tango-app-ui-manage-settings 3.7.17 → 3.7.19

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.
@@ -830,11 +830,11 @@ export class FootfallConfigurationComponent {
830
830
  return match?.label || '';
831
831
  }
832
832
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FootfallConfigurationComponent, deps: [{ token: i1.FormBuilder }, { token: i2.GlobalStateService }, { token: i3.ClientApiService }, { token: i4.NgbModal }, { token: i5.ToastService }], target: i0.ɵɵFactoryTarget.Component });
833
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FootfallConfigurationComponent, selector: "lib-footfall-configuration", host: { listeners: { "document:click": "closeMenus()" } }, viewQueries: [{ propertyName: "categoryModalTpl", first: true, predicate: ["categoryModal"], descendants: true }, { propertyName: "deleteCategoryModalTpl", first: true, predicate: ["deleteCategoryModal"], descendants: true }, { propertyName: "resetConfirmationModalTpl", first: true, predicate: ["resetConfirmationModal"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"footfallDirConfigurationForm\" class=\"container-fluid\">\n <ng-container *ngIf=\"(gs.userAccess | async)?.Global_Configuration_isEdit\">\n <div *ngIf=\"isEdit\" class=\"col-12 mb-5\">\n <div class=\"d-flex justify-content-end\">\n <button (click)=\"toggleForm();\" type=\"button\" class=\"btn btn-outline py-3 align-items-end\">\n <span class=\"me-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clip-path=\"url(#clip0_2579_25125)\">\n <path\n d=\"M14.167 2.49993C14.3859 2.28106 14.6457 2.10744 14.9317 1.98899C15.2176 1.87054 15.5241 1.80957 15.8337 1.80957C16.1432 1.80957 16.4497 1.87054 16.7357 1.98899C17.0216 2.10744 17.2815 2.28106 17.5003 2.49993C17.7192 2.7188 17.8928 2.97863 18.0113 3.2646C18.1297 3.55057 18.1907 3.85706 18.1907 4.16659C18.1907 4.47612 18.1297 4.78262 18.0113 5.06859C17.8928 5.35455 17.7192 5.61439 17.5003 5.83326L6.25033 17.0833L1.66699 18.3333L2.91699 13.7499L14.167 2.49993Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_2579_25125\">\n <rect width=\"20\" height=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </span>Edit Details\n </button>\n </div>\n </div>\n </ng-container>\n\n <!-- Approver Configuration -->\n <div class=\"card p-4 mb-4 ff-section-card\">\n <h5 class=\"ff-section-title mb-1\">Approver configuration</h5>\n <p class=\"ff-section-desc mb-4\">\n Set level of revisions required for a store raised tickets\n </p>\n\n <div formArrayName=\"revision\" class=\"d-flex flex-wrap gap-5\">\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\"\n class=\"approver-option d-flex flex-column\"\n [class.disabled-option]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\n\n <label class=\"custom-checkbox align-items-start\"\n [class.disabled-checkbox]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\n <input type=\"checkbox\" formControlName=\"isChecked\" [id]=\"'action-' + i\" />\n <span class=\"checkmark\"></span>\n <div class=\"label-text\">\n <div class=\"title\">\n {{ rev.get('actionType')?.value | titlecase }}\n </div>\n <div class=\"desc text-muted\">\n <ng-container [ngSwitch]=\"rev.get('actionType')?.value\">\n <span *ngSwitchCase=\"'reviewer'\">The ticket undergoes a single review to verify\n footfall.</span>\n <span *ngSwitchCase=\"'approver'\">The ticket undergoes a final review after the initial\n check.</span>\n <span *ngSwitchCase=\"'tango'\">Finalize tickets and update footfall count.</span>\n </ng-container>\n </div>\n </div>\n </label>\n\n </div>\n </div>\n </div>\n\n <hr class=\"ff-divider\">\n\n <!-- Store SPOC Ticket Creation -->\n <div class=\"card p-4 mb-4 ff-section-card\">\n <h5 class=\"ff-section-title mb-3\">Store SPOC Ticket Creation</h5>\n\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\n <label class=\"mb-0\">\n Allow store SPOC to create tickets only for the last\n </label>\n\n <div class=\"position-relative ff-select-wrapper compact ms-2\"\n [class.open]=\"isAllowTicketCreationDropdownOpen\" [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\"\n (click)=\"toggleAllowTicketCreationDropdown($event)\">\n <span>{{ footfallDirConfigurationForm.get('allowTicketCreation')?.value ||\n spocTicketCreationdays[0] }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isAllowTicketCreationDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let day of spocTicketCreationdays\"\n (click)=\"selectAllowTicketCreation($event, day)\">\n {{ day }}\n </button>\n </div>\n </div>\n\n <span class=\"mb-0\">Days</span>\n </div>\n </div>\n\n <hr class=\"ff-divider\">\n\n <!-- Ticket Auto-close -->\n <div class=\"card p-4 mb-4 ff-section-card\">\n <div class=\"d-flex align-items-center mb-2\">\n <h5 class=\"ff-section-title m-0\">Ticket Auto-close</h5>\n\n <label class=\"switch m-0 ms-3\" [class.disabled]=\"isEdit\">\n <input type=\"checkbox\" formControlName=\"isAutoCloseEnable\" [disabled]=\"isEdit\">\n <span class=\"slider round\"></span>\n </label>\n </div>\n\n <div class=\"d-flex align-items-center mt-2\">\n <span class=\"mb-0\">\n Ticket should be auto-closed, if the created ticket accuracy is greater than or equal to\n </span>\n\n <div class=\"position-relative ff-select-wrapper compact ms-2\" [class.open]=\"isAutoCloseDropdownOpen\"\n [class.disabled]=\"isEdit || !footfallDirConfigurationForm.get('isAutoCloseEnable')?.value\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleAutoCloseDropdown($event)\">\n <span>{{ footfallDirConfigurationForm.get('autoCloseAccuracy')?.value || '1%' }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isAutoCloseDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of accuracyPercentageList\"\n (click)=\"selectAutoCloseAccuracy($event, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <hr class=\"ff-divider\">\n\n <!-- Footfall Directory Limitations -->\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\n <div>\n <h5 class=\"ff-section-title m-0\">Footfall directory limitations</h5>\n <p class=\"ff-section-desc mb-2\">\n Set maximum limitation for stores to tag non-Purchasers from Total Footfall\n </p>\n </div>\n\n <button type=\"button\" [disabled]=\"isEdit\" class=\"add-new-btn d-inline-flex align-items-center gap-2\"\n (click)=\"openCategoryModal('add')\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 3.33334V12.6667M3.33334 8H12.6667\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span>Add New</span>\n </button>\n </div>\n\n <!-- Category Cards Grid -->\n <div formArrayName=\"taggingLimitation\" class=\"category-grid mt-3\">\n <div *ngFor=\"let tag of tagLimits.controls; let i = index\" [formGroupName]=\"i\" class=\"category-card\">\n <div class=\"category-card-header\">\n <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\">\n <ng-container [ngSwitch]=\"tag.get('iconName')?.value\">\n <svg *ngSwitchCase=\"'duplicateTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\"\n height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <g clip-path=\"url(#clip0_1162_24621)\">\n <path\n d=\"M2.5 7.5H2C1.73478 7.5 1.48043 7.39464 1.29289 7.20711C1.10536 7.01957 1 6.76522 1 6.5V2C1 1.73478 1.10536 1.48043 1.29289 1.29289C1.48043 1.10536 1.73478 1 2 1H6.5C6.76522 1 7.01957 1.10536 7.20711 1.29289C7.39464 1.48043 7.5 1.73478 7.5 2V2.5M5.5 4.5H10C10.5523 4.5 11 4.94772 11 5.5V10C11 10.5523 10.5523 11 10 11H5.5C4.94772 11 4.5 10.5523 4.5 10V5.5C4.5 4.94772 4.94772 4.5 5.5 4.5Z\"\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1162_24621\">\n <rect width=\"12\" height=\"12\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n\n <svg *ngSwitchCase=\"'employeeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\n height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\">\n <path\n d=\"M11.1667 12.5V11.1667C11.1667 10.4594 10.8857 9.78115 10.3856 9.28105C9.88552 8.78095 9.20724 8.5 8.5 8.5H3.16667C2.45942 8.5 1.78115 8.78095 1.28105 9.28105C0.780952 9.78115 0.5 10.4594 0.5 11.1667V12.5M15.1667 12.5V11.1667C15.1662 10.5758 14.9696 10.0018 14.6076 9.53488C14.2456 9.06791 13.7388 8.73438 13.1667 8.58667M10.5 0.586667C11.0736 0.733534 11.582 1.06713 11.9451 1.53487C12.3082 2.00261 12.5052 2.57789 12.5052 3.17C12.5052 3.76211 12.3082 4.33739 11.9451 4.80513C11.582 5.27287 11.0736 5.60647 10.5 5.75333M8.5 3.16667C8.5 4.63943 7.30609 5.83333 5.83333 5.83333C4.36057 5.83333 3.16667 4.63943 3.16667 3.16667C3.16667 1.69391 4.36057 0.5 5.83333 0.5C7.30609 0.5 8.5 1.69391 8.5 3.16667Z\"\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1162_24650)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1162_24650\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\n fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\n fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-container>\n </div>\n <div class=\"category-name\">\n {{ tag.get('name')?.value }}\n </div>\n <button\n *ngIf=\"(tag.get('iconName')?.value !== 'duplicateTag' && tag.get('iconName')?.value !== 'employeeTag')\"\n type=\"button\" class=\"category-menu-btn\" (click)=\"toggleCategoryMenu($event, i)\"\n [disabled]=\"isEdit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"none\"\n viewBox=\"0 0 24 24\">\n <path\n d=\"M12 5C12.5523 5 13 4.55228 13 4C13 3.44772 12.5523 3 12 3C11.4477 3 11 3.44772 11 4C11 4.55228 11.4477 5 12 5Z\"\n fill=\"#475467\" />\n <path\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\n fill=\"#475467\" />\n <path\n d=\"M12 21C12.5523 21 13 20.5523 13 20C13 19.4477 12.5523 19 12 19C11.4477 19 11 19.4477 11 20C11 20.5523 11.4477 21 12 21Z\"\n fill=\"#475467\" />\n </svg>\n </button>\n <div class=\"category-menu\" *ngIf=\"activeMenuIndex === i\">\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'edit', i)\">Edit Name</button>\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'delete', i)\">Delete</button>\n </div>\n </div>\n\n <div class=\"category-percentage-section\">\n <div class=\"position-relative ff-select-wrapper compact\"\n [class.open]=\"openLimitDropdownIndex === i\" [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\"\n (click)=\"toggleLimitDropdown($event, i)\">\n <span>{{ tag.get('value')?.value || 0 }}%</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"openLimitDropdownIndex === i\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\n (click)=\"selectLimitValue($event, i, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\n\n <!-- Store Requests -->\n <div formGroupName=\"accuracyBreach\" class=\"card p-4 mb-4 ff-section-card\">\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\n <div>\n <h5 class=\"ff-section-title mb-2\">Store Requests</h5>\n <p class=\"ff-section-desc mb-0\">\n Below stores have requested to raise a ticket after breaching the configured limit\n <span class=\"info-icon\">i</span>\n </p>\n </div>\n <button type=\"button\" class=\"btn btn-primary reset-btn d-inline-flex align-items-center gap-2\"\n *ngIf=\"!isEdit\" [disabled]=\"isResetDisabled\" (click)=\"openResetConfirmationModal()\" aria-live=\"polite\">\n <span>Reset</span>\n </button>\n </div>\n\n <!-- Restriction Criteria -->\n <div class=\"restriction-criteria mb-4\">\n <label class=\"mb-3 d-block\">\n Restrict ticket creation for any store that:\n </label>\n <div class=\"d-flex align-items-center flex-nowrap gap-2\">\n <span>Has raised more than</span>\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isTicketCountDropdownOpen\"\n [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleTicketCountDropdown($event)\">\n <span>\n {{ footfallDirConfigurationForm.get('accuracyBreach.ticketCount')?.value || 1 }}\n </span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isTicketCountDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let c of [1, 2, 3, 4, 5]\"\n (click)=\"selectTicketCount($event, c)\">\n {{ c }}\n </button>\n </div>\n </div>\n <span>tickets in the calender</span>\n <div class=\"position-relative ff-select-wrapper compact store-days-select\"\n [class.open]=\"isStoreDaysDropdownOpen\" [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreDaysDropdown($event)\">\n <span>{{ selectedDaysLabel }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isStoreDaysDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let opt of daysOptions\"\n (click)=\"selectStoreDays($event, opt)\">\n {{ opt.label }}\n </button>\n </div>\n </div>\n <span>based on configured conditions\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n placement=\"top\" [ngbTooltip]=\"conditionsTooltip\" tooltipClass=\"conditions-tooltip\">\n <g clip-path=\"url(#clip0_1432_80035)\">\n <path\n d=\"M8.00065 10.6666V7.99992M8.00065 5.33325H8.00732M14.6673 7.99992C14.6673 11.6818 11.6826 14.6666 8.00065 14.6666C4.31875 14.6666 1.33398 11.6818 1.33398 7.99992C1.33398 4.31802 4.31875 1.33325 8.00065 1.33325C11.6826 1.33325 14.6673 4.31802 14.6673 7.99992Z\"\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1432_80035\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <ng-template #conditionsTooltip>\n <div style=\"text-align: left; font-size: 12px; line-height: 1.6;\">\n <b>1.</b> Delta between Store/AOM accuracy and Central Ops/Tango accuracy exceeds 10%<br>\n <b>2.</b> The overall accuracy after all reviews is greater than 85%.<br>\n <b>3.</b> Overall the Number of Images (Footfall) marked for validation in the ticket by the\n Store is Less than equal to 10\n </div>\n </ng-template>\n </div>\n </div>\n\n <!-- Store Requests Table -->\n <div class=\"store-requests-table\" [class.disabled]=\"isEdit\"\n *ngIf=\"storeList?.length > 0; else emptyStoreRequests\">\n <div class=\"table-responsive\" [ngClass]=\"{'store-table-scroll': storeList?.length > 5}\">\n <table class=\"table table-hover store-requests-table-content\">\n <thead>\n <tr>\n <th class=\"checkbox-column\">\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\n <input type=\"checkbox\" [checked]=\"isAllSelected\" [disabled]=\"isEdit\"\n (change)=\"toggleSelectAll($event)\" />\n <span class=\"checkmark-select\"></span>\n\n </label>\n </th>\n <th class=\"sortable store-name-column\">\n <div class=\"d-flex align-items-center\">\n <span>Select all stores ({{ storeList?.length || 0 }})</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" class=\"ms-2 dropdown-arrow\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#344054\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </th>\n <th class=\"sortable\">\n Raised on\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\n fill=\"none\" class=\"ms-1 sort-icon\">\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"sortable\">\n Last raised(Approved)\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\n fill=\"none\" class=\"ms-1 sort-icon\">\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"sortable\">\n No of Time Raised\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\n fill=\"none\" class=\"ms-1 sort-icon\">\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let store of storeList\">\n <td class=\"checkbox-column\">\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\n <input #cb type=\"checkbox\" [checked]=\"isStoreSelected(store)\" [disabled]=\"isEdit\"\n (change)=\"toggleStoreSelection(store, cb.checked)\" />\n <span class=\"checkmark-select\"></span>\n </label>\n </td>\n <td>{{ store.storeName }}</td>\n <td>{{ store.raisedOn }}</td>\n <td>{{ store.lastApproved || '-' }}</td>\n <td>{{ store.totalRaised }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <ng-template #emptyStoreRequests>\n <div class=\"empty-store-state text-center\">\n <div class=\"empty-store-icon mb-3\">\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.94629 21.1995C8.645 21.2313 8.33828 21.2502 8.02734 21.2502C7.85782 21.2502 7.69052 21.2434 7.52539 21.2336V31.6067C7.52539 33.0347 8.70837 34.2258 10.1963 34.2258H29.8008C31.2888 34.2258 32.4717 33.0347 32.4717 31.6067V21.2346C32.3098 21.2438 32.1459 21.2502 31.9814 21.2502C31.6675 21.2502 31.3569 21.2323 31.0508 21.1995V28.9875H8.94629V21.1995ZM30.9277 5.77368H9.06934C8.89197 5.77368 8.73671 5.86647 8.65918 5.98755L8.65723 5.9895L5.14746 11.4729L5.05273 11.6204C3.82719 13.7402 5.0918 16.4671 7.44336 16.7766C7.64428 16.8011 7.83403 16.8157 8.02148 16.8157C9.25156 16.8157 10.3395 16.287 11.0967 15.4651L12.0186 14.4641L12.9375 15.468C13.6864 16.2861 14.7731 16.8157 16.0107 16.8157C17.2428 16.8156 18.3347 16.2854 19.083 15.468L20.0049 14.4612L20.9268 15.468C21.6751 16.2855 22.7668 16.8157 23.999 16.8157C25.2312 16.8157 26.3229 16.2854 27.0713 15.468L27.9932 14.4612L28.915 15.468C29.6634 16.2855 30.756 16.8157 31.9883 16.8157C32.1697 16.8157 32.3648 16.8018 32.5645 16.7776H32.5635C34.9572 16.4571 36.2254 13.6075 34.8574 11.4729L34.8564 11.4739L31.3398 5.99048L31.3389 5.98755C31.2614 5.86628 31.1053 5.77368 30.9277 5.77368Z\"\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\n </svg>\n </div>\n <p class=\"mb-0 fw-semibold text-muted\">No reset request from store</p>\n </div>\n </ng-template>\n </div>\n\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\n\n <!-- Send Ticket to Tango -->\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\n <h5 class=\"ff-section-title mb-1\">Send Ticket to Tango</h5>\n <div class=\"d-flex align-items-center mt-2\">\n <label class=\"me-2 mb-0 tango-label\">Send ticket to Tango if accuracy falls below</label>\n <div class=\"position-relative ff-select-wrapper compact ms-0\" [class.open]=\"issendTangoDropdownOpen\"\n [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleSendTangoCloseDropdown($event)\">\n <span>{{ footfallDirConfigurationForm.get('tangoReview')?.value || '1%' }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"issendTangoDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of sendTicketTango\"\n (click)=\"selectSendTicketTango($event, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Footer Actions -->\n <div *ngIf=\"!isEdit\">\n <div class=\"mb-5 w-100 footer-seperator\"></div>\n <div class=\"d-flex justify-content-end\">\n <a type=\"button\" class=\"btn btn-outline mt-1 pt-3 me-4\" (click)=\"onCancel()\">Cancel</a>\n <a type=\"submit\" class=\"btn btn-primary px-4\" (click)=\"onSubmit()\"><span>Save Changes</span></a>\n </div>\n </div>\n\n <!-- Category Modal -->\n <ng-template #categoryModal>\n <div class=\"modal-header border-0 pb-0\">\n <h5 class=\"modal-title\">\n {{ categoryModalMode === 'add' ? 'Add New Category' : 'Edit Category' }}\n </h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"closeCategoryModal()\"></button>\n </div>\n <div class=\"modal-body category-modal-body\">\n <form [formGroup]=\"categoryForm\">\n <div class=\"mb-3\">\n <label class=\"form-label text-muted\">Icon</label>\n <div class=\"ff-select-wrapper icon-select\" [class.open]=\"isCategoryIconDropdownOpen\">\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryIconDropdown($event)\">\n <span class=\"d-inline-flex align-items-center gap-2\">\n <span class=\"category-icon\"\n [ngClass]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\n <ng-container\n [ngSwitch]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_icon_housekeeping)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_icon_housekeeping\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-container>\n </span>\n <span class=\"icon-label\">{{ selectedCategoryIconLabel }}</span>\n </span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryIconDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option d-flex align-items-center gap-2\"\n *ngFor=\"let icon of categoryIcons\"\n (click)=\"selectCategoryIconFromDropdown($event, icon.value)\">\n <span class=\"category-icon\" [ngClass]=\"icon.value\">\n <ng-container [ngSwitch]=\"icon.value\">\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1162_24650)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1162_24650\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-container>\n </span>\n <span>{{ icon.label }}</span>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3\">\n <label class=\"form-label text-muted\">Category Name</label>\n <input type=\"text\" class=\"form-control\"\n [class.is-invalid]=\"categoryForm.get('name')?.invalid && categoryForm.get('name')?.touched\"\n placeholder=\"Enter your new category\" formControlName=\"name\" />\n <small class=\"text-danger\"\n *ngIf=\"categoryForm.get('name')?.hasError('required') && categoryForm.get('name')?.touched\">\n Category name is required.\n </small>\n <small class=\"text-danger\"\n *ngIf=\"categoryForm.get('name')?.hasError('duplicate') && categoryForm.get('name')?.touched\">\n Category name already exists.\n </small>\n </div>\n\n <div class=\"mb-2\">\n <label class=\"form-label text-muted\">Limitation</label>\n <div class=\"ff-select-wrapper\" [class.open]=\"isCategoryLimitDropdownOpen\">\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryLimitDropdown($event)\">\n <span>{{ categoryForm.get('limit')?.value || percentageList[0] }}%</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryLimitDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\n (click)=\"selectCategoryLimitValue($event, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </form>\n </div>\n <div class=\"modal-footer border-0 pt-0\">\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeCategoryModal()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"submitCategoryForm()\">\n {{ categoryModalMode === 'add' ? 'Create' : 'Save' }}\n </button>\n </div>\n </ng-template>\n\n <!-- Delete Confirmation Modal -->\n <ng-template #deleteCategoryModal>\n <div class=\"modal-body text-center p-4\">\n <h5 class=\"fw-semibold mb-2\">Confirmation</h5>\n <p class=\"mb-4 text-muted\">\n You're about to delete <span class=\"fw-semibold\">{{ categoryPendingDeleteName }}</span> category.\n </p>\n <div class=\"d-flex justify-content-center gap-3\">\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeDeleteModal()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-danger\" (click)=\"confirmDeleteCategory()\">Delete</button>\n </div>\n </div>\n </ng-template>\n\n <!-- Reset Store Requests Confirmation Modal -->\n <ng-template #resetConfirmationModal>\n <div class=\"modal-body text-center p-4\">\n <h5 class=\"fw-semibold mb-2\">Reset Store Requests</h5>\n <p class=\"mb-4 text-muted\">\n Are you sure you want to proceed with resetting the selected <span class=\"fw-semibold\">{{\n resetRequest.arrayOfStores.length }}</span> store(s) requests?\n </p>\n <div class=\"d-flex justify-content-center gap-3\">\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeResetModal()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"confirmResetStoreRequest()\">Reset</button>\n </div>\n </div>\n </ng-template>\n\n</form>\n", styles: ["::ng-deep .conditions-tooltip .tooltip-inner{max-width:450px;text-align:left;padding:10px 14px;font-size:12px;line-height:1.6}form{padding:32px 20px;border-radius:16px;font-family:Inter,Segoe UI,sans-serif}.ff-section-card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 1px 4px #0f172a0a}.ff-section-title{font-size:16px;font-weight:600;color:#101828}.ff-section-desc{font-size:13px;color:#667085}.ff-divider{margin:8px 24px;border-color:#e4e7ec}.form-check{display:flex;align-items:center;gap:10px}.form-check-input{width:42px;height:22px;cursor:pointer;accent-color:#2563eb;border:1px solid #d1d5db;transition:all .2s ease-in-out}.form-check-input:checked{background-color:#2563eb;border-color:#2563eb}.form-check-input:disabled{opacity:.6;cursor:not-allowed}input[type=radio].form-check-input{width:16px;height:16px;accent-color:#2563eb}input[type=radio]:checked{border-color:#2563eb}select.form-select{border:1px solid #d1d5db;border-radius:8px;height:38px;font-size:14px;color:#374151;padding:6px 10px;outline:none;transition:.2s}select.form-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.btn-outline{background-color:#fff;border:1px solid #d1d5db;color:#374151;padding:6px 16px;border-radius:8px;transition:all .2s}.btn-outline:hover{background:#f9fafb}.btn-primary{background-color:#2563eb;border:none;color:#fff;border-radius:8px;padding:6px 16px;transition:.2s}.btn-primary:hover{background-color:#1e40af}.approver-option{display:flex;flex-direction:column;justify-content:flex-start;width:220px}.custom-checkbox{position:relative;display:flex;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.custom-checkbox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer}.custom-checkbox .checkmark{height:18px;width:18px;min-width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease}.custom-checkbox input:checked~.checkmark{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.label-text{display:flex;flex-direction:column}.label-text .title{font-weight:600;color:#101828}.label-text .desc{font-size:13px;color:#667085;margin-top:2px;max-width:190px;line-height:1.4}.custom-checkbox input:not(:checked)~.label-text .desc{opacity:.6}.approver-option.disabled-option{opacity:.6;pointer-events:none}.approver-option.disabled-option .custom-checkbox.disabled-checkbox{cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .checkmark{background-color:#f3f4f6;border-color:#d1d5dd;cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark{background-color:#f3f4f6;border-color:#d1d5dd}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg);opacity:.5}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .title{color:#9ca3af}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .desc{color:#d1d5dd}.switch{position:relative;display:inline-block;width:44px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ddd;transition:.3s;border-radius:22px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}input:checked+.slider{background-color:#4c9aff}input:checked+.slider:before{transform:translate(21px)}.switch.disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.switch.disabled .slider{cursor:not-allowed;background-color:#e5e7eb}.switch.disabled input:checked+.slider{background-color:#7dd3fc}.category-grid{display:flex;flex-wrap:wrap;gap:12px}.category-card{min-width:180px;border:1px solid #e5e7eb;border-radius:10px;padding:12px;background-color:#fff;box-shadow:0 1px 3px #1018280f;position:relative;display:flex;flex-direction:column;gap:12px}.category-card-header{display:flex;align-items:center;gap:10px}.category-icon{width:32px;height:32px;min-width:32px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.category-name{font-weight:500;color:#101828;font-size:14px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-percentage-section{width:100%}.category-percentage-section .ff-select-wrapper.compact{width:100%;min-width:auto}.category-percentage-section .ff-select-toggle.small{width:100%;min-height:36px;padding:6px 10px;font-size:13px}.category-menu-btn{border:none;background:transparent;padding:4px;line-height:1;cursor:pointer;flex-shrink:0;margin-left:4px;display:inline-flex;align-items:center;justify-content:center}.category-menu-btn:disabled{cursor:default}.category-menu{position:absolute;top:48px;right:16px;background:#fff;border:1px solid #e4e7ec;border-radius:10px;box-shadow:0 12px 30px #0f172a26;min-width:140px;z-index:5;padding:4px}.category-menu button{width:100%;text-align:left;background:transparent;border:none;padding:8px 10px;border-radius:8px;font-size:13px;color:#101828}.category-menu button:hover{background:#f4f7fb}.duplicateTag{background:#4755691f;color:#475569}.employeeTag{background:#3b82f61f;color:#3b82f6}.houseKeepingTag{background:#22c55e1f;color:#22c55e}.junkTag{background:#ef44441f;color:#ef4444}.purpleTag{background:#7c3aed1f;color:#7c3aed}.orangeTag{background:#ea580c1f;color:#ea580c}.add-new-btn{background:#fff;border:1px solid #d0d5dd;border-radius:10px;padding:5px 13px;font-size:14px;font-weight:600;color:#101828;transition:all .2s ease;cursor:pointer;display:inline-flex;align-items:center;gap:8px;box-shadow:0 1px 2px #1018280d}.add-new-btn:hover:not(:disabled){background:#f9fafb;border-color:#004aad;color:#004aad;box-shadow:0 2px 4px #10182814}.add-new-btn:active:not(:disabled){background:#f4f7fb;transform:translateY(1px);box-shadow:0 1px 2px #1018280d}.add-new-btn:disabled{opacity:.6;cursor:not-allowed;background:#f9fafb;border-color:#e5e7eb;color:#9ca3af}.add-new-btn svg{transition:transform .2s ease;flex-shrink:0}.add-new-btn:hover:not(:disabled) svg{transform:rotate(90deg)}.info-icon{display:inline-flex;justify-content:center;align-items:center;width:18px;height:18px;font-size:11px;font-weight:600;border-radius:50%;background:#f3f3f3;color:#555;cursor:pointer;margin-left:6px;border:1.5px solid #8a8a8a}.tango-label{font-size:13px;color:#475467;font-weight:500}.store-requests-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.reset-btn{border-width:1px;border-color:#d0d5dd;color:#004aad;font-weight:600;padding:6px 18px;background-color:#fff;transition:all .2s ease}.reset-btn svg path{stroke:currentColor}.reset-btn .spinner-border{color:#004aad}.reset-btn:disabled{opacity:.6;cursor:not-allowed}.reset-btn:not(:disabled):hover{background-color:#f4f7fb;border-color:#004aad;box-shadow:0 1px 2px #1018280f}.restriction-criteria{padding:16px 0;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb}.custom-checkbox-select{position:relative;display:flex;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-checkbox-select input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;width:0;height:0}.checkmark-select{height:18px;width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease;position:relative}.custom-checkbox-select input:checked~.checkmark-select{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox-select input:checked~.checkmark-select:after{content:\"\";position:absolute;left:7px;top:3px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.dropdown-arrow{cursor:pointer;transition:transform .2s}.dropdown-arrow:hover{transform:translateY(2px)}.store-requests-table{margin-top:16px;position:relative;border:1px solid #e5e7eb;border-radius:10px;overflow:hidden}.store-requests-table.disabled{pointer-events:none;opacity:.6;-webkit-user-select:none;user-select:none}.store-requests-table-content{border-collapse:collapse;border-spacing:0;width:100%;margin-bottom:0}.store-requests-table-content thead{background:linear-gradient(180deg,#f0f6ff,#f7f9fc)}.store-requests-table-content thead th{padding:14px 16px;font-weight:600;font-size:12px;color:#475467;text-align:left;border-bottom:1px solid #e5e7eb;white-space:nowrap;vertical-align:middle;text-transform:uppercase;letter-spacing:.04em}.store-requests-table-content tbody td{padding:14px 16px;font-size:13px;color:#344054;border-bottom:1px solid #f2f4f7;vertical-align:middle}.store-requests-table-content tbody tr{transition:background .15s}.store-requests-table-content tbody tr:hover{background-color:#f8fbff}.store-requests-table-content tbody tr:last-child td{border-bottom:none}.store-table-scroll{max-height:360px;overflow-y:auto}.store-table-scroll table{margin-bottom:0}.store-table-scroll .store-requests-table-content thead th{position:sticky;top:0;z-index:2;background:#f0f6ff}.checkbox-column{width:50px;padding-left:16px!important;padding-right:0!important}.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;position:relative}.sortable:hover{background-color:#e8eef8}.sort-icon{opacity:.5;transition:opacity .2s}.sortable:hover .sort-icon{opacity:1}.store-name-column{min-width:240px}.store-name-column .column-header{justify-content:space-between}.store-name-column .select-all-row{padding-top:8px;margin-top:8px;border-top:1px solid #e5e7eb}.empty-store-state{border:1px dashed #c7d7f0;border-radius:12px;padding:40px 16px;background:#f9fbff;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-store-icon{display:inline-flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:50%;background:#2e90fa1f}.store-days-select .ff-select-toggle{min-width:99px}.store-days-select .ff-select-toggle span{white-space:nowrap}.ff-select-wrapper{width:100%;position:relative}.ff-select-wrapper.compact{width:auto;min-width:80px}.ff-select-wrapper.disabled{pointer-events:none;opacity:.7}.ff-select-wrapper.open .ff-select-toggle svg{transform:rotate(180deg)}.ff-select-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid #d0d5dd;border-radius:10px;padding:8px 12px;background:#fff;font-weight:600;color:#101828;min-height:40px}.ff-select-toggle.small{min-height:36px;padding:6px 10px;font-size:13px}.ff-select-toggle svg{transition:transform .2s ease}.ff-select-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#fff;border:1px solid #e4e7ec;border-radius:12px;box-shadow:0 16px 40px #0f172a26;max-height:220px;overflow-y:auto;z-index:15;padding:4px}.ff-select-option{width:100%;text-align:left;border:none;background:transparent;padding:8px 10px;border-radius:8px;font-size:14px;color:#101828}.ff-select-option:hover{background:#f4f7fb}.category-modal-body .form-control,.category-modal-body .form-select{border-radius:10px;min-height:44px}.category-modal-body .form-label{font-size:13px}.category-modal-body .text-danger{font-size:12px}.custom-modal{border-radius:16px;padding:10px 20px 20px;background:#fff;box-shadow:0 10px 40px #00000014;width:500px}.field-label{color:#8b8b8b;font-size:14px;margin-bottom:4px;display:block}.input-box{width:100%;height:46px;border:1px solid #e5e7eb;border-radius:10px;padding:0 14px;font-size:15px;background:#f8fafc;display:flex;align-items:center}.input-box:focus-within{border-color:#4daeff;background:#fff;box-shadow:0 0 0 2px #4daeff26}.icon-row{display:flex}.icon-box{width:60px;cursor:pointer;justify-content:space-between}.clean-select{border:none;width:100%;height:100%;background:transparent;font-size:15px;outline:none}.select-box{padding:0}.button-area{display:flex;justify-content:space-between;gap:15px}.btn-cancel{width:50%;height:46px;border-radius:10px;border:1px solid #dbdbdb;background:#fff;font-weight:500;cursor:pointer}.btn-create{width:50%;height:46px;border-radius:10px;border:none;background:#0094ff;color:#fff;font-weight:600;cursor:pointer}.btn-create:hover{background:#007bdb}.card .btn-outline.btn-sm{padding:6px 10px;border-radius:8px}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TitleCasePipe, name: "titlecase" }] });
833
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FootfallConfigurationComponent, selector: "lib-footfall-configuration", host: { listeners: { "document:click": "closeMenus()" } }, viewQueries: [{ propertyName: "categoryModalTpl", first: true, predicate: ["categoryModal"], descendants: true }, { propertyName: "deleteCategoryModalTpl", first: true, predicate: ["deleteCategoryModal"], descendants: true }, { propertyName: "resetConfirmationModalTpl", first: true, predicate: ["resetConfirmationModal"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"footfallDirConfigurationForm\" class=\"container-fluid\">\r\n <ng-container *ngIf=\"(gs.userAccess | async)?.Global_Configuration_isEdit\">\r\n <div *ngIf=\"isEdit\" class=\"col-12 mb-5\">\r\n <div class=\"d-flex justify-content-end\">\r\n <button (click)=\"toggleForm();\" type=\"button\" class=\"btn btn-outline py-3 align-items-end\">\r\n <span class=\"me-2\">\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_2579_25125)\">\r\n <path\r\n d=\"M14.167 2.49993C14.3859 2.28106 14.6457 2.10744 14.9317 1.98899C15.2176 1.87054 15.5241 1.80957 15.8337 1.80957C16.1432 1.80957 16.4497 1.87054 16.7357 1.98899C17.0216 2.10744 17.2815 2.28106 17.5003 2.49993C17.7192 2.7188 17.8928 2.97863 18.0113 3.2646C18.1297 3.55057 18.1907 3.85706 18.1907 4.16659C18.1907 4.47612 18.1297 4.78262 18.0113 5.06859C17.8928 5.35455 17.7192 5.61439 17.5003 5.83326L6.25033 17.0833L1.66699 18.3333L2.91699 13.7499L14.167 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2579_25125\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>Edit Details\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Approver Configuration -->\r\n <div class=\"card p-4 mb-4 ff-section-card\">\r\n <h5 class=\"ff-section-title mb-1\">Approver configuration</h5>\r\n <p class=\"ff-section-desc mb-4\">\r\n Set level of revisions required for a store raised tickets\r\n </p>\r\n\r\n <div formArrayName=\"revision\" class=\"d-flex flex-wrap gap-5\">\r\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"approver-option d-flex flex-column\"\r\n [class.disabled-option]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n\r\n <label class=\"custom-checkbox align-items-start\"\r\n [class.disabled-checkbox]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n <input type=\"checkbox\" formControlName=\"isChecked\" [id]=\"'action-' + i\" />\r\n <span class=\"checkmark\"></span>\r\n <div class=\"label-text\">\r\n <div class=\"title\">\r\n {{ rev.get('actionType')?.value | titlecase }}\r\n </div>\r\n <div class=\"desc text-muted\">\r\n <ng-container [ngSwitch]=\"rev.get('actionType')?.value\">\r\n <span *ngSwitchCase=\"'reviewer'\">The ticket undergoes a single review to verify\r\n footfall.</span>\r\n <span *ngSwitchCase=\"'approver'\">The ticket undergoes a final review after the initial\r\n check.</span>\r\n <span *ngSwitchCase=\"'tango'\">Finalize tickets and update footfall count.</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </label>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\">\r\n\r\n <!-- Store SPOC Ticket Creation -->\r\n <div class=\"card p-4 mb-4 ff-section-card\">\r\n <h5 class=\"ff-section-title mb-3\">Store SPOC Ticket Creation</h5>\r\n\r\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n <label class=\"mb-0\">\r\n Allow store SPOC to create tickets only for the last\r\n </label>\r\n\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\"\r\n [class.open]=\"isAllowTicketCreationDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleAllowTicketCreationDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('allowTicketCreation')?.value ||\r\n spocTicketCreationdays[0] }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAllowTicketCreationDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let day of spocTicketCreationdays\"\r\n (click)=\"selectAllowTicketCreation($event, day)\">\r\n {{ day }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <span class=\"mb-0\">Days</span>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\">\r\n\r\n <!-- Ticket Auto-close -->\r\n <div class=\"card p-4 mb-4 ff-section-card\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <h5 class=\"ff-section-title m-0\">Ticket Auto-close</h5>\r\n\r\n <label class=\"switch m-0 ms-3\" [class.disabled]=\"isEdit\">\r\n <input type=\"checkbox\" formControlName=\"isAutoCloseEnable\" [disabled]=\"isEdit\">\r\n <span class=\"slider round\"></span>\r\n </label>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center mt-2\">\r\n <span class=\"mb-0\">\r\n Ticket should be auto-closed, if the created ticket accuracy is greater than or equal to\r\n </span>\r\n\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\" [class.open]=\"isAutoCloseDropdownOpen\"\r\n [class.disabled]=\"isEdit || !footfallDirConfigurationForm.get('isAutoCloseEnable')?.value\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleAutoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('autoCloseAccuracy')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAutoCloseDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of accuracyPercentageList\"\r\n (click)=\"selectAutoCloseAccuracy($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\">\r\n\r\n <!-- Footfall Directory Limitations -->\r\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\r\n <div>\r\n <h5 class=\"ff-section-title m-0\">Footfall directory limitations</h5>\r\n <p class=\"ff-section-desc mb-2\">\r\n Set maximum limitation for stores to tag non-Purchasers from Total Footfall\r\n </p>\r\n </div>\r\n\r\n <button type=\"button\" [disabled]=\"isEdit\" class=\"add-new-btn d-inline-flex align-items-center gap-2\"\r\n (click)=\"openCategoryModal('add')\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3.33334V12.6667M3.33334 8H12.6667\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>Add New</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Category Cards Grid -->\r\n <div formArrayName=\"taggingLimitation\" class=\"category-grid mt-3\">\r\n <div *ngFor=\"let tag of tagLimits.controls; let i = index\" [formGroupName]=\"i\" class=\"category-card\">\r\n <div class=\"category-card-header\">\r\n <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\">\r\n <ng-container [ngSwitch]=\"tag.get('iconName')?.value\">\r\n <svg *ngSwitchCase=\"'duplicateTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\"\r\n height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1162_24621)\">\r\n <path\r\n d=\"M2.5 7.5H2C1.73478 7.5 1.48043 7.39464 1.29289 7.20711C1.10536 7.01957 1 6.76522 1 6.5V2C1 1.73478 1.10536 1.48043 1.29289 1.29289C1.48043 1.10536 1.73478 1 2 1H6.5C6.76522 1 7.01957 1.10536 7.20711 1.29289C7.39464 1.48043 7.5 1.73478 7.5 2V2.5M5.5 4.5H10C10.5523 4.5 11 4.94772 11 5.5V10C11 10.5523 10.5523 11 10 11H5.5C4.94772 11 4.5 10.5523 4.5 10V5.5C4.5 4.94772 4.94772 4.5 5.5 4.5Z\"\r\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24621\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'employeeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\r\n height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\">\r\n <path\r\n d=\"M11.1667 12.5V11.1667C11.1667 10.4594 10.8857 9.78115 10.3856 9.28105C9.88552 8.78095 9.20724 8.5 8.5 8.5H3.16667C2.45942 8.5 1.78115 8.78095 1.28105 9.28105C0.780952 9.78115 0.5 10.4594 0.5 11.1667V12.5M15.1667 12.5V11.1667C15.1662 10.5758 14.9696 10.0018 14.6076 9.53488C14.2456 9.06791 13.7388 8.73438 13.1667 8.58667M10.5 0.586667C11.0736 0.733534 11.582 1.06713 11.9451 1.53487C12.3082 2.00261 12.5052 2.57789 12.5052 3.17C12.5052 3.76211 12.3082 4.33739 11.9451 4.80513C11.582 5.27287 11.0736 5.60647 10.5 5.75333M8.5 3.16667C8.5 4.63943 7.30609 5.83333 5.83333 5.83333C4.36057 5.83333 3.16667 4.63943 3.16667 3.16667C3.16667 1.69391 4.36057 0.5 5.83333 0.5C7.30609 0.5 8.5 1.69391 8.5 3.16667Z\"\r\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n <div class=\"category-name\">\r\n {{ tag.get('name')?.value }}\r\n </div>\r\n <button\r\n *ngIf=\"(tag.get('iconName')?.value !== 'duplicateTag' && tag.get('iconName')?.value !== 'employeeTag')\"\r\n type=\"button\" class=\"category-menu-btn\" (click)=\"toggleCategoryMenu($event, i)\"\r\n [disabled]=\"isEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"none\"\r\n viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M12 5C12.5523 5 13 4.55228 13 4C13 3.44772 12.5523 3 12 3C11.4477 3 11 3.44772 11 4C11 4.55228 11.4477 5 12 5Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 21C12.5523 21 13 20.5523 13 20C13 19.4477 12.5523 19 12 19C11.4477 19 11 19.4477 11 20C11 20.5523 11.4477 21 12 21Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n </button>\r\n <div class=\"category-menu\" *ngIf=\"activeMenuIndex === i\">\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'edit', i)\">Edit Name</button>\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'delete', i)\">Delete</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"category-percentage-section\">\r\n <div class=\"position-relative ff-select-wrapper compact\"\r\n [class.open]=\"openLimitDropdownIndex === i\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleLimitDropdown($event, i)\">\r\n <span>{{ tag.get('value')?.value || 0 }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"openLimitDropdownIndex === i\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectLimitValue($event, i, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n\r\n <!-- Store Requests -->\r\n <div formGroupName=\"accuracyBreach\" class=\"card p-4 mb-4 ff-section-card\">\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div>\r\n <h5 class=\"ff-section-title mb-2\">Store Requests</h5>\r\n <p class=\"ff-section-desc mb-0\">\r\n Below stores have requested to raise a ticket after breaching the configured limit\r\n <span class=\"info-icon\">i</span>\r\n </p>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-primary reset-btn d-inline-flex align-items-center gap-2\"\r\n *ngIf=\"!isEdit\" [disabled]=\"isResetDisabled\" (click)=\"openResetConfirmationModal()\" aria-live=\"polite\">\r\n <span>Reset</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Restriction Criteria -->\r\n <div class=\"restriction-criteria mb-4\">\r\n <label class=\"mb-3 d-block\">\r\n Restrict ticket creation for any store that:\r\n </label>\r\n <div class=\"d-flex align-items-center flex-nowrap gap-2\">\r\n <span>Has raised more than</span>\r\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isTicketCountDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleTicketCountDropdown($event)\">\r\n <span>\r\n {{ footfallDirConfigurationForm.get('accuracyBreach.ticketCount')?.value || 1 }}\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isTicketCountDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let c of [1, 2, 3, 4, 5]\"\r\n (click)=\"selectTicketCount($event, c)\">\r\n {{ c }}\r\n </button>\r\n </div>\r\n </div>\r\n <span>tickets in the calender</span>\r\n <div class=\"position-relative ff-select-wrapper compact store-days-select\"\r\n [class.open]=\"isStoreDaysDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreDaysDropdown($event)\">\r\n <span>{{ selectedDaysLabel }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isStoreDaysDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let opt of daysOptions\"\r\n (click)=\"selectStoreDays($event, opt)\">\r\n {{ opt.label }}\r\n </button>\r\n </div>\r\n </div>\r\n <span>based on configured conditions\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n placement=\"top\" [ngbTooltip]=\"conditionsTooltip\" tooltipClass=\"conditions-tooltip\">\r\n <g clip-path=\"url(#clip0_1432_80035)\">\r\n <path\r\n d=\"M8.00065 10.6666V7.99992M8.00065 5.33325H8.00732M14.6673 7.99992C14.6673 11.6818 11.6826 14.6666 8.00065 14.6666C4.31875 14.6666 1.33398 11.6818 1.33398 7.99992C1.33398 4.31802 4.31875 1.33325 8.00065 1.33325C11.6826 1.33325 14.6673 4.31802 14.6673 7.99992Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1432_80035\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <ng-template #conditionsTooltip>\r\n <div style=\"text-align: left; font-size: 12px; line-height: 1.6;\">\r\n <b>1.</b> Delta between Store/AOM accuracy and Central Ops/Tango accuracy exceeds 10%<br>\r\n <b>2.</b> The overall accuracy after all reviews is greater than 85%.<br>\r\n <b>3.</b> Overall the Number of Images (Footfall) marked for validation in the ticket by the\r\n Store is Less than equal to 10\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Requests Table -->\r\n <div class=\"store-requests-table\" [class.disabled]=\"isEdit\"\r\n *ngIf=\"storeList?.length > 0; else emptyStoreRequests\">\r\n <div class=\"table-responsive\" [ngClass]=\"{'store-table-scroll': storeList?.length > 5}\">\r\n <table class=\"table table-hover store-requests-table-content\">\r\n <thead>\r\n <tr>\r\n <th class=\"checkbox-column\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input type=\"checkbox\" [checked]=\"isAllSelected\" [disabled]=\"isEdit\"\r\n (change)=\"toggleSelectAll($event)\" />\r\n <span class=\"checkmark-select\"></span>\r\n\r\n </label>\r\n </th>\r\n <th class=\"sortable store-name-column\">\r\n <div class=\"d-flex align-items-center\">\r\n <span>Select all stores ({{ storeList?.length || 0 }})</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" class=\"ms-2 dropdown-arrow\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th class=\"sortable\">\r\n Raised on\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\r\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n Last raised(Approved)\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\r\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n No of Time Raised\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\r\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let store of storeList\">\r\n <td class=\"checkbox-column\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input #cb type=\"checkbox\" [checked]=\"isStoreSelected(store)\" [disabled]=\"isEdit\"\r\n (change)=\"toggleStoreSelection(store, cb.checked)\" />\r\n <span class=\"checkmark-select\"></span>\r\n </label>\r\n </td>\r\n <td>{{ store.storeName }}</td>\r\n <td>{{ store.raisedOn }}</td>\r\n <td>{{ store.lastApproved || '-' }}</td>\r\n <td>{{ store.totalRaised }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <ng-template #emptyStoreRequests>\r\n <div class=\"empty-store-state text-center\">\r\n <div class=\"empty-store-icon mb-3\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M8.94629 21.1995C8.645 21.2313 8.33828 21.2502 8.02734 21.2502C7.85782 21.2502 7.69052 21.2434 7.52539 21.2336V31.6067C7.52539 33.0347 8.70837 34.2258 10.1963 34.2258H29.8008C31.2888 34.2258 32.4717 33.0347 32.4717 31.6067V21.2346C32.3098 21.2438 32.1459 21.2502 31.9814 21.2502C31.6675 21.2502 31.3569 21.2323 31.0508 21.1995V28.9875H8.94629V21.1995ZM30.9277 5.77368H9.06934C8.89197 5.77368 8.73671 5.86647 8.65918 5.98755L8.65723 5.9895L5.14746 11.4729L5.05273 11.6204C3.82719 13.7402 5.0918 16.4671 7.44336 16.7766C7.64428 16.8011 7.83403 16.8157 8.02148 16.8157C9.25156 16.8157 10.3395 16.287 11.0967 15.4651L12.0186 14.4641L12.9375 15.468C13.6864 16.2861 14.7731 16.8157 16.0107 16.8157C17.2428 16.8156 18.3347 16.2854 19.083 15.468L20.0049 14.4612L20.9268 15.468C21.6751 16.2855 22.7668 16.8157 23.999 16.8157C25.2312 16.8157 26.3229 16.2854 27.0713 15.468L27.9932 14.4612L28.915 15.468C29.6634 16.2855 30.756 16.8157 31.9883 16.8157C32.1697 16.8157 32.3648 16.8018 32.5645 16.7776H32.5635C34.9572 16.4571 36.2254 13.6075 34.8574 11.4729L34.8564 11.4739L31.3398 5.99048L31.3389 5.98755C31.2614 5.86628 31.1053 5.77368 30.9277 5.77368Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <p class=\"mb-0 fw-semibold text-muted\">No reset request from store</p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n\r\n <!-- Send Ticket to Tango -->\r\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\r\n <h5 class=\"ff-section-title mb-1\">Send Ticket to Tango</h5>\r\n <div class=\"d-flex align-items-center mt-2\">\r\n <label class=\"me-2 mb-0 tango-label\">Send ticket to Tango if accuracy falls below</label>\r\n <div class=\"position-relative ff-select-wrapper compact ms-0\" [class.open]=\"issendTangoDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleSendTangoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('tangoReview')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"issendTangoDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of sendTicketTango\"\r\n (click)=\"selectSendTicketTango($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Actions -->\r\n <div *ngIf=\"!isEdit\">\r\n <div class=\"mb-5 w-100 footer-seperator\"></div>\r\n <div class=\"d-flex justify-content-end\">\r\n <a type=\"button\" class=\"btn btn-outline mt-1 pt-3 me-4\" (click)=\"onCancel()\">Cancel</a>\r\n <a type=\"submit\" class=\"btn btn-primary px-4\" (click)=\"onSubmit()\"><span>Save Changes</span></a>\r\n </div>\r\n </div>\r\n\r\n <!-- Category Modal -->\r\n <ng-template #categoryModal>\r\n <div class=\"modal-header border-0 pb-0\">\r\n <h5 class=\"modal-title\">\r\n {{ categoryModalMode === 'add' ? 'Add New Category' : 'Edit Category' }}\r\n </h5>\r\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"closeCategoryModal()\"></button>\r\n </div>\r\n <div class=\"modal-body category-modal-body\">\r\n <form [formGroup]=\"categoryForm\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Icon</label>\r\n <div class=\"ff-select-wrapper icon-select\" [class.open]=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryIconDropdown($event)\">\r\n <span class=\"d-inline-flex align-items-center gap-2\">\r\n <span class=\"category-icon\"\r\n [ngClass]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <ng-container\r\n [ngSwitch]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_icon_housekeeping)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_icon_housekeeping\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span class=\"icon-label\">{{ selectedCategoryIconLabel }}</span>\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option d-flex align-items-center gap-2\"\r\n *ngFor=\"let icon of categoryIcons\"\r\n (click)=\"selectCategoryIconFromDropdown($event, icon.value)\">\r\n <span class=\"category-icon\" [ngClass]=\"icon.value\">\r\n <ng-container [ngSwitch]=\"icon.value\">\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span>{{ icon.label }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Category Name</label>\r\n <input type=\"text\" class=\"form-control\"\r\n [class.is-invalid]=\"categoryForm.get('name')?.invalid && categoryForm.get('name')?.touched\"\r\n placeholder=\"Enter your new category\" formControlName=\"name\" />\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('required') && categoryForm.get('name')?.touched\">\r\n Category name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('duplicate') && categoryForm.get('name')?.touched\">\r\n Category name already exists.\r\n </small>\r\n </div>\r\n\r\n <div class=\"mb-2\">\r\n <label class=\"form-label text-muted\">Limitation</label>\r\n <div class=\"ff-select-wrapper\" [class.open]=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryLimitDropdown($event)\">\r\n <span>{{ categoryForm.get('limit')?.value || percentageList[0] }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectCategoryLimitValue($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"modal-footer border-0 pt-0\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeCategoryModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"submitCategoryForm()\">\r\n {{ categoryModalMode === 'add' ? 'Create' : 'Save' }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Delete Confirmation Modal -->\r\n <ng-template #deleteCategoryModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Confirmation</h5>\r\n <p class=\"mb-4 text-muted\">\r\n You're about to delete <span class=\"fw-semibold\">{{ categoryPendingDeleteName }}</span> category.\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeDeleteModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger\" (click)=\"confirmDeleteCategory()\">Delete</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Reset Store Requests Confirmation Modal -->\r\n <ng-template #resetConfirmationModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Reset Store Requests</h5>\r\n <p class=\"mb-4 text-muted\">\r\n Are you sure you want to proceed with resetting the selected <span class=\"fw-semibold\">{{\r\n resetRequest.arrayOfStores.length }}</span> store(s) requests?\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeResetModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"confirmResetStoreRequest()\">Reset</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n</form>\r\n", styles: ["::ng-deep .conditions-tooltip .tooltip-inner{max-width:450px;text-align:left;padding:10px 14px;font-size:12px;line-height:1.6}form{padding:32px 20px;border-radius:16px;font-family:Inter,Segoe UI,sans-serif}.ff-section-card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 1px 4px #0f172a0a}.ff-section-title{font-size:16px;font-weight:600;color:#101828}.ff-section-desc{font-size:13px;color:#667085}.ff-divider{margin:8px 24px;border-color:#e4e7ec}.form-check{display:flex;align-items:center;gap:10px}.form-check-input{width:42px;height:22px;cursor:pointer;accent-color:#2563eb;border:1px solid #d1d5db;transition:all .2s ease-in-out}.form-check-input:checked{background-color:#2563eb;border-color:#2563eb}.form-check-input:disabled{opacity:.6;cursor:not-allowed}input[type=radio].form-check-input{width:16px;height:16px;accent-color:#2563eb}input[type=radio]:checked{border-color:#2563eb}select.form-select{border:1px solid #d1d5db;border-radius:8px;height:38px;font-size:14px;color:#374151;padding:6px 10px;outline:none;transition:.2s}select.form-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.btn-outline{background-color:#fff;border:1px solid #d1d5db;color:#374151;padding:6px 16px;border-radius:8px;transition:all .2s}.btn-outline:hover{background:#f9fafb}.btn-primary{background-color:#2563eb;border:none;color:#fff;border-radius:8px;padding:6px 16px;transition:.2s}.btn-primary:hover{background-color:#1e40af}.approver-option{display:flex;flex-direction:column;justify-content:flex-start;width:220px}.custom-checkbox{position:relative;display:flex;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.custom-checkbox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer}.custom-checkbox .checkmark{height:18px;width:18px;min-width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease}.custom-checkbox input:checked~.checkmark{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.label-text{display:flex;flex-direction:column}.label-text .title{font-weight:600;color:#101828}.label-text .desc{font-size:13px;color:#667085;margin-top:2px;max-width:190px;line-height:1.4}.custom-checkbox input:not(:checked)~.label-text .desc{opacity:.6}.approver-option.disabled-option{opacity:.6;pointer-events:none}.approver-option.disabled-option .custom-checkbox.disabled-checkbox{cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .checkmark{background-color:#f3f4f6;border-color:#d1d5dd;cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark{background-color:#f3f4f6;border-color:#d1d5dd}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg);opacity:.5}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .title{color:#9ca3af}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .desc{color:#d1d5dd}.switch{position:relative;display:inline-block;width:44px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ddd;transition:.3s;border-radius:22px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}input:checked+.slider{background-color:#4c9aff}input:checked+.slider:before{transform:translate(21px)}.switch.disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.switch.disabled .slider{cursor:not-allowed;background-color:#e5e7eb}.switch.disabled input:checked+.slider{background-color:#7dd3fc}.category-grid{display:flex;flex-wrap:wrap;gap:12px}.category-card{min-width:180px;border:1px solid #e5e7eb;border-radius:10px;padding:12px;background-color:#fff;box-shadow:0 1px 3px #1018280f;position:relative;display:flex;flex-direction:column;gap:12px}.category-card-header{display:flex;align-items:center;gap:10px}.category-icon{width:32px;height:32px;min-width:32px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.category-name{font-weight:500;color:#101828;font-size:14px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-percentage-section{width:100%}.category-percentage-section .ff-select-wrapper.compact{width:100%;min-width:auto}.category-percentage-section .ff-select-toggle.small{width:100%;min-height:36px;padding:6px 10px;font-size:13px}.category-menu-btn{border:none;background:transparent;padding:4px;line-height:1;cursor:pointer;flex-shrink:0;margin-left:4px;display:inline-flex;align-items:center;justify-content:center}.category-menu-btn:disabled{cursor:default}.category-menu{position:absolute;top:48px;right:16px;background:#fff;border:1px solid #e4e7ec;border-radius:10px;box-shadow:0 12px 30px #0f172a26;min-width:140px;z-index:5;padding:4px}.category-menu button{width:100%;text-align:left;background:transparent;border:none;padding:8px 10px;border-radius:8px;font-size:13px;color:#101828}.category-menu button:hover{background:#f4f7fb}.duplicateTag{background:#4755691f;color:#475569}.employeeTag{background:#3b82f61f;color:#3b82f6}.houseKeepingTag{background:#22c55e1f;color:#22c55e}.junkTag{background:#ef44441f;color:#ef4444}.purpleTag{background:#7c3aed1f;color:#7c3aed}.orangeTag{background:#ea580c1f;color:#ea580c}.add-new-btn{background:#fff;border:1px solid #d0d5dd;border-radius:10px;padding:5px 13px;font-size:14px;font-weight:600;color:#101828;transition:all .2s ease;cursor:pointer;display:inline-flex;align-items:center;gap:8px;box-shadow:0 1px 2px #1018280d}.add-new-btn:hover:not(:disabled){background:#f9fafb;border-color:#004aad;color:#004aad;box-shadow:0 2px 4px #10182814}.add-new-btn:active:not(:disabled){background:#f4f7fb;transform:translateY(1px);box-shadow:0 1px 2px #1018280d}.add-new-btn:disabled{opacity:.6;cursor:not-allowed;background:#f9fafb;border-color:#e5e7eb;color:#9ca3af}.add-new-btn svg{transition:transform .2s ease;flex-shrink:0}.add-new-btn:hover:not(:disabled) svg{transform:rotate(90deg)}.info-icon{display:inline-flex;justify-content:center;align-items:center;width:18px;height:18px;font-size:11px;font-weight:600;border-radius:50%;background:#f3f3f3;color:#555;cursor:pointer;margin-left:6px;border:1.5px solid #8a8a8a}.tango-label{font-size:13px;color:#475467;font-weight:500}.store-requests-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.reset-btn{border-width:1px;border-color:#d0d5dd;color:#004aad;font-weight:600;padding:6px 18px;background-color:#fff;transition:all .2s ease}.reset-btn svg path{stroke:currentColor}.reset-btn .spinner-border{color:#004aad}.reset-btn:disabled{opacity:.6;cursor:not-allowed}.reset-btn:not(:disabled):hover{background-color:#f4f7fb;border-color:#004aad;box-shadow:0 1px 2px #1018280f}.restriction-criteria{padding:16px 0;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb}.custom-checkbox-select{position:relative;display:flex;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-checkbox-select input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;width:0;height:0}.checkmark-select{height:18px;width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease;position:relative}.custom-checkbox-select input:checked~.checkmark-select{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox-select input:checked~.checkmark-select:after{content:\"\";position:absolute;left:7px;top:3px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.dropdown-arrow{cursor:pointer;transition:transform .2s}.dropdown-arrow:hover{transform:translateY(2px)}.store-requests-table{margin-top:16px;position:relative;border:1px solid #e5e7eb;border-radius:10px;overflow:hidden}.store-requests-table.disabled{pointer-events:none;opacity:.6;-webkit-user-select:none;user-select:none}.store-requests-table-content{border-collapse:collapse;border-spacing:0;width:100%;margin-bottom:0}.store-requests-table-content thead{background:linear-gradient(180deg,#f0f6ff,#f7f9fc)}.store-requests-table-content thead th{padding:14px 16px;font-weight:600;font-size:12px;color:#475467;text-align:left;border-bottom:1px solid #e5e7eb;white-space:nowrap;vertical-align:middle;text-transform:uppercase;letter-spacing:.04em}.store-requests-table-content tbody td{padding:14px 16px;font-size:13px;color:#344054;border-bottom:1px solid #f2f4f7;vertical-align:middle}.store-requests-table-content tbody tr{transition:background .15s}.store-requests-table-content tbody tr:hover{background-color:#f8fbff}.store-requests-table-content tbody tr:last-child td{border-bottom:none}.store-table-scroll{max-height:360px;overflow-y:auto}.store-table-scroll table{margin-bottom:0}.store-table-scroll .store-requests-table-content thead th{position:sticky;top:0;z-index:2;background:#f0f6ff}.checkbox-column{width:50px;padding-left:16px!important;padding-right:0!important}.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;position:relative}.sortable:hover{background-color:#e8eef8}.sort-icon{opacity:.5;transition:opacity .2s}.sortable:hover .sort-icon{opacity:1}.store-name-column{min-width:240px}.store-name-column .column-header{justify-content:space-between}.store-name-column .select-all-row{padding-top:8px;margin-top:8px;border-top:1px solid #e5e7eb}.empty-store-state{border:1px dashed #c7d7f0;border-radius:12px;padding:40px 16px;background:#f9fbff;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-store-icon{display:inline-flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:50%;background:#2e90fa1f}.store-days-select .ff-select-toggle{min-width:99px}.store-days-select .ff-select-toggle span{white-space:nowrap}.ff-select-wrapper{width:100%;position:relative}.ff-select-wrapper.compact{width:auto;min-width:80px}.ff-select-wrapper.disabled{pointer-events:none;opacity:.7}.ff-select-wrapper.open .ff-select-toggle svg{transform:rotate(180deg)}.ff-select-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid #d0d5dd;border-radius:10px;padding:8px 12px;background:#fff;font-weight:600;color:#101828;min-height:40px}.ff-select-toggle.small{min-height:36px;padding:6px 10px;font-size:13px}.ff-select-toggle svg{transition:transform .2s ease}.ff-select-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#fff;border:1px solid #e4e7ec;border-radius:12px;box-shadow:0 16px 40px #0f172a26;max-height:220px;overflow-y:auto;z-index:15;padding:4px}.ff-select-option{width:100%;text-align:left;border:none;background:transparent;padding:8px 10px;border-radius:8px;font-size:14px;color:#101828}.ff-select-option:hover{background:#f4f7fb}.category-modal-body .form-control,.category-modal-body .form-select{border-radius:10px;min-height:44px}.category-modal-body .form-label{font-size:13px}.category-modal-body .text-danger{font-size:12px}.custom-modal{border-radius:16px;padding:10px 20px 20px;background:#fff;box-shadow:0 10px 40px #00000014;width:500px}.field-label{color:#8b8b8b;font-size:14px;margin-bottom:4px;display:block}.input-box{width:100%;height:46px;border:1px solid #e5e7eb;border-radius:10px;padding:0 14px;font-size:15px;background:#f8fafc;display:flex;align-items:center}.input-box:focus-within{border-color:#4daeff;background:#fff;box-shadow:0 0 0 2px #4daeff26}.icon-row{display:flex}.icon-box{width:60px;cursor:pointer;justify-content:space-between}.clean-select{border:none;width:100%;height:100%;background:transparent;font-size:15px;outline:none}.select-box{padding:0}.button-area{display:flex;justify-content:space-between;gap:15px}.btn-cancel{width:50%;height:46px;border-radius:10px;border:1px solid #dbdbdb;background:#fff;font-weight:500;cursor:pointer}.btn-create{width:50%;height:46px;border-radius:10px;border:none;background:#0094ff;color:#fff;font-weight:600;cursor:pointer}.btn-create:hover{background:#007bdb}.card .btn-outline.btn-sm{padding:6px 10px;border-radius:8px}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TitleCasePipe, name: "titlecase" }] });
834
834
  }
835
835
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FootfallConfigurationComponent, decorators: [{
836
836
  type: Component,
837
- args: [{ selector: 'lib-footfall-configuration', template: "<form [formGroup]=\"footfallDirConfigurationForm\" class=\"container-fluid\">\n <ng-container *ngIf=\"(gs.userAccess | async)?.Global_Configuration_isEdit\">\n <div *ngIf=\"isEdit\" class=\"col-12 mb-5\">\n <div class=\"d-flex justify-content-end\">\n <button (click)=\"toggleForm();\" type=\"button\" class=\"btn btn-outline py-3 align-items-end\">\n <span class=\"me-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clip-path=\"url(#clip0_2579_25125)\">\n <path\n d=\"M14.167 2.49993C14.3859 2.28106 14.6457 2.10744 14.9317 1.98899C15.2176 1.87054 15.5241 1.80957 15.8337 1.80957C16.1432 1.80957 16.4497 1.87054 16.7357 1.98899C17.0216 2.10744 17.2815 2.28106 17.5003 2.49993C17.7192 2.7188 17.8928 2.97863 18.0113 3.2646C18.1297 3.55057 18.1907 3.85706 18.1907 4.16659C18.1907 4.47612 18.1297 4.78262 18.0113 5.06859C17.8928 5.35455 17.7192 5.61439 17.5003 5.83326L6.25033 17.0833L1.66699 18.3333L2.91699 13.7499L14.167 2.49993Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_2579_25125\">\n <rect width=\"20\" height=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </span>Edit Details\n </button>\n </div>\n </div>\n </ng-container>\n\n <!-- Approver Configuration -->\n <div class=\"card p-4 mb-4 ff-section-card\">\n <h5 class=\"ff-section-title mb-1\">Approver configuration</h5>\n <p class=\"ff-section-desc mb-4\">\n Set level of revisions required for a store raised tickets\n </p>\n\n <div formArrayName=\"revision\" class=\"d-flex flex-wrap gap-5\">\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\"\n class=\"approver-option d-flex flex-column\"\n [class.disabled-option]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\n\n <label class=\"custom-checkbox align-items-start\"\n [class.disabled-checkbox]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\n <input type=\"checkbox\" formControlName=\"isChecked\" [id]=\"'action-' + i\" />\n <span class=\"checkmark\"></span>\n <div class=\"label-text\">\n <div class=\"title\">\n {{ rev.get('actionType')?.value | titlecase }}\n </div>\n <div class=\"desc text-muted\">\n <ng-container [ngSwitch]=\"rev.get('actionType')?.value\">\n <span *ngSwitchCase=\"'reviewer'\">The ticket undergoes a single review to verify\n footfall.</span>\n <span *ngSwitchCase=\"'approver'\">The ticket undergoes a final review after the initial\n check.</span>\n <span *ngSwitchCase=\"'tango'\">Finalize tickets and update footfall count.</span>\n </ng-container>\n </div>\n </div>\n </label>\n\n </div>\n </div>\n </div>\n\n <hr class=\"ff-divider\">\n\n <!-- Store SPOC Ticket Creation -->\n <div class=\"card p-4 mb-4 ff-section-card\">\n <h5 class=\"ff-section-title mb-3\">Store SPOC Ticket Creation</h5>\n\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\n <label class=\"mb-0\">\n Allow store SPOC to create tickets only for the last\n </label>\n\n <div class=\"position-relative ff-select-wrapper compact ms-2\"\n [class.open]=\"isAllowTicketCreationDropdownOpen\" [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\"\n (click)=\"toggleAllowTicketCreationDropdown($event)\">\n <span>{{ footfallDirConfigurationForm.get('allowTicketCreation')?.value ||\n spocTicketCreationdays[0] }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isAllowTicketCreationDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let day of spocTicketCreationdays\"\n (click)=\"selectAllowTicketCreation($event, day)\">\n {{ day }}\n </button>\n </div>\n </div>\n\n <span class=\"mb-0\">Days</span>\n </div>\n </div>\n\n <hr class=\"ff-divider\">\n\n <!-- Ticket Auto-close -->\n <div class=\"card p-4 mb-4 ff-section-card\">\n <div class=\"d-flex align-items-center mb-2\">\n <h5 class=\"ff-section-title m-0\">Ticket Auto-close</h5>\n\n <label class=\"switch m-0 ms-3\" [class.disabled]=\"isEdit\">\n <input type=\"checkbox\" formControlName=\"isAutoCloseEnable\" [disabled]=\"isEdit\">\n <span class=\"slider round\"></span>\n </label>\n </div>\n\n <div class=\"d-flex align-items-center mt-2\">\n <span class=\"mb-0\">\n Ticket should be auto-closed, if the created ticket accuracy is greater than or equal to\n </span>\n\n <div class=\"position-relative ff-select-wrapper compact ms-2\" [class.open]=\"isAutoCloseDropdownOpen\"\n [class.disabled]=\"isEdit || !footfallDirConfigurationForm.get('isAutoCloseEnable')?.value\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleAutoCloseDropdown($event)\">\n <span>{{ footfallDirConfigurationForm.get('autoCloseAccuracy')?.value || '1%' }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isAutoCloseDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of accuracyPercentageList\"\n (click)=\"selectAutoCloseAccuracy($event, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <hr class=\"ff-divider\">\n\n <!-- Footfall Directory Limitations -->\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\n <div>\n <h5 class=\"ff-section-title m-0\">Footfall directory limitations</h5>\n <p class=\"ff-section-desc mb-2\">\n Set maximum limitation for stores to tag non-Purchasers from Total Footfall\n </p>\n </div>\n\n <button type=\"button\" [disabled]=\"isEdit\" class=\"add-new-btn d-inline-flex align-items-center gap-2\"\n (click)=\"openCategoryModal('add')\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 3.33334V12.6667M3.33334 8H12.6667\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span>Add New</span>\n </button>\n </div>\n\n <!-- Category Cards Grid -->\n <div formArrayName=\"taggingLimitation\" class=\"category-grid mt-3\">\n <div *ngFor=\"let tag of tagLimits.controls; let i = index\" [formGroupName]=\"i\" class=\"category-card\">\n <div class=\"category-card-header\">\n <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\">\n <ng-container [ngSwitch]=\"tag.get('iconName')?.value\">\n <svg *ngSwitchCase=\"'duplicateTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\"\n height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <g clip-path=\"url(#clip0_1162_24621)\">\n <path\n d=\"M2.5 7.5H2C1.73478 7.5 1.48043 7.39464 1.29289 7.20711C1.10536 7.01957 1 6.76522 1 6.5V2C1 1.73478 1.10536 1.48043 1.29289 1.29289C1.48043 1.10536 1.73478 1 2 1H6.5C6.76522 1 7.01957 1.10536 7.20711 1.29289C7.39464 1.48043 7.5 1.73478 7.5 2V2.5M5.5 4.5H10C10.5523 4.5 11 4.94772 11 5.5V10C11 10.5523 10.5523 11 10 11H5.5C4.94772 11 4.5 10.5523 4.5 10V5.5C4.5 4.94772 4.94772 4.5 5.5 4.5Z\"\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1162_24621\">\n <rect width=\"12\" height=\"12\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n\n <svg *ngSwitchCase=\"'employeeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\n height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\">\n <path\n d=\"M11.1667 12.5V11.1667C11.1667 10.4594 10.8857 9.78115 10.3856 9.28105C9.88552 8.78095 9.20724 8.5 8.5 8.5H3.16667C2.45942 8.5 1.78115 8.78095 1.28105 9.28105C0.780952 9.78115 0.5 10.4594 0.5 11.1667V12.5M15.1667 12.5V11.1667C15.1662 10.5758 14.9696 10.0018 14.6076 9.53488C14.2456 9.06791 13.7388 8.73438 13.1667 8.58667M10.5 0.586667C11.0736 0.733534 11.582 1.06713 11.9451 1.53487C12.3082 2.00261 12.5052 2.57789 12.5052 3.17C12.5052 3.76211 12.3082 4.33739 11.9451 4.80513C11.582 5.27287 11.0736 5.60647 10.5 5.75333M8.5 3.16667C8.5 4.63943 7.30609 5.83333 5.83333 5.83333C4.36057 5.83333 3.16667 4.63943 3.16667 3.16667C3.16667 1.69391 4.36057 0.5 5.83333 0.5C7.30609 0.5 8.5 1.69391 8.5 3.16667Z\"\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1162_24650)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1162_24650\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\n fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\n fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-container>\n </div>\n <div class=\"category-name\">\n {{ tag.get('name')?.value }}\n </div>\n <button\n *ngIf=\"(tag.get('iconName')?.value !== 'duplicateTag' && tag.get('iconName')?.value !== 'employeeTag')\"\n type=\"button\" class=\"category-menu-btn\" (click)=\"toggleCategoryMenu($event, i)\"\n [disabled]=\"isEdit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"none\"\n viewBox=\"0 0 24 24\">\n <path\n d=\"M12 5C12.5523 5 13 4.55228 13 4C13 3.44772 12.5523 3 12 3C11.4477 3 11 3.44772 11 4C11 4.55228 11.4477 5 12 5Z\"\n fill=\"#475467\" />\n <path\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\n fill=\"#475467\" />\n <path\n d=\"M12 21C12.5523 21 13 20.5523 13 20C13 19.4477 12.5523 19 12 19C11.4477 19 11 19.4477 11 20C11 20.5523 11.4477 21 12 21Z\"\n fill=\"#475467\" />\n </svg>\n </button>\n <div class=\"category-menu\" *ngIf=\"activeMenuIndex === i\">\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'edit', i)\">Edit Name</button>\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'delete', i)\">Delete</button>\n </div>\n </div>\n\n <div class=\"category-percentage-section\">\n <div class=\"position-relative ff-select-wrapper compact\"\n [class.open]=\"openLimitDropdownIndex === i\" [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\"\n (click)=\"toggleLimitDropdown($event, i)\">\n <span>{{ tag.get('value')?.value || 0 }}%</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"openLimitDropdownIndex === i\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\n (click)=\"selectLimitValue($event, i, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\n\n <!-- Store Requests -->\n <div formGroupName=\"accuracyBreach\" class=\"card p-4 mb-4 ff-section-card\">\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\n <div>\n <h5 class=\"ff-section-title mb-2\">Store Requests</h5>\n <p class=\"ff-section-desc mb-0\">\n Below stores have requested to raise a ticket after breaching the configured limit\n <span class=\"info-icon\">i</span>\n </p>\n </div>\n <button type=\"button\" class=\"btn btn-primary reset-btn d-inline-flex align-items-center gap-2\"\n *ngIf=\"!isEdit\" [disabled]=\"isResetDisabled\" (click)=\"openResetConfirmationModal()\" aria-live=\"polite\">\n <span>Reset</span>\n </button>\n </div>\n\n <!-- Restriction Criteria -->\n <div class=\"restriction-criteria mb-4\">\n <label class=\"mb-3 d-block\">\n Restrict ticket creation for any store that:\n </label>\n <div class=\"d-flex align-items-center flex-nowrap gap-2\">\n <span>Has raised more than</span>\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isTicketCountDropdownOpen\"\n [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleTicketCountDropdown($event)\">\n <span>\n {{ footfallDirConfigurationForm.get('accuracyBreach.ticketCount')?.value || 1 }}\n </span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isTicketCountDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let c of [1, 2, 3, 4, 5]\"\n (click)=\"selectTicketCount($event, c)\">\n {{ c }}\n </button>\n </div>\n </div>\n <span>tickets in the calender</span>\n <div class=\"position-relative ff-select-wrapper compact store-days-select\"\n [class.open]=\"isStoreDaysDropdownOpen\" [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreDaysDropdown($event)\">\n <span>{{ selectedDaysLabel }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isStoreDaysDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let opt of daysOptions\"\n (click)=\"selectStoreDays($event, opt)\">\n {{ opt.label }}\n </button>\n </div>\n </div>\n <span>based on configured conditions\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n placement=\"top\" [ngbTooltip]=\"conditionsTooltip\" tooltipClass=\"conditions-tooltip\">\n <g clip-path=\"url(#clip0_1432_80035)\">\n <path\n d=\"M8.00065 10.6666V7.99992M8.00065 5.33325H8.00732M14.6673 7.99992C14.6673 11.6818 11.6826 14.6666 8.00065 14.6666C4.31875 14.6666 1.33398 11.6818 1.33398 7.99992C1.33398 4.31802 4.31875 1.33325 8.00065 1.33325C11.6826 1.33325 14.6673 4.31802 14.6673 7.99992Z\"\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1432_80035\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <ng-template #conditionsTooltip>\n <div style=\"text-align: left; font-size: 12px; line-height: 1.6;\">\n <b>1.</b> Delta between Store/AOM accuracy and Central Ops/Tango accuracy exceeds 10%<br>\n <b>2.</b> The overall accuracy after all reviews is greater than 85%.<br>\n <b>3.</b> Overall the Number of Images (Footfall) marked for validation in the ticket by the\n Store is Less than equal to 10\n </div>\n </ng-template>\n </div>\n </div>\n\n <!-- Store Requests Table -->\n <div class=\"store-requests-table\" [class.disabled]=\"isEdit\"\n *ngIf=\"storeList?.length > 0; else emptyStoreRequests\">\n <div class=\"table-responsive\" [ngClass]=\"{'store-table-scroll': storeList?.length > 5}\">\n <table class=\"table table-hover store-requests-table-content\">\n <thead>\n <tr>\n <th class=\"checkbox-column\">\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\n <input type=\"checkbox\" [checked]=\"isAllSelected\" [disabled]=\"isEdit\"\n (change)=\"toggleSelectAll($event)\" />\n <span class=\"checkmark-select\"></span>\n\n </label>\n </th>\n <th class=\"sortable store-name-column\">\n <div class=\"d-flex align-items-center\">\n <span>Select all stores ({{ storeList?.length || 0 }})</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" class=\"ms-2 dropdown-arrow\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#344054\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </th>\n <th class=\"sortable\">\n Raised on\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\n fill=\"none\" class=\"ms-1 sort-icon\">\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"sortable\">\n Last raised(Approved)\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\n fill=\"none\" class=\"ms-1 sort-icon\">\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"sortable\">\n No of Time Raised\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\n fill=\"none\" class=\"ms-1 sort-icon\">\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let store of storeList\">\n <td class=\"checkbox-column\">\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\n <input #cb type=\"checkbox\" [checked]=\"isStoreSelected(store)\" [disabled]=\"isEdit\"\n (change)=\"toggleStoreSelection(store, cb.checked)\" />\n <span class=\"checkmark-select\"></span>\n </label>\n </td>\n <td>{{ store.storeName }}</td>\n <td>{{ store.raisedOn }}</td>\n <td>{{ store.lastApproved || '-' }}</td>\n <td>{{ store.totalRaised }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <ng-template #emptyStoreRequests>\n <div class=\"empty-store-state text-center\">\n <div class=\"empty-store-icon mb-3\">\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.94629 21.1995C8.645 21.2313 8.33828 21.2502 8.02734 21.2502C7.85782 21.2502 7.69052 21.2434 7.52539 21.2336V31.6067C7.52539 33.0347 8.70837 34.2258 10.1963 34.2258H29.8008C31.2888 34.2258 32.4717 33.0347 32.4717 31.6067V21.2346C32.3098 21.2438 32.1459 21.2502 31.9814 21.2502C31.6675 21.2502 31.3569 21.2323 31.0508 21.1995V28.9875H8.94629V21.1995ZM30.9277 5.77368H9.06934C8.89197 5.77368 8.73671 5.86647 8.65918 5.98755L8.65723 5.9895L5.14746 11.4729L5.05273 11.6204C3.82719 13.7402 5.0918 16.4671 7.44336 16.7766C7.64428 16.8011 7.83403 16.8157 8.02148 16.8157C9.25156 16.8157 10.3395 16.287 11.0967 15.4651L12.0186 14.4641L12.9375 15.468C13.6864 16.2861 14.7731 16.8157 16.0107 16.8157C17.2428 16.8156 18.3347 16.2854 19.083 15.468L20.0049 14.4612L20.9268 15.468C21.6751 16.2855 22.7668 16.8157 23.999 16.8157C25.2312 16.8157 26.3229 16.2854 27.0713 15.468L27.9932 14.4612L28.915 15.468C29.6634 16.2855 30.756 16.8157 31.9883 16.8157C32.1697 16.8157 32.3648 16.8018 32.5645 16.7776H32.5635C34.9572 16.4571 36.2254 13.6075 34.8574 11.4729L34.8564 11.4739L31.3398 5.99048L31.3389 5.98755C31.2614 5.86628 31.1053 5.77368 30.9277 5.77368Z\"\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\n </svg>\n </div>\n <p class=\"mb-0 fw-semibold text-muted\">No reset request from store</p>\n </div>\n </ng-template>\n </div>\n\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\n\n <!-- Send Ticket to Tango -->\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\n <h5 class=\"ff-section-title mb-1\">Send Ticket to Tango</h5>\n <div class=\"d-flex align-items-center mt-2\">\n <label class=\"me-2 mb-0 tango-label\">Send ticket to Tango if accuracy falls below</label>\n <div class=\"position-relative ff-select-wrapper compact ms-0\" [class.open]=\"issendTangoDropdownOpen\"\n [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleSendTangoCloseDropdown($event)\">\n <span>{{ footfallDirConfigurationForm.get('tangoReview')?.value || '1%' }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"issendTangoDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of sendTicketTango\"\n (click)=\"selectSendTicketTango($event, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Footer Actions -->\n <div *ngIf=\"!isEdit\">\n <div class=\"mb-5 w-100 footer-seperator\"></div>\n <div class=\"d-flex justify-content-end\">\n <a type=\"button\" class=\"btn btn-outline mt-1 pt-3 me-4\" (click)=\"onCancel()\">Cancel</a>\n <a type=\"submit\" class=\"btn btn-primary px-4\" (click)=\"onSubmit()\"><span>Save Changes</span></a>\n </div>\n </div>\n\n <!-- Category Modal -->\n <ng-template #categoryModal>\n <div class=\"modal-header border-0 pb-0\">\n <h5 class=\"modal-title\">\n {{ categoryModalMode === 'add' ? 'Add New Category' : 'Edit Category' }}\n </h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"closeCategoryModal()\"></button>\n </div>\n <div class=\"modal-body category-modal-body\">\n <form [formGroup]=\"categoryForm\">\n <div class=\"mb-3\">\n <label class=\"form-label text-muted\">Icon</label>\n <div class=\"ff-select-wrapper icon-select\" [class.open]=\"isCategoryIconDropdownOpen\">\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryIconDropdown($event)\">\n <span class=\"d-inline-flex align-items-center gap-2\">\n <span class=\"category-icon\"\n [ngClass]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\n <ng-container\n [ngSwitch]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_icon_housekeeping)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_icon_housekeeping\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-container>\n </span>\n <span class=\"icon-label\">{{ selectedCategoryIconLabel }}</span>\n </span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryIconDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option d-flex align-items-center gap-2\"\n *ngFor=\"let icon of categoryIcons\"\n (click)=\"selectCategoryIconFromDropdown($event, icon.value)\">\n <span class=\"category-icon\" [ngClass]=\"icon.value\">\n <ng-container [ngSwitch]=\"icon.value\">\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1162_24650)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1162_24650\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-container>\n </span>\n <span>{{ icon.label }}</span>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3\">\n <label class=\"form-label text-muted\">Category Name</label>\n <input type=\"text\" class=\"form-control\"\n [class.is-invalid]=\"categoryForm.get('name')?.invalid && categoryForm.get('name')?.touched\"\n placeholder=\"Enter your new category\" formControlName=\"name\" />\n <small class=\"text-danger\"\n *ngIf=\"categoryForm.get('name')?.hasError('required') && categoryForm.get('name')?.touched\">\n Category name is required.\n </small>\n <small class=\"text-danger\"\n *ngIf=\"categoryForm.get('name')?.hasError('duplicate') && categoryForm.get('name')?.touched\">\n Category name already exists.\n </small>\n </div>\n\n <div class=\"mb-2\">\n <label class=\"form-label text-muted\">Limitation</label>\n <div class=\"ff-select-wrapper\" [class.open]=\"isCategoryLimitDropdownOpen\">\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryLimitDropdown($event)\">\n <span>{{ categoryForm.get('limit')?.value || percentageList[0] }}%</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryLimitDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\n (click)=\"selectCategoryLimitValue($event, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </form>\n </div>\n <div class=\"modal-footer border-0 pt-0\">\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeCategoryModal()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"submitCategoryForm()\">\n {{ categoryModalMode === 'add' ? 'Create' : 'Save' }}\n </button>\n </div>\n </ng-template>\n\n <!-- Delete Confirmation Modal -->\n <ng-template #deleteCategoryModal>\n <div class=\"modal-body text-center p-4\">\n <h5 class=\"fw-semibold mb-2\">Confirmation</h5>\n <p class=\"mb-4 text-muted\">\n You're about to delete <span class=\"fw-semibold\">{{ categoryPendingDeleteName }}</span> category.\n </p>\n <div class=\"d-flex justify-content-center gap-3\">\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeDeleteModal()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-danger\" (click)=\"confirmDeleteCategory()\">Delete</button>\n </div>\n </div>\n </ng-template>\n\n <!-- Reset Store Requests Confirmation Modal -->\n <ng-template #resetConfirmationModal>\n <div class=\"modal-body text-center p-4\">\n <h5 class=\"fw-semibold mb-2\">Reset Store Requests</h5>\n <p class=\"mb-4 text-muted\">\n Are you sure you want to proceed with resetting the selected <span class=\"fw-semibold\">{{\n resetRequest.arrayOfStores.length }}</span> store(s) requests?\n </p>\n <div class=\"d-flex justify-content-center gap-3\">\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeResetModal()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"confirmResetStoreRequest()\">Reset</button>\n </div>\n </div>\n </ng-template>\n\n</form>\n", styles: ["::ng-deep .conditions-tooltip .tooltip-inner{max-width:450px;text-align:left;padding:10px 14px;font-size:12px;line-height:1.6}form{padding:32px 20px;border-radius:16px;font-family:Inter,Segoe UI,sans-serif}.ff-section-card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 1px 4px #0f172a0a}.ff-section-title{font-size:16px;font-weight:600;color:#101828}.ff-section-desc{font-size:13px;color:#667085}.ff-divider{margin:8px 24px;border-color:#e4e7ec}.form-check{display:flex;align-items:center;gap:10px}.form-check-input{width:42px;height:22px;cursor:pointer;accent-color:#2563eb;border:1px solid #d1d5db;transition:all .2s ease-in-out}.form-check-input:checked{background-color:#2563eb;border-color:#2563eb}.form-check-input:disabled{opacity:.6;cursor:not-allowed}input[type=radio].form-check-input{width:16px;height:16px;accent-color:#2563eb}input[type=radio]:checked{border-color:#2563eb}select.form-select{border:1px solid #d1d5db;border-radius:8px;height:38px;font-size:14px;color:#374151;padding:6px 10px;outline:none;transition:.2s}select.form-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.btn-outline{background-color:#fff;border:1px solid #d1d5db;color:#374151;padding:6px 16px;border-radius:8px;transition:all .2s}.btn-outline:hover{background:#f9fafb}.btn-primary{background-color:#2563eb;border:none;color:#fff;border-radius:8px;padding:6px 16px;transition:.2s}.btn-primary:hover{background-color:#1e40af}.approver-option{display:flex;flex-direction:column;justify-content:flex-start;width:220px}.custom-checkbox{position:relative;display:flex;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.custom-checkbox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer}.custom-checkbox .checkmark{height:18px;width:18px;min-width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease}.custom-checkbox input:checked~.checkmark{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.label-text{display:flex;flex-direction:column}.label-text .title{font-weight:600;color:#101828}.label-text .desc{font-size:13px;color:#667085;margin-top:2px;max-width:190px;line-height:1.4}.custom-checkbox input:not(:checked)~.label-text .desc{opacity:.6}.approver-option.disabled-option{opacity:.6;pointer-events:none}.approver-option.disabled-option .custom-checkbox.disabled-checkbox{cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .checkmark{background-color:#f3f4f6;border-color:#d1d5dd;cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark{background-color:#f3f4f6;border-color:#d1d5dd}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg);opacity:.5}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .title{color:#9ca3af}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .desc{color:#d1d5dd}.switch{position:relative;display:inline-block;width:44px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ddd;transition:.3s;border-radius:22px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}input:checked+.slider{background-color:#4c9aff}input:checked+.slider:before{transform:translate(21px)}.switch.disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.switch.disabled .slider{cursor:not-allowed;background-color:#e5e7eb}.switch.disabled input:checked+.slider{background-color:#7dd3fc}.category-grid{display:flex;flex-wrap:wrap;gap:12px}.category-card{min-width:180px;border:1px solid #e5e7eb;border-radius:10px;padding:12px;background-color:#fff;box-shadow:0 1px 3px #1018280f;position:relative;display:flex;flex-direction:column;gap:12px}.category-card-header{display:flex;align-items:center;gap:10px}.category-icon{width:32px;height:32px;min-width:32px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.category-name{font-weight:500;color:#101828;font-size:14px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-percentage-section{width:100%}.category-percentage-section .ff-select-wrapper.compact{width:100%;min-width:auto}.category-percentage-section .ff-select-toggle.small{width:100%;min-height:36px;padding:6px 10px;font-size:13px}.category-menu-btn{border:none;background:transparent;padding:4px;line-height:1;cursor:pointer;flex-shrink:0;margin-left:4px;display:inline-flex;align-items:center;justify-content:center}.category-menu-btn:disabled{cursor:default}.category-menu{position:absolute;top:48px;right:16px;background:#fff;border:1px solid #e4e7ec;border-radius:10px;box-shadow:0 12px 30px #0f172a26;min-width:140px;z-index:5;padding:4px}.category-menu button{width:100%;text-align:left;background:transparent;border:none;padding:8px 10px;border-radius:8px;font-size:13px;color:#101828}.category-menu button:hover{background:#f4f7fb}.duplicateTag{background:#4755691f;color:#475569}.employeeTag{background:#3b82f61f;color:#3b82f6}.houseKeepingTag{background:#22c55e1f;color:#22c55e}.junkTag{background:#ef44441f;color:#ef4444}.purpleTag{background:#7c3aed1f;color:#7c3aed}.orangeTag{background:#ea580c1f;color:#ea580c}.add-new-btn{background:#fff;border:1px solid #d0d5dd;border-radius:10px;padding:5px 13px;font-size:14px;font-weight:600;color:#101828;transition:all .2s ease;cursor:pointer;display:inline-flex;align-items:center;gap:8px;box-shadow:0 1px 2px #1018280d}.add-new-btn:hover:not(:disabled){background:#f9fafb;border-color:#004aad;color:#004aad;box-shadow:0 2px 4px #10182814}.add-new-btn:active:not(:disabled){background:#f4f7fb;transform:translateY(1px);box-shadow:0 1px 2px #1018280d}.add-new-btn:disabled{opacity:.6;cursor:not-allowed;background:#f9fafb;border-color:#e5e7eb;color:#9ca3af}.add-new-btn svg{transition:transform .2s ease;flex-shrink:0}.add-new-btn:hover:not(:disabled) svg{transform:rotate(90deg)}.info-icon{display:inline-flex;justify-content:center;align-items:center;width:18px;height:18px;font-size:11px;font-weight:600;border-radius:50%;background:#f3f3f3;color:#555;cursor:pointer;margin-left:6px;border:1.5px solid #8a8a8a}.tango-label{font-size:13px;color:#475467;font-weight:500}.store-requests-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.reset-btn{border-width:1px;border-color:#d0d5dd;color:#004aad;font-weight:600;padding:6px 18px;background-color:#fff;transition:all .2s ease}.reset-btn svg path{stroke:currentColor}.reset-btn .spinner-border{color:#004aad}.reset-btn:disabled{opacity:.6;cursor:not-allowed}.reset-btn:not(:disabled):hover{background-color:#f4f7fb;border-color:#004aad;box-shadow:0 1px 2px #1018280f}.restriction-criteria{padding:16px 0;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb}.custom-checkbox-select{position:relative;display:flex;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-checkbox-select input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;width:0;height:0}.checkmark-select{height:18px;width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease;position:relative}.custom-checkbox-select input:checked~.checkmark-select{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox-select input:checked~.checkmark-select:after{content:\"\";position:absolute;left:7px;top:3px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.dropdown-arrow{cursor:pointer;transition:transform .2s}.dropdown-arrow:hover{transform:translateY(2px)}.store-requests-table{margin-top:16px;position:relative;border:1px solid #e5e7eb;border-radius:10px;overflow:hidden}.store-requests-table.disabled{pointer-events:none;opacity:.6;-webkit-user-select:none;user-select:none}.store-requests-table-content{border-collapse:collapse;border-spacing:0;width:100%;margin-bottom:0}.store-requests-table-content thead{background:linear-gradient(180deg,#f0f6ff,#f7f9fc)}.store-requests-table-content thead th{padding:14px 16px;font-weight:600;font-size:12px;color:#475467;text-align:left;border-bottom:1px solid #e5e7eb;white-space:nowrap;vertical-align:middle;text-transform:uppercase;letter-spacing:.04em}.store-requests-table-content tbody td{padding:14px 16px;font-size:13px;color:#344054;border-bottom:1px solid #f2f4f7;vertical-align:middle}.store-requests-table-content tbody tr{transition:background .15s}.store-requests-table-content tbody tr:hover{background-color:#f8fbff}.store-requests-table-content tbody tr:last-child td{border-bottom:none}.store-table-scroll{max-height:360px;overflow-y:auto}.store-table-scroll table{margin-bottom:0}.store-table-scroll .store-requests-table-content thead th{position:sticky;top:0;z-index:2;background:#f0f6ff}.checkbox-column{width:50px;padding-left:16px!important;padding-right:0!important}.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;position:relative}.sortable:hover{background-color:#e8eef8}.sort-icon{opacity:.5;transition:opacity .2s}.sortable:hover .sort-icon{opacity:1}.store-name-column{min-width:240px}.store-name-column .column-header{justify-content:space-between}.store-name-column .select-all-row{padding-top:8px;margin-top:8px;border-top:1px solid #e5e7eb}.empty-store-state{border:1px dashed #c7d7f0;border-radius:12px;padding:40px 16px;background:#f9fbff;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-store-icon{display:inline-flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:50%;background:#2e90fa1f}.store-days-select .ff-select-toggle{min-width:99px}.store-days-select .ff-select-toggle span{white-space:nowrap}.ff-select-wrapper{width:100%;position:relative}.ff-select-wrapper.compact{width:auto;min-width:80px}.ff-select-wrapper.disabled{pointer-events:none;opacity:.7}.ff-select-wrapper.open .ff-select-toggle svg{transform:rotate(180deg)}.ff-select-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid #d0d5dd;border-radius:10px;padding:8px 12px;background:#fff;font-weight:600;color:#101828;min-height:40px}.ff-select-toggle.small{min-height:36px;padding:6px 10px;font-size:13px}.ff-select-toggle svg{transition:transform .2s ease}.ff-select-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#fff;border:1px solid #e4e7ec;border-radius:12px;box-shadow:0 16px 40px #0f172a26;max-height:220px;overflow-y:auto;z-index:15;padding:4px}.ff-select-option{width:100%;text-align:left;border:none;background:transparent;padding:8px 10px;border-radius:8px;font-size:14px;color:#101828}.ff-select-option:hover{background:#f4f7fb}.category-modal-body .form-control,.category-modal-body .form-select{border-radius:10px;min-height:44px}.category-modal-body .form-label{font-size:13px}.category-modal-body .text-danger{font-size:12px}.custom-modal{border-radius:16px;padding:10px 20px 20px;background:#fff;box-shadow:0 10px 40px #00000014;width:500px}.field-label{color:#8b8b8b;font-size:14px;margin-bottom:4px;display:block}.input-box{width:100%;height:46px;border:1px solid #e5e7eb;border-radius:10px;padding:0 14px;font-size:15px;background:#f8fafc;display:flex;align-items:center}.input-box:focus-within{border-color:#4daeff;background:#fff;box-shadow:0 0 0 2px #4daeff26}.icon-row{display:flex}.icon-box{width:60px;cursor:pointer;justify-content:space-between}.clean-select{border:none;width:100%;height:100%;background:transparent;font-size:15px;outline:none}.select-box{padding:0}.button-area{display:flex;justify-content:space-between;gap:15px}.btn-cancel{width:50%;height:46px;border-radius:10px;border:1px solid #dbdbdb;background:#fff;font-weight:500;cursor:pointer}.btn-create{width:50%;height:46px;border-radius:10px;border:none;background:#0094ff;color:#fff;font-weight:600;cursor:pointer}.btn-create:hover{background:#007bdb}.card .btn-outline.btn-sm{padding:6px 10px;border-radius:8px}\n"] }]
837
+ args: [{ selector: 'lib-footfall-configuration', template: "<form [formGroup]=\"footfallDirConfigurationForm\" class=\"container-fluid\">\r\n <ng-container *ngIf=\"(gs.userAccess | async)?.Global_Configuration_isEdit\">\r\n <div *ngIf=\"isEdit\" class=\"col-12 mb-5\">\r\n <div class=\"d-flex justify-content-end\">\r\n <button (click)=\"toggleForm();\" type=\"button\" class=\"btn btn-outline py-3 align-items-end\">\r\n <span class=\"me-2\">\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_2579_25125)\">\r\n <path\r\n d=\"M14.167 2.49993C14.3859 2.28106 14.6457 2.10744 14.9317 1.98899C15.2176 1.87054 15.5241 1.80957 15.8337 1.80957C16.1432 1.80957 16.4497 1.87054 16.7357 1.98899C17.0216 2.10744 17.2815 2.28106 17.5003 2.49993C17.7192 2.7188 17.8928 2.97863 18.0113 3.2646C18.1297 3.55057 18.1907 3.85706 18.1907 4.16659C18.1907 4.47612 18.1297 4.78262 18.0113 5.06859C17.8928 5.35455 17.7192 5.61439 17.5003 5.83326L6.25033 17.0833L1.66699 18.3333L2.91699 13.7499L14.167 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2579_25125\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>Edit Details\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Approver Configuration -->\r\n <div class=\"card p-4 mb-4 ff-section-card\">\r\n <h5 class=\"ff-section-title mb-1\">Approver configuration</h5>\r\n <p class=\"ff-section-desc mb-4\">\r\n Set level of revisions required for a store raised tickets\r\n </p>\r\n\r\n <div formArrayName=\"revision\" class=\"d-flex flex-wrap gap-5\">\r\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"approver-option d-flex flex-column\"\r\n [class.disabled-option]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n\r\n <label class=\"custom-checkbox align-items-start\"\r\n [class.disabled-checkbox]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n <input type=\"checkbox\" formControlName=\"isChecked\" [id]=\"'action-' + i\" />\r\n <span class=\"checkmark\"></span>\r\n <div class=\"label-text\">\r\n <div class=\"title\">\r\n {{ rev.get('actionType')?.value | titlecase }}\r\n </div>\r\n <div class=\"desc text-muted\">\r\n <ng-container [ngSwitch]=\"rev.get('actionType')?.value\">\r\n <span *ngSwitchCase=\"'reviewer'\">The ticket undergoes a single review to verify\r\n footfall.</span>\r\n <span *ngSwitchCase=\"'approver'\">The ticket undergoes a final review after the initial\r\n check.</span>\r\n <span *ngSwitchCase=\"'tango'\">Finalize tickets and update footfall count.</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </label>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\">\r\n\r\n <!-- Store SPOC Ticket Creation -->\r\n <div class=\"card p-4 mb-4 ff-section-card\">\r\n <h5 class=\"ff-section-title mb-3\">Store SPOC Ticket Creation</h5>\r\n\r\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n <label class=\"mb-0\">\r\n Allow store SPOC to create tickets only for the last\r\n </label>\r\n\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\"\r\n [class.open]=\"isAllowTicketCreationDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleAllowTicketCreationDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('allowTicketCreation')?.value ||\r\n spocTicketCreationdays[0] }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAllowTicketCreationDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let day of spocTicketCreationdays\"\r\n (click)=\"selectAllowTicketCreation($event, day)\">\r\n {{ day }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <span class=\"mb-0\">Days</span>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\">\r\n\r\n <!-- Ticket Auto-close -->\r\n <div class=\"card p-4 mb-4 ff-section-card\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <h5 class=\"ff-section-title m-0\">Ticket Auto-close</h5>\r\n\r\n <label class=\"switch m-0 ms-3\" [class.disabled]=\"isEdit\">\r\n <input type=\"checkbox\" formControlName=\"isAutoCloseEnable\" [disabled]=\"isEdit\">\r\n <span class=\"slider round\"></span>\r\n </label>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center mt-2\">\r\n <span class=\"mb-0\">\r\n Ticket should be auto-closed, if the created ticket accuracy is greater than or equal to\r\n </span>\r\n\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\" [class.open]=\"isAutoCloseDropdownOpen\"\r\n [class.disabled]=\"isEdit || !footfallDirConfigurationForm.get('isAutoCloseEnable')?.value\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleAutoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('autoCloseAccuracy')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAutoCloseDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of accuracyPercentageList\"\r\n (click)=\"selectAutoCloseAccuracy($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\">\r\n\r\n <!-- Footfall Directory Limitations -->\r\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\r\n <div>\r\n <h5 class=\"ff-section-title m-0\">Footfall directory limitations</h5>\r\n <p class=\"ff-section-desc mb-2\">\r\n Set maximum limitation for stores to tag non-Purchasers from Total Footfall\r\n </p>\r\n </div>\r\n\r\n <button type=\"button\" [disabled]=\"isEdit\" class=\"add-new-btn d-inline-flex align-items-center gap-2\"\r\n (click)=\"openCategoryModal('add')\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3.33334V12.6667M3.33334 8H12.6667\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>Add New</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Category Cards Grid -->\r\n <div formArrayName=\"taggingLimitation\" class=\"category-grid mt-3\">\r\n <div *ngFor=\"let tag of tagLimits.controls; let i = index\" [formGroupName]=\"i\" class=\"category-card\">\r\n <div class=\"category-card-header\">\r\n <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\">\r\n <ng-container [ngSwitch]=\"tag.get('iconName')?.value\">\r\n <svg *ngSwitchCase=\"'duplicateTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\"\r\n height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1162_24621)\">\r\n <path\r\n d=\"M2.5 7.5H2C1.73478 7.5 1.48043 7.39464 1.29289 7.20711C1.10536 7.01957 1 6.76522 1 6.5V2C1 1.73478 1.10536 1.48043 1.29289 1.29289C1.48043 1.10536 1.73478 1 2 1H6.5C6.76522 1 7.01957 1.10536 7.20711 1.29289C7.39464 1.48043 7.5 1.73478 7.5 2V2.5M5.5 4.5H10C10.5523 4.5 11 4.94772 11 5.5V10C11 10.5523 10.5523 11 10 11H5.5C4.94772 11 4.5 10.5523 4.5 10V5.5C4.5 4.94772 4.94772 4.5 5.5 4.5Z\"\r\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24621\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'employeeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\r\n height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\">\r\n <path\r\n d=\"M11.1667 12.5V11.1667C11.1667 10.4594 10.8857 9.78115 10.3856 9.28105C9.88552 8.78095 9.20724 8.5 8.5 8.5H3.16667C2.45942 8.5 1.78115 8.78095 1.28105 9.28105C0.780952 9.78115 0.5 10.4594 0.5 11.1667V12.5M15.1667 12.5V11.1667C15.1662 10.5758 14.9696 10.0018 14.6076 9.53488C14.2456 9.06791 13.7388 8.73438 13.1667 8.58667M10.5 0.586667C11.0736 0.733534 11.582 1.06713 11.9451 1.53487C12.3082 2.00261 12.5052 2.57789 12.5052 3.17C12.5052 3.76211 12.3082 4.33739 11.9451 4.80513C11.582 5.27287 11.0736 5.60647 10.5 5.75333M8.5 3.16667C8.5 4.63943 7.30609 5.83333 5.83333 5.83333C4.36057 5.83333 3.16667 4.63943 3.16667 3.16667C3.16667 1.69391 4.36057 0.5 5.83333 0.5C7.30609 0.5 8.5 1.69391 8.5 3.16667Z\"\r\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n <div class=\"category-name\">\r\n {{ tag.get('name')?.value }}\r\n </div>\r\n <button\r\n *ngIf=\"(tag.get('iconName')?.value !== 'duplicateTag' && tag.get('iconName')?.value !== 'employeeTag')\"\r\n type=\"button\" class=\"category-menu-btn\" (click)=\"toggleCategoryMenu($event, i)\"\r\n [disabled]=\"isEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"none\"\r\n viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M12 5C12.5523 5 13 4.55228 13 4C13 3.44772 12.5523 3 12 3C11.4477 3 11 3.44772 11 4C11 4.55228 11.4477 5 12 5Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 21C12.5523 21 13 20.5523 13 20C13 19.4477 12.5523 19 12 19C11.4477 19 11 19.4477 11 20C11 20.5523 11.4477 21 12 21Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n </button>\r\n <div class=\"category-menu\" *ngIf=\"activeMenuIndex === i\">\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'edit', i)\">Edit Name</button>\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'delete', i)\">Delete</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"category-percentage-section\">\r\n <div class=\"position-relative ff-select-wrapper compact\"\r\n [class.open]=\"openLimitDropdownIndex === i\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleLimitDropdown($event, i)\">\r\n <span>{{ tag.get('value')?.value || 0 }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"openLimitDropdownIndex === i\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectLimitValue($event, i, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n\r\n <!-- Store Requests -->\r\n <div formGroupName=\"accuracyBreach\" class=\"card p-4 mb-4 ff-section-card\">\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div>\r\n <h5 class=\"ff-section-title mb-2\">Store Requests</h5>\r\n <p class=\"ff-section-desc mb-0\">\r\n Below stores have requested to raise a ticket after breaching the configured limit\r\n <span class=\"info-icon\">i</span>\r\n </p>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-primary reset-btn d-inline-flex align-items-center gap-2\"\r\n *ngIf=\"!isEdit\" [disabled]=\"isResetDisabled\" (click)=\"openResetConfirmationModal()\" aria-live=\"polite\">\r\n <span>Reset</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Restriction Criteria -->\r\n <div class=\"restriction-criteria mb-4\">\r\n <label class=\"mb-3 d-block\">\r\n Restrict ticket creation for any store that:\r\n </label>\r\n <div class=\"d-flex align-items-center flex-nowrap gap-2\">\r\n <span>Has raised more than</span>\r\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isTicketCountDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleTicketCountDropdown($event)\">\r\n <span>\r\n {{ footfallDirConfigurationForm.get('accuracyBreach.ticketCount')?.value || 1 }}\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isTicketCountDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let c of [1, 2, 3, 4, 5]\"\r\n (click)=\"selectTicketCount($event, c)\">\r\n {{ c }}\r\n </button>\r\n </div>\r\n </div>\r\n <span>tickets in the calender</span>\r\n <div class=\"position-relative ff-select-wrapper compact store-days-select\"\r\n [class.open]=\"isStoreDaysDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreDaysDropdown($event)\">\r\n <span>{{ selectedDaysLabel }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isStoreDaysDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let opt of daysOptions\"\r\n (click)=\"selectStoreDays($event, opt)\">\r\n {{ opt.label }}\r\n </button>\r\n </div>\r\n </div>\r\n <span>based on configured conditions\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n placement=\"top\" [ngbTooltip]=\"conditionsTooltip\" tooltipClass=\"conditions-tooltip\">\r\n <g clip-path=\"url(#clip0_1432_80035)\">\r\n <path\r\n d=\"M8.00065 10.6666V7.99992M8.00065 5.33325H8.00732M14.6673 7.99992C14.6673 11.6818 11.6826 14.6666 8.00065 14.6666C4.31875 14.6666 1.33398 11.6818 1.33398 7.99992C1.33398 4.31802 4.31875 1.33325 8.00065 1.33325C11.6826 1.33325 14.6673 4.31802 14.6673 7.99992Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1432_80035\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <ng-template #conditionsTooltip>\r\n <div style=\"text-align: left; font-size: 12px; line-height: 1.6;\">\r\n <b>1.</b> Delta between Store/AOM accuracy and Central Ops/Tango accuracy exceeds 10%<br>\r\n <b>2.</b> The overall accuracy after all reviews is greater than 85%.<br>\r\n <b>3.</b> Overall the Number of Images (Footfall) marked for validation in the ticket by the\r\n Store is Less than equal to 10\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Requests Table -->\r\n <div class=\"store-requests-table\" [class.disabled]=\"isEdit\"\r\n *ngIf=\"storeList?.length > 0; else emptyStoreRequests\">\r\n <div class=\"table-responsive\" [ngClass]=\"{'store-table-scroll': storeList?.length > 5}\">\r\n <table class=\"table table-hover store-requests-table-content\">\r\n <thead>\r\n <tr>\r\n <th class=\"checkbox-column\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input type=\"checkbox\" [checked]=\"isAllSelected\" [disabled]=\"isEdit\"\r\n (change)=\"toggleSelectAll($event)\" />\r\n <span class=\"checkmark-select\"></span>\r\n\r\n </label>\r\n </th>\r\n <th class=\"sortable store-name-column\">\r\n <div class=\"d-flex align-items-center\">\r\n <span>Select all stores ({{ storeList?.length || 0 }})</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" class=\"ms-2 dropdown-arrow\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th class=\"sortable\">\r\n Raised on\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\r\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n Last raised(Approved)\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\r\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n No of Time Raised\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\r\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let store of storeList\">\r\n <td class=\"checkbox-column\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input #cb type=\"checkbox\" [checked]=\"isStoreSelected(store)\" [disabled]=\"isEdit\"\r\n (change)=\"toggleStoreSelection(store, cb.checked)\" />\r\n <span class=\"checkmark-select\"></span>\r\n </label>\r\n </td>\r\n <td>{{ store.storeName }}</td>\r\n <td>{{ store.raisedOn }}</td>\r\n <td>{{ store.lastApproved || '-' }}</td>\r\n <td>{{ store.totalRaised }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <ng-template #emptyStoreRequests>\r\n <div class=\"empty-store-state text-center\">\r\n <div class=\"empty-store-icon mb-3\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M8.94629 21.1995C8.645 21.2313 8.33828 21.2502 8.02734 21.2502C7.85782 21.2502 7.69052 21.2434 7.52539 21.2336V31.6067C7.52539 33.0347 8.70837 34.2258 10.1963 34.2258H29.8008C31.2888 34.2258 32.4717 33.0347 32.4717 31.6067V21.2346C32.3098 21.2438 32.1459 21.2502 31.9814 21.2502C31.6675 21.2502 31.3569 21.2323 31.0508 21.1995V28.9875H8.94629V21.1995ZM30.9277 5.77368H9.06934C8.89197 5.77368 8.73671 5.86647 8.65918 5.98755L8.65723 5.9895L5.14746 11.4729L5.05273 11.6204C3.82719 13.7402 5.0918 16.4671 7.44336 16.7766C7.64428 16.8011 7.83403 16.8157 8.02148 16.8157C9.25156 16.8157 10.3395 16.287 11.0967 15.4651L12.0186 14.4641L12.9375 15.468C13.6864 16.2861 14.7731 16.8157 16.0107 16.8157C17.2428 16.8156 18.3347 16.2854 19.083 15.468L20.0049 14.4612L20.9268 15.468C21.6751 16.2855 22.7668 16.8157 23.999 16.8157C25.2312 16.8157 26.3229 16.2854 27.0713 15.468L27.9932 14.4612L28.915 15.468C29.6634 16.2855 30.756 16.8157 31.9883 16.8157C32.1697 16.8157 32.3648 16.8018 32.5645 16.7776H32.5635C34.9572 16.4571 36.2254 13.6075 34.8574 11.4729L34.8564 11.4739L31.3398 5.99048L31.3389 5.98755C31.2614 5.86628 31.1053 5.77368 30.9277 5.77368Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <p class=\"mb-0 fw-semibold text-muted\">No reset request from store</p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n\r\n <!-- Send Ticket to Tango -->\r\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\r\n <h5 class=\"ff-section-title mb-1\">Send Ticket to Tango</h5>\r\n <div class=\"d-flex align-items-center mt-2\">\r\n <label class=\"me-2 mb-0 tango-label\">Send ticket to Tango if accuracy falls below</label>\r\n <div class=\"position-relative ff-select-wrapper compact ms-0\" [class.open]=\"issendTangoDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleSendTangoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('tangoReview')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"issendTangoDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of sendTicketTango\"\r\n (click)=\"selectSendTicketTango($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Actions -->\r\n <div *ngIf=\"!isEdit\">\r\n <div class=\"mb-5 w-100 footer-seperator\"></div>\r\n <div class=\"d-flex justify-content-end\">\r\n <a type=\"button\" class=\"btn btn-outline mt-1 pt-3 me-4\" (click)=\"onCancel()\">Cancel</a>\r\n <a type=\"submit\" class=\"btn btn-primary px-4\" (click)=\"onSubmit()\"><span>Save Changes</span></a>\r\n </div>\r\n </div>\r\n\r\n <!-- Category Modal -->\r\n <ng-template #categoryModal>\r\n <div class=\"modal-header border-0 pb-0\">\r\n <h5 class=\"modal-title\">\r\n {{ categoryModalMode === 'add' ? 'Add New Category' : 'Edit Category' }}\r\n </h5>\r\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"closeCategoryModal()\"></button>\r\n </div>\r\n <div class=\"modal-body category-modal-body\">\r\n <form [formGroup]=\"categoryForm\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Icon</label>\r\n <div class=\"ff-select-wrapper icon-select\" [class.open]=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryIconDropdown($event)\">\r\n <span class=\"d-inline-flex align-items-center gap-2\">\r\n <span class=\"category-icon\"\r\n [ngClass]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <ng-container\r\n [ngSwitch]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_icon_housekeeping)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_icon_housekeeping\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span class=\"icon-label\">{{ selectedCategoryIconLabel }}</span>\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option d-flex align-items-center gap-2\"\r\n *ngFor=\"let icon of categoryIcons\"\r\n (click)=\"selectCategoryIconFromDropdown($event, icon.value)\">\r\n <span class=\"category-icon\" [ngClass]=\"icon.value\">\r\n <ng-container [ngSwitch]=\"icon.value\">\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span>{{ icon.label }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Category Name</label>\r\n <input type=\"text\" class=\"form-control\"\r\n [class.is-invalid]=\"categoryForm.get('name')?.invalid && categoryForm.get('name')?.touched\"\r\n placeholder=\"Enter your new category\" formControlName=\"name\" />\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('required') && categoryForm.get('name')?.touched\">\r\n Category name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('duplicate') && categoryForm.get('name')?.touched\">\r\n Category name already exists.\r\n </small>\r\n </div>\r\n\r\n <div class=\"mb-2\">\r\n <label class=\"form-label text-muted\">Limitation</label>\r\n <div class=\"ff-select-wrapper\" [class.open]=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryLimitDropdown($event)\">\r\n <span>{{ categoryForm.get('limit')?.value || percentageList[0] }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectCategoryLimitValue($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"modal-footer border-0 pt-0\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeCategoryModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"submitCategoryForm()\">\r\n {{ categoryModalMode === 'add' ? 'Create' : 'Save' }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Delete Confirmation Modal -->\r\n <ng-template #deleteCategoryModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Confirmation</h5>\r\n <p class=\"mb-4 text-muted\">\r\n You're about to delete <span class=\"fw-semibold\">{{ categoryPendingDeleteName }}</span> category.\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeDeleteModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger\" (click)=\"confirmDeleteCategory()\">Delete</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Reset Store Requests Confirmation Modal -->\r\n <ng-template #resetConfirmationModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Reset Store Requests</h5>\r\n <p class=\"mb-4 text-muted\">\r\n Are you sure you want to proceed with resetting the selected <span class=\"fw-semibold\">{{\r\n resetRequest.arrayOfStores.length }}</span> store(s) requests?\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeResetModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"confirmResetStoreRequest()\">Reset</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n</form>\r\n", styles: ["::ng-deep .conditions-tooltip .tooltip-inner{max-width:450px;text-align:left;padding:10px 14px;font-size:12px;line-height:1.6}form{padding:32px 20px;border-radius:16px;font-family:Inter,Segoe UI,sans-serif}.ff-section-card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 1px 4px #0f172a0a}.ff-section-title{font-size:16px;font-weight:600;color:#101828}.ff-section-desc{font-size:13px;color:#667085}.ff-divider{margin:8px 24px;border-color:#e4e7ec}.form-check{display:flex;align-items:center;gap:10px}.form-check-input{width:42px;height:22px;cursor:pointer;accent-color:#2563eb;border:1px solid #d1d5db;transition:all .2s ease-in-out}.form-check-input:checked{background-color:#2563eb;border-color:#2563eb}.form-check-input:disabled{opacity:.6;cursor:not-allowed}input[type=radio].form-check-input{width:16px;height:16px;accent-color:#2563eb}input[type=radio]:checked{border-color:#2563eb}select.form-select{border:1px solid #d1d5db;border-radius:8px;height:38px;font-size:14px;color:#374151;padding:6px 10px;outline:none;transition:.2s}select.form-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.btn-outline{background-color:#fff;border:1px solid #d1d5db;color:#374151;padding:6px 16px;border-radius:8px;transition:all .2s}.btn-outline:hover{background:#f9fafb}.btn-primary{background-color:#2563eb;border:none;color:#fff;border-radius:8px;padding:6px 16px;transition:.2s}.btn-primary:hover{background-color:#1e40af}.approver-option{display:flex;flex-direction:column;justify-content:flex-start;width:220px}.custom-checkbox{position:relative;display:flex;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.custom-checkbox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer}.custom-checkbox .checkmark{height:18px;width:18px;min-width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease}.custom-checkbox input:checked~.checkmark{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.label-text{display:flex;flex-direction:column}.label-text .title{font-weight:600;color:#101828}.label-text .desc{font-size:13px;color:#667085;margin-top:2px;max-width:190px;line-height:1.4}.custom-checkbox input:not(:checked)~.label-text .desc{opacity:.6}.approver-option.disabled-option{opacity:.6;pointer-events:none}.approver-option.disabled-option .custom-checkbox.disabled-checkbox{cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .checkmark{background-color:#f3f4f6;border-color:#d1d5dd;cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark{background-color:#f3f4f6;border-color:#d1d5dd}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg);opacity:.5}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .title{color:#9ca3af}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .desc{color:#d1d5dd}.switch{position:relative;display:inline-block;width:44px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ddd;transition:.3s;border-radius:22px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}input:checked+.slider{background-color:#4c9aff}input:checked+.slider:before{transform:translate(21px)}.switch.disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.switch.disabled .slider{cursor:not-allowed;background-color:#e5e7eb}.switch.disabled input:checked+.slider{background-color:#7dd3fc}.category-grid{display:flex;flex-wrap:wrap;gap:12px}.category-card{min-width:180px;border:1px solid #e5e7eb;border-radius:10px;padding:12px;background-color:#fff;box-shadow:0 1px 3px #1018280f;position:relative;display:flex;flex-direction:column;gap:12px}.category-card-header{display:flex;align-items:center;gap:10px}.category-icon{width:32px;height:32px;min-width:32px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.category-name{font-weight:500;color:#101828;font-size:14px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-percentage-section{width:100%}.category-percentage-section .ff-select-wrapper.compact{width:100%;min-width:auto}.category-percentage-section .ff-select-toggle.small{width:100%;min-height:36px;padding:6px 10px;font-size:13px}.category-menu-btn{border:none;background:transparent;padding:4px;line-height:1;cursor:pointer;flex-shrink:0;margin-left:4px;display:inline-flex;align-items:center;justify-content:center}.category-menu-btn:disabled{cursor:default}.category-menu{position:absolute;top:48px;right:16px;background:#fff;border:1px solid #e4e7ec;border-radius:10px;box-shadow:0 12px 30px #0f172a26;min-width:140px;z-index:5;padding:4px}.category-menu button{width:100%;text-align:left;background:transparent;border:none;padding:8px 10px;border-radius:8px;font-size:13px;color:#101828}.category-menu button:hover{background:#f4f7fb}.duplicateTag{background:#4755691f;color:#475569}.employeeTag{background:#3b82f61f;color:#3b82f6}.houseKeepingTag{background:#22c55e1f;color:#22c55e}.junkTag{background:#ef44441f;color:#ef4444}.purpleTag{background:#7c3aed1f;color:#7c3aed}.orangeTag{background:#ea580c1f;color:#ea580c}.add-new-btn{background:#fff;border:1px solid #d0d5dd;border-radius:10px;padding:5px 13px;font-size:14px;font-weight:600;color:#101828;transition:all .2s ease;cursor:pointer;display:inline-flex;align-items:center;gap:8px;box-shadow:0 1px 2px #1018280d}.add-new-btn:hover:not(:disabled){background:#f9fafb;border-color:#004aad;color:#004aad;box-shadow:0 2px 4px #10182814}.add-new-btn:active:not(:disabled){background:#f4f7fb;transform:translateY(1px);box-shadow:0 1px 2px #1018280d}.add-new-btn:disabled{opacity:.6;cursor:not-allowed;background:#f9fafb;border-color:#e5e7eb;color:#9ca3af}.add-new-btn svg{transition:transform .2s ease;flex-shrink:0}.add-new-btn:hover:not(:disabled) svg{transform:rotate(90deg)}.info-icon{display:inline-flex;justify-content:center;align-items:center;width:18px;height:18px;font-size:11px;font-weight:600;border-radius:50%;background:#f3f3f3;color:#555;cursor:pointer;margin-left:6px;border:1.5px solid #8a8a8a}.tango-label{font-size:13px;color:#475467;font-weight:500}.store-requests-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.reset-btn{border-width:1px;border-color:#d0d5dd;color:#004aad;font-weight:600;padding:6px 18px;background-color:#fff;transition:all .2s ease}.reset-btn svg path{stroke:currentColor}.reset-btn .spinner-border{color:#004aad}.reset-btn:disabled{opacity:.6;cursor:not-allowed}.reset-btn:not(:disabled):hover{background-color:#f4f7fb;border-color:#004aad;box-shadow:0 1px 2px #1018280f}.restriction-criteria{padding:16px 0;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb}.custom-checkbox-select{position:relative;display:flex;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-checkbox-select input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;width:0;height:0}.checkmark-select{height:18px;width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease;position:relative}.custom-checkbox-select input:checked~.checkmark-select{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox-select input:checked~.checkmark-select:after{content:\"\";position:absolute;left:7px;top:3px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.dropdown-arrow{cursor:pointer;transition:transform .2s}.dropdown-arrow:hover{transform:translateY(2px)}.store-requests-table{margin-top:16px;position:relative;border:1px solid #e5e7eb;border-radius:10px;overflow:hidden}.store-requests-table.disabled{pointer-events:none;opacity:.6;-webkit-user-select:none;user-select:none}.store-requests-table-content{border-collapse:collapse;border-spacing:0;width:100%;margin-bottom:0}.store-requests-table-content thead{background:linear-gradient(180deg,#f0f6ff,#f7f9fc)}.store-requests-table-content thead th{padding:14px 16px;font-weight:600;font-size:12px;color:#475467;text-align:left;border-bottom:1px solid #e5e7eb;white-space:nowrap;vertical-align:middle;text-transform:uppercase;letter-spacing:.04em}.store-requests-table-content tbody td{padding:14px 16px;font-size:13px;color:#344054;border-bottom:1px solid #f2f4f7;vertical-align:middle}.store-requests-table-content tbody tr{transition:background .15s}.store-requests-table-content tbody tr:hover{background-color:#f8fbff}.store-requests-table-content tbody tr:last-child td{border-bottom:none}.store-table-scroll{max-height:360px;overflow-y:auto}.store-table-scroll table{margin-bottom:0}.store-table-scroll .store-requests-table-content thead th{position:sticky;top:0;z-index:2;background:#f0f6ff}.checkbox-column{width:50px;padding-left:16px!important;padding-right:0!important}.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;position:relative}.sortable:hover{background-color:#e8eef8}.sort-icon{opacity:.5;transition:opacity .2s}.sortable:hover .sort-icon{opacity:1}.store-name-column{min-width:240px}.store-name-column .column-header{justify-content:space-between}.store-name-column .select-all-row{padding-top:8px;margin-top:8px;border-top:1px solid #e5e7eb}.empty-store-state{border:1px dashed #c7d7f0;border-radius:12px;padding:40px 16px;background:#f9fbff;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-store-icon{display:inline-flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:50%;background:#2e90fa1f}.store-days-select .ff-select-toggle{min-width:99px}.store-days-select .ff-select-toggle span{white-space:nowrap}.ff-select-wrapper{width:100%;position:relative}.ff-select-wrapper.compact{width:auto;min-width:80px}.ff-select-wrapper.disabled{pointer-events:none;opacity:.7}.ff-select-wrapper.open .ff-select-toggle svg{transform:rotate(180deg)}.ff-select-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid #d0d5dd;border-radius:10px;padding:8px 12px;background:#fff;font-weight:600;color:#101828;min-height:40px}.ff-select-toggle.small{min-height:36px;padding:6px 10px;font-size:13px}.ff-select-toggle svg{transition:transform .2s ease}.ff-select-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#fff;border:1px solid #e4e7ec;border-radius:12px;box-shadow:0 16px 40px #0f172a26;max-height:220px;overflow-y:auto;z-index:15;padding:4px}.ff-select-option{width:100%;text-align:left;border:none;background:transparent;padding:8px 10px;border-radius:8px;font-size:14px;color:#101828}.ff-select-option:hover{background:#f4f7fb}.category-modal-body .form-control,.category-modal-body .form-select{border-radius:10px;min-height:44px}.category-modal-body .form-label{font-size:13px}.category-modal-body .text-danger{font-size:12px}.custom-modal{border-radius:16px;padding:10px 20px 20px;background:#fff;box-shadow:0 10px 40px #00000014;width:500px}.field-label{color:#8b8b8b;font-size:14px;margin-bottom:4px;display:block}.input-box{width:100%;height:46px;border:1px solid #e5e7eb;border-radius:10px;padding:0 14px;font-size:15px;background:#f8fafc;display:flex;align-items:center}.input-box:focus-within{border-color:#4daeff;background:#fff;box-shadow:0 0 0 2px #4daeff26}.icon-row{display:flex}.icon-box{width:60px;cursor:pointer;justify-content:space-between}.clean-select{border:none;width:100%;height:100%;background:transparent;font-size:15px;outline:none}.select-box{padding:0}.button-area{display:flex;justify-content:space-between;gap:15px}.btn-cancel{width:50%;height:46px;border-radius:10px;border:1px solid #dbdbdb;background:#fff;font-weight:500;cursor:pointer}.btn-create{width:50%;height:46px;border-radius:10px;border:none;background:#0094ff;color:#fff;font-weight:600;cursor:pointer}.btn-create:hover{background:#007bdb}.card .btn-outline.btn-sm{padding:6px 10px;border-radius:8px}\n"] }]
838
838
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.GlobalStateService }, { type: i3.ClientApiService }, { type: i4.NgbModal }, { type: i5.ToastService }], propDecorators: { categoryModalTpl: [{
839
839
  type: ViewChild,
840
840
  args: ['categoryModal']
@@ -848,4 +848,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
848
848
  type: HostListener,
849
849
  args: ['document:click']
850
850
  }] } });
851
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBdUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQVcxQyxNQUFNLE9BQU8sOEJBQThCO0lBd0RyQjtJQUNYO0lBQ0M7SUFDQTtJQUNBO0lBM0RWLDRCQUE0QixDQUFhO0lBQ3hCLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzFDLFlBQVksR0FBbUY7UUFDN0YsUUFBUSxFQUFFLEVBQUU7UUFDWixhQUFhLEVBQUUsRUFBRTtLQUNsQixDQUFDO0lBQ0Ysc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25DLGNBQWMsR0FBYSxFQUFFLENBQUM7SUFDOUIsc0JBQXNCLEdBQWEsRUFBRSxDQUFDO0lBQ3RDLGVBQWUsR0FBYSxFQUFFLENBQUM7SUFDL0IsZUFBZSxHQUFhLEVBQUUsQ0FBQztJQUMvQixNQUFNLEdBQVksSUFBSSxDQUFDO0lBQ3ZCLE9BQU8sQ0FBUztJQUNoQixTQUFTLEdBQVEsRUFBRSxDQUFDO0lBQ3BCLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsWUFBWSxDQUFhO0lBQ3pCLGlCQUFpQixHQUFtQixLQUFLLENBQUM7SUFDMUMsb0JBQW9CLEdBQWtCLElBQUksQ0FBQztJQUMzQyxnQkFBZ0IsR0FBdUIsSUFBSSxDQUFDO0lBQzVDLGNBQWMsR0FBdUIsSUFBSSxDQUFDO0lBQzFDLGFBQWEsR0FBdUIsSUFBSSxDQUFDO0lBQ3pDLHFCQUFxQixHQUFrQixJQUFJLENBQUM7SUFDNUMseUJBQXlCLEdBQUcsRUFBRSxDQUFDO0lBQy9CLGVBQWUsR0FBa0IsSUFBSSxDQUFDO0lBQ3RDLHNCQUFzQixHQUFrQixJQUFJLENBQUM7SUFDN0MsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0lBQ3BDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztJQUNuQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDaEMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztJQUNsQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDaEMsV0FBVyxHQUF1QztRQUNoRCxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtRQUMvQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtLQUM5QixDQUFDO0lBQ0YsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0lBQ3BDLGlDQUFpQyxHQUFHLEtBQUssQ0FBQztJQUNsQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDL0IsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLGlCQUFpQixHQUFPO1FBQy9CLDJDQUEyQztRQUMzQyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRTtRQUMzQyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRTtLQUM1QyxDQUFDO0lBRU8sdUJBQXVCLEdBQUc7UUFDakMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRTtRQUNwRCxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtLQUNwQyxDQUFDO0lBRUYsa0JBQWtCLEdBQVEsRUFBRSxDQUFDO0lBQ0QsZ0JBQWdCLENBQW9CO0lBQzlCLHNCQUFzQixDQUFvQjtJQUN2Qyx5QkFBeUIsQ0FBb0I7SUFFbEYsWUFBb0IsRUFBZSxFQUMxQixFQUFzQixFQUNyQixVQUE0QixFQUM1QixZQUFzQixFQUN0QixLQUFtQjtRQUpULE9BQUUsR0FBRixFQUFFLENBQWE7UUFDMUIsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFDckIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3hFLElBQUksQ0FBQyxFQUFFO2dCQUNMLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFBO2dCQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckMsbURBQW1EO2dCQUNuRCxxQ0FBcUM7YUFDdEM7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzlFLElBQUksR0FBRyxFQUFFO2dCQUNQLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksR0FBRyxDQUFDLElBQUksS0FBSywwQkFBMEIsRUFBRTtvQkFDbkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7aUJBQzFCO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCw4REFBOEQ7SUFDOUQscUJBQXFCO0lBQ3JCLGNBQWM7SUFDZCxNQUFNO0lBQ04sNEZBQTRGO0lBQzVGLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsa0VBQWtFO0lBQ2xFLGtFQUFrRTtJQUNsRSwyRUFBMkU7SUFDM0UscURBQXFEO0lBQ3JELFlBQVk7SUFDWixVQUFVO0lBQ1YsU0FBUztJQUNULHdCQUF3QjtJQUN4QiwrREFBK0Q7SUFDL0QsUUFBUTtJQUNSLFFBQVE7SUFDUixJQUFJO0lBRUosa0JBQWtCLENBQUMsS0FBYTtRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVBLHFCQUFxQixDQUFDLEtBQWE7UUFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxHQUFXO1FBQ2pDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxHQUFXO1FBQzNCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsUUFBUTtRQUNOLGtCQUFrQjtRQUNsQixJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEQsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzQixtQkFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQztZQUMzQixpQkFBaUIsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUMxQixpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN2QixpQkFBaUIsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEMsY0FBYyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUM1QixXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksRUFBRSxFQUFFO2dCQUNSLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzthQUNmLENBQUM7WUFDRixXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDbEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFTO1FBQ2pCLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixpQkFBaUI7UUFDakIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQWMsQ0FBQztRQUNyRixhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNsQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMzRSxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQscUVBQXFFO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQWMsQ0FBQztRQUN6RixRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLElBQUksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEdBQUcsQ0FBQztZQUNqRixJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNyQyxvREFBb0Q7WUFDcEQsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDdkQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEcsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxHQUFHLENBQUM7WUFDeEYsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkMseUVBQXlFO1lBQ3pFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFXLEVBQUUsT0FBWSxFQUFFLEVBQUU7Z0JBQzlFLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFO29CQUN0QyxPQUFPLE1BQU0sQ0FBQztpQkFDZjtnQkFDRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtvQkFDcEMsT0FBTyxPQUFPLENBQUM7aUJBQ2hCO2dCQUNELE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDcEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNsRCxPQUFPLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3JELENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVULElBQUksV0FBVyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDekQsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQkFDdEMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hHLENBQUMsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtRQUVELDZCQUE2QjtRQUM3QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdkIsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFVBQVUsQ0FBQztnQkFDbEUsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVztnQkFDNUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLElBQUk7Z0JBQ3RDLFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVE7YUFDdkMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFVBQVUsQ0FBQztZQUMzQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQztZQUNsRCxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLElBQUksS0FBSztZQUNsRCxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLElBQUksS0FBSztZQUNsRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxLQUFLO1NBQ3ZDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1Qyx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQW9CLEVBQUUsS0FBYztRQUNwRCxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7WUFDdEUsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLDJCQUEyQixHQUFHLEtBQUssQ0FBQztRQUN6QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRXJFLElBQUksSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssSUFBSSxFQUFFO1lBQ3pELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBYyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO2dCQUN6QixRQUFRLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7Z0JBQ2pGLElBQUksRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNoRixLQUFLLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7YUFDbkUsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO2dCQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7Z0JBQ3pDLElBQUksRUFBRSxFQUFFO2dCQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQzthQUM5QixDQUFDLENBQUM7U0FDSjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDcEUsUUFBUSxFQUFFLElBQUk7WUFDZCxJQUFJLEVBQUUsSUFBSTtZQUNWLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFO1lBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQyxPQUFPO1NBQ1I7UUFFRCxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUMxRCxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV4QyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLDRCQUE0QixDQUFDLENBQUM7WUFDdkQsT0FBTztTQUNSO1FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQ3JFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssV0FBVyxDQUFDLFdBQVcsRUFBRTtZQUNwRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQzFDLENBQUM7UUFFRixJQUFJLGNBQWMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN6QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRCxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDNUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQzdCLE9BQU87U0FDUjtRQUVELG1DQUFtQztRQUNuQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxLQUFLLEVBQUU7WUFDcEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDekQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLEtBQUssUUFBUSxDQUN6QyxDQUFDO1lBRUYsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7Z0JBQzNFLE9BQU87YUFDUjtTQUNGO2FBQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLEVBQUU7WUFDbEYsa0ZBQWtGO1lBQ2xGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssS0FBSyxRQUFRLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxvQkFBb0IsQ0FDOUUsQ0FBQztZQUVGLElBQUksWUFBWSxFQUFFO2dCQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2dCQUMzRSxPQUFPO2FBQ1I7U0FDRjtRQUVELElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLEtBQUssRUFBRTtZQUNwQyxxREFBcUQ7WUFDckQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7U0FDOUQ7YUFBTSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLEVBQUU7WUFDN0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFjLENBQUM7WUFDaEYsYUFBYSxDQUFDLFVBQVUsQ0FBQztnQkFDdkIsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUNwQixRQUFRLEVBQUUsUUFBUTthQUNuQixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUM5QjtRQUNELElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUM7SUFDM0MsQ0FBQztJQUVELHVCQUF1QixDQUFDLEtBQWE7UUFDbkMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNuQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQWMsQ0FBQztRQUM1RCxJQUFJLENBQUMseUJBQXlCLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLElBQUksZUFBZSxDQUFDO1FBQ3JGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQ3hFLFFBQVEsRUFBRSxJQUFJO1lBQ2QsSUFBSSxFQUFFLElBQUk7WUFDVixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksSUFBSSxDQUFDLHFCQUFxQixLQUFLLElBQUksRUFBRTtZQUN2QyxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFDRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxTQUFpQjtRQUNsQyxtQ0FBbUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssS0FBSyxFQUFFO1lBQ3BDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3pELElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxLQUFLLFNBQVMsQ0FDMUMsQ0FBQztZQUVGLElBQUksWUFBWSxFQUFFO2dCQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2dCQUMzRSxPQUFPO2FBQ1I7U0FDRjthQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssSUFBSSxFQUFFO1lBQ2xGLGtGQUFrRjtZQUNsRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FDOUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsb0JBQW9CLENBQy9FLENBQUM7WUFFRixJQUFJLFlBQVksRUFBRTtnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsZ0RBQWdELENBQUMsQ0FBQztnQkFDM0UsT0FBTzthQUNSO1NBQ0Y7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELGtCQUFrQixDQUFDLEtBQVksRUFBRSxLQUFhO1FBQzVDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN2RSxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBWSxFQUFFLE1BQXlCLEVBQUUsS0FBYTtRQUN6RSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDdkM7YUFBTTtZQUNMLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyQztJQUNILENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFZLEVBQUUsS0FBYTtRQUM3QyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFZLEVBQUUsS0FBYSxFQUFFLEtBQWE7UUFDekQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxHQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTztTQUNSO1FBQ0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7SUFDckMsQ0FBQztJQUVELDJCQUEyQixDQUFDLEtBQVk7UUFDdEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQywyQkFBMkIsR0FBRyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQztJQUN2RSxDQUFDO0lBRUQsd0JBQXdCLENBQUMsS0FBWSxFQUFFLEtBQWE7UUFDbEQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxLQUFZO1FBQ2xDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFDRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDN0YsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3ZCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUMvRCxDQUFDO0lBRUQsNEJBQTRCLENBQUMsS0FBWTtRQUN2QyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQy9ELENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxLQUFZLEVBQUUsS0FBYTtRQUNqRCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPO1NBQ1I7UUFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUM5QixPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUVELHFCQUFxQixDQUFDLEtBQVksRUFBRSxLQUFhO1FBQy9DLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPO1NBQ1I7UUFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUM5QixPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUVELHlCQUF5QixDQUFDLEtBQVk7UUFDcEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztJQUNuRSxDQUFDO0lBRUQsaUJBQWlCLENBQUMsS0FBWSxFQUFFLEtBQWE7UUFDM0MsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTztTQUNSO1FBQ0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUM7SUFDekMsQ0FBQztJQUVELHVCQUF1QixDQUFDLEtBQVk7UUFDbEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUMvRCxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQVksRUFBRSxNQUF3QztRQUNwRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPO1NBQ1I7UUFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDekYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFlBQVksQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sS0FBSyxFQUFFLEtBQUssSUFBSSxPQUFPLENBQUM7SUFDakMsQ0FBQztJQUVELDJCQUEyQixDQUFDLEtBQVk7UUFDdEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQywyQkFBMkIsR0FBRyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQztJQUN2RSxDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBWSxFQUFFLEtBQWE7UUFDN0MsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTztTQUNSO1FBQ0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDOUIsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFRCxpQ0FBaUMsQ0FBQyxLQUFZO1FBQzVDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsaUNBQWlDLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUM7SUFDbkYsQ0FBQztJQUVELHlCQUF5QixDQUFDLEtBQVksRUFBRSxLQUFhO1FBQ25ELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE9BQU87U0FDUjtRQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsaUNBQWlDLEdBQUcsS0FBSyxDQUFDO0lBQ2pELENBQUM7SUFFRCxJQUFJLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBSSxrQkFBa0I7UUFDcEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFDOUMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUM7UUFDbEYsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUM7UUFFbEYsSUFBSSxRQUFRLElBQUksUUFBUSxFQUFFO1lBQ3hCLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQ3pELE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbEQsMkRBQTJEO1lBQzNELE9BQU8sZUFBZSxFQUFFLFFBQVEsSUFBSSxDQUFDLGVBQWUsQ0FBQztTQUN0RDtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixxQ0FBcUM7UUFDckMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ2hFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNELEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUNyRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR0QsVUFBVTtRQUNSLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7UUFDbkMsSUFBSSxDQUFDLDJCQUEyQixHQUFHLEtBQUssQ0FBQztRQUN6QyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO1FBQ3hDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUM7UUFDekMsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLEtBQUssQ0FBQztRQUMvQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxLQUFZO1FBQ3JDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsMEJBQTBCLEdBQUcsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUM7SUFDckUsQ0FBQztJQUVELDhCQUE4QixDQUFDLEtBQVksRUFBRSxTQUFpQjtRQUM1RCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7SUFDMUMsQ0FBQztJQUVELDRCQUE0QixDQUFDLE9BQWU7UUFDMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5Rix5RkFBeUY7WUFDdkYsSUFBSSxFQUFDLENBQUMsR0FBUSxFQUFDLEVBQUU7Z0JBQ2pCLElBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUUsS0FBSyxFQUFDO29CQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDO2lCQUNwQztxQkFBSTtvQkFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztpQkFDckI7WUFDRixDQUFDO1lBQ0EsS0FBSyxFQUFDLENBQUMsR0FBRyxFQUFDLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDcEQsQ0FBQztTQUNILENBQUMsQ0FBQTtJQUNMLENBQUM7SUFHRCxVQUFVO0lBQ1YsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBYyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQWMsQ0FBQztJQUNqRixDQUFDO0lBR0QsY0FBYyxDQUFDLFVBQWtCLEVBQUUsU0FBa0I7UUFDbkQsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQixVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUM7WUFDeEIsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBWSxFQUFFLEtBQWEsRUFBRSxRQUFnQixFQUFFLElBQWEsRUFBRSxHQUFZO1FBQ3ZGLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ1osS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2QsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ1gsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztZQUNaLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFVLEVBQUUsT0FBZ0I7UUFDL0MsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztTQUNoRzthQUFNLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUN4RSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsT0FBTyxDQUNuQyxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQVU7UUFDeEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQ3ZHLENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsZUFBZSxDQUFDLEtBQVk7UUFDMUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQTBCLENBQUM7UUFDaEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUMvQixJQUFJLE9BQU8sRUFBRTtZQUNYLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87Z0JBQ3RCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTthQUM3QixDQUFDLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQzVEO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQzlDO0lBQ0gsQ0FBQztJQUVELDBCQUEwQjtRQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUM5QyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssS0FBSyxVQUFVLENBQUMsQ0FBQztRQUNsRixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssS0FBSyxVQUFVLENBQUMsQ0FBQztRQUNsRixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQztRQUU1RSxJQUFJLEtBQUssRUFBRTtZQUNULEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDdkQ7UUFFRCxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUU7WUFDeEIsbURBQW1EO1lBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRTtnQkFDckMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDekQsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ2pFO2lCQUFNO2dCQUNMLHlDQUF5QztnQkFDekMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUN6RDtZQUVELG1EQUFtRDtZQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO2dCQUNqQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUMzRixJQUFJLE9BQU8sRUFBRTt3QkFDWCxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO3FCQUN6RDt5QkFBTTt3QkFDTCxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO3dCQUN6RCxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7cUJBQ2pFO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7YUFDckM7U0FDRjtJQUNILENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsK0RBQStEO1lBQy9ELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO1lBQzlDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDO1lBQ2xGLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDO1lBRWxGLHlFQUF5RTtZQUN6RSxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRTtnQkFDN0QsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ2pFO1lBRUQsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNDLG9GQUFvRjtZQUNwRixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztTQUNuQzthQUFNO1lBQ0wsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVDLDJEQUEyRDtZQUMzRCw2REFBNkQ7WUFDN0QsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBQ0QsZ0NBQWdDO0lBQ2hDLDBCQUEwQjtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDL0QsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUU7WUFDMUUsUUFBUSxFQUFFLElBQUk7WUFDZCxJQUFJLEVBQUUsSUFBSTtZQUNWLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVELGlDQUFpQztJQUNqQyx3QkFBd0I7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQy9ELE9BQU87U0FDUjtRQUNELDBCQUEwQjtRQUMxQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFdkIsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQzthQUN2RCxJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDeEIsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFDLENBQUMsR0FBUSxFQUFDLEVBQUU7Z0JBQ2pCLElBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUUsS0FBSyxFQUFDO29CQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDO29CQUNuQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO2lCQUNsRTtxQkFBSTtvQkFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsaUNBQWlDLENBQUMsQ0FBQztpQkFDN0Q7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM5QyxDQUFDO1lBQ0EsS0FBSyxFQUFDLENBQUMsR0FBRyxFQUFDLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7Z0JBQzVELE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbEQsQ0FBQztTQUNILENBQUMsQ0FBQTtJQUNILENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNwRixDQUFDO0lBRUQsUUFBUTtRQUNOLG1EQUFtRDtRQUNuRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNyQyxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsS0FBSyxPQUFPLENBQUMsQ0FBQztZQUN2RixJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDckIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2FBQ2pEO1NBQ0Y7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxDQUFBO1FBQzNHLG9FQUFvRTtRQUNwRSxvREFBb0Q7UUFDcEQsbUZBQW1GO1FBQ25GLHNCQUFzQjtRQUN0Qix3QkFBd0I7UUFDeEIsNEJBQTRCO1FBQzVCLGlDQUFpQztRQUNqQyxvQ0FBb0M7UUFDcEMsU0FBUztRQUNULElBQUk7UUFDSixvQkFBb0I7UUFDcEIseUNBQXlDO1FBQ3pDLCtCQUErQjtRQUMvQixLQUFLO1FBQ0gsZ0JBQWdCO1FBQ2hCLHdDQUF3QztRQUN4Qyw4Q0FBOEM7UUFDOUMsbURBQW1EO1FBQ25ELElBQUk7UUFDSixzQ0FBc0M7UUFDdEMsbUVBQW1FO1FBQ25FLFdBQVc7UUFDWCwrQkFBK0I7UUFDL0IsTUFBTTtRQUNOLGlCQUFpQjtRQUNqQiw0QkFBNEI7UUFDNUIsNkRBQTZEO1FBQzdELG1FQUFtRTtRQUNuRSx1RkFBdUY7UUFDdkYsaUJBQWlCO1FBQ2pCLGlGQUFpRjtRQUNqRixVQUFVO1FBQ1YsU0FBUztRQUNULHdCQUF3QjtRQUN4QixnRkFBZ0Y7UUFDaEYsd0VBQXdFO1FBQ3hFLFNBQVM7UUFDVCxPQUFPO0lBQ1gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLENBQUMsQ0FBQTtRQUN0RyxJQUFJLENBQUMsNEJBQTRCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU8saUJBQWlCLENBQUMsU0FBb0QsRUFBRTtRQUM5RSxPQUFPO1lBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRTtZQUM1QixhQUFhLEVBQUUsTUFBTTtTQUN0QixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVuRCxvREFBb0Q7UUFDcEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbkcsdUVBQXVFO1FBQ3ZFLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssSUFBSSxFQUFFO1lBQzNFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUM7WUFDekYsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDO1NBQzVFO1FBRUQsd0RBQXdEO1FBQ3hELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzNDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDM0I7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLHlCQUF5QjtRQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUM5RixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDdEUsT0FBTyxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDO3dHQWg1QlUsOEJBQThCOzRGQUE5Qiw4QkFBOEIsc2RDakIzQywyZ2pEQTRwQkE7OzRGRDNvQmEsOEJBQThCO2tCQVAxQyxTQUFTOytCQUNFLDRCQUE0QjtrTUEwRFYsZ0JBQWdCO3NCQUEzQyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ1Esc0JBQXNCO3NCQUF2RCxTQUFTO3VCQUFDLHFCQUFxQjtnQkFDSyx5QkFBeUI7c0JBQTdELFNBQVM7dUJBQUMsd0JBQXdCO2dCQW9oQm5DLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgT25Jbml0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmdiTW9kYWwsIE5nYk1vZGFsUmVmIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgQ2xpZW50QXBpU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NsaWVudC1hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItZm9vdGZhbGwtY29uZmlndXJhdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBGb290ZmFsbENvbmZpZ3VyYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0hOiBGb3JtR3JvdXA7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcmVzZXRSZXF1ZXN0OiB7IGNsaWVudElkOiBzdHJpbmc7IGFycmF5T2ZTdG9yZXM6IHsgc3RvcmVJZDogc3RyaW5nOyBkYXRlU3RyaW5nOiBzdHJpbmcgfVtdIH0gPSB7XHJcbiAgICBjbGllbnRJZDogJycsXHJcbiAgICBhcnJheU9mU3RvcmVzOiBbXVxyXG4gIH07XHJcbiAgc3BvY1RpY2tldENyZWF0aW9uZGF5cyA9IFsxLCAyLCAzXTtcclxuICBwZXJjZW50YWdlTGlzdDogbnVtYmVyW10gPSBbXTtcclxuICBhY2N1cmFjeVBlcmNlbnRhZ2VMaXN0OiBudW1iZXJbXSA9IFtdO1xyXG4gIHN0b3JlVGlja2V0RGF5czogbnVtYmVyW10gPSBbXTtcclxuICBzZW5kVGlja2V0VGFuZ286IG51bWJlcltdID0gW107XHJcbiAgaXNFZGl0OiBib29sZWFuID0gdHJ1ZTtcclxuICBjbGllbklkOiBzdHJpbmc7XHJcbiAgc3RvcmVMaXN0OiBhbnkgPSBbXTtcclxuICBpc1Jlc2V0dGluZyA9IGZhbHNlO1xyXG4gIGNhdGVnb3J5Rm9ybSE6IEZvcm1Hcm91cDtcclxuICBjYXRlZ29yeU1vZGFsTW9kZTogJ2FkZCcgfCAnZWRpdCcgPSAnYWRkJztcclxuICBlZGl0aW5nQ2F0ZWdvcnlJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgY2F0ZWdvcnlNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcclxuICBkZWxldGVNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcclxuICByZXNldE1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xyXG4gIGNhdGVnb3J5VG9EZWxldGVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgY2F0ZWdvcnlQZW5kaW5nRGVsZXRlTmFtZSA9ICcnO1xyXG4gIGFjdGl2ZU1lbnVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgb3BlbkxpbWl0RHJvcGRvd25JbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICBpc0F1dG9DbG9zZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIGlzc2VuZFRhbmdvRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIGlzU3RvcmVEYXlzRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgZGF5c09wdGlvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXHJcbiAgICB7IGxhYmVsOiAnTW9udGgnLCB2YWx1ZTogJzMwJyB9LFxyXG4gICAgeyBsYWJlbDogJ1dlZWsnLCB2YWx1ZTogJzcnIH1cclxuICBdO1xyXG4gIGlzU3RvcmVBY2N1cmFjeURyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIGlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmV2aXNpb25EZXBzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICByZWFkb25seSBtYXhDYXRlZ29yeUNvdW50ID0gNTtcclxuICByZWFkb25seSBiYXNlQ2F0ZWdvcnlJY29uczphbnkgPSBbXHJcbiAgICAvLyB7IGxhYmVsOiAnQmx1ZSBUYWcnLCB2YWx1ZTogJ2JsdWVUYWcnIH0sXHJcbiAgICB7IGxhYmVsOiAnUHVycGxlIFRhZycsIHZhbHVlOiAncHVycGxlVGFnJyB9LFxyXG4gICAgeyBsYWJlbDogJ09yYW5nZSBUYWcnLCB2YWx1ZTogJ29yYW5nZVRhZycgfVxyXG4gIF07XHJcblxyXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxDYXRlZ29yeUljb25zID0gW1xyXG4gICAgeyBsYWJlbDogJ0hvdXNlIEtlZXBpbmcnLCB2YWx1ZTogJ2hvdXNlS2VlcGluZ1RhZycgfSxcclxuICAgIHsgbGFiZWw6ICdKdW5rJywgdmFsdWU6ICdqdW5rVGFnJyB9XHJcbiAgXTtcclxuXHJcbiAgZm9vdGZhbGxDb25maWdEYXRhOiBhbnkgPSBbXTtcclxuICBAVmlld0NoaWxkKCdjYXRlZ29yeU1vZGFsJykgY2F0ZWdvcnlNb2RhbFRwbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnZGVsZXRlQ2F0ZWdvcnlNb2RhbCcpIGRlbGV0ZUNhdGVnb3J5TW9kYWxUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3Jlc2V0Q29uZmlybWF0aW9uTW9kYWwnKSByZXNldENvbmZpcm1hdGlvbk1vZGFsVHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogQ2xpZW50QXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSkge1xyXG4gICAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50SWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW5JZCA9IGVcclxuICAgICAgICB0aGlzLnJlc2V0UmVxdWVzdC5jbGllbnRJZCA9IGU7XHJcbiAgICAgICAgdGhpcy5nZXRDbGllbnRNYXBwZWRTdG9yZXNEZXRhaWxzKGUpO1xyXG4gICAgICAgIC8vIExvYWQgZm9vdGZhbGwgZGV0YWlscyB3aGVuIGNsaWVudElkIGlzIGF2YWlsYWJsZVxyXG4gICAgICAgIC8vIHRoaXMubG9hZEZvb3RmYWxsQ29uZmlnRGV0YWlscyhlKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0Q2F0ZWdvcnlGb3JtKCk7XHJcbiAgICB0aGlzLmxvYWRGb3JtKCk7XHJcbiAgICB0aGlzLmdlbmVyYXRlRGF5T3B0aW9ucyg0NSk7XHJcbiAgICB0aGlzLmdlbmVyYXRlRGlyTGltaXRhdGlvbigxMDApO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUFjY3VyYWN5T3B0aW9ucyg5NSk7XHJcbiAgICB0aGlzLnNlbmRUaWNrZXRUb1RhbmdvKDEwMCk7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50Rm9ybURhdGEucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICBpZiAocmVzLnR5cGUgPT09ICdpbnB1dCcgJiYgcmVzLmZvcm0gPT09ICdmb290ZmFsbERpcmVjdG9yeUNvbmZpZ3MnKSB7XHJcbiAgICAgICAgICB0aGlzLnBhdGNoRm9ybShyZXMudmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgZm9vdGZhbGwgZGV0YWlscyBmcm9tIEFQSSB3aGVuIGNsaWVudElkIGlzIGF2YWlsYWJsZVxyXG4gICAqIFRoaXMgZW5zdXJlcyBjbGllbklkIGlzIHNldCBiZWZvcmUgbWFraW5nIHRoZSBBUEkgY2FsbFxyXG4gICAqL1xyXG4gIC8vIHByaXZhdGUgbG9hZEZvb3RmYWxsQ29uZmlnRGV0YWlscyhjbGllbnRJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgLy8gICBpZiAoIWNsaWVudElkKSB7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMuYXBpU2VydmljZS5nZXRGb290ZmFsbERldGFpbHMoY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gIC8vICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHJlcykge1xyXG4gIC8vICAgICAgICAgY29uc29sZS5sb2coJ0Zvb3RmYWxsIERpcmVjdG9yeSBDb25maWdzIGRhdGEgOjonLCByZXMpO1xyXG4gIC8vICAgICAgICAgaWYgKHJlcz8uZGF0YSAmJiByZXM/LmRhdGE/LmZvb3RmYWxsRGlyZWN0b3J5Q29uZmlncykge1xyXG4gIC8vICAgICAgICAgICB0aGlzLmZvb3RmYWxsQ29uZmlnRGF0YSA9IHJlcz8uZGF0YT8uZm9vdGZhbGxEaXJlY3RvcnlDb25maWdzO1xyXG4gIC8vICAgICAgICAgICB0aGlzLnBhdGNoRm9ybSh0aGlzLmZvb3RmYWxsQ29uZmlnRGF0YSk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgZm9vdGZhbGwgZGV0YWlsczonLCBlcnIpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIGdlbmVyYXRlRGF5T3B0aW9ucyhjb3VudDogbnVtYmVyKSB7XHJcbiAgdGhpcy5zdG9yZVRpY2tldERheXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4gaSArIDEpO1xyXG4gfVxyXG5cclxuICBnZW5lcmF0ZURpckxpbWl0YXRpb24oY291bnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5wZXJjZW50YWdlTGlzdCA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sIChfLCBpKSA9PiBpICsgMSk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZUFjY3VyYWN5T3B0aW9ucyhtYXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5hY2N1cmFjeVBlcmNlbnRhZ2VMaXN0ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbWF4IH0sIChfLCBpKSA9PiBpICsgMSk7XHJcbiAgfVxyXG5cclxuICBzZW5kVGlja2V0VG9UYW5nbyhtYXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5zZW5kVGlja2V0VGFuZ28gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBtYXggfSwgKF8sIGkpID0+IGkgKyAxKTtcclxuICB9XHJcblxyXG4gIGxvYWRGb3JtKCkge1xyXG4gICAgLy8gaW5pdGlhbGl6ZSBmb3JtXHJcbiAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcmV2aXNpb246IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBhbGxvd1RpY2tldENyZWF0aW9uOiBbbnVsbF0sXHJcbiAgICAgIGlzQXV0b0Nsb3NlRW5hYmxlOiBbZmFsc2VdLFxyXG4gICAgICBhdXRvQ2xvc2VBY2N1cmFjeTogWycnXSxcclxuICAgICAgdGFnZ2luZ0xpbWl0YXRpb246IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBhY2N1cmFjeUJyZWFjaDogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgdGlja2V0Q291bnQ6IFsnJ10sXHJcbiAgICAgICAgZGF5czogW10sXHJcbiAgICAgICAgYWNjdXJhY3k6IFsnJ11cclxuICAgICAgfSksXHJcbiAgICAgIHRhbmdvUmV2aWV3OiBbJyddXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHBhdGNoRm9ybShkYXRhOiBhbnkpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuO1xyXG4gICAgLy8gcGF0Y2ggcmV2aXNpb25cclxuICAgIGNvbnN0IHJldmlzaW9uQXJyYXkgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdyZXZpc2lvbicpIGFzIEZvcm1BcnJheTtcclxuICAgIHJldmlzaW9uQXJyYXkuY2xlYXIoKTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEucmV2aXNpb24pKSB7XHJcbiAgICAgIGRhdGEucmV2aXNpb24uZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgcmV2aXNpb25BcnJheS5wdXNoKHRoaXMuY3JlYXRlUmV2aXNpb24oaXRlbS5hY3Rpb25UeXBlLCBpdGVtLmlzQ2hlY2tlZCkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwYXRjaCB0YWdnaW5nTGltaXRhdGlvbiAtLSBiYXNlZCBvbiBuZXcga2V5IGZvcm1hdCBcImVmZmVjdGl2ZUZyb21cIlxyXG4gICAgY29uc3QgdGFnQXJyYXkgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCd0YWdnaW5nTGltaXRhdGlvbicpIGFzIEZvcm1BcnJheTtcclxuICAgIHRhZ0FycmF5LmNsZWFyKCk7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhPy50YWdnaW5nTGltaXRhdGlvbikgJiYgZGF0YT8udGFnZ2luZ0xpbWl0YXRpb24/Lmxlbmd0aCA+IDAgJiYgXHJcbiAgICBkYXRhPy50YWdnaW5nTGltaXRhdGlvbj8ubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIC8vIE9ubHkgb25lIGNvbmZpZyBwcmVzZW50IOKAkyB1c2UgaXRzIHZhbHVlcyBkaXJlY3RseVxyXG4gICAgICBkYXRhPy50YWdnaW5nTGltaXRhdGlvblswXT8udmFsdWVzPy5mb3JFYWNoKCh0YWc6IGFueSkgPT4ge1xyXG4gICAgICAgIHRhZ0FycmF5LnB1c2godGhpcy5jcmVhdGVUYWdMaW1pdCh0YWc/LnR5cGUsIHRhZz8udmFsdWUsIHRhZz8uaWNvbk5hbWUsIHRhZz8ubmFtZSwgdGFnPy5rZXkpKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGF0YT8udGFnZ2luZ0xpbWl0YXRpb24pICYmIGRhdGE/LnRhZ2dpbmdMaW1pdGF0aW9uPy5sZW5ndGggPiAwICYmIFxyXG4gICAgZGF0YT8udGFnZ2luZ0xpbWl0YXRpb24/Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgLy8gTXVsdGlwbGUgY29uZmlncyBwcmVzZW50IOKAkyBwaWNrIHRoZSBvbmUgd2l0aCBsYXRlc3QgZWZmZWN0aXZlRnJvbSBkYXRlXHJcbiAgICAgIGNvbnN0IGxhdGVzdEVudHJ5ID0gZGF0YS50YWdnaW5nTGltaXRhdGlvbi5yZWR1Y2UoKGxhdGVzdDogYW55LCBjdXJyZW50OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWN1cnJlbnQgfHwgIWN1cnJlbnQuZWZmZWN0aXZlRnJvbSkge1xyXG4gICAgICAgICAgcmV0dXJuIGxhdGVzdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFsYXRlc3QgfHwgIWxhdGVzdC5lZmZlY3RpdmVGcm9tKSB7XHJcbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZShjdXJyZW50LmVmZmVjdGl2ZUZyb20pO1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdERhdGUgPSBuZXcgRGF0ZShsYXRlc3QuZWZmZWN0aXZlRnJvbSk7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlID4gbGF0ZXN0RGF0ZSA/IGN1cnJlbnQgOiBsYXRlc3Q7XHJcbiAgICAgIH0sIG51bGwpO1xyXG5cclxuICAgICAgaWYgKGxhdGVzdEVudHJ5ICYmIEFycmF5LmlzQXJyYXkobGF0ZXN0RW50cnkudmFsdWVzKSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdlZmZlY3RpdmVGcm9tOicsIGxhdGVzdEVudHJ5LmVmZmVjdGl2ZUZyb20pO1xyXG4gICAgICAgIGxhdGVzdEVudHJ5LnZhbHVlcy5mb3JFYWNoKCh0YWc6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGFnQXJyYXkucHVzaCh0aGlzLmNyZWF0ZVRhZ0xpbWl0KHRhZz8udHlwZSwgdGFnPy52YWx1ZSwgdGFnPy5pY29uTmFtZSwgdGFnPy5uYW1lLCB0YWc/LmtleSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcGF0Y2ggYWNjdXJhY3lCcmVhY2ggZ3JvdXBcclxuICAgIGlmIChkYXRhLmFjY3VyYWN5QnJlYWNoKSB7XHJcbiAgICAgIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoJyk/LnBhdGNoVmFsdWUoe1xyXG4gICAgICAgIHRpY2tldENvdW50OiBkYXRhLmFjY3VyYWN5QnJlYWNoLnRpY2tldENvdW50LFxyXG4gICAgICAgIGRheXM6IGRhdGEuYWNjdXJhY3lCcmVhY2guZGF5cyA/PyAnMzAnLFxyXG4gICAgICAgIGFjY3VyYWN5OiBkYXRhLmFjY3VyYWN5QnJlYWNoLmFjY3VyYWN5XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHBhdGNoIHNpbXBsZSBmaWVsZHNcclxuICAgIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgYWxsb3dUaWNrZXRDcmVhdGlvbjogZGF0YS5hbGxvd1RpY2tldENyZWF0aW9uID8/IDMsXHJcbiAgICAgIGlzQXV0b0Nsb3NlRW5hYmxlOiBkYXRhLmlzQXV0b0Nsb3NlRW5hYmxlID8/IGZhbHNlLFxyXG4gICAgICBhdXRvQ2xvc2VBY2N1cmFjeTogZGF0YS5hdXRvQ2xvc2VBY2N1cmFjeSA/PyAnOTUlJyxcclxuICAgICAgdGFuZ29SZXZpZXc6IGRhdGEudGFuZ29SZXZpZXcgPz8gJzg1JSdcclxuICAgIH0pO1xyXG4gICAgdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmRpc2FibGUoKTtcclxuICAgIC8vIEFwcGx5IGRlcGVuZGVuY3kgbG9naWNcclxuICAgIHRoaXMuaGFuZGxlUmV2aXNpb25EZXBlbmRlbmNpZXMoKTtcclxuICB9XHJcblxyXG4gIG9wZW5DYXRlZ29yeU1vZGFsKG1vZGU6ICdhZGQnIHwgJ2VkaXQnLCBpbmRleD86IG51bWJlcikge1xyXG4gICAgaWYgKG1vZGUgPT09ICdhZGQnICYmIHRoaXMuaXNDYXRlZ29yeUxpbWl0UmVhY2hlZCkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdCgnTWF4aW11bSBDYXRlZ29yeSBjcmVhdGlvbiBsaW1pdCByZWFjaGVkJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9IG1vZGU7XHJcbiAgICB0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4ID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IGluZGV4IDogbnVsbDtcclxuXHJcbiAgICBpZiAobW9kZSA9PT0gJ2VkaXQnICYmIHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgY2F0ZWdvcnlHcm91cCA9IHRoaXMudGFnTGltaXRzLmF0KHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgICAgdGhpcy5jYXRlZ29yeUZvcm0uc2V0VmFsdWUoe1xyXG4gICAgICAgIGljb25OYW1lOiBjYXRlZ29yeUdyb3VwLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgfHwgdGhpcy5iYXNlQ2F0ZWdvcnlJY29uc1swXS52YWx1ZSxcclxuICAgICAgICBuYW1lOiBjYXRlZ29yeUdyb3VwLmdldCgnbmFtZScpPy52YWx1ZSB8fCBjYXRlZ29yeUdyb3VwLmdldCgndHlwZScpPy52YWx1ZSB8fCAnJyxcclxuICAgICAgICBsaW1pdDogY2F0ZWdvcnlHcm91cC5nZXQoJ3ZhbHVlJyk/LnZhbHVlIHx8IHRoaXMucGVyY2VudGFnZUxpc3RbMF1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhdGVnb3J5Rm9ybS5yZXNldCh7XHJcbiAgICAgICAgaWNvbk5hbWU6IHRoaXMuYmFzZUNhdGVnb3J5SWNvbnNbMF0udmFsdWUsXHJcbiAgICAgICAgbmFtZTogJycsXHJcbiAgICAgICAgbGltaXQ6IHRoaXMucGVyY2VudGFnZUxpc3RbMF1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jYXRlZ29yeU1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmNhdGVnb3J5TW9kYWxUcGwsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIHNpemU6ICdtZCcsXHJcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcclxuICAgICAga2V5Ym9hcmQ6IHRydWVcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3VibWl0Q2F0ZWdvcnlGb3JtKCkge1xyXG4gICAgaWYgKHRoaXMuY2F0ZWdvcnlGb3JtLmludmFsaWQpIHtcclxuICAgICAgdGhpcy5jYXRlZ29yeUZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgeyBpY29uTmFtZSwgbmFtZSwgbGltaXQgfSA9IHRoaXMuY2F0ZWdvcnlGb3JtLnZhbHVlO1xyXG4gICAgY29uc3QgdHJpbW1lZE5hbWUgPSAobmFtZSB8fCAnJykudHJpbSgpO1xyXG5cclxuICAgIGlmICghdHJpbW1lZE5hbWUpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdDYXRlZ29yeSBuYW1lIGlzIHJlcXVpcmVkLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZHVwbGljYXRlSW5kZXggPSB0aGlzLnRhZ0xpbWl0cy5jb250cm9scy5maW5kSW5kZXgoKGN0cmwsIGlkeCkgPT5cclxuICAgICAgKGN0cmwuZ2V0KCduYW1lJyk/LnZhbHVlPy50b0xvd2VyQ2FzZSgpID09PSB0cmltbWVkTmFtZS50b0xvd2VyQ2FzZSgpIHx8IFxyXG4gICAgICAgY3RybC5nZXQoJ3R5cGUnKT8udmFsdWU/LnRvTG93ZXJDYXNlKCkgPT09IHRyaW1tZWROYW1lLnRvTG93ZXJDYXNlKCkpICYmXHJcbiAgICAgIGlkeCAhPT0gKHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggPz8gLTEpXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChkdXBsaWNhdGVJbmRleCAhPT0gLTEpIHtcclxuICAgICAgY29uc3QgbmFtZUNvbnRyb2wgPSB0aGlzLmNhdGVnb3J5Rm9ybS5nZXQoJ25hbWUnKTtcclxuICAgICAgbmFtZUNvbnRyb2w/LnNldEVycm9ycyh7IGR1cGxpY2F0ZTogdHJ1ZSB9KTtcclxuICAgICAgbmFtZUNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIGljb25OYW1lIGFscmVhZHkgZXhpc3RzXHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcpIHtcclxuICAgICAgY29uc3QgZXhpc3RpbmdJY29uID0gdGhpcy50YWdMaW1pdHMuY29udHJvbHMuZmluZCgoY3RybCkgPT4gXHJcbiAgICAgICAgY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlID09PSBpY29uTmFtZVxyXG4gICAgICApO1xyXG4gICAgICBcclxuICAgICAgaWYgKGV4aXN0aW5nSWNvbikge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnVGhpcyBpY29uIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5LicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID09PSAnZWRpdCcgJiYgdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBJbiBlZGl0IG1vZGUsIGNoZWNrIGlmIGljb24gaXMgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5IChleGNsdWRpbmcgY3VycmVudCBvbmUpXHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nSWNvbiA9IHRoaXMudGFnTGltaXRzLmNvbnRyb2xzLmZpbmQoKGN0cmwsIGlkeCkgPT4gXHJcbiAgICAgICAgY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlID09PSBpY29uTmFtZSAmJiBpZHggIT09IHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXhcclxuICAgICAgKTtcclxuICAgICAgXHJcbiAgICAgIGlmIChleGlzdGluZ0ljb24pIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1RoaXMgaWNvbiBpcyBhbHJlYWR5IHVzZWQgYnkgYW5vdGhlciBjYXRlZ29yeS4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcpIHtcclxuICAgICAgLy8gR2VuZXJhdGUgdHlwZSBmcm9tIG5hbWUgKGxvd2VyY2FzZSwgcmVtb3ZlIHNwYWNlcylcclxuICAgICAgY29uc3QgdHlwZSA9IHRyaW1tZWROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnJyk7XHJcbiAgICAgIGNvbnN0IGtleSA9IHR5cGUuY2hhckF0KDApO1xyXG4gICAgICB0aGlzLnRhZ0xpbWl0cy5wdXNoKHRoaXMuY3JlYXRlVGFnTGltaXQodHlwZSwgTnVtYmVyKGxpbWl0KSwgaWNvbk5hbWUsIHRyaW1tZWROYW1lLCBrZXkpKTtcclxuICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ0NhdGVnb3J5IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4ICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3J5R3JvdXAgPSB0aGlzLnRhZ0xpbWl0cy5hdCh0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4KSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgIGNhdGVnb3J5R3JvdXAucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgbmFtZTogdHJpbW1lZE5hbWUsXHJcbiAgICAgICAgdmFsdWU6IE51bWJlcihsaW1pdCksXHJcbiAgICAgICAgaWNvbk5hbWU6IGljb25OYW1lXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnQ2F0ZWdvcnkgdXBkYXRlZCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbG9zZUNhdGVnb3J5TW9kYWwoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlQ2F0ZWdvcnlNb2RhbCgpIHtcclxuICAgIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxSZWYpIHtcclxuICAgICAgdGhpcy5jYXRlZ29yeU1vZGFsUmVmLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMuY2F0ZWdvcnlNb2RhbFJlZiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb3BlbkRlbGV0ZUNhdGVnb3J5TW9kYWwoaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXggPSBpbmRleDtcclxuICAgIGNvbnN0IGNhdGVnb3J5R3JvdXAgPSB0aGlzLnRhZ0xpbWl0cy5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgdGhpcy5jYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lID0gY2F0ZWdvcnlHcm91cC5nZXQoJ25hbWUnKT8udmFsdWUgfHwgJ3RoaXMgY2F0ZWdvcnknO1xyXG4gICAgdGhpcy5kZWxldGVNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5kZWxldGVDYXRlZ29yeU1vZGFsVHBsLCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICBzaXplOiAnc20nLFxyXG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXHJcbiAgICAgIGtleWJvYXJkOiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25maXJtRGVsZXRlQ2F0ZWdvcnkoKSB7XHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXggPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50YWdMaW1pdHMucmVtb3ZlQXQodGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXgpO1xyXG4gICAgdGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXggPSBudWxsO1xyXG4gICAgdGhpcy5jYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lID0gJyc7XHJcbiAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnQ2F0ZWdvcnkgZGVsZXRlZCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICB0aGlzLmNsb3NlRGVsZXRlTW9kYWwoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlRGVsZXRlTW9kYWwoKSB7XHJcbiAgICBpZiAodGhpcy5kZWxldGVNb2RhbFJlZikge1xyXG4gICAgICB0aGlzLmRlbGV0ZU1vZGFsUmVmLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMuZGVsZXRlTW9kYWxSZWYgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lID0gJyc7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RDYXRlZ29yeUljb24oaWNvblZhbHVlOiBzdHJpbmcpIHtcclxuICAgIC8vIENoZWNrIGlmIGljb25OYW1lIGFscmVhZHkgZXhpc3RzXHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcpIHtcclxuICAgICAgY29uc3QgZXhpc3RpbmdJY29uID0gdGhpcy50YWdMaW1pdHMuY29udHJvbHMuZmluZCgoY3RybCkgPT4gXHJcbiAgICAgICAgY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlID09PSBpY29uVmFsdWVcclxuICAgICAgKTtcclxuICAgICAgXHJcbiAgICAgIGlmIChleGlzdGluZ0ljb24pIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1RoaXMgaWNvbiBpcyBhbHJlYWR5IHVzZWQgYnkgYW5vdGhlciBjYXRlZ29yeS4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2VkaXQnICYmIHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggIT09IG51bGwpIHtcclxuICAgICAgLy8gSW4gZWRpdCBtb2RlLCBjaGVjayBpZiBpY29uIGlzIHVzZWQgYnkgYW5vdGhlciBjYXRlZ29yeSAoZXhjbHVkaW5nIGN1cnJlbnQgb25lKVxyXG4gICAgICBjb25zdCBleGlzdGluZ0ljb24gPSB0aGlzLnRhZ0xpbWl0cy5jb250cm9scy5maW5kKChjdHJsLCBpZHgpID0+IFxyXG4gICAgICAgIGN0cmwuZ2V0KCdpY29uTmFtZScpPy52YWx1ZSA9PT0gaWNvblZhbHVlICYmIGlkeCAhPT0gdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleFxyXG4gICAgICApO1xyXG4gICAgICBcclxuICAgICAgaWYgKGV4aXN0aW5nSWNvbikge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnVGhpcyBpY29uIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5LicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLmNhdGVnb3J5Rm9ybS5nZXQoJ2ljb25OYW1lJyk/LnNldFZhbHVlKGljb25WYWx1ZSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDYXRlZ29yeU1lbnUoZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuYWN0aXZlTWVudUluZGV4ID0gdGhpcy5hY3RpdmVNZW51SW5kZXggPT09IGluZGV4ID8gbnVsbCA6IGluZGV4O1xyXG4gIH1cclxuXHJcbiAgb25DYXRlZ29yeU1lbnVBY3Rpb24oZXZlbnQ6IEV2ZW50LCBhY3Rpb246ICdlZGl0JyB8ICdkZWxldGUnLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuYWN0aXZlTWVudUluZGV4ID0gbnVsbDtcclxuICAgIGlmIChhY3Rpb24gPT09ICdlZGl0Jykge1xyXG4gICAgICB0aGlzLm9wZW5DYXRlZ29yeU1vZGFsKCdlZGl0JywgaW5kZXgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcGVuRGVsZXRlQ2F0ZWdvcnlNb2RhbChpbmRleCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVMaW1pdERyb3Bkb3duKGV2ZW50OiBFdmVudCwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5pc0VkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vcGVuTGltaXREcm9wZG93bkluZGV4ID0gdGhpcy5vcGVuTGltaXREcm9wZG93bkluZGV4ID09PSBpbmRleCA/IG51bGwgOiBpbmRleDtcclxuICB9XHJcblxyXG4gIHNlbGVjdExpbWl0VmFsdWUoZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSAodGhpcy50YWdMaW1pdHMuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ2F0ZWdvcnlMaW1pdERyb3Bkb3duKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9ICF0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHNlbGVjdENhdGVnb3J5TGltaXRWYWx1ZShldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuY2F0ZWdvcnlGb3JtLmdldCgnbGltaXQnKTtcclxuICAgIGNvbnRyb2w/LnNldFZhbHVlKHZhbHVlKTtcclxuICAgIGNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQXV0b0Nsb3NlRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBpc0F1dG9DbG9zZUVuYWJsZWQgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdpc0F1dG9DbG9zZUVuYWJsZScpPy52YWx1ZTtcclxuICAgIGlmICghaXNBdXRvQ2xvc2VFbmFibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW4gPSAhdGhpcy5pc0F1dG9DbG9zZURyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbmRUYW5nb0Nsb3NlRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzc2VuZFRhbmdvRHJvcGRvd25PcGVuID0gIXRoaXMuaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICBzZWxlY3RBdXRvQ2xvc2VBY2N1cmFjeShldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2F1dG9DbG9zZUFjY3VyYWN5Jyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZShgJHt2YWx1ZX0lYCk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFNlbmRUaWNrZXRUYW5nbyhldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3RhbmdvUmV2aWV3Jyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZShgJHt2YWx1ZX0lYCk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVRpY2tldENvdW50RHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzVGlja2V0Q291bnREcm9wZG93bk9wZW4gPSAhdGhpcy5pc1RpY2tldENvdW50RHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0VGlja2V0Q291bnQoZXZlbnQ6IEV2ZW50LCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaC50aWNrZXRDb3VudCcpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLmlzVGlja2V0Q291bnREcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVN0b3JlRGF5c0Ryb3Bkb3duKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5pc0VkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc1N0b3JlRGF5c0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmlzU3RvcmVEYXlzRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U3RvcmVEYXlzKGV2ZW50OiBFdmVudCwgb3B0aW9uOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnYWNjdXJhY3lCcmVhY2guZGF5cycpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUob3B0aW9uLnZhbHVlKTtcclxuICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5pc1N0b3JlRGF5c0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkRGF5c0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaC5kYXlzJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRheXNPcHRpb25zLmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PT0gY3VycmVudFZhbHVlKTtcclxuICAgIHJldHVybiBtYXRjaD8ubGFiZWwgfHwgJ01vbnRoJztcclxuICB9XHJcblxyXG4gIHRvZ2dsZVN0b3JlQWNjdXJhY3lEcm9wZG93bihldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNTdG9yZUFjY3VyYWN5RHJvcGRvd25PcGVuID0gIXRoaXMuaXNTdG9yZUFjY3VyYWN5RHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U3RvcmVBY2N1cmFjeShldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoLmFjY3VyYWN5Jyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZShgJHt2YWx1ZX0lYCk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNTdG9yZUFjY3VyYWN5RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlbiA9ICF0aGlzLmlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHNlbGVjdEFsbG93VGlja2V0Q3JlYXRpb24oZXZlbnQ6IEV2ZW50LCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhbGxvd1RpY2tldENyZWF0aW9uJyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNDYXRlZ29yeUxpbWl0UmVhY2hlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRhZ0xpbWl0cy5sZW5ndGggPj0gdGhpcy5tYXhDYXRlZ29yeUNvdW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQXBwcm92ZXJEaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJldmlzaW9ucyA9IHRoaXMucmV2aXNpb25BcnJheS5jb250cm9scztcclxuICAgIGNvbnN0IHJldmlld2VyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAncmV2aWV3ZXInKTtcclxuICAgIGNvbnN0IGFwcHJvdmVyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInKTtcclxuICAgIFxyXG4gICAgaWYgKHJldmlld2VyICYmIGFwcHJvdmVyKSB7XHJcbiAgICAgIGNvbnN0IHJldmlld2VyQ2hlY2tlZCA9IHJldmlld2VyLmdldCgnaXNDaGVja2VkJyk/LnZhbHVlO1xyXG4gICAgICBjb25zdCBhcHByb3ZlckNvbnRyb2wgPSBhcHByb3Zlci5nZXQoJ2lzQ2hlY2tlZCcpO1xyXG4gICAgICAvLyBDaGVjayBpZiBhcHByb3ZlciBpcyBkaXNhYmxlZCBPUiByZXZpZXdlciBpcyBub3QgY2hlY2tlZFxyXG4gICAgICByZXR1cm4gYXBwcm92ZXJDb250cm9sPy5kaXNhYmxlZCB8fCAhcmV2aWV3ZXJDaGVja2VkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzVGFuZ29EaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIC8vIFRhbmdvIGFsd2F5cyBzaG93cyBkaXNhYmxlZCBkZXNpZ25cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Q2F0ZWdvcnlGb3JtKCkge1xyXG4gICAgdGhpcy5jYXRlZ29yeUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgaWNvbk5hbWU6IFt0aGlzLmJhc2VDYXRlZ29yeUljb25zWzBdLnZhbHVlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgbmFtZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMzApXV0sXHJcbiAgICAgIGxpbWl0OiBbdGhpcy5wZXJjZW50YWdlTGlzdFswXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snKVxyXG4gIGNsb3NlTWVudXMoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU1lbnVJbmRleCA9IG51bGw7XHJcbiAgICB0aGlzLm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPSBudWxsO1xyXG4gICAgdGhpcy5pc0NhdGVnb3J5TGltaXREcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1N0b3JlRGF5c0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1N0b3JlQWNjdXJhY3lEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzc2VuZFRhbmdvRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDYXRlZ29yeUljb25Ecm9wZG93bihldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5pc0NhdGVnb3J5SWNvbkRyb3Bkb3duT3BlbiA9ICF0aGlzLmlzQ2F0ZWdvcnlJY29uRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Q2F0ZWdvcnlJY29uRnJvbURyb3Bkb3duKGV2ZW50OiBFdmVudCwgaWNvblZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5zZWxlY3RDYXRlZ29yeUljb24oaWNvblZhbHVlKTtcclxuICAgIHRoaXMuaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldENsaWVudE1hcHBlZFN0b3Jlc0RldGFpbHMoY2xpZW5JZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0b3JlTGlzdCA9IFtdO1xyXG4gICAgIHRoaXMuYXBpU2VydmljZS5nZXRGb290ZmFsbFN0b3JlUmFpc2VEZXRhaWxzKGNsaWVuSWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAvLyB0aGlzLmFwaVNlcnZpY2UuZ2V0Rm9vdGZhbGxEZXRhaWxzKGNsaWVuSWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6KHJlczogYW55KT0+e1xyXG4gICAgICAgIGlmKHJlcyAmJiByZXMuY29kZT09JzIwMCcpe1xyXG4gICAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSByZXM/LmRhdGE/LnJlc3VsdDtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgfSxcclxuICAgICAgICBlcnJvcjooZXJyKT0+e1xyXG4gICAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSBbXTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgc3RvcmUgbGlzdCcsIGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICB9KVxyXG4gIH1cclxuXHJcblxyXG4gIC8vIGhlbHBlcnNcclxuICBnZXQgcmV2aXNpb25BcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3JldmlzaW9uJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRhZ0xpbWl0cygpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3RhZ2dpbmdMaW1pdGF0aW9uJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcblxyXG4gIGNyZWF0ZVJldmlzaW9uKGFjdGlvblR5cGU6IHN0cmluZywgaXNDaGVja2VkOiBib29sZWFuKTogRm9ybUdyb3VwIHtcclxuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgYWN0aW9uVHlwZTogW2FjdGlvblR5cGVdLFxyXG4gICAgICBpc0NoZWNrZWQ6IFtpc0NoZWNrZWRdXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVRhZ0xpbWl0KHR5cGU6IHN0cmluZywgdmFsdWU6IG51bWJlciwgaWNvbk5hbWU6IHN0cmluZywgbmFtZT86IHN0cmluZywga2V5Pzogc3RyaW5nKTogRm9ybUdyb3VwIHtcclxuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdHlwZTogW3R5cGVdLFxyXG4gICAgICB2YWx1ZTogW3ZhbHVlXSxcclxuICAgICAgdW5pdDogWyclJ10sXHJcbiAgICAgIGljb25OYW1lOiBbaWNvbk5hbWVdLFxyXG4gICAgICBuYW1lOiBbbmFtZV0sXHJcbiAgICAgIGtleTogW2tleV1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU3RvcmVTZWxlY3Rpb24oc3RvcmU6IGFueSwgY2hlY2tlZDogYm9vbGVhbikge1xyXG4gICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgdGhpcy5yZXNldFJlcXVlc3QuY2xpZW50SWQgPSB0aGlzLmNsaWVuSWQ7XHJcbiAgICAgIHRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMucHVzaCh7IHN0b3JlSWQ6IHN0b3JlLnN0b3JlSWQsIGRhdGVTdHJpbmc6IHN0b3JlLmRhdGVTdHJpbmcgfSk7XHJcbiAgICB9IGVsc2UgaWYgKCFjaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3JlcyA9IHRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMuZmlsdGVyKFxyXG4gICAgICAgIChzKSA9PiBzLnN0b3JlSWQgIT09IHN0b3JlLnN0b3JlSWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzU3RvcmVTZWxlY3RlZChzdG9yZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5zb21lKHIgPT4gci5zdG9yZUlkID09PSBzdG9yZS5zdG9yZUlkKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVMaXN0Lmxlbmd0aCA+IDAgJiYgdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5sZW5ndGggPT09IHRoaXMuc3RvcmVMaXN0Lmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8vIHNlbGVjdCBhbGwgc3RvcmVzIHJlcXVlc3QgbGlzdCBoYW5kbGVyXHJcbiAgdG9nZ2xlU2VsZWN0QWxsKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBjaGVja2VkID0gdGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZFN0b3JlcyA9IHRoaXMuc3RvcmVMaXN0Lm1hcCgoc3RvcmU6IGFueSkgPT4gKHtcclxuICAgICAgICBzdG9yZUlkOiBzdG9yZS5zdG9yZUlkLFxyXG4gICAgICAgIGRhdGVTdHJpbmc6IHN0b3JlLmRhdGVTdHJpbmdcclxuICAgICAgfSkpO1xyXG4gICAgICB0aGlzLnJlc2V0UmVxdWVzdCA9IHRoaXMuYnVpbGRSZXNldFBheWxvYWQoc2VsZWN0ZWRTdG9yZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXNldFJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVzZXRQYXlsb2FkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVSZXZpc2lvbkRlcGVuZGVuY2llcygpIHtcclxuICAgIGNvbnN0IHJldmlzaW9ucyA9IHRoaXMucmV2aXNpb25BcnJheS5jb250cm9scztcclxuICAgIGNvbnN0IHJldmlld2VyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAncmV2aWV3ZXInKTtcclxuICAgIGNvbnN0IGFwcHJvdmVyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInKTtcclxuICAgIGNvbnN0IHRhbmdvID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAndGFuZ28nKTtcclxuXHJcbiAgICBpZiAodGFuZ28pIHtcclxuICAgICAgdGFuZ28uZ2V0KCdpc0NoZWNrZWQnKT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJldmlld2VyICYmIGFwcHJvdmVyKSB7XHJcbiAgICAgIC8vIGRpc2FibGUgYXBwcm92ZXIgaW5pdGlhbGx5IGlmIHJldmlld2VyIHVuY2hlY2tlZFxyXG4gICAgICBpZiAoIXJldmlld2VyLmdldCgnaXNDaGVja2VkJyk/LnZhbHVlKSB7XHJcbiAgICAgICAgYXBwcm92ZXIuZ2V0KCdpc0NoZWNrZWQnKT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgYXBwcm92ZXIucGF0Y2hWYWx1ZSh7IGlzQ2hlY2tlZDogZmFsc2UgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGVuYWJsZSBhcHByb3ZlciBpZiByZXZpZXdlciBpcyBjaGVja2VkXHJcbiAgICAgICAgYXBwcm92ZXIuZ2V0KCdpc0NoZWNrZWQnKT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gbGlzdGVuIHJldmlld2VyIGNoZWNrYm94IGNoYW5nZSAob25seSB3aXJlIG9uY2UpXHJcbiAgICAgIGlmICghdGhpcy5yZXZpc2lvbkRlcHNJbml0aWFsaXplZCkge1xyXG4gICAgICAgIHJldmlld2VyLmdldCgnaXNDaGVja2VkJyk/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChjaGVja2VkKSA9PiB7XHJcbiAgICAgICAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICAgICAgICBhcHByb3Zlci5nZXQoJ2lzQ2hlY2tlZCcpPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXBwcm92ZXIuZ2V0KCdpc0NoZWNrZWQnKT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIGFwcHJvdmVyLnBhdGNoVmFsdWUoeyBpc0NoZWNrZWQ6IGZhbHNlIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJldmlzaW9uRGVwc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRm9ybSgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNFZGl0ID0gIXRoaXMuaXNFZGl0O1xyXG4gICAgaWYgKCF0aGlzLmlzRWRpdCkge1xyXG4gICAgICAvLyBGaXJzdCwgZW5zdXJlIGFwcHJvdmVyIHN0YXRlIGlzIGNvcnJlY3QgYmVmb3JlIGVuYWJsaW5nIGZvcm1cclxuICAgICAgY29uc3QgcmV2aXNpb25zID0gdGhpcy5yZXZpc2lvbkFycmF5LmNvbnRyb2xzO1xyXG4gICAgICBjb25zdCByZXZpZXdlciA9IHJldmlzaW9ucy5maW5kKChyKSA9PiByLmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ3Jldmlld2VyJyk7XHJcbiAgICAgIGNvbnN0IGFwcHJvdmVyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInKTtcclxuICAgICAgXHJcbiAgICAgIC8vIElmIHJldmlld2VyIGlzIHVuY2hlY2tlZCwgZW5zdXJlIGFwcHJvdmVyIGlzIHVuY2hlY2tlZCBiZWZvcmUgZW5hYmxpbmdcclxuICAgICAgaWYgKHJldmlld2VyICYmIGFwcHJvdmVyICYmICFyZXZpZXdlci5nZXQoJ2lzQ2hlY2tlZCcpPy52YWx1ZSkge1xyXG4gICAgICAgIGFwcHJvdmVyLnBhdGNoVmFsdWUoeyBpc0NoZWNrZWQ6IGZhbHNlIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmVuYWJsZSgpO1xyXG4gICAgICAvLyBSZS1hcHBseSByZXZpc2lvbiBkZXBlbmRlbmNpZXMgYWZ0ZXIgZW5hYmxpbmcgdG8gZW5zdXJlIGFwcHJvdmVyIHN0YXRlIGlzIGNvcnJlY3RcclxuICAgICAgdGhpcy5oYW5kbGVSZXZpc2lvbkRlcGVuZGVuY2llcygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmRpc2FibGUoKTtcclxuICAgICAgLy8gUmUtYXBwbHkgcmV2aXNpb24gZGVwZW5kZW5jaWVzIHNvIFRhbmdvIHJlbWFpbnMgZGlzYWJsZWRcclxuICAgICAgLy8gYW5kIEFwcHJvdmVyIGZvbGxvd3MgUmV2aWV3ZXIgaW4gYm90aCB2aWV3IGFuZCBlZGl0IG1vZGVzLlxyXG4gICAgICB0aGlzLmhhbmRsZVJldmlzaW9uRGVwZW5kZW5jaWVzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vIE9wZW4gcmVzZXQgY29uZmlybWF0aW9uIG1vZGFsXHJcbiAgb3BlblJlc2V0Q29uZmlybWF0aW9uTW9kYWwoKSB7XHJcbiAgICBpZiAoIXRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMubGVuZ3RoIHx8IHRoaXMuaXNSZXNldHRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXNldE1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLnJlc2V0Q29uZmlybWF0aW9uTW9kYWxUcGwsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIHNpemU6ICdzbScsXHJcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcclxuICAgICAga2V5Ym9hcmQ6IGZhbHNlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIENsb3NlIHJlc2V0IGNvbmZpcm1hdGlvbiBtb2RhbFxyXG4gIGNsb3NlUmVzZXRNb2RhbCgpIHtcclxuICAgIGlmICh0aGlzLnJlc2V0TW9kYWxSZWYpIHtcclxuICAgICAgdGhpcy5yZXNldE1vZGFsUmVmLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMucmVzZXRNb2RhbFJlZiA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBDb25maXJtIGFuZCBwcm9jZWVkIHdpdGggcmVzZXRcclxuICBjb25maXJtUmVzZXRTdG9yZVJlcXVlc3QoKSB7XHJcbiAgICBpZiAoIXRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMubGVuZ3RoIHx8IHRoaXMuaXNSZXNldHRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gQ2xvc2UgbW9kYWwgaW1tZWRpYXRlbHlcclxuICAgIHRoaXMuY2xvc2VSZXNldE1vZGFsKCk7XHJcbiAgICBcclxuICAgIC8vIFByb2NlZWQgd2l0aCByZXNldCBvcGVyYXRpb25cclxuICAgIHRoaXMuaXNSZXNldHRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLnJlc2V0U3RvcmVSZXF1ZXN0TGlzdCh0aGlzLnJlc2V0UmVxdWVzdClcclxuICAgIC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICB0aGlzLmlzUmVzZXR0aW5nID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDoocmVzOiBhbnkpPT57XHJcbiAgICAgIGlmKHJlcyAmJiByZXMuY29kZT09JzIwMCcpe1xyXG4gICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gcmVzPy5kYXRhPy5yZXN1bHQ7XHJcbiAgICAgICAgdGhpcy5nZXRDbGllbnRNYXBwZWRTdG9yZXNEZXRhaWxzKHRoaXMuY2xpZW5JZCk7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ1N0b3JlIHJlcXVlc3RzIHJlc2V0IHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byByZXNldCBzdG9yZSByZXF1ZXN0cy4nKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlc2V0UmVxdWVzdCA9IHRoaXMuYnVpbGRSZXNldFBheWxvYWQoKTtcclxuICAgICB9LFxyXG4gICAgICBlcnJvcjooZXJyKT0+e1xyXG4gICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdFcnJvciByZXNldHRpbmcgc3RvcmUgcmVxdWVzdHMuJyk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgc3RvcmUgbGlzdCcsIGVycik7XHJcbiAgICAgIH0sXHJcbiAgIH0pXHJcbiAgfVxyXG5cclxuICAvLyB0byByZXNldCBzdG9yZSBsaXN0IChrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlmIG5lZWRlZClcclxuICByZXNldFN0b3JlUmVxdWVzdCgpIHtcclxuICAgIHRoaXMub3BlblJlc2V0Q29uZmlybWF0aW9uTW9kYWwoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1Jlc2V0RGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMubGVuZ3RoIHx8IHRoaXMuaXNSZXNldHRpbmcgfHwgdGhpcy5pc0VkaXQ7XHJcbiAgfVxyXG5cclxuICBvblN1Ym1pdCgpIHtcclxuICAgIC8vIEVuc3VyZSBUYW5nbyBjaGVja2JveCBpcyBhbHdheXMgdHJ1ZSB3aGVuIHNhdmluZ1xyXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldFJhd1ZhbHVlKCk7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JtVmFsdWUucmV2aXNpb24pKSB7XHJcbiAgICAgIGNvbnN0IHRhbmdvSW5kZXggPSBmb3JtVmFsdWUucmV2aXNpb24uZmluZEluZGV4KChyOiBhbnkpID0+IHI/LmFjdGlvblR5cGUgPT09ICd0YW5nbycpO1xyXG4gICAgICBpZiAodGFuZ29JbmRleCAhPT0gLTEpIHtcclxuICAgICAgICBmb3JtVmFsdWUucmV2aXNpb25bdGFuZ29JbmRleF0uaXNDaGVja2VkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coJ3VwZGF0ZSBmb3JtIGNvbmZpZyA+PicsIGZvcm1WYWx1ZSk7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50Rm9ybURhdGEubmV4dCh7IHZhbHVlOiBmb3JtVmFsdWUsIHR5cGU6ICdzdWJtaXQnLCBmb3JtOiAnZm9vdGZhbGxEaXJlY3RvcnlDb25maWdzJyB9KVxyXG4gICAgLy8gY29uc3QgZm9ybVZhbHVlID0geyAuLi50aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0udmFsdWUgfTtcclxuICAgIC8vIGlmIChBcnJheS5pc0FycmF5KGZvcm1WYWx1ZS50YWdnaW5nTGltaXRhdGlvbikpIHtcclxuICAgIC8vICAgZm9ybVZhbHVlLnRhZ2dpbmdMaW1pdGF0aW9uID0gZm9ybVZhbHVlLnRhZ2dpbmdMaW1pdGF0aW9uLm1hcCgodGFnOiBhbnkpID0+ICh7XHJcbiAgICAvLyAgICAgdHlwZTogdGFnLnR5cGUsXHJcbiAgICAvLyAgICAgdmFsdWU6IHRhZy52YWx1ZSxcclxuICAgIC8vICAgICB1bml0OiB0YWcudW5pdCB8fCAnJSdcclxuICAgIC8vICAgICAvLyBpY29uTmFtZTogdGFnLmljb25OYW1lLFxyXG4gICAgLy8gICAgIC8vIG5hbWU6IHRhZy5uYW1lIHx8IHRhZy50eXBlXHJcbiAgICAvLyAgIH0pKTtcclxuICAgIC8vIH1cclxuICAgIC8vIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAvLyAgIGZvb3RmYWxsRGlyZWN0b3J5Q29uZmlnczogZm9ybVZhbHVlLFxyXG4gICAgLy8gICByZXF1ZXN0OiB0aGlzLnJlc2V0UmVxdWVzdFxyXG4gICAgLy8gfTtcclxuICAgICAgLy8gY29uc3Qgb2JqID0ge1xyXG4gICAgICAvLyAgIHRhbmdvUmV2aWV3OiBmb3JtVmFsdWUudGFuZ29SZXZpZXcsXHJcbiAgICAgIC8vICAgYWNjdXJhY3lCcmVhY2g6IGZvcm1WYWx1ZS5hY2N1cmFjeUJyZWFjaCxcclxuICAgICAgLy8gICB0YWdnaW5nTGltaXRhdGlvbjogZm9ybVZhbHVlLnRhZ2dpbmdMaW1pdGF0aW9uXHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gY29uc29sZS5sb2coJ0ZpbmFsIFBheWxvYWQ6Jywgb2JqKTtcclxuICAgICAgLy8gdGhpcy5hcGlTZXJ2aWNlLnVwZGF0ZUZvb3RmYWxsRGlyZWN0b3J5Q29uZmlnKG9iaiwgdGhpcy5jbGllbklkKVxyXG4gICAgICAvLyAgIC5waXBlKFxyXG4gICAgICAvLyAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICAgIC8vICAgKVxyXG4gICAgICAvLyAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAvLyAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgIC8vICAgICAgIGNvbnNvbGUubG9nKCdzYXZlIGZvb3RmYWxsIGNvbmZpZyBkZXRhaWxzID4+JywgcmVzKTtcclxuICAgICAgLy8gICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAnMjAwJyAmJiByZXMuc3RhdHVzID09ICdzdWNjZXNzJykge1xyXG4gICAgICAvLyAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdmb290ZmFsbCBjb25maWcgZGV0YWlscyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgICAgLy8gICAgICAgfSBlbHNlIHtcclxuICAgICAgLy8gICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byB1cGRhdGUgZm9vdGZhbGwgY29uZmlnIGRldGFpbHMuJyk7XHJcbiAgICAgIC8vICAgICAgIH1cclxuICAgICAgLy8gICAgIH0sXHJcbiAgICAgIC8vICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAvLyAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0Vycm9yIGluIHVwZGF0aW5nIGZvb3RmYWxsIGNvbmZpZyBkZXRhaWxzLicpO1xyXG4gICAgICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiB1cGRhdGVGb290ZmFsbERpcmVjdG9yeUNvbmZpZyA6JywgZXJyKTtcclxuICAgICAgLy8gICAgIH0sXHJcbiAgICAgIC8vICAgfSlcclxuICB9XHJcblxyXG4gIG9uQ2FuY2VsKCkge1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmNsaWVudEZvcm1EYXRhLm5leHQoeyB2YWx1ZTogbnVsbCwgdHlwZTogJ2NhbmNlbCcsIGZvcm06ICdmb290ZmFsbERpcmVjdG9yeUNvbmZpZ3MnIH0pXHJcbiAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZGlzYWJsZSgpO1xyXG4gICAgdGhpcy50b2dnbGVGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRSZXNldFBheWxvYWQoc3RvcmVzOiB7IHN0b3JlSWQ6IHN0cmluZzsgZGF0ZVN0cmluZzogc3RyaW5nIH1bXSA9IFtdKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbklkID8/ICcnLFxyXG4gICAgICBhcnJheU9mU3RvcmVzOiBzdG9yZXNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXQgY2F0ZWdvcnlJY29ucygpOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4ge1xyXG4gICAgY29uc3QgYXZhaWxhYmxlSWNvbnMgPSBbLi4udGhpcy5iYXNlQ2F0ZWdvcnlJY29uc107XHJcbiAgICBcclxuICAgIC8vIENoZWNrIHdoaWNoIGFkZGl0aW9uYWwgaWNvbnMgYXJlIGN1cnJlbnRseSBpbiB1c2VcclxuICAgIGNvbnN0IHVzZWRJY29ucyA9IHRoaXMudGFnTGltaXRzLmNvbnRyb2xzLm1hcChjdHJsID0+IGN0cmwuZ2V0KCdpY29uTmFtZScpPy52YWx1ZSkuZmlsdGVyKEJvb2xlYW4pO1xyXG4gICAgXHJcbiAgICAvLyBJZiBlZGl0aW5nLCBleGNsdWRlIHRoZSBjdXJyZW50IGljb24gYmVpbmcgZWRpdGVkIGZyb20gdGhlIHVzZWQgbGlzdFxyXG4gICAgbGV0IHVzZWRJY29uc0ZvckNoZWNrID0gWy4uLnVzZWRJY29uc107XHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2VkaXQnICYmIHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgZWRpdGluZ0ljb24gPSB0aGlzLnRhZ0xpbWl0cy5hdCh0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4KT8uZ2V0KCdpY29uTmFtZScpPy52YWx1ZTtcclxuICAgICAgdXNlZEljb25zRm9yQ2hlY2sgPSB1c2VkSWNvbnNGb3JDaGVjay5maWx0ZXIoaWNvbiA9PiBpY29uICE9PSBlZGl0aW5nSWNvbik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIEFkZCBob3VzZUtlZXBpbmdUYWcgYW5kIGp1bmtUYWcgaWYgdGhleSdyZSBub3QgaW4gdXNlXHJcbiAgICB0aGlzLmFkZGl0aW9uYWxDYXRlZ29yeUljb25zLmZvckVhY2goaWNvbiA9PiB7XHJcbiAgICAgIGlmICghdXNlZEljb25zRm9yQ2hlY2suaW5jbHVkZXMoaWNvbi52YWx1ZSkpIHtcclxuICAgICAgICBhdmFpbGFibGVJY29ucy5wdXNoKGljb24pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgcmV0dXJuIGF2YWlsYWJsZUljb25zO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkQ2F0ZWdvcnlJY29uTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmNhdGVnb3J5Rm9ybT8uZ2V0KCdpY29uTmFtZScpPy52YWx1ZSB8fCB0aGlzLmJhc2VDYXRlZ29yeUljb25zWzBdPy52YWx1ZTtcclxuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5jYXRlZ29yeUljb25zLmZpbmQoaWNvbiA9PiBpY29uLnZhbHVlID09PSBjdXJyZW50KTtcclxuICAgIHJldHVybiBtYXRjaD8ubGFiZWwgfHwgJyc7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtXCIgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/Lkdsb2JhbF9Db25maWd1cmF0aW9uX2lzRWRpdFwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNFZGl0XCIgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwidG9nZ2xlRm9ybSgpO1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBweS0zIGFsaWduLWl0ZW1zLWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMjU3OV8yNTEyNSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTQuMTY3IDIuNDk5OTNDMTQuMzg1OSAyLjI4MTA2IDE0LjY0NTcgMi4xMDc0NCAxNC45MzE3IDEuOTg4OTlDMTUuMjE3NiAxLjg3MDU0IDE1LjUyNDEgMS44MDk1NyAxNS44MzM3IDEuODA5NTdDMTYuMTQzMiAxLjgwOTU3IDE2LjQ0OTcgMS44NzA1NCAxNi43MzU3IDEuOTg4OTlDMTcuMDIxNiAyLjEwNzQ0IDE3LjI4MTUgMi4yODEwNiAxNy41MDAzIDIuNDk5OTNDMTcuNzE5MiAyLjcxODggMTcuODkyOCAyLjk3ODYzIDE4LjAxMTMgMy4yNjQ2QzE4LjEyOTcgMy41NTA1NyAxOC4xOTA3IDMuODU3MDYgMTguMTkwNyA0LjE2NjU5QzE4LjE5MDcgNC40NzYxMiAxOC4xMjk3IDQuNzgyNjIgMTguMDExMyA1LjA2ODU5QzE3Ljg5MjggNS4zNTQ1NSAxNy43MTkyIDUuNjE0MzkgMTcuNTAwMyA1LjgzMzI2TDYuMjUwMzMgMTcuMDgzM0wxLjY2Njk5IDE4LjMzMzNMMi45MTY5OSAxMy43NDk5TDE0LjE2NyAyLjQ5OTkzWlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMjU3OV8yNTEyNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPkVkaXQgRGV0YWlsc1xuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBBcHByb3ZlciBDb25maWd1cmF0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtNCBtYi00IGZmLXNlY3Rpb24tY2FyZFwiPlxuICAgICAgICA8aDUgY2xhc3M9XCJmZi1zZWN0aW9uLXRpdGxlIG1iLTFcIj5BcHByb3ZlciBjb25maWd1cmF0aW9uPC9oNT5cbiAgICAgICAgPHAgY2xhc3M9XCJmZi1zZWN0aW9uLWRlc2MgbWItNFwiPlxuICAgICAgICAgICAgU2V0IGxldmVsIG9mIHJldmlzaW9ucyByZXF1aXJlZCBmb3IgYSBzdG9yZSByYWlzZWQgdGlja2V0c1xuICAgICAgICA8L3A+XG5cbiAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwicmV2aXNpb25cIiBjbGFzcz1cImQtZmxleCBmbGV4LXdyYXAgZ2FwLTVcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJldiBvZiByZXZpc2lvbkFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhcHByb3Zlci1vcHRpb24gZC1mbGV4IGZsZXgtY29sdW1uXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtb3B0aW9uXT1cIihyZXYuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInICYmIGlzQXBwcm92ZXJEaXNhYmxlZCkgfHwgKHJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICd0YW5nbycgJiYgaXNUYW5nb0Rpc2FibGVkKVwiPlxuXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94IGFsaWduLWl0ZW1zLXN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNoZWNrYm94XT1cIihyZXYuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInICYmIGlzQXBwcm92ZXJEaXNhYmxlZCkgfHwgKHJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICd0YW5nbycgJiYgaXNUYW5nb0Rpc2FibGVkKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZm9ybUNvbnRyb2xOYW1lPVwiaXNDaGVja2VkXCIgW2lkXT1cIidhY3Rpb24tJyArIGlcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrbWFya1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgfCB0aXRsZWNhc2UgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MgdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidyZXZpZXdlcidcIj5UaGUgdGlja2V0IHVuZGVyZ29lcyBhIHNpbmdsZSByZXZpZXcgdG8gdmVyaWZ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb290ZmFsbC48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInYXBwcm92ZXInXCI+VGhlIHRpY2tldCB1bmRlcmdvZXMgYSBmaW5hbCByZXZpZXcgYWZ0ZXIgdGhlIGluaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid0YW5nbydcIj5GaW5hbGl6ZSB0aWNrZXRzIGFuZCB1cGRhdGUgZm9vdGZhbGwgY291bnQuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxociBjbGFzcz1cImZmLWRpdmlkZXJcIj5cblxuICAgIDwhLS0gU3RvcmUgU1BPQyBUaWNrZXQgQ3JlYXRpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQgcC00IG1iLTQgZmYtc2VjdGlvbi1jYXJkXCI+XG4gICAgICAgIDxoNSBjbGFzcz1cImZmLXNlY3Rpb24tdGl0bGUgbWItM1wiPlN0b3JlIFNQT0MgVGlja2V0IENyZWF0aW9uPC9oNT5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LXdyYXAgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1iLTBcIj5cbiAgICAgICAgICAgICAgICBBbGxvdyBzdG9yZSBTUE9DIHRvIGNyZWF0ZSB0aWNrZXRzIG9ubHkgZm9yIHRoZSBsYXN0XG4gICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdCBtcy0yXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Mub3Blbl09XCJpc0FsbG93VGlja2V0Q3JlYXRpb25Ecm9wZG93bk9wZW5cIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNFZGl0XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlIHNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFsbG93VGlja2V0Q3JlYXRpb25Ecm9wZG93bigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhbGxvd1RpY2tldENyZWF0aW9uJyk/LnZhbHVlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzcG9jVGlja2V0Q3JlYXRpb25kYXlzWzBdIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc0FsbG93VGlja2V0Q3JlYXRpb25Ecm9wZG93bk9wZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IGRheSBvZiBzcG9jVGlja2V0Q3JlYXRpb25kYXlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RBbGxvd1RpY2tldENyZWF0aW9uKCRldmVudCwgZGF5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF5IH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWItMFwiPkRheXM8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGhyIGNsYXNzPVwiZmYtZGl2aWRlclwiPlxuXG4gICAgPCEtLSBUaWNrZXQgQXV0by1jbG9zZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTQgbWItNCBmZi1zZWN0aW9uLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxuICAgICAgICAgICAgPGg1IGNsYXNzPVwiZmYtc2VjdGlvbi10aXRsZSBtLTBcIj5UaWNrZXQgQXV0by1jbG9zZTwvaDU+XG5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInN3aXRjaCBtLTAgbXMtM1wiIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZm9ybUNvbnRyb2xOYW1lPVwiaXNBdXRvQ2xvc2VFbmFibGVcIiBbZGlzYWJsZWRdPVwiaXNFZGl0XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbGlkZXIgcm91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1iLTBcIj5cbiAgICAgICAgICAgICAgICBUaWNrZXQgc2hvdWxkIGJlIGF1dG8tY2xvc2VkLCBpZiB0aGUgY3JlYXRlZCB0aWNrZXQgYWNjdXJhY3kgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXG4gICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBmZi1zZWxlY3Qtd3JhcHBlciBjb21wYWN0IG1zLTJcIiBbY2xhc3Mub3Blbl09XCJpc0F1dG9DbG9zZURyb3Bkb3duT3BlblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdCB8fCAhZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2lzQXV0b0Nsb3NlRW5hYmxlJyk/LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlIHNtYWxsXCIgKGNsaWNrKT1cInRvZ2dsZUF1dG9DbG9zZURyb3Bkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2F1dG9DbG9zZUFjY3VyYWN5Jyk/LnZhbHVlIHx8ICcxJScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzQXV0b0Nsb3NlRHJvcGRvd25PcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBwIG9mIGFjY3VyYWN5UGVyY2VudGFnZUxpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEF1dG9DbG9zZUFjY3VyYWN5KCRldmVudCwgcClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHAgfX0lXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGhyIGNsYXNzPVwiZmYtZGl2aWRlclwiPlxuXG4gICAgPCEtLSBGb290ZmFsbCBEaXJlY3RvcnkgTGltaXRhdGlvbnMgLS0+XG4gICAgPGRpdiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiIGNsYXNzPVwiY2FyZCBwLTQgbWItNCBmZi1zZWN0aW9uLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMVwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJmZi1zZWN0aW9uLXRpdGxlIG0tMFwiPkZvb3RmYWxsIGRpcmVjdG9yeSBsaW1pdGF0aW9uczwvaDU+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmZi1zZWN0aW9uLWRlc2MgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICBTZXQgbWF4aW11bSBsaW1pdGF0aW9uIGZvciBzdG9yZXMgdG8gdGFnIG5vbi1QdXJjaGFzZXJzIGZyb20gVG90YWwgRm9vdGZhbGxcbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cImlzRWRpdFwiIGNsYXNzPVwiYWRkLW5ldy1idG4gZC1pbmxpbmUtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ2F0ZWdvcnlNb2RhbCgnYWRkJylcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDMuMzMzMzRWMTIuNjY2N00zLjMzMzM0IDhIMTIuNjY2N1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzcGFuPkFkZCBOZXc8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBDYXRlZ29yeSBDYXJkcyBHcmlkIC0tPlxuICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJ0YWdnaW5nTGltaXRhdGlvblwiIGNsYXNzPVwiY2F0ZWdvcnktZ3JpZCBtdC0zXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB0YWcgb2YgdGFnTGltaXRzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNsYXNzPVwiY2F0ZWdvcnktY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1jYXJkLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaWNvblwiIFtuZ0NsYXNzXT1cInRhZy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJ0YWcuZ2V0KCdpY29uTmFtZScpPy52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidkdXBsaWNhdGVUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzExNjJfMjQ2MjEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMi41IDcuNUgyQzEuNzM0NzggNy41IDEuNDgwNDMgNy4zOTQ2NCAxLjI5Mjg5IDcuMjA3MTFDMS4xMDUzNiA3LjAxOTU3IDEgNi43NjUyMiAxIDYuNVYyQzEgMS43MzQ3OCAxLjEwNTM2IDEuNDgwNDMgMS4yOTI4OSAxLjI5Mjg5QzEuNDgwNDMgMS4xMDUzNiAxLjczNDc4IDEgMiAxSDYuNUM2Ljc2NTIyIDEgNy4wMTk1NyAxLjEwNTM2IDcuMjA3MTEgMS4yOTI4OUM3LjM5NDY0IDEuNDgwNDMgNy41IDEuNzM0NzggNy41IDJWMi41TTUuNSA0LjVIMTBDMTAuNTUyMyA0LjUgMTEgNC45NDc3MiAxMSA1LjVWMTBDMTEgMTAuNTUyMyAxMC41NTIzIDExIDEwIDExSDUuNUM0Ljk0NzcyIDExIDQuNSAxMC41NTIzIDQuNSAxMFY1LjVDNC41IDQuOTQ3NzIgNC45NDc3MiA0LjUgNS41IDQuNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xMTYyXzI0NjIxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidlbXBsb3llZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAxNiAxM1wiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjE2NjcgMTIuNVYxMS4xNjY3QzExLjE2NjcgMTAuNDU5NCAxMC44ODU3IDkuNzgxMTUgMTAuMzg1NiA5LjI4MTA1QzkuODg1NTIgOC43ODA5NSA5LjIwNzI0IDguNSA4LjUgOC41SDMuMTY2NjdDMi40NTk0MiA4LjUgMS43ODExNSA4Ljc4MDk1IDEuMjgxMDUgOS4yODEwNUMwLjc4MDk1MiA5Ljc4MTE1IDAuNSAxMC40NTk0IDAuNSAxMS4xNjY3VjEyLjVNMTUuMTY2NyAxMi41VjExLjE2NjdDMTUuMTY2MiAxMC41NzU4IDE0Ljk2OTYgMTAuMDAxOCAxNC42MDc2IDkuNTM0ODhDMTQuMjQ1NiA5LjA2NzkxIDEzLjczODggOC43MzQzOCAxMy4xNjY3IDguNTg2NjdNMTAuNSAwLjU4NjY2N0MxMS4wNzM2IDAuNzMzNTM0IDExLjU4MiAxLjA2NzEzIDExLjk0NTEgMS41MzQ4N0MxMi4zMDgyIDIuMDAyNjEgMTIuNTA1MiAyLjU3Nzg5IDEyLjUwNTIgMy4xN0MxMi41MDUyIDMuNzYyMTEgMTIuMzA4MiA0LjMzNzM5IDExLjk0NTEgNC44MDUxM0MxMS41ODIgNS4yNzI4NyAxMS4wNzM2IDUuNjA2NDcgMTAuNSA1Ljc1MzMzTTguNSAzLjE2NjY3QzguNSA0LjYzOTQzIDcuMzA2MDkgNS44MzMzMyA1LjgzMzMzIDUuODMzMzNDNC4zNjA1NyA1LjgzMzMzIDMuMTY2NjcgNC42Mzk0MyAzLjE2NjY3IDMuMTY2NjdDMy4xNjY2NyAxLjY5MzkxIDQuMzYwNTcgMC41IDUuODMzMzMgMC41QzcuMzA2MDkgMC41IDguNSAxLjY5MzkxIDguNSAzLjE2NjY3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2hvdXNlS2VlcGluZ1RhZydcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTE2Ml8yNDY1MClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMDQ5ODMgMC41NDQ5NDdDNy43NDczOCAtMC4xODE2NDkgOC44NzgyOSAtMC4xODE2NDkgOS41NzU4NCAwLjU0NDk0N0wxNS40Njk3IDYuNjg0NEMxNi4xNjcyIDcuNDExMDEgMTYuMTY3MiA4LjU4OTA0IDE1LjQ2OTcgOS4zMTU2NUw5LjU3NTg0IDE1LjQ1NTFDOC44NzgyOSAxNi4xODE2IDcuNzQ3MzggMTYuMTgxNiA3LjA0OTgzIDE1LjQ1NTFMNS4zNjU2MiAxMy43MDA3TDMuODIxNzkgMTUuMzA4OEMzLjEyNDI2IDE2LjAzNTQgMS45OTMzNCAxNi4wMzU0IDEuMjk1OCAxNS4zMDg4QzAuNTk4MjcyIDE0LjU4MjMgMC41OTgyNzIgMTMuNDA0MiAxLjI5NTggMTIuNjc3N0wyLjgzOTY0IDExLjA2OTVMMS4xNTU5NiA5LjMxNTY1QzAuNDU4NDI5IDguNTg5MDQgMC40NTg0MjkgNy40MTEwMSAxLjE1NTk2IDYuNjg0NEw3LjA0OTgzIDAuNTQ0OTQ3Wk04LjczMzgxIDEuNDIyMDNDOC41MDEyOSAxLjE3OTgzIDguMTI0MyAxLjE3OTgzIDcuODkxNzggMS40MjIwM0wzLjY4MTY1IDUuODA3NjJMMTAuNDE3NSAxMi44MjQyTDE0LjYyNzcgOC40Mzg1NEMxNC44NjAyIDguMTk2MzQgMTQuODYwMiA3LjgwMzYzIDE0LjYyNzcgNy41NjE1MUwxMS42ODA1IDQuNDkxNDNMMTAuNjk4MSA1LjUxNDY5QzEwLjQ2NTYgNS43NTY4OSAxMC4wODg3IDUuNzU2ODkgOS44NTYxNCA1LjUxNDY5QzkuNjIzNjMgNS4yNzI0OSA5LjYyMzYzIDQuODc5ODEgOS44NTYxNCA0LjYzNzYxTDEwLjgzODQgMy42MTQzNUw5Ljk5NjY1IDIuNzM3NDZMNy42MTEgNS4yMjI1MkM3LjM3ODQ5IDUuNDY0NzEgNy4wMDE0OSA1LjQ2NDcxIDYuNzY4OTcgNS4yMjI1MkM2LjUzNjQ2IDQuOTgwMzIgNi41MzY0NiA0LjU4NzYzIDYuNzY4OTcgNC4zNDU0NEw5LjE1NDYyIDEuODYwMzhMOC43MzM4MSAxLjQyMjAzWk05LjU3NTUyIDEzLjcwMTJMMi44Mzk2NiA2LjY4NDdMMS45OTc5NiA3LjU2MTUxQzEuNzY1NDQgNy44MDM2MyAxLjc2NTQ0IDguMTk2MzQgMS45OTc5NiA4LjQzODU0TDcuODkxNzggMTQuNTc4QzguMTI0MyAxNC44MjAyIDguNTAxMjkgMTQuODIwMiA4LjczMzgxIDE0LjU3OEw5LjU3NTUyIDEzLjcwMTJaTTMuNjgxNTYgMTEuOTQ2NkwyLjEzNzggMTMuNTU0N0MxLjkwNTI5IDEzLjc5NjkgMS45MDUyOSAxNC4xODk2IDIuMTM3OCAxNC40MzE4QzIuMzcwMzEgMTQuNjc0IDIuNzQ3MjkgMTQuNjc0IDIuOTc5OCAxNC40MzE4TDQuNTIzNTUgMTIuODIzN0wzLjY4MTU2IDExLjk0NjZaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzExNjJfMjQ2NTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2p1bmtUYWcnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yIDQuMDAwMDRIMy4zMzMzM00zLjMzMzMzIDQuMDAwMDRIMTRNMy4zMzMzMyA0LjAwMDA0VjEzLjMzMzRDMy4zMzMzMyAxMy42ODcgMy40NzM4MSAxNC4wMjYxIDMuNzIzODYgMTQuMjc2MkMzLjk3MzkxIDE0LjUyNjIgNC4zMTMwNCAxNC42NjY3IDQuNjY2NjcgMTQuNjY2N0gxMS4zMzMzQzExLjY4NyAxNC42NjY3IDEyLjAyNjEgMTQuNTI2MiAxMi4yNzYxIDE0LjI3NjJDMTIuNTI2MiAxNC4wMjYxIDEyLjY2NjcgMTMuNjg3IDEyLjY2NjcgMTMuMzMzNFY0LjAwMDA0SDMuMzMzMzNaTTUuMzMzMzMgNC4wMDAwNFYyLjY2NjcxQzUuMzMzMzMgMi4zMTMwOSA1LjQ3MzgxIDEuOTczOTUgNS43MjM4NiAxLjcyMzlDNS45NzM5MSAxLjQ3Mzg1IDYuMzEzMDQgMS4zMzMzNyA2LjY2NjY3IDEuMzMzMzdIOS4zMzMzM0M5LjY4Njk2IDEuMzMzMzcgMTAuMDI2MSAxLjQ3Mzg1IDEwLjI3NjEgMS43MjM5QzEwLjUyNjIgMS45NzM5NSAxMC42NjY3IDIuMzEzMDkgMTAuNjY2NyAyLjY2NjcxVjQuMDAwMDRNNi42NjY2NyA3LjMzMzM3VjExLjMzMzRNOS4zMzMzMyA3LjMzMzM3VjExLjMzMzRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ3B1cnBsZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIwLjcwNzEgMTMuMjkyOUwxMS40MTQyIDRINFYxMS40MTQyTDEzLjI5MjkgMjAuNzA3MUMxMy42ODM0IDIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDE0LjcwNzEgMjAuNzA3MUwyMC43MDcxIDE0LjcwNzFDMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTMuNjgzNCAyMC43MDcxIDEzLjI5MjlaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgN0g3LjAxXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInb3JhbmdlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRhZy5nZXQoJ25hbWUnKT8udmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKHRhZy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlICE9PSAnZHVwbGljYXRlVGFnJyAmJiB0YWcuZ2V0KCdpY29uTmFtZScpPy52YWx1ZSAhPT0gJ2VtcGxveWVlVGFnJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2F0ZWdvcnktbWVudS1idG5cIiAoY2xpY2spPVwidG9nZ2xlQ2F0ZWdvcnlNZW51KCRldmVudCwgaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRWRpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyIDVDMTIuNTUyMyA1IDEzIDQuNTUyMjggMTMgNEMxMyAzLjQ0NzcyIDEyLjU1MjMgMyAxMiAzQzExLjQ0NzcgMyAxMSAzLjQ0NzcyIDExIDRDMTEgNC41NTIyOCAxMS40NDc3IDUgMTIgNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMiAxM0MxMi41NTIzIDEzIDEzIDEyLjU1MjMgMTMgMTJDMTMgMTEuNDQ3NyAxMi41NTIzIDExIDEyIDExQzExLjQ0NzcgMTEgMTEgMTEuNDQ3NyAxMSAxMkMxMSAxMi41NTIzIDExLjQ0NzcgMTMgMTIgMTNaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgMjFDMTIuNTUyMyAyMSAxMyAyMC41NTIzIDEzIDIwQzEzIDE5LjQ0NzcgMTIuNTUyMyAxOSAxMiAxOUMxMS40NDc3IDE5IDExIDE5LjQ0NzcgMTEgMjBDMTEgMjAuNTUyMyAxMS40NDc3IDIxIDEyIDIxWlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW1lbnVcIiAqbmdJZj1cImFjdGl2ZU1lbnVJbmRleCA9PT0gaVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2F0ZWdvcnlNZW51QWN0aW9uKCRldmVudCwgJ2VkaXQnLCBpKVwiPkVkaXQgTmFtZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2F0ZWdvcnlNZW51QWN0aW9uKCRldmVudCwgJ2RlbGV0ZScsIGkpXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LXBlcmNlbnRhZ2Utc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mub3Blbl09XCJvcGVuTGltaXREcm9wZG93bkluZGV4ID09PSBpXCIgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlIHNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTGltaXREcm9wZG93bigkZXZlbnQsIGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdGFnLmdldCgndmFsdWUnKT8udmFsdWUgfHwgMCB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cIm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPT09IGlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgcCBvZiBwZXJjZW50YWdlTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RMaW1pdFZhbHVlKCRldmVudCwgaSwgcClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcCB9fSVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxociBjbGFzcz1cImZmLWRpdmlkZXJcIiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiPlxuXG4gICAgPCEtLSBTdG9yZSBSZXF1ZXN0cyAtLT5cbiAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJhY2N1cmFjeUJyZWFjaFwiIGNsYXNzPVwiY2FyZCBwLTQgbWItNCBmZi1zZWN0aW9uLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1zdGFydCBtYi00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImZmLXNlY3Rpb24tdGl0bGUgbWItMlwiPlN0b3JlIFJlcXVlc3RzPC9oNT5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZmLXNlY3Rpb24tZGVzYyBtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgIEJlbG93IHN0b3JlcyBoYXZlIHJlcXVlc3RlZCB0byByYWlzZSBhIHRpY2tldCBhZnRlciBicmVhY2hpbmcgdGhlIGNvbmZpZ3VyZWQgbGltaXRcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmZvLWljb25cIj5pPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcmVzZXQtYnRuIGQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0VkaXRcIiBbZGlzYWJsZWRdPVwiaXNSZXNldERpc2FibGVkXCIgKGNsaWNrKT1cIm9wZW5SZXNldENvbmZpcm1hdGlvbk1vZGFsKClcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5SZXNldDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJlc3RyaWN0aW9uIENyaXRlcmlhIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVzdHJpY3Rpb24tY3JpdGVyaWEgbWItNFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItMyBkLWJsb2NrXCI+XG4gICAgICAgICAgICAgICAgUmVzdHJpY3QgdGlja2V0IGNyZWF0aW9uIGZvciBhbnkgc3RvcmUgdGhhdDpcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LW5vd3JhcCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPkhhcyByYWlzZWQgbW9yZSB0aGFuPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBmZi1zZWxlY3Qtd3JhcHBlciBjb21wYWN0XCIgW2NsYXNzLm9wZW5dPVwiaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlblwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlIHNtYWxsXCIgKGNsaWNrKT1cInRvZ2dsZVRpY2tldENvdW50RHJvcGRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoLnRpY2tldENvdW50Jyk/LnZhbHVlIHx8IDEgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3QtbWVudVwiICpuZ0lmPVwiaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IGMgb2YgWzEsIDIsIDMsIDQsIDVdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGlja2V0Q291bnQoJGV2ZW50LCBjKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3Bhbj50aWNrZXRzIGluIHRoZSBjYWxlbmRlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdCBzdG9yZS1kYXlzLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuXT1cImlzU3RvcmVEYXlzRHJvcGRvd25PcGVuXCIgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIiAoY2xpY2spPVwidG9nZ2xlU3RvcmVEYXlzRHJvcGRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2VsZWN0ZWREYXlzTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzU3RvcmVEYXlzRHJvcGRvd25PcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgb3B0IG9mIGRheXNPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0U3RvcmVEYXlzKCRldmVudCwgb3B0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuPmJhc2VkIG9uIGNvbmZpZ3VyZWQgY29uZGl0aW9uc1xuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCIgW25nYlRvb2x0aXBdPVwiY29uZGl0aW9uc1Rvb2x0aXBcIiB0b29sdGlwQ2xhc3M9XCJjb25kaXRpb25zLXRvb2x0aXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTQzMl84MDAzNSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwNjUgMTAuNjY2NlY3Ljk5OTkyTTguMDAwNjUgNS4zMzMyNUg4LjAwNzMyTTE0LjY2NzMgNy45OTk5MkMxNC42NjczIDExLjY4MTggMTEuNjgyNiAxNC42NjY2IDguMDAwNjUgMTQuNjY2NkM0LjMxODc1IDE0LjY2NjYgMS4zMzM5OCAxMS42ODE4IDEuMzMzOTggNy45OTk5MkMxLjMzMzk4IDQuMzE4MDIgNC4zMTg3NSAxLjMzMzI1IDguMDAwNjUgMS4zMzMyNUMxMS42ODI2IDEuMzMzMjUgMTQuNjY3MyA0LjMxODAyIDE0LjY2NzMgNy45OTk5MlpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNDMyXzgwMDM1XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY29uZGl0aW9uc1Rvb2x0aXA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBmb250LXNpemU6IDEycHg7IGxpbmUtaGVpZ2h0OiAxLjY7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Yj4xLjwvYj4gRGVsdGEgYmV0d2VlbiBTdG9yZS9BT00gYWNjdXJhY3kgYW5kIENlbnRyYWwgT3BzL1RhbmdvIGFjY3VyYWN5IGV4Y2VlZHMgMTAlPGJyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGI+Mi48L2I+IFRoZSBvdmVyYWxsIGFjY3VyYWN5IGFmdGVyIGFsbCByZXZpZXdzIGlzIGdyZWF0ZXIgdGhhbiA4NSUuPGJyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGI+My48L2I+IE92ZXJhbGwgdGhlIE51bWJlciBvZiBJbWFnZXMgKEZvb3RmYWxsKSBtYXJrZWQgZm9yIHZhbGlkYXRpb24gaW4gdGhlIHRpY2tldCBieSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlIGlzIExlc3MgdGhhbiBlcXVhbCB0byAxMFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gU3RvcmUgUmVxdWVzdHMgVGFibGUgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1yZXF1ZXN0cy10YWJsZVwiIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIlxuICAgICAgICAgICAgKm5nSWY9XCJzdG9yZUxpc3Q/Lmxlbmd0aCA+IDA7IGVsc2UgZW1wdHlTdG9yZVJlcXVlc3RzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiIFtuZ0NsYXNzXT1cInsnc3RvcmUtdGFibGUtc2Nyb2xsJzogc3RvcmVMaXN0Py5sZW5ndGggPiA1fVwiPlxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWhvdmVyIHN0b3JlLXJlcXVlc3RzLXRhYmxlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNoZWNrYm94LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jaGVja2JveC1zZWxlY3QgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc0FsbFNlbGVjdGVkXCIgW2Rpc2FibGVkXT1cImlzRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja21hcmstc2VsZWN0XCI+PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlIHN0b3JlLW5hbWUtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U2VsZWN0IGFsbCBzdG9yZXMgKHt7IHN0b3JlTGlzdD8ubGVuZ3RoIHx8IDAgfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1zLTIgZHJvcGRvd24tYXJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhaXNlZCBvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtcy0xIHNvcnQtaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDQuNUw2IDEuNUw5IDQuNU0zIDcuNUw2IDEwLjVMOSA3LjVcIiBzdHJva2U9XCIjMzQ0MDU0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3QgcmFpc2VkKEFwcHJvdmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtcy0xIHNvcnQtaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDQuNUw2IDEuNUw5IDQuNU0zIDcuNUw2IDEwLjVMOSA3LjVcIiBzdHJva2U9XCIjMzQ0MDU0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIG9mIFRpbWUgUmFpc2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1zLTEgc29ydC1pY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNC41TDYgMS41TDkgNC41TTMgNy41TDYgMTAuNUw5IDcuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHN0b3JlIG9mIHN0b3JlTGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNoZWNrYm94LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXN0b20tY2hlY2tib3gtc2VsZWN0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICNjYiB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc1N0b3JlU2VsZWN0ZWQoc3RvcmUpXCIgW2Rpc2FibGVkXT1cImlzRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTdG9yZVNlbGVjdGlvbihzdG9yZSwgY2IuY2hlY2tlZClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja21hcmstc2VsZWN0XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHN0b3JlLnN0b3JlTmFtZSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHN0b3JlLnJhaXNlZE9uIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgc3RvcmUubGFzdEFwcHJvdmVkIHx8ICctJyB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHN0b3JlLnRvdGFsUmFpc2VkIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eVN0b3JlUmVxdWVzdHM+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3RvcmUtc3RhdGUgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3RvcmUtaWNvbiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgdmlld0JveD1cIjAgMCA0MCA0MFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguOTQ2MjkgMjEuMTk5NUM4LjY0NSAyMS4yMzEzIDguMzM4MjggMjEuMjUwMiA4LjAyNzM0IDIxLjI1MDJDNy44NTc4MiAyMS4yNTAyIDcuNjkwNTIgMjEuMjQzNCA3LjUyNTM5IDIxLjIzMzZWMzEuNjA2N0M3LjUyNTM5IDMzLjAzNDcgOC43MDgzNyAzNC4yMjU4IDEwLjE5NjMgMzQuMjI1OEgyOS44MDA4QzMxLjI4ODggMzQuMjI1OCAzMi40NzE3IDMzLjAzNDcgMzIuNDcxNyAzMS42MDY3VjIxLjIzNDZDMzIuMzA5OCAyMS4yNDM4IDMyLjE0NTkgMjEuMjUwMiAzMS45ODE0IDIxLjI1MDJDMzEuNjY3NSAyMS4yNTAyIDMxLjM1NjkgMjEuMjMyMyAzMS4wNTA4IDIxLjE5OTVWMjguOTg3NUg4Ljk0NjI5VjIxLjE5OTVaTTMwLjkyNzcgNS43NzM2OEg5LjA2OTM0QzguODkxOTcgNS43NzM2OCA4LjczNjcxIDUuODY2NDcgOC42NTkxOCA1Ljk4NzU1TDguNjU3MjMgNS45ODk1TDUuMTQ3NDYgMTEuNDcyOUw1LjA1MjczIDExLjYyMDRDMy44MjcxOSAxMy43NDAyIDUuMDkxOCAxNi40NjcxIDcuNDQzMzYgMTYuNzc2NkM3LjY0NDI4IDE2LjgwMTEgNy44MzQwMyAxNi44MTU3IDguMDIxNDggMTYuODE1N0M5LjI1MTU2IDE2LjgxNTcgMTAuMzM5NSAxNi4yODcgMTEuMDk2NyAxNS40NjUxTDEyLjAxODYgMTQuNDY0MUwxMi45Mzc1IDE1LjQ2OEMxMy42ODY0IDE2LjI4NjEgMTQuNzczMSAxNi44MTU3IDE2LjAxMDcgMTYuODE1N0MxNy4yNDI4IDE2LjgxNTYgMTguMzM0NyAxNi4yODU0IDE5LjA4MyAxNS40NjhMMjAuMDA0OSAxNC40NjEyTDIwLjkyNjggMTUuNDY4QzIxLjY3NTEgMTYuMjg1NSAyMi43NjY4IDE2LjgxNTcgMjMuOTk5IDE2LjgxNTdDMjUuMjMxMiAxNi44MTU3IDI2LjMyMjkgMTYuMjg1NCAyNy4wNzEzIDE1LjQ2OEwyNy45OTMyIDE0LjQ2MTJMMjguOTE1IDE1LjQ2OEMyOS42NjM0IDE2LjI4NTUgMzAuNzU2IDE2LjgxNTcgMzEuOTg4MyAxNi44MTU3QzMyLjE2OTcgMTYuODE1NyAzMi4zNjQ4IDE2LjgwMTggMzIuNTY0NSAxNi43Nzc2SDMyLjU2MzVDMzQuOTU3MiAxNi40NTcxIDM2LjIyNTQgMTMuNjA3NSAzNC44NTc0IDExLjQ3MjlMMzQuODU2NCAxMS40NzM5TDMxLjMzOTggNS45OTA0OEwzMS4zMzg5IDUuOTg3NTVDMzEuMjYxNCA1Ljg2NjI4IDMxLjEwNTMgNS43NzM2OCAzMC45Mjc3IDUuNzczNjhaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDA5QkYzXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wIGZ3LXNlbWlib2xkIHRleHQtbXV0ZWRcIj5ObyByZXNldCByZXF1ZXN0IGZyb20gc3RvcmU8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cblxuICAgIDxociBjbGFzcz1cImZmLWRpdmlkZXJcIiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiPlxuXG4gICAgPCEtLSBTZW5kIFRpY2tldCB0byBUYW5nbyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LnVzZXJUeXBlID09PSAndGFuZ28nXCIgY2xhc3M9XCJjYXJkIHAtNCBtYi00IGZmLXNlY3Rpb24tY2FyZFwiPlxuICAgICAgICA8aDUgY2xhc3M9XCJmZi1zZWN0aW9uLXRpdGxlIG1iLTFcIj5TZW5kIFRpY2tldCB0byBUYW5nbzwvaDU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTJcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1lLTIgbWItMCB0YW5nby1sYWJlbFwiPlNlbmQgdGlja2V0IHRvIFRhbmdvIGlmIGFjY3VyYWN5IGZhbGxzIGJlbG93PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBmZi1zZWxlY3Qtd3JhcHBlciBjb21wYWN0IG1zLTBcIiBbY2xhc3Mub3Blbl09XCJpc3NlbmRUYW5nb0Ryb3Bkb3duT3BlblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZSBzbWFsbFwiIChjbGljayk9XCJ0b2dnbGVTZW5kVGFuZ29DbG9zZURyb3Bkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3RhbmdvUmV2aWV3Jyk/LnZhbHVlIHx8ICcxJScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzc2VuZFRhbmdvRHJvcGRvd25PcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBwIG9mIHNlbmRUaWNrZXRUYW5nb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0U2VuZFRpY2tldFRhbmdvKCRldmVudCwgcClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHAgfX0lXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGb290ZXIgQWN0aW9ucyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRWRpdFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItNSB3LTEwMCBmb290ZXItc2VwZXJhdG9yXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgPGEgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIG10LTEgcHQtMyBtZS00XCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5DYW5jZWw8L2E+XG4gICAgICAgICAgICA8YSB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcHgtNFwiIChjbGljayk9XCJvblN1Ym1pdCgpXCI+PHNwYW4+U2F2ZSBDaGFuZ2VzPC9zcGFuPjwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENhdGVnb3J5IE1vZGFsIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjY2F0ZWdvcnlNb2RhbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBib3JkZXItMCBwYi0wXCI+XG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiPlxuICAgICAgICAgICAgICAgIHt7IGNhdGVnb3J5TW9kYWxNb2RlID09PSAnYWRkJyA/ICdBZGQgTmV3IENhdGVnb3J5JyA6ICdFZGl0IENhdGVnb3J5JyB9fVxuICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cImNsb3NlQ2F0ZWdvcnlNb2RhbCgpXCI+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBjYXRlZ29yeS1tb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNhdGVnb3J5Rm9ybVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgdGV4dC1tdXRlZFwiPkljb248L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LXdyYXBwZXIgaWNvbi1zZWxlY3RcIiBbY2xhc3Mub3Blbl09XCJpc0NhdGVnb3J5SWNvbkRyb3Bkb3duT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlXCIgKGNsaWNrKT1cInRvZ2dsZUNhdGVnb3J5SWNvbkRyb3Bkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnktaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjYXRlZ29yeUZvcm0uZ2V0KCdpY29uTmFtZScpPy52YWx1ZSB8fCBiYXNlQ2F0ZWdvcnlJY29uc1swXT8udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTd2l0Y2hdPVwiY2F0ZWdvcnlGb3JtLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgfHwgYmFzZUNhdGVnb3J5SWNvbnNbMF0/LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ3B1cnBsZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIwLjcwNzEgMTMuMjkyOUwxMS40MTQyIDRINFYxMS40MTQyTDEzLjI5MjkgMjAuNzA3MUMxMy42ODM0IDIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDE0LjcwNzEgMjAuNzA3MUwyMC43MDcxIDE0LjcwNzFDMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTMuNjgzNCAyMC43MDcxIDEzLjI5MjlaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgN0g3LjAxXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ29yYW5nZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIwLjcwNzEgMTMuMjkyOUwxMS40MTQyIDRINFYxMS40MTQyTDEzLjI5MjkgMjAuNzA3MUMxMy42ODM0IDIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDE0LjcwNzEgMjAuNzA3MUwyMC43MDcxIDE0LjcwNzFDMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTMuNjgzNCAyMC43MDcxIDEzLjI5MjlaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgN0g3LjAxXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2hvdXNlS2VlcGluZ1RhZydcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfaWNvbl9ob3VzZWtlZXBpbmcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjA0OTgzIDAuNTQ0OTQ3QzcuNzQ3MzggLTAuMTgxNjQ5IDguODc4MjkgLTAuMTgxNjQ5IDkuNTc1ODQgMC41NDQ5NDdMMTUuNDY5NyA2LjY4NDRDMTYuMTY3MiA3LjQxMTAxIDE2LjE2NzIgOC41ODkwNCAxNS40Njk3IDkuMzE1NjVMOS41NzU4NCAxNS40NTUxQzguODc4MjkgMTYuMTgxNiA3Ljc0NzM4IDE2LjE4MTYgNy4wNDk4MyAxNS40NTUxTDUuMzY1NjIgMTMuNzAwN0wzLjgyMTc5IDE1LjMwODhDMy4xMjQyNiAxNi4wMzU0IDEuOTkzMzQgMTYuMDM1NCAxLjI5NTggMTUuMzA4OEMwLjU5ODI3MiAxNC41ODIzIDAuNTk4MjcyIDEzLjQwNDIgMS4yOTU4IDEyLjY3NzdMMi44Mzk2NCAxMS4wNjk1TDEuMTU1OTYgOS4zMTU2NUMwLjQ1ODQyOSA4LjU4OTA0IDAuNDU4NDI5IDcuNDExMDEgMS4xNTU5NiA2LjY4NDRMNy4wNDk4MyAwLjU0NDk0N1pNOC43MzM4MSAxLjQyMjAzQzguNTAxMjkgMS4xNzk4MyA4LjEyNDMgMS4xNzk4MyA3Ljg5MTc4IDEuNDIyMDNMMy42ODE2NSA1LjgwNzYyTDEwLjQxNzUgMTIuODI0MkwxNC42Mjc3IDguNDM4NTRDMTQuODYwMiA4LjE5NjM0IDE0Ljg2MDIgNy44MDM2MyAxNC42Mjc3IDcuNTYxNTFMMTEuNjgwNSA0LjQ5MTQzTDEwLjY5ODEgNS41MTQ2OUMxMC40NjU2IDUuNzU2ODkgMTAuMDg4NyA1Ljc1Njg5IDkuODU2MTQgNS41MTQ2OUM5LjYyMzYzIDUuMjcyNDkgOS42MjM2MyA0Ljg3OTgxIDkuODU2MTQgNC42Mzc2MUwxMC44Mzg0IDMuNjE0MzVMOS45OTY2NSAyLjczNzQ2TDcuNjExIDUuMjIyNTJDNy4zNzg0OSA1LjQ2NDcxIDcuMDAxNDkgNS40NjQ3MSA2Ljc2ODk3IDUuMjIyNTJDNi41MzY0NiA0Ljk4MDMyIDYuNTM2NDYgNC41ODc2MyA2Ljc2ODk3IDQuMzQ1NDRMOS4xNTQ2MiAxLjg2MDM4TDguNzMzODEgMS40MjIwM1pNOS41NzU1MiAxMy43MDEyTDIuODM5NjYgNi42ODQ3TDEuOTk3OTYgNy41NjE1MUMxLjc2NTQ0IDcuODAzNjMgMS43NjU0NCA4LjE5NjM0IDEuOTk3OTYgOC40Mzg1NEw3Ljg5MTc4IDE0LjU3OEM4LjEyNDMgMTQuODIwMiA4LjUwMTI5IDE0LjgyMDIgOC43MzM4MSAxNC41NzhMOS41NzU1MiAxMy43MDEyWk0zLjY4MTU2IDExLjk0NjZMMi4xMzc4IDEzLjU1NDdDMS45MDUyOSAxMy43OTY5IDEuOTA1MjkgMTQuMTg5NiAyLjEzNzggMTQuNDMxOEMyLjM3MDMxIDE0LjY3NCAyLjc0NzI5IDE0LjY3NCAyLjk3OTggMTQuNDMxOEw0LjUyMzU1IDEyLjgyMzdMMy42ODE1NiAxMS45NDY2WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF9pY29uX2hvdXNla2VlcGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2p1bmtUYWcnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yIDQuMDAwMDRIMy4zMzMzM00zLjMzMzMzIDQuMDAwMDRIMTRNMy4zMzMzMyA0LjAwMDA0VjEzLjMzMzRDMy4zMzMzMyAxMy42ODcgMy40NzM4MSAxNC4wMjYxIDMuNzIzODYgMTQuMjc2MkMzLjk3MzkxIDE0LjUyNjIgNC4zMTMwNCAxNC42NjY3IDQuNjY2NjcgMTQuNjY2N0gxMS4zMzMzQzExLjY4NyAxNC42NjY3IDEyLjAyNjEgMTQuNTI2MiAxMi4yNzYxIDE0LjI3NjJDMTIuNTI2MiAxNC4wMjYxIDEyLjY2NjcgMTMuNjg3IDEyLjY2NjcgMTMuMzMzNFY0LjAwMDA0SDMuMzMzMzNaTTUuMzMzMzMgNC4wMDAwNFYyLjY2NjcxQzUuMzMzMzMgMi4zMTMwOSA1LjQ3MzgxIDEuOTczOTUgNS43MjM4NiAxLjcyMzlDNS45NzM5MSAxLjQ3Mzg1IDYuMzEzMDQgMS4zMzMzNyA2LjY2NjY3IDEuMzMzMzdIOS4zMzMzM0M5LjY4Njk2IDEuMzMzMzcgMTAuMDI2MSAxLjQ3Mzg1IDEwLjI3NjEgMS43MjM5QzEwLjUyNjIgMS45NzM5NSAxMC42NjY3IDIuMzEzMDkgMTAuNjY2NyAyLjY2NjcxVjQuMDAwMDRNNi42NjY2NyA3LjMzMzM3VjExLjMzMzRNOS4zMzMzMyA3LjMzMzM3VjExLjMzMzRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLWxhYmVsXCI+e3sgc2VsZWN0ZWRDYXRlZ29yeUljb25MYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzQ2F0ZWdvcnlJY29uRHJvcGRvd25PcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaWNvbiBvZiBjYXRlZ29yeUljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENhdGVnb3J5SWNvbkZyb21Ecm9wZG93bigkZXZlbnQsIGljb24udmFsdWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnktaWNvblwiIFtuZ0NsYXNzXT1cImljb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImljb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCIncHVycGxlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInb3JhbmdlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInaG91c2VLZWVwaW5nVGFnJ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xMTYyXzI0NjUwKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy4wNDk4MyAwLjU0NDk0N0M3Ljc0NzM4IC0wLjE4MTY0OSA4Ljg3ODI5IC0wLjE4MTY0OSA5LjU3NTg0IDAuNTQ0OTQ3TDE1LjQ2OTcgNi42ODQ0QzE2LjE2NzIgNy40MTEwMSAxNi4xNjcyIDguNTg5MDQgMTUuNDY5NyA5LjMxNTY1TDkuNTc1ODQgMTUuNDU1MUM4Ljg3ODI5IDE2LjE4MTYgNy43NDczOCAxNi4xODE2IDcuMDQ5ODMgMTUuNDU1MUw1LjM2NTYyIDEzLjcwMDdMMy44MjE3OSAxNS4zMDg4QzMuMTI0MjYgMTYuMDM1NCAxLjk5MzM0IDE2LjAzNTQgMS4yOTU4IDE1LjMwODhDMC41OTgyNzIgMTQuNTgyMyAwLjU5ODI3MiAxMy40MDQyIDEuMjk1OCAxMi42Nzc3TDIuODM5NjQgMTEuMDY5NUwxLjE1NTk2IDkuMzE1NjVDMC40NTg0MjkgOC41ODkwNCAwLjQ1ODQyOSA3LjQxMTAxIDEuMTU1OTYgNi42ODQ0TDcuMDQ5ODMgMC41NDQ5NDdaTTguNzMzODEgMS40MjIwM0M4LjUwMTI5IDEuMTc5ODMgOC4xMjQzIDEuMTc5ODMgNy44OTE3OCAxLjQyMjAzTDMuNjgxNjUgNS44MDc2MkwxMC40MTc1IDEyLjgyNDJMMTQuNjI3NyA4LjQzODU0QzE0Ljg2MDIgOC4xOTYzNCAxNC44NjAyIDcuODAzNjMgMTQuNjI3NyA3LjU2MTUxTDExLjY4MDUgNC40OTE0M0wxMC42OTgxIDUuNTE0NjlDMTAuNDY1NiA1Ljc1Njg5IDEwLjA4ODcgNS43NTY4OSA5Ljg1NjE0IDUuNTE0NjlDOS42MjM2MyA1LjI3MjQ5IDkuNjIzNjMgNC44Nzk4MSA5Ljg1NjE0IDQuNjM3NjFMMTAuODM4NCAzLjYxNDM1TDkuOTk2NjUgMi43Mzc0Nkw3LjYxMSA1LjIyMjUyQzcuMzc4NDkgNS40NjQ3MSA3LjAwMTQ5IDUuNDY0NzEgNi43Njg5NyA1LjIyMjUyQzYuNTM2NDYgNC45ODAzMiA2LjUzNjQ2IDQuNTg3NjMgNi43Njg5NyA0LjM0NTQ0TDkuMTU0NjIgMS44NjAzOEw4LjczMzgxIDEuNDIyMDNaTTkuNTc1NTIgMTMuNzAxMkwyLjgzOTY2IDYuNjg0N0wxLjk5Nzk2IDcuNTYxNTFDMS43NjU0NCA3LjgwMzYzIDEuNzY1NDQgOC4xOTYzNCAxLjk5Nzk2IDguNDM4NTRMNy44OTE3OCAxNC41NzhDOC4xMjQzIDE0LjgyMDIgOC41MDEyOSAxNC44MjAyIDguNzMzODEgMTQuNTc4TDkuNTc1NTIgMTMuNzAxMlpNMy42ODE1NiAxMS45NDY2TDIuMTM3OCAxMy41NTQ3QzEuOTA1MjkgMTMuNzk2OSAxLjkwNTI5IDE0LjE4OTYgMi4xMzc4IDE0LjQzMThDMi4zNzAzMSAxNC42NzQgMi43NDcyOSAxNC42NzQgMi45Nzk4IDE0LjQzMThMNC41MjM1NSAxMi44MjM3TDMuNjgxNTYgMTEuOTQ2NlpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTE2Ml8yNDY1MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2p1bmtUYWcnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yIDQuMDAwMDRIMy4zMzMzM00zLjMzMzMzIDQuMDAwMDRIMTRNMy4zMzMzMyA0LjAwMDA0VjEzLjMzMzRDMy4zMzMzMyAxMy42ODcgMy40NzM4MSAxNC4wMjYxIDMuNzIzODYgMTQuMjc2MkMzLjk3MzkxIDE0LjUyNjIgNC4zMTMwNCAxNC42NjY3IDQuNjY2NjcgMTQuNjY2N0gxMS4zMzMzQzExLjY4NyAxNC42NjY3IDEyLjAyNjEgMTQuNTI2MiAxMi4yNzYxIDE0LjI3NjJDMTIuNTI2MiAxNC4wMjYxIDEyLjY2NjcgMTMuNjg3IDEyLjY2NjcgMTMuMzMzNFY0LjAwMDA0SDMuMzMzMzNaTTUuMzMzMzMgNC4wMDAwNFYyLjY2NjcxQzUuMzMzMzMgMi4zMTMwOSA1LjQ3MzgxIDEuOTczOTUgNS43MjM4NiAxLjcyMzlDNS45NzM5MSAxLjQ3Mzg1IDYuMzEzMDQgMS4zMzMzNyA2LjY2NjY3IDEuMzMzMzdIOS4zMzMzM0M5LjY4Njk2IDEuMzMzMzcgMTAuMDI2MSAxLjQ3Mzg1IDEwLjI3NjEgMS43MjM5QzEwLjUyNjIgMS45NzM5NSAxMC42NjY3IDIuMzEzMDkgMTAuNjY2NyAyLjY2NjcxVjQuMDAwMDRNNi42NjY2NyA3LjMzMzM3VjExLjMzMzRNOS4zMzMzMyA3LjMzMzM3VjExLjMzMzRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaWNvbi5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgdGV4dC1tdXRlZFwiPkNhdGVnb3J5IE5hbWU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/LmludmFsaWQgJiYgY2F0ZWdvcnlGb3JtLmdldCgnbmFtZScpPy50b3VjaGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBuZXcgY2F0ZWdvcnlcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIGNhdGVnb3J5Rm9ybS5nZXQoJ25hbWUnKT8udG91Y2hlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgbmFtZSBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/Lmhhc0Vycm9yKCdkdXBsaWNhdGUnKSAmJiBjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/LnRvdWNoZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5IG5hbWUgYWxyZWFkeSBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHRleHQtbXV0ZWRcIj5MaW1pdGF0aW9uPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC13cmFwcGVyXCIgW2NsYXNzLm9wZW5dPVwiaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGVcIiAoY2xpY2spPVwidG9nZ2xlQ2F0ZWdvcnlMaW1pdERyb3Bkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjYXRlZ29yeUZvcm0uZ2V0KCdsaW1pdCcpPy52YWx1ZSB8fCBwZXJjZW50YWdlTGlzdFswXSB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBwIG9mIHBlcmNlbnRhZ2VMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENhdGVnb3J5TGltaXRWYWx1ZSgkZXZlbnQsIHApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHAgfX0lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyIGJvcmRlci0wIHB0LTBcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cImNsb3NlQ2F0ZWdvcnlNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJzdWJtaXRDYXRlZ29yeUZvcm0oKVwiPlxuICAgICAgICAgICAgICAgIHt7IGNhdGVnb3J5TW9kYWxNb2RlID09PSAnYWRkJyA/ICdDcmVhdGUnIDogJ1NhdmUnIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwhLS0gRGVsZXRlIENvbmZpcm1hdGlvbiBNb2RhbCAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2RlbGV0ZUNhdGVnb3J5TW9kYWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHRleHQtY2VudGVyIHAtNFwiPlxuICAgICAgICAgICAgPGg1IGNsYXNzPVwiZnctc2VtaWJvbGQgbWItMlwiPkNvbmZpcm1hdGlvbjwvaDU+XG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTQgdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgIFlvdSdyZSBhYm91dCB0byBkZWxldGUgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPnt7IGNhdGVnb3J5UGVuZGluZ0RlbGV0ZU5hbWUgfX08L3NwYW4+IGNhdGVnb3J5LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwiY2xvc2VEZWxldGVNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIChjbGljayk9XCJjb25maXJtRGVsZXRlQ2F0ZWdvcnkoKVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIFJlc2V0IFN0b3JlIFJlcXVlc3RzIENvbmZpcm1hdGlvbiBNb2RhbCAtLT5cbiAgICA8bmctdGVtcGxhdGUgI3Jlc2V0Q29uZmlybWF0aW9uTW9kYWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHRleHQtY2VudGVyIHAtNFwiPlxuICAgICAgICAgICAgPGg1IGNsYXNzPVwiZnctc2VtaWJvbGQgbWItMlwiPlJlc2V0IFN0b3JlIFJlcXVlc3RzPC9oNT5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWItNCB0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgICAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHByb2NlZWQgd2l0aCByZXNldHRpbmcgdGhlIHNlbGVjdGVkIDxzcGFuIGNsYXNzPVwiZnctc2VtaWJvbGRcIj57e1xuICAgICAgICAgICAgICAgICAgICByZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5sZW5ndGggfX08L3NwYW4+IHN0b3JlKHMpIHJlcXVlc3RzP1xuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwiY2xvc2VSZXNldE1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJjb25maXJtUmVzZXRTdG9yZVJlcXVlc3QoKVwiPlJlc2V0PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuPC9mb3JtPlxuIl19
851
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBdUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQVcxQyxNQUFNLE9BQU8sOEJBQThCO0lBd0RyQjtJQUNYO0lBQ0M7SUFDQTtJQUNBO0lBM0RWLDRCQUE0QixDQUFhO0lBQ3hCLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzFDLFlBQVksR0FBbUY7UUFDN0YsUUFBUSxFQUFFLEVBQUU7UUFDWixhQUFhLEVBQUUsRUFBRTtLQUNsQixDQUFDO0lBQ0Ysc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25DLGNBQWMsR0FBYSxFQUFFLENBQUM7SUFDOUIsc0JBQXNCLEdBQWEsRUFBRSxDQUFDO0lBQ3RD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QlUsOEJBQThCOzRGQUE5Qiw4QkFBOEIsc2RDakIzQyxtMGxEQTRwQkE7OzRGRDNvQmEsOEJBQThCO2tCQVAxQyxTQUFTOytCQUNFLDRCQUE0QjtrTUEwRFYsZ0JBQWdCO3NCQUEzQyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ1Esc0JBQXNCO3NCQUF2RCxTQUFTO3VCQUFDLHFCQUFxQjtnQkFDSyx5QkFBeUI7c0JBQTdELFNBQVM7dUJBQUMsd0JBQXdCO2dCQW9oQm5DLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgT25Jbml0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmdiTW9kYWwsIE5nYk1vZGFsUmVmIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgQ2xpZW50QXBpU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NsaWVudC1hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItZm9vdGZhbGwtY29uZmlndXJhdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBGb290ZmFsbENvbmZpZ3VyYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0hOiBGb3JtR3JvdXA7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcmVzZXRSZXF1ZXN0OiB7IGNsaWVudElkOiBzdHJpbmc7IGFycmF5T2ZTdG9yZXM6IHsgc3RvcmVJZDogc3RyaW5nOyBkYXRlU3RyaW5nOiBzdHJpbmcgfVtdIH0gPSB7XHJcbiAgICBjbGllbnRJZDogJycsXHJcbiAgICBhcnJheU9mU3RvcmVzOiBbXVxyXG4gIH07XHJcbiAgc3BvY1RpY2tldENyZWF0aW9uZGF5cyA9IFsxLCAyLCAzXTtcclxuICBwZXJjZW50YWdlTGlzdDogbnVtYmVyW10gPSBbXTtcclxuICBhY2N1cmFjeVBlcmNlbnRhZ2VMaXN0OiBudW1iZXJbXSA9IFtdO1xyXG4gIHN0b3JlVGlja2V0RGF5czogbnVtYmVyW10gPSBbXTtcclxuICBzZW5kVGlja2V0VGFuZ286IG51bWJlcltdID0gW107XHJcbiAgaXNFZGl0OiBib29sZWFuID0gdHJ1ZTtcclxuICBjbGllbklkOiBzdHJpbmc7XHJcbiAgc3RvcmVMaXN0OiBhbnkgPSBbXTtcclxuICBpc1Jlc2V0dGluZyA9IGZhbHNlO1xyXG4gIGNhdGVnb3J5Rm9ybSE6IEZvcm1Hcm91cDtcclxuICBjYXRlZ29yeU1vZGFsTW9kZTogJ2FkZCcgfCAnZWRpdCcgPSAnYWRkJztcclxuICBlZGl0aW5nQ2F0ZWdvcnlJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgY2F0ZWdvcnlNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcclxuICBkZWxldGVNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcclxuICByZXNldE1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xyXG4gIGNhdGVnb3J5VG9EZWxldGVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgY2F0ZWdvcnlQZW5kaW5nRGVsZXRlTmFtZSA9ICcnO1xyXG4gIGFjdGl2ZU1lbnVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgb3BlbkxpbWl0RHJvcGRvd25JbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICBpc0F1dG9DbG9zZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIGlzc2VuZFRhbmdvRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIGlzU3RvcmVEYXlzRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgZGF5c09wdGlvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXHJcbiAgICB7IGxhYmVsOiAnTW9udGgnLCB2YWx1ZTogJzMwJyB9LFxyXG4gICAgeyBsYWJlbDogJ1dlZWsnLCB2YWx1ZTogJzcnIH1cclxuICBdO1xyXG4gIGlzU3RvcmVBY2N1cmFjeURyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIGlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmV2aXNpb25EZXBzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICByZWFkb25seSBtYXhDYXRlZ29yeUNvdW50ID0gNTtcclxuICByZWFkb25seSBiYXNlQ2F0ZWdvcnlJY29uczphbnkgPSBbXHJcbiAgICAvLyB7IGxhYmVsOiAnQmx1ZSBUYWcnLCB2YWx1ZTogJ2JsdWVUYWcnIH0sXHJcbiAgICB7IGxhYmVsOiAnUHVycGxlIFRhZycsIHZhbHVlOiAncHVycGxlVGFnJyB9LFxyXG4gICAgeyBsYWJlbDogJ09yYW5nZSBUYWcnLCB2YWx1ZTogJ29yYW5nZVRhZycgfVxyXG4gIF07XHJcblxyXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxDYXRlZ29yeUljb25zID0gW1xyXG4gICAgeyBsYWJlbDogJ0hvdXNlIEtlZXBpbmcnLCB2YWx1ZTogJ2hvdXNlS2VlcGluZ1RhZycgfSxcclxuICAgIHsgbGFiZWw6ICdKdW5rJywgdmFsdWU6ICdqdW5rVGFnJyB9XHJcbiAgXTtcclxuXHJcbiAgZm9vdGZhbGxDb25maWdEYXRhOiBhbnkgPSBbXTtcclxuICBAVmlld0NoaWxkKCdjYXRlZ29yeU1vZGFsJykgY2F0ZWdvcnlNb2RhbFRwbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnZGVsZXRlQ2F0ZWdvcnlNb2RhbCcpIGRlbGV0ZUNhdGVnb3J5TW9kYWxUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3Jlc2V0Q29uZmlybWF0aW9uTW9kYWwnKSByZXNldENvbmZpcm1hdGlvbk1vZGFsVHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogQ2xpZW50QXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSkge1xyXG4gICAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50SWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW5JZCA9IGVcclxuICAgICAgICB0aGlzLnJlc2V0UmVxdWVzdC5jbGllbnRJZCA9IGU7XHJcbiAgICAgICAgdGhpcy5nZXRDbGllbnRNYXBwZWRTdG9yZXNEZXRhaWxzKGUpO1xyXG4gICAgICAgIC8vIExvYWQgZm9vdGZhbGwgZGV0YWlscyB3aGVuIGNsaWVudElkIGlzIGF2YWlsYWJsZVxyXG4gICAgICAgIC8vIHRoaXMubG9hZEZvb3RmYWxsQ29uZmlnRGV0YWlscyhlKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0Q2F0ZWdvcnlGb3JtKCk7XHJcbiAgICB0aGlzLmxvYWRGb3JtKCk7XHJcbiAgICB0aGlzLmdlbmVyYXRlRGF5T3B0aW9ucyg0NSk7XHJcbiAgICB0aGlzLmdlbmVyYXRlRGlyTGltaXRhdGlvbigxMDApO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUFjY3VyYWN5T3B0aW9ucyg5NSk7XHJcbiAgICB0aGlzLnNlbmRUaWNrZXRUb1RhbmdvKDEwMCk7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50Rm9ybURhdGEucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICBpZiAocmVzLnR5cGUgPT09ICdpbnB1dCcgJiYgcmVzLmZvcm0gPT09ICdmb290ZmFsbERpcmVjdG9yeUNvbmZpZ3MnKSB7XHJcbiAgICAgICAgICB0aGlzLnBhdGNoRm9ybShyZXMudmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgZm9vdGZhbGwgZGV0YWlscyBmcm9tIEFQSSB3aGVuIGNsaWVudElkIGlzIGF2YWlsYWJsZVxyXG4gICAqIFRoaXMgZW5zdXJlcyBjbGllbklkIGlzIHNldCBiZWZvcmUgbWFraW5nIHRoZSBBUEkgY2FsbFxyXG4gICAqL1xyXG4gIC8vIHByaXZhdGUgbG9hZEZvb3RmYWxsQ29uZmlnRGV0YWlscyhjbGllbnRJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgLy8gICBpZiAoIWNsaWVudElkKSB7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMuYXBpU2VydmljZS5nZXRGb290ZmFsbERldGFpbHMoY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gIC8vICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHJlcykge1xyXG4gIC8vICAgICAgICAgY29uc29sZS5sb2coJ0Zvb3RmYWxsIERpcmVjdG9yeSBDb25maWdzIGRhdGEgOjonLCByZXMpO1xyXG4gIC8vICAgICAgICAgaWYgKHJlcz8uZGF0YSAmJiByZXM/LmRhdGE/LmZvb3RmYWxsRGlyZWN0b3J5Q29uZmlncykge1xyXG4gIC8vICAgICAgICAgICB0aGlzLmZvb3RmYWxsQ29uZmlnRGF0YSA9IHJlcz8uZGF0YT8uZm9vdGZhbGxEaXJlY3RvcnlDb25maWdzO1xyXG4gIC8vICAgICAgICAgICB0aGlzLnBhdGNoRm9ybSh0aGlzLmZvb3RmYWxsQ29uZmlnRGF0YSk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgZm9vdGZhbGwgZGV0YWlsczonLCBlcnIpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIGdlbmVyYXRlRGF5T3B0aW9ucyhjb3VudDogbnVtYmVyKSB7XHJcbiAgdGhpcy5zdG9yZVRpY2tldERheXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4gaSArIDEpO1xyXG4gfVxyXG5cclxuICBnZW5lcmF0ZURpckxpbWl0YXRpb24oY291bnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5wZXJjZW50YWdlTGlzdCA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sIChfLCBpKSA9PiBpICsgMSk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZUFjY3VyYWN5T3B0aW9ucyhtYXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5hY2N1cmFjeVBlcmNlbnRhZ2VMaXN0ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbWF4IH0sIChfLCBpKSA9PiBpICsgMSk7XHJcbiAgfVxyXG5cclxuICBzZW5kVGlja2V0VG9UYW5nbyhtYXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5zZW5kVGlja2V0VGFuZ28gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBtYXggfSwgKF8sIGkpID0+IGkgKyAxKTtcclxuICB9XHJcblxyXG4gIGxvYWRGb3JtKCkge1xyXG4gICAgLy8gaW5pdGlhbGl6ZSBmb3JtXHJcbiAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcmV2aXNpb246IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBhbGxvd1RpY2tldENyZWF0aW9uOiBbbnVsbF0sXHJcbiAgICAgIGlzQXV0b0Nsb3NlRW5hYmxlOiBbZmFsc2VdLFxyXG4gICAgICBhdXRvQ2xvc2VBY2N1cmFjeTogWycnXSxcclxuICAgICAgdGFnZ2luZ0xpbWl0YXRpb246IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBhY2N1cmFjeUJyZWFjaDogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgdGlja2V0Q291bnQ6IFsnJ10sXHJcbiAgICAgICAgZGF5czogW10sXHJcbiAgICAgICAgYWNjdXJhY3k6IFsnJ11cclxuICAgICAgfSksXHJcbiAgICAgIHRhbmdvUmV2aWV3OiBbJyddXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHBhdGNoRm9ybShkYXRhOiBhbnkpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuO1xyXG4gICAgLy8gcGF0Y2ggcmV2aXNpb25cclxuICAgIGNvbnN0IHJldmlzaW9uQXJyYXkgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdyZXZpc2lvbicpIGFzIEZvcm1BcnJheTtcclxuICAgIHJldmlzaW9uQXJyYXkuY2xlYXIoKTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEucmV2aXNpb24pKSB7XHJcbiAgICAgIGRhdGEucmV2aXNpb24uZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgcmV2aXNpb25BcnJheS5wdXNoKHRoaXMuY3JlYXRlUmV2aXNpb24oaXRlbS5hY3Rpb25UeXBlLCBpdGVtLmlzQ2hlY2tlZCkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwYXRjaCB0YWdnaW5nTGltaXRhdGlvbiAtLSBiYXNlZCBvbiBuZXcga2V5IGZvcm1hdCBcImVmZmVjdGl2ZUZyb21cIlxyXG4gICAgY29uc3QgdGFnQXJyYXkgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCd0YWdnaW5nTGltaXRhdGlvbicpIGFzIEZvcm1BcnJheTtcclxuICAgIHRhZ0FycmF5LmNsZWFyKCk7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhPy50YWdnaW5nTGltaXRhdGlvbikgJiYgZGF0YT8udGFnZ2luZ0xpbWl0YXRpb24/Lmxlbmd0aCA+IDAgJiYgXHJcbiAgICBkYXRhPy50YWdnaW5nTGltaXRhdGlvbj8ubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIC8vIE9ubHkgb25lIGNvbmZpZyBwcmVzZW50IOKAkyB1c2UgaXRzIHZhbHVlcyBkaXJlY3RseVxyXG4gICAgICBkYXRhPy50YWdnaW5nTGltaXRhdGlvblswXT8udmFsdWVzPy5mb3JFYWNoKCh0YWc6IGFueSkgPT4ge1xyXG4gICAgICAgIHRhZ0FycmF5LnB1c2godGhpcy5jcmVhdGVUYWdMaW1pdCh0YWc/LnR5cGUsIHRhZz8udmFsdWUsIHRhZz8uaWNvbk5hbWUsIHRhZz8ubmFtZSwgdGFnPy5rZXkpKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGF0YT8udGFnZ2luZ0xpbWl0YXRpb24pICYmIGRhdGE/LnRhZ2dpbmdMaW1pdGF0aW9uPy5sZW5ndGggPiAwICYmIFxyXG4gICAgZGF0YT8udGFnZ2luZ0xpbWl0YXRpb24/Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgLy8gTXVsdGlwbGUgY29uZmlncyBwcmVzZW50IOKAkyBwaWNrIHRoZSBvbmUgd2l0aCBsYXRlc3QgZWZmZWN0aXZlRnJvbSBkYXRlXHJcbiAgICAgIGNvbnN0IGxhdGVzdEVudHJ5ID0gZGF0YS50YWdnaW5nTGltaXRhdGlvbi5yZWR1Y2UoKGxhdGVzdDogYW55LCBjdXJyZW50OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWN1cnJlbnQgfHwgIWN1cnJlbnQuZWZmZWN0aXZlRnJvbSkge1xyXG4gICAgICAgICAgcmV0dXJuIGxhdGVzdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFsYXRlc3QgfHwgIWxhdGVzdC5lZmZlY3RpdmVGcm9tKSB7XHJcbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZShjdXJyZW50LmVmZmVjdGl2ZUZyb20pO1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdERhdGUgPSBuZXcgRGF0ZShsYXRlc3QuZWZmZWN0aXZlRnJvbSk7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlID4gbGF0ZXN0RGF0ZSA/IGN1cnJlbnQgOiBsYXRlc3Q7XHJcbiAgICAgIH0sIG51bGwpO1xyXG5cclxuICAgICAgaWYgKGxhdGVzdEVudHJ5ICYmIEFycmF5LmlzQXJyYXkobGF0ZXN0RW50cnkudmFsdWVzKSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdlZmZlY3RpdmVGcm9tOicsIGxhdGVzdEVudHJ5LmVmZmVjdGl2ZUZyb20pO1xyXG4gICAgICAgIGxhdGVzdEVudHJ5LnZhbHVlcy5mb3JFYWNoKCh0YWc6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGFnQXJyYXkucHVzaCh0aGlzLmNyZWF0ZVRhZ0xpbWl0KHRhZz8udHlwZSwgdGFnPy52YWx1ZSwgdGFnPy5pY29uTmFtZSwgdGFnPy5uYW1lLCB0YWc/LmtleSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcGF0Y2ggYWNjdXJhY3lCcmVhY2ggZ3JvdXBcclxuICAgIGlmIChkYXRhLmFjY3VyYWN5QnJlYWNoKSB7XHJcbiAgICAgIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoJyk/LnBhdGNoVmFsdWUoe1xyXG4gICAgICAgIHRpY2tldENvdW50OiBkYXRhLmFjY3VyYWN5QnJlYWNoLnRpY2tldENvdW50LFxyXG4gICAgICAgIGRheXM6IGRhdGEuYWNjdXJhY3lCcmVhY2guZGF5cyA/PyAnMzAnLFxyXG4gICAgICAgIGFjY3VyYWN5OiBkYXRhLmFjY3VyYWN5QnJlYWNoLmFjY3VyYWN5XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHBhdGNoIHNpbXBsZSBmaWVsZHNcclxuICAgIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgYWxsb3dUaWNrZXRDcmVhdGlvbjogZGF0YS5hbGxvd1RpY2tldENyZWF0aW9uID8/IDMsXHJcbiAgICAgIGlzQXV0b0Nsb3NlRW5hYmxlOiBkYXRhLmlzQXV0b0Nsb3NlRW5hYmxlID8/IGZhbHNlLFxyXG4gICAgICBhdXRvQ2xvc2VBY2N1cmFjeTogZGF0YS5hdXRvQ2xvc2VBY2N1cmFjeSA/PyAnOTUlJyxcclxuICAgICAgdGFuZ29SZXZpZXc6IGRhdGEudGFuZ29SZXZpZXcgPz8gJzg1JSdcclxuICAgIH0pO1xyXG4gICAgdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmRpc2FibGUoKTtcclxuICAgIC8vIEFwcGx5IGRlcGVuZGVuY3kgbG9naWNcclxuICAgIHRoaXMuaGFuZGxlUmV2aXNpb25EZXBlbmRlbmNpZXMoKTtcclxuICB9XHJcblxyXG4gIG9wZW5DYXRlZ29yeU1vZGFsKG1vZGU6ICdhZGQnIHwgJ2VkaXQnLCBpbmRleD86IG51bWJlcikge1xyXG4gICAgaWYgKG1vZGUgPT09ICdhZGQnICYmIHRoaXMuaXNDYXRlZ29yeUxpbWl0UmVhY2hlZCkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdCgnTWF4aW11bSBDYXRlZ29yeSBjcmVhdGlvbiBsaW1pdCByZWFjaGVkJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9IG1vZGU7XHJcbiAgICB0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4ID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IGluZGV4IDogbnVsbDtcclxuXHJcbiAgICBpZiAobW9kZSA9PT0gJ2VkaXQnICYmIHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgY2F0ZWdvcnlHcm91cCA9IHRoaXMudGFnTGltaXRzLmF0KHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgICAgdGhpcy5jYXRlZ29yeUZvcm0uc2V0VmFsdWUoe1xyXG4gICAgICAgIGljb25OYW1lOiBjYXRlZ29yeUdyb3VwLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgfHwgdGhpcy5iYXNlQ2F0ZWdvcnlJY29uc1swXS52YWx1ZSxcclxuICAgICAgICBuYW1lOiBjYXRlZ29yeUdyb3VwLmdldCgnbmFtZScpPy52YWx1ZSB8fCBjYXRlZ29yeUdyb3VwLmdldCgndHlwZScpPy52YWx1ZSB8fCAnJyxcclxuICAgICAgICBsaW1pdDogY2F0ZWdvcnlHcm91cC5nZXQoJ3ZhbHVlJyk/LnZhbHVlIHx8IHRoaXMucGVyY2VudGFnZUxpc3RbMF1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhdGVnb3J5Rm9ybS5yZXNldCh7XHJcbiAgICAgICAgaWNvbk5hbWU6IHRoaXMuYmFzZUNhdGVnb3J5SWNvbnNbMF0udmFsdWUsXHJcbiAgICAgICAgbmFtZTogJycsXHJcbiAgICAgICAgbGltaXQ6IHRoaXMucGVyY2VudGFnZUxpc3RbMF1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jYXRlZ29yeU1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmNhdGVnb3J5TW9kYWxUcGwsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIHNpemU6ICdtZCcsXHJcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcclxuICAgICAga2V5Ym9hcmQ6IHRydWVcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3VibWl0Q2F0ZWdvcnlGb3JtKCkge1xyXG4gICAgaWYgKHRoaXMuY2F0ZWdvcnlGb3JtLmludmFsaWQpIHtcclxuICAgICAgdGhpcy5jYXRlZ29yeUZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgeyBpY29uTmFtZSwgbmFtZSwgbGltaXQgfSA9IHRoaXMuY2F0ZWdvcnlGb3JtLnZhbHVlO1xyXG4gICAgY29uc3QgdHJpbW1lZE5hbWUgPSAobmFtZSB8fCAnJykudHJpbSgpO1xyXG5cclxuICAgIGlmICghdHJpbW1lZE5hbWUpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdDYXRlZ29yeSBuYW1lIGlzIHJlcXVpcmVkLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZHVwbGljYXRlSW5kZXggPSB0aGlzLnRhZ0xpbWl0cy5jb250cm9scy5maW5kSW5kZXgoKGN0cmwsIGlkeCkgPT5cclxuICAgICAgKGN0cmwuZ2V0KCduYW1lJyk/LnZhbHVlPy50b0xvd2VyQ2FzZSgpID09PSB0cmltbWVkTmFtZS50b0xvd2VyQ2FzZSgpIHx8IFxyXG4gICAgICAgY3RybC5nZXQoJ3R5cGUnKT8udmFsdWU/LnRvTG93ZXJDYXNlKCkgPT09IHRyaW1tZWROYW1lLnRvTG93ZXJDYXNlKCkpICYmXHJcbiAgICAgIGlkeCAhPT0gKHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggPz8gLTEpXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChkdXBsaWNhdGVJbmRleCAhPT0gLTEpIHtcclxuICAgICAgY29uc3QgbmFtZUNvbnRyb2wgPSB0aGlzLmNhdGVnb3J5Rm9ybS5nZXQoJ25hbWUnKTtcclxuICAgICAgbmFtZUNvbnRyb2w/LnNldEVycm9ycyh7IGR1cGxpY2F0ZTogdHJ1ZSB9KTtcclxuICAgICAgbmFtZUNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIGljb25OYW1lIGFscmVhZHkgZXhpc3RzXHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcpIHtcclxuICAgICAgY29uc3QgZXhpc3RpbmdJY29uID0gdGhpcy50YWdMaW1pdHMuY29udHJvbHMuZmluZCgoY3RybCkgPT4gXHJcbiAgICAgICAgY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlID09PSBpY29uTmFtZVxyXG4gICAgICApO1xyXG4gICAgICBcclxuICAgICAgaWYgKGV4aXN0aW5nSWNvbikge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnVGhpcyBpY29uIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5LicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID09PSAnZWRpdCcgJiYgdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBJbiBlZGl0IG1vZGUsIGNoZWNrIGlmIGljb24gaXMgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5IChleGNsdWRpbmcgY3VycmVudCBvbmUpXHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nSWNvbiA9IHRoaXMudGFnTGltaXRzLmNvbnRyb2xzLmZpbmQoKGN0cmwsIGlkeCkgPT4gXHJcbiAgICAgICAgY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlID09PSBpY29uTmFtZSAmJiBpZHggIT09IHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXhcclxuICAgICAgKTtcclxuICAgICAgXHJcbiAgICAgIGlmIChleGlzdGluZ0ljb24pIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1RoaXMgaWNvbiBpcyBhbHJlYWR5IHVzZWQgYnkgYW5vdGhlciBjYXRlZ29yeS4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcpIHtcclxuICAgICAgLy8gR2VuZXJhdGUgdHlwZSBmcm9tIG5hbWUgKGxvd2VyY2FzZSwgcmVtb3ZlIHNwYWNlcylcclxuICAgICAgY29uc3QgdHlwZSA9IHRyaW1tZWROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnJyk7XHJcbiAgICAgIGNvbnN0IGtleSA9IHR5cGUuY2hhckF0KDApO1xyXG4gICAgICB0aGlzLnRhZ0xpbWl0cy5wdXNoKHRoaXMuY3JlYXRlVGFnTGltaXQodHlwZSwgTnVtYmVyKGxpbWl0KSwgaWNvbk5hbWUsIHRyaW1tZWROYW1lLCBrZXkpKTtcclxuICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ0NhdGVnb3J5IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4ICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3J5R3JvdXAgPSB0aGlzLnRhZ0xpbWl0cy5hdCh0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4KSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgIGNhdGVnb3J5R3JvdXAucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgbmFtZTogdHJpbW1lZE5hbWUsXHJcbiAgICAgICAgdmFsdWU6IE51bWJlcihsaW1pdCksXHJcbiAgICAgICAgaWNvbk5hbWU6IGljb25OYW1lXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnQ2F0ZWdvcnkgdXBkYXRlZCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbG9zZUNhdGVnb3J5TW9kYWwoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlQ2F0ZWdvcnlNb2RhbCgpIHtcclxuICAgIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxSZWYpIHtcclxuICAgICAgdGhpcy5jYXRlZ29yeU1vZGFsUmVmLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMuY2F0ZWdvcnlNb2RhbFJlZiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb3BlbkRlbGV0ZUNhdGVnb3J5TW9kYWwoaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXggPSBpbmRleDtcclxuICAgIGNvbnN0IGNhdGVnb3J5R3JvdXAgPSB0aGlzLnRhZ0xpbWl0cy5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgdGhpcy5jYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lID0gY2F0ZWdvcnlHcm91cC5nZXQoJ25hbWUnKT8udmFsdWUgfHwgJ3RoaXMgY2F0ZWdvcnknO1xyXG4gICAgdGhpcy5kZWxldGVNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5kZWxldGVDYXRlZ29yeU1vZGFsVHBsLCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgICBzaXplOiAnc20nLFxyXG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXHJcbiAgICAgIGtleWJvYXJkOiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25maXJtRGVsZXRlQ2F0ZWdvcnkoKSB7XHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXggPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50YWdMaW1pdHMucmVtb3ZlQXQodGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXgpO1xyXG4gICAgdGhpcy5jYXRlZ29yeVRvRGVsZXRlSW5kZXggPSBudWxsO1xyXG4gICAgdGhpcy5jYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lID0gJyc7XHJcbiAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnQ2F0ZWdvcnkgZGVsZXRlZCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICB0aGlzLmNsb3NlRGVsZXRlTW9kYWwoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlRGVsZXRlTW9kYWwoKSB7XHJcbiAgICBpZiAodGhpcy5kZWxldGVNb2RhbFJlZikge1xyXG4gICAgICB0aGlzLmRlbGV0ZU1vZGFsUmVmLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMuZGVsZXRlTW9kYWxSZWYgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lID0gJyc7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RDYXRlZ29yeUljb24oaWNvblZhbHVlOiBzdHJpbmcpIHtcclxuICAgIC8vIENoZWNrIGlmIGljb25OYW1lIGFscmVhZHkgZXhpc3RzXHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcpIHtcclxuICAgICAgY29uc3QgZXhpc3RpbmdJY29uID0gdGhpcy50YWdMaW1pdHMuY29udHJvbHMuZmluZCgoY3RybCkgPT4gXHJcbiAgICAgICAgY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlID09PSBpY29uVmFsdWVcclxuICAgICAgKTtcclxuICAgICAgXHJcbiAgICAgIGlmIChleGlzdGluZ0ljb24pIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1RoaXMgaWNvbiBpcyBhbHJlYWR5IHVzZWQgYnkgYW5vdGhlciBjYXRlZ29yeS4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2VkaXQnICYmIHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggIT09IG51bGwpIHtcclxuICAgICAgLy8gSW4gZWRpdCBtb2RlLCBjaGVjayBpZiBpY29uIGlzIHVzZWQgYnkgYW5vdGhlciBjYXRlZ29yeSAoZXhjbHVkaW5nIGN1cnJlbnQgb25lKVxyXG4gICAgICBjb25zdCBleGlzdGluZ0ljb24gPSB0aGlzLnRhZ0xpbWl0cy5jb250cm9scy5maW5kKChjdHJsLCBpZHgpID0+IFxyXG4gICAgICAgIGN0cmwuZ2V0KCdpY29uTmFtZScpPy52YWx1ZSA9PT0gaWNvblZhbHVlICYmIGlkeCAhPT0gdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleFxyXG4gICAgICApO1xyXG4gICAgICBcclxuICAgICAgaWYgKGV4aXN0aW5nSWNvbikge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnVGhpcyBpY29uIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5LicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLmNhdGVnb3J5Rm9ybS5nZXQoJ2ljb25OYW1lJyk/LnNldFZhbHVlKGljb25WYWx1ZSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDYXRlZ29yeU1lbnUoZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuYWN0aXZlTWVudUluZGV4ID0gdGhpcy5hY3RpdmVNZW51SW5kZXggPT09IGluZGV4ID8gbnVsbCA6IGluZGV4O1xyXG4gIH1cclxuXHJcbiAgb25DYXRlZ29yeU1lbnVBY3Rpb24oZXZlbnQ6IEV2ZW50LCBhY3Rpb246ICdlZGl0JyB8ICdkZWxldGUnLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuYWN0aXZlTWVudUluZGV4ID0gbnVsbDtcclxuICAgIGlmIChhY3Rpb24gPT09ICdlZGl0Jykge1xyXG4gICAgICB0aGlzLm9wZW5DYXRlZ29yeU1vZGFsKCdlZGl0JywgaW5kZXgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcGVuRGVsZXRlQ2F0ZWdvcnlNb2RhbChpbmRleCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVMaW1pdERyb3Bkb3duKGV2ZW50OiBFdmVudCwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5pc0VkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vcGVuTGltaXREcm9wZG93bkluZGV4ID0gdGhpcy5vcGVuTGltaXREcm9wZG93bkluZGV4ID09PSBpbmRleCA/IG51bGwgOiBpbmRleDtcclxuICB9XHJcblxyXG4gIHNlbGVjdExpbWl0VmFsdWUoZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSAodGhpcy50YWdMaW1pdHMuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cCkuZ2V0KCd2YWx1ZScpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ2F0ZWdvcnlMaW1pdERyb3Bkb3duKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9ICF0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHNlbGVjdENhdGVnb3J5TGltaXRWYWx1ZShldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuY2F0ZWdvcnlGb3JtLmdldCgnbGltaXQnKTtcclxuICAgIGNvbnRyb2w/LnNldFZhbHVlKHZhbHVlKTtcclxuICAgIGNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQXV0b0Nsb3NlRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBpc0F1dG9DbG9zZUVuYWJsZWQgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdpc0F1dG9DbG9zZUVuYWJsZScpPy52YWx1ZTtcclxuICAgIGlmICghaXNBdXRvQ2xvc2VFbmFibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW4gPSAhdGhpcy5pc0F1dG9DbG9zZURyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbmRUYW5nb0Nsb3NlRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzc2VuZFRhbmdvRHJvcGRvd25PcGVuID0gIXRoaXMuaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICBzZWxlY3RBdXRvQ2xvc2VBY2N1cmFjeShldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2F1dG9DbG9zZUFjY3VyYWN5Jyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZShgJHt2YWx1ZX0lYCk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFNlbmRUaWNrZXRUYW5nbyhldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3RhbmdvUmV2aWV3Jyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZShgJHt2YWx1ZX0lYCk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVRpY2tldENvdW50RHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzVGlja2V0Q291bnREcm9wZG93bk9wZW4gPSAhdGhpcy5pc1RpY2tldENvdW50RHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0VGlja2V0Q291bnQoZXZlbnQ6IEV2ZW50LCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaC50aWNrZXRDb3VudCcpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLmlzVGlja2V0Q291bnREcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVN0b3JlRGF5c0Ryb3Bkb3duKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5pc0VkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc1N0b3JlRGF5c0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmlzU3RvcmVEYXlzRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U3RvcmVEYXlzKGV2ZW50OiBFdmVudCwgb3B0aW9uOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnYWNjdXJhY3lCcmVhY2guZGF5cycpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUob3B0aW9uLnZhbHVlKTtcclxuICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5pc1N0b3JlRGF5c0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkRGF5c0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaC5kYXlzJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRheXNPcHRpb25zLmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PT0gY3VycmVudFZhbHVlKTtcclxuICAgIHJldHVybiBtYXRjaD8ubGFiZWwgfHwgJ01vbnRoJztcclxuICB9XHJcblxyXG4gIHRvZ2dsZVN0b3JlQWNjdXJhY3lEcm9wZG93bihldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNTdG9yZUFjY3VyYWN5RHJvcGRvd25PcGVuID0gIXRoaXMuaXNTdG9yZUFjY3VyYWN5RHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U3RvcmVBY2N1cmFjeShldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoLmFjY3VyYWN5Jyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZShgJHt2YWx1ZX0lYCk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNTdG9yZUFjY3VyYWN5RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlbiA9ICF0aGlzLmlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHNlbGVjdEFsbG93VGlja2V0Q3JlYXRpb24oZXZlbnQ6IEV2ZW50LCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhbGxvd1RpY2tldENyZWF0aW9uJyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNDYXRlZ29yeUxpbWl0UmVhY2hlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRhZ0xpbWl0cy5sZW5ndGggPj0gdGhpcy5tYXhDYXRlZ29yeUNvdW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQXBwcm92ZXJEaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJldmlzaW9ucyA9IHRoaXMucmV2aXNpb25BcnJheS5jb250cm9scztcclxuICAgIGNvbnN0IHJldmlld2VyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAncmV2aWV3ZXInKTtcclxuICAgIGNvbnN0IGFwcHJvdmVyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInKTtcclxuICAgIFxyXG4gICAgaWYgKHJldmlld2VyICYmIGFwcHJvdmVyKSB7XHJcbiAgICAgIGNvbnN0IHJldmlld2VyQ2hlY2tlZCA9IHJldmlld2VyLmdldCgnaXNDaGVja2VkJyk/LnZhbHVlO1xyXG4gICAgICBjb25zdCBhcHByb3ZlckNvbnRyb2wgPSBhcHByb3Zlci5nZXQoJ2lzQ2hlY2tlZCcpO1xyXG4gICAgICAvLyBDaGVjayBpZiBhcHByb3ZlciBpcyBkaXNhYmxlZCBPUiByZXZpZXdlciBpcyBub3QgY2hlY2tlZFxyXG4gICAgICByZXR1cm4gYXBwcm92ZXJDb250cm9sPy5kaXNhYmxlZCB8fCAhcmV2aWV3ZXJDaGVja2VkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzVGFuZ29EaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIC8vIFRhbmdvIGFsd2F5cyBzaG93cyBkaXNhYmxlZCBkZXNpZ25cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Q2F0ZWdvcnlGb3JtKCkge1xyXG4gICAgdGhpcy5jYXRlZ29yeUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgaWNvbk5hbWU6IFt0aGlzLmJhc2VDYXRlZ29yeUljb25zWzBdLnZhbHVlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgbmFtZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMzApXV0sXHJcbiAgICAgIGxpbWl0OiBbdGhpcy5wZXJjZW50YWdlTGlzdFswXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snKVxyXG4gIGNsb3NlTWVudXMoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU1lbnVJbmRleCA9IG51bGw7XHJcbiAgICB0aGlzLm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPSBudWxsO1xyXG4gICAgdGhpcy5pc0NhdGVnb3J5TGltaXREcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1N0b3JlRGF5c0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1N0b3JlQWNjdXJhY3lEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzc2VuZFRhbmdvRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDYXRlZ29yeUljb25Ecm9wZG93bihldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5pc0NhdGVnb3J5SWNvbkRyb3Bkb3duT3BlbiA9ICF0aGlzLmlzQ2F0ZWdvcnlJY29uRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Q2F0ZWdvcnlJY29uRnJvbURyb3Bkb3duKGV2ZW50OiBFdmVudCwgaWNvblZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5zZWxlY3RDYXRlZ29yeUljb24oaWNvblZhbHVlKTtcclxuICAgIHRoaXMuaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldENsaWVudE1hcHBlZFN0b3Jlc0RldGFpbHMoY2xpZW5JZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0b3JlTGlzdCA9IFtdO1xyXG4gICAgIHRoaXMuYXBpU2VydmljZS5nZXRGb290ZmFsbFN0b3JlUmFpc2VEZXRhaWxzKGNsaWVuSWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAvLyB0aGlzLmFwaVNlcnZpY2UuZ2V0Rm9vdGZhbGxEZXRhaWxzKGNsaWVuSWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6KHJlczogYW55KT0+e1xyXG4gICAgICAgIGlmKHJlcyAmJiByZXMuY29kZT09JzIwMCcpe1xyXG4gICAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSByZXM/LmRhdGE/LnJlc3VsdDtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgfSxcclxuICAgICAgICBlcnJvcjooZXJyKT0+e1xyXG4gICAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSBbXTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgc3RvcmUgbGlzdCcsIGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICB9KVxyXG4gIH1cclxuXHJcblxyXG4gIC8vIGhlbHBlcnNcclxuICBnZXQgcmV2aXNpb25BcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3JldmlzaW9uJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRhZ0xpbWl0cygpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3RhZ2dpbmdMaW1pdGF0aW9uJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcblxyXG4gIGNyZWF0ZVJldmlzaW9uKGFjdGlvblR5cGU6IHN0cmluZywgaXNDaGVja2VkOiBib29sZWFuKTogRm9ybUdyb3VwIHtcclxuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgYWN0aW9uVHlwZTogW2FjdGlvblR5cGVdLFxyXG4gICAgICBpc0NoZWNrZWQ6IFtpc0NoZWNrZWRdXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVRhZ0xpbWl0KHR5cGU6IHN0cmluZywgdmFsdWU6IG51bWJlciwgaWNvbk5hbWU6IHN0cmluZywgbmFtZT86IHN0cmluZywga2V5Pzogc3RyaW5nKTogRm9ybUdyb3VwIHtcclxuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdHlwZTogW3R5cGVdLFxyXG4gICAgICB2YWx1ZTogW3ZhbHVlXSxcclxuICAgICAgdW5pdDogWyclJ10sXHJcbiAgICAgIGljb25OYW1lOiBbaWNvbk5hbWVdLFxyXG4gICAgICBuYW1lOiBbbmFtZV0sXHJcbiAgICAgIGtleTogW2tleV1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU3RvcmVTZWxlY3Rpb24oc3RvcmU6IGFueSwgY2hlY2tlZDogYm9vbGVhbikge1xyXG4gICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgdGhpcy5yZXNldFJlcXVlc3QuY2xpZW50SWQgPSB0aGlzLmNsaWVuSWQ7XHJcbiAgICAgIHRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMucHVzaCh7IHN0b3JlSWQ6IHN0b3JlLnN0b3JlSWQsIGRhdGVTdHJpbmc6IHN0b3JlLmRhdGVTdHJpbmcgfSk7XHJcbiAgICB9IGVsc2UgaWYgKCFjaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3JlcyA9IHRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMuZmlsdGVyKFxyXG4gICAgICAgIChzKSA9PiBzLnN0b3JlSWQgIT09IHN0b3JlLnN0b3JlSWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzU3RvcmVTZWxlY3RlZChzdG9yZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5zb21lKHIgPT4gci5zdG9yZUlkID09PSBzdG9yZS5zdG9yZUlkKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVMaXN0Lmxlbmd0aCA+IDAgJiYgdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5sZW5ndGggPT09IHRoaXMuc3RvcmVMaXN0Lmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8vIHNlbGVjdCBhbGwgc3RvcmVzIHJlcXVlc3QgbGlzdCBoYW5kbGVyXHJcbiAgdG9nZ2xlU2VsZWN0QWxsKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBjaGVja2VkID0gdGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZFN0b3JlcyA9IHRoaXMuc3RvcmVMaXN0Lm1hcCgoc3RvcmU6IGFueSkgPT4gKHtcclxuICAgICAgICBzdG9yZUlkOiBzdG9yZS5zdG9yZUlkLFxyXG4gICAgICAgIGRhdGVTdHJpbmc6IHN0b3JlLmRhdGVTdHJpbmdcclxuICAgICAgfSkpO1xyXG4gICAgICB0aGlzLnJlc2V0UmVxdWVzdCA9IHRoaXMuYnVpbGRSZXNldFBheWxvYWQoc2VsZWN0ZWRTdG9yZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXNldFJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVzZXRQYXlsb2FkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVSZXZpc2lvbkRlcGVuZGVuY2llcygpIHtcclxuICAgIGNvbnN0IHJldmlzaW9ucyA9IHRoaXMucmV2aXNpb25BcnJheS5jb250cm9scztcclxuICAgIGNvbnN0IHJldmlld2VyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAncmV2aWV3ZXInKTtcclxuICAgIGNvbnN0IGFwcHJvdmVyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInKTtcclxuICAgIGNvbnN0IHRhbmdvID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAndGFuZ28nKTtcclxuXHJcbiAgICBpZiAodGFuZ28pIHtcclxuICAgICAgdGFuZ28uZ2V0KCdpc0NoZWNrZWQnKT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJldmlld2VyICYmIGFwcHJvdmVyKSB7XHJcbiAgICAgIC8vIGRpc2FibGUgYXBwcm92ZXIgaW5pdGlhbGx5IGlmIHJldmlld2VyIHVuY2hlY2tlZFxyXG4gICAgICBpZiAoIXJldmlld2VyLmdldCgnaXNDaGVja2VkJyk/LnZhbHVlKSB7XHJcbiAgICAgICAgYXBwcm92ZXIuZ2V0KCdpc0NoZWNrZWQnKT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgYXBwcm92ZXIucGF0Y2hWYWx1ZSh7IGlzQ2hlY2tlZDogZmFsc2UgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGVuYWJsZSBhcHByb3ZlciBpZiByZXZpZXdlciBpcyBjaGVja2VkXHJcbiAgICAgICAgYXBwcm92ZXIuZ2V0KCdpc0NoZWNrZWQnKT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gbGlzdGVuIHJldmlld2VyIGNoZWNrYm94IGNoYW5nZSAob25seSB3aXJlIG9uY2UpXHJcbiAgICAgIGlmICghdGhpcy5yZXZpc2lvbkRlcHNJbml0aWFsaXplZCkge1xyXG4gICAgICAgIHJldmlld2VyLmdldCgnaXNDaGVja2VkJyk/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChjaGVja2VkKSA9PiB7XHJcbiAgICAgICAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICAgICAgICBhcHByb3Zlci5nZXQoJ2lzQ2hlY2tlZCcpPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXBwcm92ZXIuZ2V0KCdpc0NoZWNrZWQnKT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIGFwcHJvdmVyLnBhdGNoVmFsdWUoeyBpc0NoZWNrZWQ6IGZhbHNlIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJldmlzaW9uRGVwc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRm9ybSgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNFZGl0ID0gIXRoaXMuaXNFZGl0O1xyXG4gICAgaWYgKCF0aGlzLmlzRWRpdCkge1xyXG4gICAgICAvLyBGaXJzdCwgZW5zdXJlIGFwcHJvdmVyIHN0YXRlIGlzIGNvcnJlY3QgYmVmb3JlIGVuYWJsaW5nIGZvcm1cclxuICAgICAgY29uc3QgcmV2aXNpb25zID0gdGhpcy5yZXZpc2lvbkFycmF5LmNvbnRyb2xzO1xyXG4gICAgICBjb25zdCByZXZpZXdlciA9IHJldmlzaW9ucy5maW5kKChyKSA9PiByLmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ3Jldmlld2VyJyk7XHJcbiAgICAgIGNvbnN0IGFwcHJvdmVyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInKTtcclxuICAgICAgXHJcbiAgICAgIC8vIElmIHJldmlld2VyIGlzIHVuY2hlY2tlZCwgZW5zdXJlIGFwcHJvdmVyIGlzIHVuY2hlY2tlZCBiZWZvcmUgZW5hYmxpbmdcclxuICAgICAgaWYgKHJldmlld2VyICYmIGFwcHJvdmVyICYmICFyZXZpZXdlci5nZXQoJ2lzQ2hlY2tlZCcpPy52YWx1ZSkge1xyXG4gICAgICAgIGFwcHJvdmVyLnBhdGNoVmFsdWUoeyBpc0NoZWNrZWQ6IGZhbHNlIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmVuYWJsZSgpO1xyXG4gICAgICAvLyBSZS1hcHBseSByZXZpc2lvbiBkZXBlbmRlbmNpZXMgYWZ0ZXIgZW5hYmxpbmcgdG8gZW5zdXJlIGFwcHJvdmVyIHN0YXRlIGlzIGNvcnJlY3RcclxuICAgICAgdGhpcy5oYW5kbGVSZXZpc2lvbkRlcGVuZGVuY2llcygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmRpc2FibGUoKTtcclxuICAgICAgLy8gUmUtYXBwbHkgcmV2aXNpb24gZGVwZW5kZW5jaWVzIHNvIFRhbmdvIHJlbWFpbnMgZGlzYWJsZWRcclxuICAgICAgLy8gYW5kIEFwcHJvdmVyIGZvbGxvd3MgUmV2aWV3ZXIgaW4gYm90aCB2aWV3IGFuZCBlZGl0IG1vZGVzLlxyXG4gICAgICB0aGlzLmhhbmRsZVJldmlzaW9uRGVwZW5kZW5jaWVzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vIE9wZW4gcmVzZXQgY29uZmlybWF0aW9uIG1vZGFsXHJcbiAgb3BlblJlc2V0Q29uZmlybWF0aW9uTW9kYWwoKSB7XHJcbiAgICBpZiAoIXRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMubGVuZ3RoIHx8IHRoaXMuaXNSZXNldHRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXNldE1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLnJlc2V0Q29uZmlybWF0aW9uTW9kYWxUcGwsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIHNpemU6ICdzbScsXHJcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcclxuICAgICAga2V5Ym9hcmQ6IGZhbHNlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIENsb3NlIHJlc2V0IGNvbmZpcm1hdGlvbiBtb2RhbFxyXG4gIGNsb3NlUmVzZXRNb2RhbCgpIHtcclxuICAgIGlmICh0aGlzLnJlc2V0TW9kYWxSZWYpIHtcclxuICAgICAgdGhpcy5yZXNldE1vZGFsUmVmLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMucmVzZXRNb2RhbFJlZiA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBDb25maXJtIGFuZCBwcm9jZWVkIHdpdGggcmVzZXRcclxuICBjb25maXJtUmVzZXRTdG9yZVJlcXVlc3QoKSB7XHJcbiAgICBpZiAoIXRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMubGVuZ3RoIHx8IHRoaXMuaXNSZXNldHRpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gQ2xvc2UgbW9kYWwgaW1tZWRpYXRlbHlcclxuICAgIHRoaXMuY2xvc2VSZXNldE1vZGFsKCk7XHJcbiAgICBcclxuICAgIC8vIFByb2NlZWQgd2l0aCByZXNldCBvcGVyYXRpb25cclxuICAgIHRoaXMuaXNSZXNldHRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLnJlc2V0U3RvcmVSZXF1ZXN0TGlzdCh0aGlzLnJlc2V0UmVxdWVzdClcclxuICAgIC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICB0aGlzLmlzUmVzZXR0aW5nID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDoocmVzOiBhbnkpPT57XHJcbiAgICAgIGlmKHJlcyAmJiByZXMuY29kZT09JzIwMCcpe1xyXG4gICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gcmVzPy5kYXRhPy5yZXN1bHQ7XHJcbiAgICAgICAgdGhpcy5nZXRDbGllbnRNYXBwZWRTdG9yZXNEZXRhaWxzKHRoaXMuY2xpZW5JZCk7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ1N0b3JlIHJlcXVlc3RzIHJlc2V0IHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byByZXNldCBzdG9yZSByZXF1ZXN0cy4nKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlc2V0UmVxdWVzdCA9IHRoaXMuYnVpbGRSZXNldFBheWxvYWQoKTtcclxuICAgICB9LFxyXG4gICAgICBlcnJvcjooZXJyKT0+e1xyXG4gICAgICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdFcnJvciByZXNldHRpbmcgc3RvcmUgcmVxdWVzdHMuJyk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgc3RvcmUgbGlzdCcsIGVycik7XHJcbiAgICAgIH0sXHJcbiAgIH0pXHJcbiAgfVxyXG5cclxuICAvLyB0byByZXNldCBzdG9yZSBsaXN0IChrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlmIG5lZWRlZClcclxuICByZXNldFN0b3JlUmVxdWVzdCgpIHtcclxuICAgIHRoaXMub3BlblJlc2V0Q29uZmlybWF0aW9uTW9kYWwoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1Jlc2V0RGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMucmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMubGVuZ3RoIHx8IHRoaXMuaXNSZXNldHRpbmcgfHwgdGhpcy5pc0VkaXQ7XHJcbiAgfVxyXG5cclxuICBvblN1Ym1pdCgpIHtcclxuICAgIC8vIEVuc3VyZSBUYW5nbyBjaGVja2JveCBpcyBhbHdheXMgdHJ1ZSB3aGVuIHNhdmluZ1xyXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldFJhd1ZhbHVlKCk7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JtVmFsdWUucmV2aXNpb24pKSB7XHJcbiAgICAgIGNvbnN0IHRhbmdvSW5kZXggPSBmb3JtVmFsdWUucmV2aXNpb24uZmluZEluZGV4KChyOiBhbnkpID0+IHI/LmFjdGlvblR5cGUgPT09ICd0YW5nbycpO1xyXG4gICAgICBpZiAodGFuZ29JbmRleCAhPT0gLTEpIHtcclxuICAgICAgICBmb3JtVmFsdWUucmV2aXNpb25bdGFuZ29JbmRleF0uaXNDaGVja2VkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coJ3VwZGF0ZSBmb3JtIGNvbmZpZyA+PicsIGZvcm1WYWx1ZSk7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50Rm9ybURhdGEubmV4dCh7IHZhbHVlOiBmb3JtVmFsdWUsIHR5cGU6ICdzdWJtaXQnLCBmb3JtOiAnZm9vdGZhbGxEaXJlY3RvcnlDb25maWdzJyB9KVxyXG4gICAgLy8gY29uc3QgZm9ybVZhbHVlID0geyAuLi50aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0udmFsdWUgfTtcclxuICAgIC8vIGlmIChBcnJheS5pc0FycmF5KGZvcm1WYWx1ZS50YWdnaW5nTGltaXRhdGlvbikpIHtcclxuICAgIC8vICAgZm9ybVZhbHVlLnRhZ2dpbmdMaW1pdGF0aW9uID0gZm9ybVZhbHVlLnRhZ2dpbmdMaW1pdGF0aW9uLm1hcCgodGFnOiBhbnkpID0+ICh7XHJcbiAgICAvLyAgICAgdHlwZTogdGFnLnR5cGUsXHJcbiAgICAvLyAgICAgdmFsdWU6IHRhZy52YWx1ZSxcclxuICAgIC8vICAgICB1bml0OiB0YWcudW5pdCB8fCAnJSdcclxuICAgIC8vICAgICAvLyBpY29uTmFtZTogdGFnLmljb25OYW1lLFxyXG4gICAgLy8gICAgIC8vIG5hbWU6IHRhZy5uYW1lIHx8IHRhZy50eXBlXHJcbiAgICAvLyAgIH0pKTtcclxuICAgIC8vIH1cclxuICAgIC8vIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAvLyAgIGZvb3RmYWxsRGlyZWN0b3J5Q29uZmlnczogZm9ybVZhbHVlLFxyXG4gICAgLy8gICByZXF1ZXN0OiB0aGlzLnJlc2V0UmVxdWVzdFxyXG4gICAgLy8gfTtcclxuICAgICAgLy8gY29uc3Qgb2JqID0ge1xyXG4gICAgICAvLyAgIHRhbmdvUmV2aWV3OiBmb3JtVmFsdWUudGFuZ29SZXZpZXcsXHJcbiAgICAgIC8vICAgYWNjdXJhY3lCcmVhY2g6IGZvcm1WYWx1ZS5hY2N1cmFjeUJyZWFjaCxcclxuICAgICAgLy8gICB0YWdnaW5nTGltaXRhdGlvbjogZm9ybVZhbHVlLnRhZ2dpbmdMaW1pdGF0aW9uXHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gY29uc29sZS5sb2coJ0ZpbmFsIFBheWxvYWQ6Jywgb2JqKTtcclxuICAgICAgLy8gdGhpcy5hcGlTZXJ2aWNlLnVwZGF0ZUZvb3RmYWxsRGlyZWN0b3J5Q29uZmlnKG9iaiwgdGhpcy5jbGllbklkKVxyXG4gICAgICAvLyAgIC5waXBlKFxyXG4gICAgICAvLyAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICAgIC8vICAgKVxyXG4gICAgICAvLyAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAvLyAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgIC8vICAgICAgIGNvbnNvbGUubG9nKCdzYXZlIGZvb3RmYWxsIGNvbmZpZyBkZXRhaWxzID4+JywgcmVzKTtcclxuICAgICAgLy8gICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAnMjAwJyAmJiByZXMuc3RhdHVzID09ICdzdWNjZXNzJykge1xyXG4gICAgICAvLyAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdmb290ZmFsbCBjb25maWcgZGV0YWlscyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgICAgLy8gICAgICAgfSBlbHNlIHtcclxuICAgICAgLy8gICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byB1cGRhdGUgZm9vdGZhbGwgY29uZmlnIGRldGFpbHMuJyk7XHJcbiAgICAgIC8vICAgICAgIH1cclxuICAgICAgLy8gICAgIH0sXHJcbiAgICAgIC8vICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAvLyAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0Vycm9yIGluIHVwZGF0aW5nIGZvb3RmYWxsIGNvbmZpZyBkZXRhaWxzLicpO1xyXG4gICAgICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiB1cGRhdGVGb290ZmFsbERpcmVjdG9yeUNvbmZpZyA6JywgZXJyKTtcclxuICAgICAgLy8gICAgIH0sXHJcbiAgICAgIC8vICAgfSlcclxuICB9XHJcblxyXG4gIG9uQ2FuY2VsKCkge1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmNsaWVudEZvcm1EYXRhLm5leHQoeyB2YWx1ZTogbnVsbCwgdHlwZTogJ2NhbmNlbCcsIGZvcm06ICdmb290ZmFsbERpcmVjdG9yeUNvbmZpZ3MnIH0pXHJcbiAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZGlzYWJsZSgpO1xyXG4gICAgdGhpcy50b2dnbGVGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRSZXNldFBheWxvYWQoc3RvcmVzOiB7IHN0b3JlSWQ6IHN0cmluZzsgZGF0ZVN0cmluZzogc3RyaW5nIH1bXSA9IFtdKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbklkID8/ICcnLFxyXG4gICAgICBhcnJheU9mU3RvcmVzOiBzdG9yZXNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXQgY2F0ZWdvcnlJY29ucygpOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4ge1xyXG4gICAgY29uc3QgYXZhaWxhYmxlSWNvbnMgPSBbLi4udGhpcy5iYXNlQ2F0ZWdvcnlJY29uc107XHJcbiAgICBcclxuICAgIC8vIENoZWNrIHdoaWNoIGFkZGl0aW9uYWwgaWNvbnMgYXJlIGN1cnJlbnRseSBpbiB1c2VcclxuICAgIGNvbnN0IHVzZWRJY29ucyA9IHRoaXMudGFnTGltaXRzLmNvbnRyb2xzLm1hcChjdHJsID0+IGN0cmwuZ2V0KCdpY29uTmFtZScpPy52YWx1ZSkuZmlsdGVyKEJvb2xlYW4pO1xyXG4gICAgXHJcbiAgICAvLyBJZiBlZGl0aW5nLCBleGNsdWRlIHRoZSBjdXJyZW50IGljb24gYmVpbmcgZWRpdGVkIGZyb20gdGhlIHVzZWQgbGlzdFxyXG4gICAgbGV0IHVzZWRJY29uc0ZvckNoZWNrID0gWy4uLnVzZWRJY29uc107XHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2VkaXQnICYmIHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgZWRpdGluZ0ljb24gPSB0aGlzLnRhZ0xpbWl0cy5hdCh0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4KT8uZ2V0KCdpY29uTmFtZScpPy52YWx1ZTtcclxuICAgICAgdXNlZEljb25zRm9yQ2hlY2sgPSB1c2VkSWNvbnNGb3JDaGVjay5maWx0ZXIoaWNvbiA9PiBpY29uICE9PSBlZGl0aW5nSWNvbik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIEFkZCBob3VzZUtlZXBpbmdUYWcgYW5kIGp1bmtUYWcgaWYgdGhleSdyZSBub3QgaW4gdXNlXHJcbiAgICB0aGlzLmFkZGl0aW9uYWxDYXRlZ29yeUljb25zLmZvckVhY2goaWNvbiA9PiB7XHJcbiAgICAgIGlmICghdXNlZEljb25zRm9yQ2hlY2suaW5jbHVkZXMoaWNvbi52YWx1ZSkpIHtcclxuICAgICAgICBhdmFpbGFibGVJY29ucy5wdXNoKGljb24pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgcmV0dXJuIGF2YWlsYWJsZUljb25zO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkQ2F0ZWdvcnlJY29uTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmNhdGVnb3J5Rm9ybT8uZ2V0KCdpY29uTmFtZScpPy52YWx1ZSB8fCB0aGlzLmJhc2VDYXRlZ29yeUljb25zWzBdPy52YWx1ZTtcclxuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5jYXRlZ29yeUljb25zLmZpbmQoaWNvbiA9PiBpY29uLnZhbHVlID09PSBjdXJyZW50KTtcclxuICAgIHJldHVybiBtYXRjaD8ubGFiZWwgfHwgJyc7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtXCIgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uR2xvYmFsX0NvbmZpZ3VyYXRpb25faXNFZGl0XCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImlzRWRpdFwiIGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVGb3JtKCk7XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHB5LTMgYWxpZ24taXRlbXMtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8yNTc5XzI1MTI1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTQuMTY3IDIuNDk5OTNDMTQuMzg1OSAyLjI4MTA2IDE0LjY0NTcgMi4xMDc0NCAxNC45MzE3IDEuOTg4OTlDMTUuMjE3NiAxLjg3MDU0IDE1LjUyNDEgMS44MDk1NyAxNS44MzM3IDEuODA5NTdDMTYuMTQzMiAxLjgwOTU3IDE2LjQ0OTcgMS44NzA1NCAxNi43MzU3IDEuOTg4OTlDMTcuMDIxNiAyLjEwNzQ0IDE3LjI4MTUgMi4yODEwNiAxNy41MDAzIDIuNDk5OTNDMTcuNzE5MiAyLjcxODggMTcuODkyOCAyLjk3ODYzIDE4LjAxMTMgMy4yNjQ2QzE4LjEyOTcgMy41NTA1NyAxOC4xOTA3IDMuODU3MDYgMTguMTkwNyA0LjE2NjU5QzE4LjE5MDcgNC40NzYxMiAxOC4xMjk3IDQuNzgyNjIgMTguMDExMyA1LjA2ODU5QzE3Ljg5MjggNS4zNTQ1NSAxNy43MTkyIDUuNjE0MzkgMTcuNTAwMyA1LjgzMzI2TDYuMjUwMzMgMTcuMDgzM0wxLjY2Njk5IDE4LjMzMzNMMi45MTY5OSAxMy43NDk5TDE0LjE2NyAyLjQ5OTkzWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzI1NzlfMjUxMjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+RWRpdCBEZXRhaWxzXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8IS0tIEFwcHJvdmVyIENvbmZpZ3VyYXRpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTQgbWItNCBmZi1zZWN0aW9uLWNhcmRcIj5cclxuICAgICAgICA8aDUgY2xhc3M9XCJmZi1zZWN0aW9uLXRpdGxlIG1iLTFcIj5BcHByb3ZlciBjb25maWd1cmF0aW9uPC9oNT5cclxuICAgICAgICA8cCBjbGFzcz1cImZmLXNlY3Rpb24tZGVzYyBtYi00XCI+XHJcbiAgICAgICAgICAgIFNldCBsZXZlbCBvZiByZXZpc2lvbnMgcmVxdWlyZWQgZm9yIGEgc3RvcmUgcmFpc2VkIHRpY2tldHNcclxuICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInJldmlzaW9uXCIgY2xhc3M9XCJkLWZsZXggZmxleC13cmFwIGdhcC01XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJldiBvZiByZXZpc2lvbkFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFwcHJvdmVyLW9wdGlvbiBkLWZsZXggZmxleC1jb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLW9wdGlvbl09XCIocmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ2FwcHJvdmVyJyAmJiBpc0FwcHJvdmVyRGlzYWJsZWQpIHx8IChyZXYuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAndGFuZ28nICYmIGlzVGFuZ29EaXNhYmxlZClcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXN0b20tY2hlY2tib3ggYWxpZ24taXRlbXMtc3RhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jaGVja2JveF09XCIocmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ2FwcHJvdmVyJyAmJiBpc0FwcHJvdmVyRGlzYWJsZWQpIHx8IChyZXYuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAndGFuZ28nICYmIGlzVGFuZ29EaXNhYmxlZClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZm9ybUNvbnRyb2xOYW1lPVwiaXNDaGVja2VkXCIgW2lkXT1cIidhY3Rpb24tJyArIGlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hlY2ttYXJrXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSB8IHRpdGxlY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2MgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCIncmV2aWV3ZXInXCI+VGhlIHRpY2tldCB1bmRlcmdvZXMgYSBzaW5nbGUgcmV2aWV3IHRvIHZlcmlmeVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb290ZmFsbC48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidhcHByb3ZlcidcIj5UaGUgdGlja2V0IHVuZGVyZ29lcyBhIGZpbmFsIHJldmlldyBhZnRlciB0aGUgaW5pdGlhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjay48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid0YW5nbydcIj5GaW5hbGl6ZSB0aWNrZXRzIGFuZCB1cGRhdGUgZm9vdGZhbGwgY291bnQuPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGhyIGNsYXNzPVwiZmYtZGl2aWRlclwiPlxyXG5cclxuICAgIDwhLS0gU3RvcmUgU1BPQyBUaWNrZXQgQ3JlYXRpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTQgbWItNCBmZi1zZWN0aW9uLWNhcmRcIj5cclxuICAgICAgICA8aDUgY2xhc3M9XCJmZi1zZWN0aW9uLXRpdGxlIG1iLTNcIj5TdG9yZSBTUE9DIFRpY2tldCBDcmVhdGlvbjwvaDU+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcCBnYXAtMlwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICBBbGxvdyBzdG9yZSBTUE9DIHRvIGNyZWF0ZSB0aWNrZXRzIG9ubHkgZm9yIHRoZSBsYXN0XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdCBtcy0yXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuXT1cImlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlblwiIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZSBzbWFsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFsbG93VGlja2V0Q3JlYXRpb25Ecm9wZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FsbG93VGlja2V0Q3JlYXRpb24nKT8udmFsdWUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3BvY1RpY2tldENyZWF0aW9uZGF5c1swXSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3QtbWVudVwiICpuZ0lmPVwiaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IGRheSBvZiBzcG9jVGlja2V0Q3JlYXRpb25kYXlzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEFsbG93VGlja2V0Q3JlYXRpb24oJGV2ZW50LCBkYXkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRheSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi0wXCI+RGF5czwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxociBjbGFzcz1cImZmLWRpdmlkZXJcIj5cclxuXHJcbiAgICA8IS0tIFRpY2tldCBBdXRvLWNsb3NlIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgcC00IG1iLTQgZmYtc2VjdGlvbi1jYXJkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJmZi1zZWN0aW9uLXRpdGxlIG0tMFwiPlRpY2tldCBBdXRvLWNsb3NlPC9oNT5cclxuXHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInN3aXRjaCBtLTAgbXMtM1wiIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0F1dG9DbG9zZUVuYWJsZVwiIFtkaXNhYmxlZF09XCJpc0VkaXRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2xpZGVyIHJvdW5kXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWItMFwiPlxyXG4gICAgICAgICAgICAgICAgVGlja2V0IHNob3VsZCBiZSBhdXRvLWNsb3NlZCwgaWYgdGhlIGNyZWF0ZWQgdGlja2V0IGFjY3VyYWN5IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1xyXG4gICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdCBtcy0yXCIgW2NsYXNzLm9wZW5dPVwiaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW5cIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdCB8fCAhZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2lzQXV0b0Nsb3NlRW5hYmxlJyk/LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIiAoY2xpY2spPVwidG9nZ2xlQXV0b0Nsb3NlRHJvcGRvd24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhdXRvQ2xvc2VBY2N1cmFjeScpPy52YWx1ZSB8fCAnMSUnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc0F1dG9DbG9zZURyb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBwIG9mIGFjY3VyYWN5UGVyY2VudGFnZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QXV0b0Nsb3NlQWNjdXJhY3koJGV2ZW50LCBwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBwIH19JVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGhyIGNsYXNzPVwiZmYtZGl2aWRlclwiPlxyXG5cclxuICAgIDwhLS0gRm9vdGZhbGwgRGlyZWN0b3J5IExpbWl0YXRpb25zIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiIGNsYXNzPVwiY2FyZCBwLTQgbWItNCBmZi1zZWN0aW9uLWNhcmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0xXCI+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJmZi1zZWN0aW9uLXRpdGxlIG0tMFwiPkZvb3RmYWxsIGRpcmVjdG9yeSBsaW1pdGF0aW9uczwvaDU+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZmLXNlY3Rpb24tZGVzYyBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgU2V0IG1heGltdW0gbGltaXRhdGlvbiBmb3Igc3RvcmVzIHRvIHRhZyBub24tUHVyY2hhc2VycyBmcm9tIFRvdGFsIEZvb3RmYWxsXHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cImlzRWRpdFwiIGNsYXNzPVwiYWRkLW5ldy1idG4gZC1pbmxpbmUtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5DYXRlZ29yeU1vZGFsKCdhZGQnKVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDMuMzMzMzRWMTIuNjY2N00zLjMzMzM0IDhIMTIuNjY2N1wiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDxzcGFuPkFkZCBOZXc8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIENhdGVnb3J5IENhcmRzIEdyaWQgLS0+XHJcbiAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwidGFnZ2luZ0xpbWl0YXRpb25cIiBjbGFzcz1cImNhdGVnb3J5LWdyaWQgbXQtM1wiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB0YWcgb2YgdGFnTGltaXRzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNsYXNzPVwiY2F0ZWdvcnktY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWNhcmQtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWljb25cIiBbbmdDbGFzc109XCJ0YWcuZ2V0KCdpY29uTmFtZScpPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJ0YWcuZ2V0KCdpY29uTmFtZScpPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2R1cGxpY2F0ZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzExNjJfMjQ2MjEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIuNSA3LjVIMkMxLjczNDc4IDcuNSAxLjQ4MDQzIDcuMzk0NjQgMS4yOTI4OSA3LjIwNzExQzEuMTA1MzYgNy4wMTk1NyAxIDYuNzY1MjIgMSA2LjVWMkMxIDEuNzM0NzggMS4xMDUzNiAxLjQ4MDQzIDEuMjkyODkgMS4yOTI4OUMxLjQ4MDQzIDEuMTA1MzYgMS43MzQ3OCAxIDIgMUg2LjVDNi43NjUyMiAxIDcuMDE5NTcgMS4xMDUzNiA3LjIwNzExIDEuMjkyODlDNy4zOTQ2NCAxLjQ4MDQzIDcuNSAxLjczNDc4IDcuNSAyVjIuNU01LjUgNC41SDEwQzEwLjU1MjMgNC41IDExIDQuOTQ3NzIgMTEgNS41VjEwQzExIDEwLjU1MjMgMTAuNTUyMyAxMSAxMCAxMUg1LjVDNC45NDc3MiAxMSA0LjUgMTAuNTUyMyA0LjUgMTBWNS41QzQuNSA0Ljk0NzcyIDQuOTQ3NzIgNC41IDUuNSA0LjVaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xMTYyXzI0NjIxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidlbXBsb3llZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDE2IDEzXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjE2NjcgMTIuNVYxMS4xNjY3QzExLjE2NjcgMTAuNDU5NCAxMC44ODU3IDkuNzgxMTUgMTAuMzg1NiA5LjI4MTA1QzkuODg1NTIgOC43ODA5NSA5LjIwNzI0IDguNSA4LjUgOC41SDMuMTY2NjdDMi40NTk0MiA4LjUgMS43ODExNSA4Ljc4MDk1IDEuMjgxMDUgOS4yODEwNUMwLjc4MDk1MiA5Ljc4MTE1IDAuNSAxMC40NTk0IDAuNSAxMS4xNjY3VjEyLjVNMTUuMTY2NyAxMi41VjExLjE2NjdDMTUuMTY2MiAxMC41NzU4IDE0Ljk2OTYgMTAuMDAxOCAxNC42MDc2IDkuNTM0ODhDMTQuMjQ1NiA5LjA2NzkxIDEzLjczODggOC43MzQzOCAxMy4xNjY3IDguNTg2NjdNMTAuNSAwLjU4NjY2N0MxMS4wNzM2IDAuNzMzNTM0IDExLjU4MiAxLjA2NzEzIDExLjk0NTEgMS41MzQ4N0MxMi4zMDgyIDIuMDAyNjEgMTIuNTA1MiAyLjU3Nzg5IDEyLjUwNTIgMy4xN0MxMi41MDUyIDMuNzYyMTEgMTIuMzA4MiA0LjMzNzM5IDExLjk0NTEgNC44MDUxM0MxMS41ODIgNS4yNzI4NyAxMS4wNzM2IDUuNjA2NDcgMTAuNSA1Ljc1MzMzTTguNSAzLjE2NjY3QzguNSA0LjYzOTQzIDcuMzA2MDkgNS44MzMzMyA1LjgzMzMzIDUuODMzMzNDNC4zNjA1NyA1LjgzMzMzIDMuMTY2NjcgNC42Mzk0MyAzLjE2NjY3IDMuMTY2NjdDMy4xNjY2NyAxLjY5MzkxIDQuMzYwNTcgMC41IDUuODMzMzMgMC41QzcuMzA2MDkgMC41IDguNSAxLjY5MzkxIDguNSAzLjE2NjY3WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInaG91c2VLZWVwaW5nVGFnJ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTE2Ml8yNDY1MClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjA0OTgzIDAuNTQ0OTQ3QzcuNzQ3MzggLTAuMTgxNjQ5IDguODc4MjkgLTAuMTgxNjQ5IDkuNTc1ODQgMC41NDQ5NDdMMTUuNDY5NyA2LjY4NDRDMTYuMTY3MiA3LjQxMTAxIDE2LjE2NzIgOC41ODkwNCAxNS40Njk3IDkuMzE1NjVMOS41NzU4NCAxNS40NTUxQzguODc4MjkgMTYuMTgxNiA3Ljc0NzM4IDE2LjE4MTYgNy4wNDk4MyAxNS40NTUxTDUuMzY1NjIgMTMuNzAwN0wzLjgyMTc5IDE1LjMwODhDMy4xMjQyNiAxNi4wMzU0IDEuOTkzMzQgMTYuMDM1NCAxLjI5NTggMTUuMzA4OEMwLjU5ODI3MiAxNC41ODIzIDAuNTk4MjcyIDEzLjQwNDIgMS4yOTU4IDEyLjY3NzdMMi44Mzk2NCAxMS4wNjk1TDEuMTU1OTYgOS4zMTU2NUMwLjQ1ODQyOSA4LjU4OTA0IDAuNDU4NDI5IDcuNDExMDEgMS4xNTU5NiA2LjY4NDRMNy4wNDk4MyAwLjU0NDk0N1pNOC43MzM4MSAxLjQyMjAzQzguNTAxMjkgMS4xNzk4MyA4LjEyNDMgMS4xNzk4MyA3Ljg5MTc4IDEuNDIyMDNMMy42ODE2NSA1LjgwNzYyTDEwLjQxNzUgMTIuODI0MkwxNC42Mjc3IDguNDM4NTRDMTQuODYwMiA4LjE5NjM0IDE0Ljg2MDIgNy44MDM2MyAxNC42Mjc3IDcuNTYxNTFMMTEuNjgwNSA0LjQ5MTQzTDEwLjY5ODEgNS41MTQ2OUMxMC40NjU2IDUuNzU2ODkgMTAuMDg4NyA1Ljc1Njg5IDkuODU2MTQgNS41MTQ2OUM5LjYyMzYzIDUuMjcyNDkgOS42MjM2MyA0Ljg3OTgxIDkuODU2MTQgNC42Mzc2MUwxMC44Mzg0IDMuNjE0MzVMOS45OTY2NSAyLjczNzQ2TDcuNjExIDUuMjIyNTJDNy4zNzg0OSA1LjQ2NDcxIDcuMDAxNDkgNS40NjQ3MSA2Ljc2ODk3IDUuMjIyNTJDNi41MzY0NiA0Ljk4MDMyIDYuNTM2NDYgNC41ODc2MyA2Ljc2ODk3IDQuMzQ1NDRMOS4xNTQ2MiAxLjg2MDM4TDguNzMzODEgMS40MjIwM1pNOS41NzU1MiAxMy43MDEyTDIuODM5NjYgNi42ODQ3TDEuOTk3OTYgNy41NjE1MUMxLjc2NTQ0IDcuODAzNjMgMS43NjU0NCA4LjE5NjM0IDEuOTk3OTYgOC40Mzg1NEw3Ljg5MTc4IDE0LjU3OEM4LjEyNDMgMTQuODIwMiA4LjUwMTI5IDE0LjgyMDIgOC43MzM4MSAxNC41NzhMOS41NzU1MiAxMy43MDEyWk0zLjY4MTU2IDExLjk0NjZMMi4xMzc4IDEzLjU1NDdDMS45MDUyOSAxMy43OTY5IDEuOTA1MjkgMTQuMTg5NiAyLjEzNzggMTQuNDMxOEMyLjM3MDMxIDE0LjY3NCAyLjc0NzI5IDE0LjY3NCAyLjk3OTggMTQuNDMxOEw0LjUyMzU1IDEyLjgyMzdMMy42ODE1NiAxMS45NDY2WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzExNjJfMjQ2NTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2p1bmtUYWcnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yIDQuMDAwMDRIMy4zMzMzM00zLjMzMzMzIDQuMDAwMDRIMTRNMy4zMzMzMyA0LjAwMDA0VjEzLjMzMzRDMy4zMzMzMyAxMy42ODcgMy40NzM4MSAxNC4wMjYxIDMuNzIzODYgMTQuMjc2MkMzLjk3MzkxIDE0LjUyNjIgNC4zMTMwNCAxNC42NjY3IDQuNjY2NjcgMTQuNjY2N0gxMS4zMzMzQzExLjY4NyAxNC42NjY3IDEyLjAyNjEgMTQuNTI2MiAxMi4yNzYxIDE0LjI3NjJDMTIuNTI2MiAxNC4wMjYxIDEyLjY2NjcgMTMuNjg3IDEyLjY2NjcgMTMuMzMzNFY0LjAwMDA0SDMuMzMzMzNaTTUuMzMzMzMgNC4wMDAwNFYyLjY2NjcxQzUuMzMzMzMgMi4zMTMwOSA1LjQ3MzgxIDEuOTczOTUgNS43MjM4NiAxLjcyMzlDNS45NzM5MSAxLjQ3Mzg1IDYuMzEzMDQgMS4zMzMzNyA2LjY2NjY3IDEuMzMzMzdIOS4zMzMzM0M5LjY4Njk2IDEuMzMzMzcgMTAuMDI2MSAxLjQ3Mzg1IDEwLjI3NjEgMS43MjM5QzEwLjUyNjIgMS45NzM5NSAxMC42NjY3IDIuMzEzMDkgMTAuNjY2NyAyLjY2NjcxVjQuMDAwMDRNNi42NjY2NyA3LjMzMzM3VjExLjMzMzRNOS4zMzMzMyA3LjMzMzM3VjExLjMzMzRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidwdXJwbGVUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInb3JhbmdlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRhZy5nZXQoJ25hbWUnKT8udmFsdWUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKHRhZy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlICE9PSAnZHVwbGljYXRlVGFnJyAmJiB0YWcuZ2V0KCdpY29uTmFtZScpPy52YWx1ZSAhPT0gJ2VtcGxveWVlVGFnJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjYXRlZ29yeS1tZW51LWJ0blwiIChjbGljayk9XCJ0b2dnbGVDYXRlZ29yeU1lbnUoJGV2ZW50LCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0VkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyIDVDMTIuNTUyMyA1IDEzIDQuNTUyMjggMTMgNEMxMyAzLjQ0NzcyIDEyLjU1MjMgMyAxMiAzQzExLjQ0NzcgMyAxMSAzLjQ0NzcyIDExIDRDMTEgNC41NTIyOCAxMS40NDc3IDUgMTIgNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMiAxM0MxMi41NTIzIDEzIDEzIDEyLjU1MjMgMTMgMTJDMTMgMTEuNDQ3NyAxMi41NTIzIDExIDEyIDExQzExLjQ0NzcgMTEgMTEgMTEuNDQ3NyAxMSAxMkMxMSAxMi41NTIzIDExLjQ0NzcgMTMgMTIgMTNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgMjFDMTIuNTUyMyAyMSAxMyAyMC41NTIzIDEzIDIwQzEzIDE5LjQ0NzcgMTIuNTUyMyAxOSAxMiAxOUMxMS40NDc3IDE5IDExIDE5LjQ0NzcgMTEgMjBDMTEgMjAuNTUyMyAxMS40NDc3IDIxIDEyIDIxWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktbWVudVwiICpuZ0lmPVwiYWN0aXZlTWVudUluZGV4ID09PSBpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhdGVnb3J5TWVudUFjdGlvbigkZXZlbnQsICdlZGl0JywgaSlcIj5FZGl0IE5hbWU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2F0ZWdvcnlNZW51QWN0aW9uKCRldmVudCwgJ2RlbGV0ZScsIGkpXCI+RGVsZXRlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktcGVyY2VudGFnZS1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlIGZmLXNlbGVjdC13cmFwcGVyIGNvbXBhY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mub3Blbl09XCJvcGVuTGltaXREcm9wZG93bkluZGV4ID09PSBpXCIgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUxpbWl0RHJvcGRvd24oJGV2ZW50LCBpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdGFnLmdldCgndmFsdWUnKT8udmFsdWUgfHwgMCB9fSU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cIm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPT09IGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBwIG9mIHBlcmNlbnRhZ2VMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TGltaXRWYWx1ZSgkZXZlbnQsIGksIHApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcCB9fSVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxociBjbGFzcz1cImZmLWRpdmlkZXJcIiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiPlxyXG5cclxuICAgIDwhLS0gU3RvcmUgUmVxdWVzdHMgLS0+XHJcbiAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJhY2N1cmFjeUJyZWFjaFwiIGNsYXNzPVwiY2FyZCBwLTQgbWItNCBmZi1zZWN0aW9uLWNhcmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLXN0YXJ0IG1iLTRcIj5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImZmLXNlY3Rpb24tdGl0bGUgbWItMlwiPlN0b3JlIFJlcXVlc3RzPC9oNT5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZmYtc2VjdGlvbi1kZXNjIG1iLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICBCZWxvdyBzdG9yZXMgaGF2ZSByZXF1ZXN0ZWQgdG8gcmFpc2UgYSB0aWNrZXQgYWZ0ZXIgYnJlYWNoaW5nIHRoZSBjb25maWd1cmVkIGxpbWl0XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmZvLWljb25cIj5pPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcmVzZXQtYnRuIGQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzRWRpdFwiIFtkaXNhYmxlZF09XCJpc1Jlc2V0RGlzYWJsZWRcIiAoY2xpY2spPVwib3BlblJlc2V0Q29uZmlybWF0aW9uTW9kYWwoKVwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+UmVzZXQ8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFJlc3RyaWN0aW9uIENyaXRlcmlhIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXN0cmljdGlvbi1jcml0ZXJpYSBtYi00XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1iLTMgZC1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgUmVzdHJpY3QgdGlja2V0IGNyZWF0aW9uIGZvciBhbnkgc3RvcmUgdGhhdDpcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1ub3dyYXAgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPkhhcyByYWlzZWQgbW9yZSB0aGFuPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlIGZmLXNlbGVjdC13cmFwcGVyIGNvbXBhY3RcIiBbY2xhc3Mub3Blbl09XCJpc1RpY2tldENvdW50RHJvcGRvd25PcGVuXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiaXNFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlIHNtYWxsXCIgKGNsaWNrKT1cInRvZ2dsZVRpY2tldENvdW50RHJvcGRvd24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaC50aWNrZXRDb3VudCcpPy52YWx1ZSB8fCAxIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3QtbWVudVwiICpuZ0lmPVwiaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgYyBvZiBbMSwgMiwgMywgNCwgNV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRpY2tldENvdW50KCRldmVudCwgYylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnRpY2tldHMgaW4gdGhlIGNhbGVuZGVyPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlIGZmLXNlbGVjdC13cmFwcGVyIGNvbXBhY3Qgc3RvcmUtZGF5cy1zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuXT1cImlzU3RvcmVEYXlzRHJvcGRvd25PcGVuXCIgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZSBzbWFsbFwiIChjbGljayk9XCJ0b2dnbGVTdG9yZURheXNEcm9wZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHNlbGVjdGVkRGF5c0xhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc1N0b3JlRGF5c0Ryb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgb3B0IG9mIGRheXNPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTdG9yZURheXMoJGV2ZW50LCBvcHQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHQubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPmJhc2VkIG9uIGNvbmZpZ3VyZWQgY29uZGl0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiIFtuZ2JUb29sdGlwXT1cImNvbmRpdGlvbnNUb29sdGlwXCIgdG9vbHRpcENsYXNzPVwiY29uZGl0aW9ucy10b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTQzMl84MDAzNSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDY1IDEwLjY2NjZWNy45OTk5Mk04LjAwMDY1IDUuMzMzMjVIOC4wMDczMk0xNC42NjczIDcuOTk5OTJDMTQuNjY3MyAxMS42ODE4IDExLjY4MjYgMTQuNjY2NiA4LjAwMDY1IDE0LjY2NjZDNC4zMTg3NSAxNC42NjY2IDEuMzMzOTggMTEuNjgxOCAxLjMzMzk4IDcuOTk5OTJDMS4zMzM5OCA0LjMxODAyIDQuMzE4NzUgMS4zMzMyNSA4LjAwMDY1IDEuMzMzMjVDMTEuNjgyNiAxLjMzMzI1IDE0LjY2NzMgNC4zMTgwMiAxNC42NjczIDcuOTk5OTJaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNDMyXzgwMDM1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY29uZGl0aW9uc1Rvb2x0aXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IGZvbnQtc2l6ZTogMTJweDsgbGluZS1oZWlnaHQ6IDEuNjtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGI+MS48L2I+IERlbHRhIGJldHdlZW4gU3RvcmUvQU9NIGFjY3VyYWN5IGFuZCBDZW50cmFsIE9wcy9UYW5nbyBhY2N1cmFjeSBleGNlZWRzIDEwJTxicj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGI+Mi48L2I+IFRoZSBvdmVyYWxsIGFjY3VyYWN5IGFmdGVyIGFsbCByZXZpZXdzIGlzIGdyZWF0ZXIgdGhhbiA4NSUuPGJyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Yj4zLjwvYj4gT3ZlcmFsbCB0aGUgTnVtYmVyIG9mIEltYWdlcyAoRm9vdGZhbGwpIG1hcmtlZCBmb3IgdmFsaWRhdGlvbiBpbiB0aGUgdGlja2V0IGJ5IHRoZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTdG9yZSBpcyBMZXNzIHRoYW4gZXF1YWwgdG8gMTBcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFN0b3JlIFJlcXVlc3RzIFRhYmxlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1yZXF1ZXN0cy10YWJsZVwiIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIlxyXG4gICAgICAgICAgICAqbmdJZj1cInN0b3JlTGlzdD8ubGVuZ3RoID4gMDsgZWxzZSBlbXB0eVN0b3JlUmVxdWVzdHNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIiBbbmdDbGFzc109XCJ7J3N0b3JlLXRhYmxlLXNjcm9sbCc6IHN0b3JlTGlzdD8ubGVuZ3RoID4gNX1cIj5cclxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWhvdmVyIHN0b3JlLXJlcXVlc3RzLXRhYmxlLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNoZWNrYm94LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94LXNlbGVjdCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNBbGxTZWxlY3RlZFwiIFtkaXNhYmxlZF09XCJpc0VkaXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgkZXZlbnQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrbWFyay1zZWxlY3RcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzb3J0YWJsZSBzdG9yZS1uYW1lLWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TZWxlY3QgYWxsIHN0b3JlcyAoe3sgc3RvcmVMaXN0Py5sZW5ndGggfHwgMCB9fSk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1zLTIgZHJvcGRvd24tYXJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFpc2VkIG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtcy0xIHNvcnQtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNC41TDYgMS41TDkgNC41TTMgNy41TDYgMTAuNUw5IDcuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzb3J0YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3QgcmFpc2VkKEFwcHJvdmVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIGNsYXNzPVwibXMtMSBzb3J0LWljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDQuNUw2IDEuNUw5IDQuNU0zIDcuNUw2IDEwLjVMOSA3LjVcIiBzdHJva2U9XCIjMzQ0MDU0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic29ydGFibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBvZiBUaW1lIFJhaXNlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIGNsYXNzPVwibXMtMSBzb3J0LWljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDQuNUw2IDEuNUw5IDQuNU0zIDcuNUw2IDEwLjVMOSA3LjVcIiBzdHJva2U9XCIjMzQ0MDU0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHN0b3JlIG9mIHN0b3JlTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2hlY2tib3gtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94LXNlbGVjdCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICNjYiB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc1N0b3JlU2VsZWN0ZWQoc3RvcmUpXCIgW2Rpc2FibGVkXT1cImlzRWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVN0b3JlU2VsZWN0aW9uKHN0b3JlLCBjYi5jaGVja2VkKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hlY2ttYXJrLXNlbGVjdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBzdG9yZS5zdG9yZU5hbWUgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHN0b3JlLnJhaXNlZE9uIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBzdG9yZS5sYXN0QXBwcm92ZWQgfHwgJy0nIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57eyBzdG9yZS50b3RhbFJhaXNlZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlTdG9yZVJlcXVlc3RzPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3RvcmUtc3RhdGUgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdG9yZS1pY29uIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHZpZXdCb3g9XCIwIDAgNDAgNDBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC45NDYyOSAyMS4xOTk1QzguNjQ1IDIxLjIzMTMgOC4zMzgyOCAyMS4yNTAyIDguMDI3MzQgMjEuMjUwMkM3Ljg1NzgyIDIxLjI1MDIgNy42OTA1MiAyMS4yNDM0IDcuNTI1MzkgMjEuMjMzNlYzMS42MDY3QzcuNTI1MzkgMzMuMDM0NyA4LjcwODM3IDM0LjIyNTggMTAuMTk2MyAzNC4yMjU4SDI5LjgwMDhDMzEuMjg4OCAzNC4yMjU4IDMyLjQ3MTcgMzMuMDM0NyAzMi40NzE3IDMxLjYwNjdWMjEuMjM0NkMzMi4zMDk4IDIxLjI0MzggMzIuMTQ1OSAyMS4yNTAyIDMxLjk4MTQgMjEuMjUwMkMzMS42Njc1IDIxLjI1MDIgMzEuMzU2OSAyMS4yMzIzIDMxLjA1MDggMjEuMTk5NVYyOC45ODc1SDguOTQ2MjlWMjEuMTk5NVpNMzAuOTI3NyA1Ljc3MzY4SDkuMDY5MzRDOC44OTE5NyA1Ljc3MzY4IDguNzM2NzEgNS44NjY0NyA4LjY1OTE4IDUuOTg3NTVMOC42NTcyMyA1Ljk4OTVMNS4xNDc0NiAxMS40NzI5TDUuMDUyNzMgMTEuNjIwNEMzLjgyNzE5IDEzLjc0MDIgNS4wOTE4IDE2LjQ2NzEgNy40NDMzNiAxNi43NzY2QzcuNjQ0MjggMTYuODAxMSA3LjgzNDAzIDE2LjgxNTcgOC4wMjE0OCAxNi44MTU3QzkuMjUxNTYgMTYuODE1NyAxMC4zMzk1IDE2LjI4NyAxMS4wOTY3IDE1LjQ2NTFMMTIuMDE4NiAxNC40NjQxTDEyLjkzNzUgMTUuNDY4QzEzLjY4NjQgMTYuMjg2MSAxNC43NzMxIDE2LjgxNTcgMTYuMDEwNyAxNi44MTU3QzE3LjI0MjggMTYuODE1NiAxOC4zMzQ3IDE2LjI4NTQgMTkuMDgzIDE1LjQ2OEwyMC4wMDQ5IDE0LjQ2MTJMMjAuOTI2OCAxNS40NjhDMjEuNjc1MSAxNi4yODU1IDIyLjc2NjggMTYuODE1NyAyMy45OTkgMTYuODE1N0MyNS4yMzEyIDE2LjgxNTcgMjYuMzIyOSAxNi4yODU0IDI3LjA3MTMgMTUuNDY4TDI3Ljk5MzIgMTQuNDYxMkwyOC45MTUgMTUuNDY4QzI5LjY2MzQgMTYuMjg1NSAzMC43NTYgMTYuODE1NyAzMS45ODgzIDE2LjgxNTdDMzIuMTY5NyAxNi44MTU3IDMyLjM2NDggMTYuODAxOCAzMi41NjQ1IDE2Ljc3NzZIMzIuNTYzNUMzNC45NTcyIDE2LjQ1NzEgMzYuMjI1NCAxMy42MDc1IDM0Ljg1NzQgMTEuNDcyOUwzNC44NTY0IDExLjQ3MzlMMzEuMzM5OCA1Ljk5MDQ4TDMxLjMzODkgNS45ODc1NUMzMS4yNjE0IDUuODY2MjggMzEuMTA1MyA1Ljc3MzY4IDMwLjkyNzcgNS43NzM2OFpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwOUJGM1wiIHN0cm9rZS13aWR0aD1cIjIuNVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMCBmdy1zZW1pYm9sZCB0ZXh0LW11dGVkXCI+Tm8gcmVzZXQgcmVxdWVzdCBmcm9tIHN0b3JlPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGhyIGNsYXNzPVwiZmYtZGl2aWRlclwiICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LnVzZXJUeXBlID09PSAndGFuZ28nXCI+XHJcblxyXG4gICAgPCEtLSBTZW5kIFRpY2tldCB0byBUYW5nbyAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8udXNlclR5cGUgPT09ICd0YW5nbydcIiBjbGFzcz1cImNhcmQgcC00IG1iLTQgZmYtc2VjdGlvbi1jYXJkXCI+XHJcbiAgICAgICAgPGg1IGNsYXNzPVwiZmYtc2VjdGlvbi10aXRsZSBtYi0xXCI+U2VuZCBUaWNrZXQgdG8gVGFuZ288L2g1PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTJcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWUtMiBtYi0wIHRhbmdvLWxhYmVsXCI+U2VuZCB0aWNrZXQgdG8gVGFuZ28gaWYgYWNjdXJhY3kgZmFsbHMgYmVsb3c8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdCBtcy0wXCIgW2NsYXNzLm9wZW5dPVwiaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW5cIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlIHNtYWxsXCIgKGNsaWNrKT1cInRvZ2dsZVNlbmRUYW5nb0Nsb3NlRHJvcGRvd24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCd0YW5nb1JldmlldycpPy52YWx1ZSB8fCAnMSUnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc3NlbmRUYW5nb0Ryb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBwIG9mIHNlbmRUaWNrZXRUYW5nb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTZW5kVGlja2V0VGFuZ28oJGV2ZW50LCBwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBwIH19JVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGb290ZXIgQWN0aW9ucyAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCIhaXNFZGl0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTUgdy0xMDAgZm9vdGVyLXNlcGVyYXRvclwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICA8YSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgbXQtMSBwdC0zIG1lLTRcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPkNhbmNlbDwvYT5cclxuICAgICAgICAgICAgPGEgdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHB4LTRcIiAoY2xpY2spPVwib25TdWJtaXQoKVwiPjxzcGFuPlNhdmUgQ2hhbmdlczwvc3Bhbj48L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIENhdGVnb3J5IE1vZGFsIC0tPlxyXG4gICAgPG5nLXRlbXBsYXRlICNjYXRlZ29yeU1vZGFsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgYm9yZGVyLTAgcGItMFwiPlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAge3sgY2F0ZWdvcnlNb2RhbE1vZGUgPT09ICdhZGQnID8gJ0FkZCBOZXcgQ2F0ZWdvcnknIDogJ0VkaXQgQ2F0ZWdvcnknIH19XHJcbiAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cImNsb3NlQ2F0ZWdvcnlNb2RhbCgpXCI+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgY2F0ZWdvcnktbW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNhdGVnb3J5Rm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHRleHQtbXV0ZWRcIj5JY29uPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LXdyYXBwZXIgaWNvbi1zZWxlY3RcIiBbY2xhc3Mub3Blbl09XCJpc0NhdGVnb3J5SWNvbkRyb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGVcIiAoY2xpY2spPVwidG9nZ2xlQ2F0ZWdvcnlJY29uRHJvcGRvd24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnktaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNhdGVnb3J5Rm9ybS5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlIHx8IGJhc2VDYXRlZ29yeUljb25zWzBdPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTd2l0Y2hdPVwiY2F0ZWdvcnlGb3JtLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgfHwgYmFzZUNhdGVnb3J5SWNvbnNbMF0/LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCIncHVycGxlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInb3JhbmdlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInaG91c2VLZWVwaW5nVGFnJ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfaWNvbl9ob3VzZWtlZXBpbmcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy4wNDk4MyAwLjU0NDk0N0M3Ljc0NzM4IC0wLjE4MTY0OSA4Ljg3ODI5IC0wLjE4MTY0OSA5LjU3NTg0IDAuNTQ0OTQ3TDE1LjQ2OTcgNi42ODQ0QzE2LjE2NzIgNy40MTEwMSAxNi4xNjcyIDguNTg5MDQgMTUuNDY5NyA5LjMxNTY1TDkuNTc1ODQgMTUuNDU1MUM4Ljg3ODI5IDE2LjE4MTYgNy43NDczOCAxNi4xODE2IDcuMDQ5ODMgMTUuNDU1MUw1LjM2NTYyIDEzLjcwMDdMMy44MjE3OSAxNS4zMDg4QzMuMTI0MjYgMTYuMDM1NCAxLjk5MzM0IDE2LjAzNTQgMS4yOTU4IDE1LjMwODhDMC41OTgyNzIgMTQuNTgyMyAwLjU5ODI3MiAxMy40MDQyIDEuMjk1OCAxMi42Nzc3TDIuODM5NjQgMTEuMDY5NUwxLjE1NTk2IDkuMzE1NjVDMC40NTg0MjkgOC41ODkwNCAwLjQ1ODQyOSA3LjQxMTAxIDEuMTU1OTYgNi42ODQ0TDcuMDQ5ODMgMC41NDQ5NDdaTTguNzMzODEgMS40MjIwM0M4LjUwMTI5IDEuMTc5ODMgOC4xMjQzIDEuMTc5ODMgNy44OTE3OCAxLjQyMjAzTDMuNjgxNjUgNS44MDc2MkwxMC40MTc1IDEyLjgyNDJMMTQuNjI3NyA4LjQzODU0QzE0Ljg2MDIgOC4xOTYzNCAxNC44NjAyIDcuODAzNjMgMTQuNjI3NyA3LjU2MTUxTDExLjY4MDUgNC40OTE0M0wxMC42OTgxIDUuNTE0NjlDMTAuNDY1NiA1Ljc1Njg5IDEwLjA4ODcgNS43NTY4OSA5Ljg1NjE0IDUuNTE0NjlDOS42MjM2MyA1LjI3MjQ5IDkuNjIzNjMgNC44Nzk4MSA5Ljg1NjE0IDQuNjM3NjFMMTAuODM4NCAzLjYxNDM1TDkuOTk2NjUgMi43Mzc0Nkw3LjYxMSA1LjIyMjUyQzcuMzc4NDkgNS40NjQ3MSA3LjAwMTQ5IDUuNDY0NzEgNi43Njg5NyA1LjIyMjUyQzYuNTM2NDYgNC45ODAzMiA2LjUzNjQ2IDQuNTg3NjMgNi43Njg5NyA0LjM0NTQ0TDkuMTU0NjIgMS44NjAzOEw4LjczMzgxIDEuNDIyMDNaTTkuNTc1NTIgMTMuNzAxMkwyLjgzOTY2IDYuNjg0N0wxLjk5Nzk2IDcuNTYxNTFDMS43NjU0NCA3LjgwMzYzIDEuNzY1NDQgOC4xOTYzNCAxLjk5Nzk2IDguNDM4NTRMNy44OTE3OCAxNC41NzhDOC4xMjQzIDE0LjgyMDIgOC41MDEyOSAxNC44MjAyIDguNzMzODEgMTQuNTc4TDkuNTc1NTIgMTMuNzAxMlpNMy42ODE1NiAxMS45NDY2TDIuMTM3OCAxMy41NTQ3QzEuOTA1MjkgMTMuNzk2OSAxLjkwNTI5IDE0LjE4OTYgMi4xMzc4IDE0LjQzMThDMi4zNzAzMSAxNC42NzQgMi43NDcyOSAxNC42NzQgMi45Nzk4IDE0LjQzMThMNC41MjM1NSAxMi44MjM3TDMuNjgxNTYgMTEuOTQ2NlpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF9pY29uX2hvdXNla2VlcGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidqdW5rVGFnJ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMiA0LjAwMDA0SDMuMzMzMzNNMy4zMzMzMyA0LjAwMDA0SDE0TTMuMzMzMzMgNC4wMDAwNFYxMy4zMzM0QzMuMzMzMzMgMTMuNjg3IDMuNDczODEgMTQuMDI2MSAzLjcyMzg2IDE0LjI3NjJDMy45NzM5MSAxNC41MjYyIDQuMzEzMDQgMTQuNjY2NyA0LjY2NjY3IDE0LjY2NjdIMTEuMzMzM0MxMS42ODcgMTQuNjY2NyAxMi4wMjYxIDE0LjUyNjIgMTIuMjc2MSAxNC4yNzYyQzEyLjUyNjIgMTQuMDI2MSAxMi42NjY3IDEzLjY4NyAxMi42NjY3IDEzLjMzMzRWNC4wMDAwNEgzLjMzMzMzWk01LjMzMzMzIDQuMDAwMDRWMi42NjY3MUM1LjMzMzMzIDIuMzEzMDkgNS40NzM4MSAxLjk3Mzk1IDUuNzIzODYgMS43MjM5QzUuOTczOTEgMS40NzM4NSA2LjMxMzA0IDEuMzMzMzcgNi42NjY2NyAxLjMzMzM3SDkuMzMzMzNDOS42ODY5NiAxLjMzMzM3IDEwLjAyNjEgMS40NzM4NSAxMC4yNzYxIDEuNzIzOUMxMC41MjYyIDEuOTczOTUgMTAuNjY2NyAyLjMxMzA5IDEwLjY2NjcgMi42NjY3MVY0LjAwMDA0TTYuNjY2NjcgNy4zMzMzN1YxMS4zMzM0TTkuMzMzMzMgNy4zMzMzN1YxMS4zMzM0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1sYWJlbFwiPnt7IHNlbGVjdGVkQ2F0ZWdvcnlJY29uTGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzQ2F0ZWdvcnlJY29uRHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb24gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGljb24gb2YgY2F0ZWdvcnlJY29uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENhdGVnb3J5SWNvbkZyb21Ecm9wZG93bigkZXZlbnQsIGljb24udmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeS1pY29uXCIgW25nQ2xhc3NdPVwiaWNvbi52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJpY29uLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCIncHVycGxlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInb3JhbmdlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInaG91c2VLZWVwaW5nVGFnJ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTE2Ml8yNDY1MClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjA0OTgzIDAuNTQ0OTQ3QzcuNzQ3MzggLTAuMTgxNjQ5IDguODc4MjkgLTAuMTgxNjQ5IDkuNTc1ODQgMC41NDQ5NDdMMTUuNDY5NyA2LjY4NDRDMTYuMTY3MiA3LjQxMTAxIDE2LjE2NzIgOC41ODkwNCAxNS40Njk3IDkuMzE1NjVMOS41NzU4NCAxNS40NTUxQzguODc4MjkgMTYuMTgxNiA3Ljc0NzM4IDE2LjE4MTYgNy4wNDk4MyAxNS40NTUxTDUuMzY1NjIgMTMuNzAwN0wzLjgyMTc5IDE1LjMwODhDMy4xMjQyNiAxNi4wMzU0IDEuOTkzMzQgMTYuMDM1NCAxLjI5NTggMTUuMzA4OEMwLjU5ODI3MiAxNC41ODIzIDAuNTk4MjcyIDEzLjQwNDIgMS4yOTU4IDEyLjY3NzdMMi44Mzk2NCAxMS4wNjk1TDEuMTU1OTYgOS4zMTU2NUMwLjQ1ODQyOSA4LjU4OTA0IDAuNDU4NDI5IDcuNDExMDEgMS4xNTU5NiA2LjY4NDRMNy4wNDk4MyAwLjU0NDk0N1pNOC43MzM4MSAxLjQyMjAzQzguNTAxMjkgMS4xNzk4MyA4LjEyNDMgMS4xNzk4MyA3Ljg5MTc4IDEuNDIyMDNMMy42ODE2NSA1LjgwNzYyTDEwLjQxNzUgMTIuODI0MkwxNC42Mjc3IDguNDM4NTRDMTQuODYwMiA4LjE5NjM0IDE0Ljg2MDIgNy44MDM2MyAxNC42Mjc3IDcuNTYxNTFMMTEuNjgwNSA0LjQ5MTQzTDEwLjY5ODEgNS41MTQ2OUMxMC40NjU2IDUuNzU2ODkgMTAuMDg4NyA1Ljc1Njg5IDkuODU2MTQgNS41MTQ2OUM5LjYyMzYzIDUuMjcyNDkgOS42MjM2MyA0Ljg3OTgxIDkuODU2MTQgNC42Mzc2MUwxMC44Mzg0IDMuNjE0MzVMOS45OTY2NSAyLjczNzQ2TDcuNjExIDUuMjIyNTJDNy4zNzg0OSA1LjQ2NDcxIDcuMDAxNDkgNS40NjQ3MSA2Ljc2ODk3IDUuMjIyNTJDNi41MzY0NiA0Ljk4MDMyIDYuNTM2NDYgNC41ODc2MyA2Ljc2ODk3IDQuMzQ1NDRMOS4xNTQ2MiAxLjg2MDM4TDguNzMzODEgMS40MjIwM1pNOS41NzU1MiAxMy43MDEyTDIuODM5NjYgNi42ODQ3TDEuOTk3OTYgNy41NjE1MUMxLjc2NTQ0IDcuODAzNjMgMS43NjU0NCA4LjE5NjM0IDEuOTk3OTYgOC40Mzg1NEw3Ljg5MTc4IDE0LjU3OEM4LjEyNDMgMTQuODIwMiA4LjUwMTI5IDE0LjgyMDIgOC43MzM4MSAxNC41NzhMOS41NzU1MiAxMy43MDEyWk0zLjY4MTU2IDExLjk0NjZMMi4xMzc4IDEzLjU1NDdDMS45MDUyOSAxMy43OTY5IDEuOTA1MjkgMTQuMTg5NiAyLjEzNzggMTQuNDMxOEMyLjM3MDMxIDE0LjY3NCAyLjc0NzI5IDE0LjY3NCAyLjk3OTggMTQuNDMxOEw0LjUyMzU1IDEyLjgyMzdMMy42ODE1NiAxMS45NDY2WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzExNjJfMjQ2NTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInanVua1RhZydcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIgNC4wMDAwNEgzLjMzMzMzTTMuMzMzMzMgNC4wMDAwNEgxNE0zLjMzMzMzIDQuMDAwMDRWMTMuMzMzNEMzLjMzMzMzIDEzLjY4NyAzLjQ3MzgxIDE0LjAyNjEgMy43MjM4NiAxNC4yNzYyQzMuOTczOTEgMTQuNTI2MiA0LjMxMzA0IDE0LjY2NjcgNC42NjY2NyAxNC42NjY3SDExLjMzMzNDMTEuNjg3IDE0LjY2NjcgMTIuMDI2MSAxNC41MjYyIDEyLjI3NjEgMTQuMjc2MkMxMi41MjYyIDE0LjAyNjEgMTIuNjY2NyAxMy42ODcgMTIuNjY2NyAxMy4zMzM0VjQuMDAwMDRIMy4zMzMzM1pNNS4zMzMzMyA0LjAwMDA0VjIuNjY2NzFDNS4zMzMzMyAyLjMxMzA5IDUuNDczODEgMS45NzM5NSA1LjcyMzg2IDEuNzIzOUM1Ljk3MzkxIDEuNDczODUgNi4zMTMwNCAxLjMzMzM3IDYuNjY2NjcgMS4zMzMzN0g5LjMzMzMzQzkuNjg2OTYgMS4zMzMzNyAxMC4wMjYxIDEuNDczODUgMTAuMjc2MSAxLjcyMzlDMTAuNTI2MiAxLjk3Mzk1IDEwLjY2NjcgMi4zMTMwOSAxMC42NjY3IDIuNjY2NzFWNC4wMDAwNE02LjY2NjY3IDcuMzMzMzdWMTEuMzMzNE05LjMzMzMzIDcuMzMzMzdWMTEuMzMzNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpY29uLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHRleHQtbXV0ZWRcIj5DYXRlZ29yeSBOYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImNhdGVnb3J5Rm9ybS5nZXQoJ25hbWUnKT8uaW52YWxpZCAmJiBjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/LnRvdWNoZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgbmV3IGNhdGVnb3J5XCIgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNhdGVnb3J5Rm9ybS5nZXQoJ25hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgY2F0ZWdvcnlGb3JtLmdldCgnbmFtZScpPy50b3VjaGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5IG5hbWUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2F0ZWdvcnlGb3JtLmdldCgnbmFtZScpPy5oYXNFcnJvcignZHVwbGljYXRlJykgJiYgY2F0ZWdvcnlGb3JtLmdldCgnbmFtZScpPy50b3VjaGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5IG5hbWUgYWxyZWFkeSBleGlzdHMuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCB0ZXh0LW11dGVkXCI+TGltaXRhdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC13cmFwcGVyXCIgW2NsYXNzLm9wZW5dPVwiaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZVwiIChjbGljayk9XCJ0b2dnbGVDYXRlZ29yeUxpbWl0RHJvcGRvd24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgY2F0ZWdvcnlGb3JtLmdldCgnbGltaXQnKT8udmFsdWUgfHwgcGVyY2VudGFnZUxpc3RbMF0gfX0lPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc0NhdGVnb3J5TGltaXREcm9wZG93bk9wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBwIG9mIHBlcmNlbnRhZ2VMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2F0ZWdvcnlMaW1pdFZhbHVlKCRldmVudCwgcClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBwIH19JVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyIGJvcmRlci0wIHB0LTBcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwiY2xvc2VDYXRlZ29yeU1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwic3VibWl0Q2F0ZWdvcnlGb3JtKClcIj5cclxuICAgICAgICAgICAgICAgIHt7IGNhdGVnb3J5TW9kYWxNb2RlID09PSAnYWRkJyA/ICdDcmVhdGUnIDogJ1NhdmUnIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8IS0tIERlbGV0ZSBDb25maXJtYXRpb24gTW9kYWwgLS0+XHJcbiAgICA8bmctdGVtcGxhdGUgI2RlbGV0ZUNhdGVnb3J5TW9kYWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgdGV4dC1jZW50ZXIgcC00XCI+XHJcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cImZ3LXNlbWlib2xkIG1iLTJcIj5Db25maXJtYXRpb248L2g1PlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTQgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgWW91J3JlIGFib3V0IHRvIGRlbGV0ZSA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgY2F0ZWdvcnlQZW5kaW5nRGVsZXRlTmFtZSB9fTwvc3Bhbj4gY2F0ZWdvcnkuXHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJjbG9zZURlbGV0ZU1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiAoY2xpY2spPVwiY29uZmlybURlbGV0ZUNhdGVnb3J5KClcIj5EZWxldGU8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDwhLS0gUmVzZXQgU3RvcmUgUmVxdWVzdHMgQ29uZmlybWF0aW9uIE1vZGFsIC0tPlxyXG4gICAgPG5nLXRlbXBsYXRlICNyZXNldENvbmZpcm1hdGlvbk1vZGFsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHRleHQtY2VudGVyIHAtNFwiPlxyXG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJmdy1zZW1pYm9sZCBtYi0yXCI+UmVzZXQgU3RvcmUgUmVxdWVzdHM8L2g1PlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTQgdGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHByb2NlZWQgd2l0aCByZXNldHRpbmcgdGhlIHNlbGVjdGVkIDxzcGFuIGNsYXNzPVwiZnctc2VtaWJvbGRcIj57e1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc2V0UmVxdWVzdC5hcnJheU9mU3RvcmVzLmxlbmd0aCB9fTwvc3Bhbj4gc3RvcmUocykgcmVxdWVzdHM/XHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJjbG9zZVJlc2V0TW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiY29uZmlybVJlc2V0U3RvcmVSZXF1ZXN0KClcIj5SZXNldDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG48L2Zvcm0+XHJcbiJdfQ==