ng-zenduit 2.0.13 → 2.0.14

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.
@@ -616,11 +616,23 @@ export class ZenduSelectComponent {
616
616
  }
617
617
  this.isOpen = false;
618
618
  }
619
+ /**
620
+ * Handle Enter key on search input
621
+ */
622
+ onSearchEnter(event) {
623
+ event.preventDefault();
624
+ if (this.enableAddNewOption && this.filteredOptions.length === 0 && (this.searchText || this.searchInputValue)?.trim()) {
625
+ this.handleAddNewOption();
626
+ }
627
+ }
619
628
  /**
620
629
  * Handle add new option
621
630
  */
622
631
  handleAddNewOption() {
623
- this.addNewOption.emit({ value: this.searchText });
632
+ this.addNewOption.emit({ value: this.searchText || this.searchInputValue });
633
+ this.searchText = '';
634
+ this.searchInputValue = '';
635
+ this.filterOptions();
624
636
  this.hideDropDown(true);
625
637
  }
626
638
  /**
@@ -735,10 +747,10 @@ export class ZenduSelectComponent {
735
747
  }
736
748
  }
737
749
  ZenduSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduSelectComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
738
- ZenduSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduSelectComponent, selector: "zen-select", inputs: { selectModel: "selectModel", options: "options", label: "label", supportingText: "supportingText", hintText: "hintText", placeholder: "placeholder", leadingType: "leadingType", leadingIcon: "leadingIcon", leadingAvatar: "leadingAvatar", leadingDotColor: "leadingDotColor", displayProp: "displayProp", idProp: "idProp", hasSearch: "hasSearch", isMultiselect: "isMultiselect", multiselect: "multiselect", hideSelectAll: "hideSelectAll", hideTreeSearch: "hideTreeSearch", required: "required", disabled: "disabled", error: "error", errorMessage: "errorMessage", destructive: "destructive", size: "size", returnOption: "returnOption", isTruncate: "isTruncate", enableAddNewOption: "enableAddNewOption", showDefaultAddOption: "showDefaultAddOption", newOptionText: "newOptionText", enableRemoveOption: "enableRemoveOption", removeOptionText: "removeOptionText", isLazyLoading: "isLazyLoading", lazyLoader: "lazyLoader", preferredOpenDirection: "preferredOpenDirection" }, outputs: { selectModelChange: "selectModelChange", addNewOption: "addNewOption", removeOption: "removeOption", closed: "closed" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, queries: [{ propertyName: "optionTemplate", first: true, predicate: ZenduSelectOptionDirective, descendants: true }, { propertyName: "valueTemplate", first: true, predicate: ZenduSelectValueDirective, descendants: true }, { propertyName: "buttonTemplate", first: true, predicate: ZenduSelectButtonDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [class]=\"getStateClasses()\">\n <!-- Label -->\n <label class=\"app-select-label text text-sm text-weight-medium\" *ngIf=\"label\"\n [ngClass]=\"{'required': required, 'disabled': disabled, 'destructive': destructive}\">\n {{ label | translate }}\n <span *ngIf=\"required\" class=\"required-indicator\">*</span>\n </label>\n\n <!-- Select Input -->\n <div class=\"app-select-wrapper\">\n <!-- Template Selection Based on Leading Type -->\n <ng-container [ngSwitch]=\"leadingType\">\n <!-- Default Select (no leading element) -->\n <ng-container *ngSwitchCase=\"'default'\">\n <ng-container *ngTemplateOutlet=\"defaultSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Icon Leading Select -->\n <ng-container *ngSwitchCase=\"'icon'\">\n <ng-container *ngTemplateOutlet=\"iconSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Avatar Leading Select -->\n <ng-container *ngSwitchCase=\"'avatar'\">\n <ng-container *ngTemplateOutlet=\"avatarSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Dot Leading Select -->\n <ng-container *ngSwitchCase=\"'dot'\">\n <ng-container *ngTemplateOutlet=\"dotSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Search Input Select -->\n <ng-container *ngSwitchCase=\"'search'\">\n <ng-container *ngTemplateOutlet=\"searchInputTemplate\"></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Dropdown Menu -->\n <div class=\"app-select-dropdown\" \n [ngClass]=\"getDropdownDirectionClass()\"\n *ngIf=\"isOpen\">\n \n <!-- Tree Mode: embed zen-groups inline -->\n <ng-container *ngIf=\"isTreeMode && isMultiselect; else flatList\">\n <zen-groups [inline]=\"true\"\n [dataSource]=\"$any(options)\"\n [filteredDataSource]=\"treeFilteredDataSource\"\n [hideSelectAll]=\"hideSelectAll\"\n [hideSearch]=\"hideTreeSearch\"\n [idProp]=\"idProp\"\n [displayProp]=\"displayProp\"\n [(isSelectedAll)]=\"isSelectedAll\"\n (isSelectedAllChange)=\"onTreeSelectAllChange($event)\"\n (checkedChange)=\"onTreeCheckedChange($event)\">\n </zen-groups>\n </ng-container>\n\n <!-- Flat List Mode (default) -->\n <ng-template #flatList>\n <!-- Search Box for hasSearch (not for search type as it has inline search) -->\n <div class=\"app-select-search\" *ngIf=\"leadingType !== 'search' && hasSearch && !disabled\">\n <zen-icon [name]=\"'search'\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"onSearchChange()\"\n placeholder=\"Search\"\n class=\"app-select-search-input\">\n </div>\n\n <!-- Options List -->\n <div class=\"app-select-options\">\n <!-- Select All Option for Multiselect -->\n <button *ngIf=\"isMultiselect && !hideSelectAll && filteredOptions.length > 0\"\n class=\"app-select-option select-all\"\n (click)=\"toggleSelectAll()\">\n <zen-checkbox class=\"app-select-checkbox\"\n [checked]=\"isAllSelected()\"\n [disableValueChange]=\"true\"\n [label]=\"''\"\n size=\"sm\">\n </zen-checkbox>\n <span class=\"app-select-option-text\">\n Select All\n </span>\n </button>\n\n <div *ngIf=\"filteredOptions.length === 0\" class=\"app-select-no-options\">\n No matching options found\n </div>\n\n <button *ngFor=\"let option of filteredOptions\"\n class=\"app-select-option\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"selectOption(option)\">\n\n <!-- Checkbox for Multiselect -->\n <zen-checkbox class=\"app-select-checkbox\"\n *ngIf=\"isMultiselect\"\n [checked]=\"isSelected(option)\"\n [disableValueChange]=\"true\"\n [label]=\"''\"\n size=\"sm\">\n </zen-checkbox>\n\n <!-- Option Leading Element -->\n <div class=\"app-select-option-leading\" *ngIf=\"leadingType !== 'default'\">\n <ng-container [ngSwitch]=\"leadingType\">\n <ng-container *ngSwitchCase=\"'icon'\">\n <ng-container *ngTemplateOutlet=\"iconLeadingElement; context: { option: option }\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'avatar'\">\n <ng-container *ngTemplateOutlet=\"avatarLeadingElement; context: { option: option }\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'dot'\">\n <ng-container *ngTemplateOutlet=\"dotLeadingElement; context: { option: option }\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Option Text -->\n <div class=\"app-select-option-text-wrapper\">\n <!-- Use custom template if provided -->\n <ng-container *ngIf=\"!isMultiselect && optionTemplate; else defaultOptionText\">\n <ng-template [ngTemplateOutlet]=\"optionTemplate.template\"\n [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-template>\n </ng-container>\n <ng-template #defaultOptionText>\n <span class=\"app-select-option-text\" [class.app-select-option-truncate]=\"isTruncate\">\n {{ getName(option) | translate }}\n </span>\n <span class=\"app-select-option-secondary\" *ngIf=\"option.secondaryText\">\n {{ option.secondaryText }}\n </span>\n </ng-template>\n </div>\n\n <!-- Check Icon for Single Select -->\n <zen-icon *ngIf=\"!isMultiselect && isSelected(option)\"\n class=\"app-select-option-check\"\n [name]=\"'check'\"\n [customColor]=\"'#136AB6'\">\n </zen-icon>\n </button>\n </div>\n </ng-template>\n </div>\n </div>\n \n <!-- Hint text / Error message -->\n <div *ngIf=\"(destructive && errorMessage) || hintText\" \n class=\"app-select-hint text text-sm text-weight-regular\"\n [ngClass]=\"{'destructive': destructive}\">\n <i *ngIf=\"destructive\" class=\"material-icons-outlined hint-icon\">error_outline</i>\n <span>{{ ((destructive && errorMessage) ? errorMessage : hintText) | translate }}</span>\n </div>\n</div>\n\n<!-- ============================================= -->\n<!-- MAIN SELECT INPUT TEMPLATES -->\n<!-- ============================================= -->\n\n<!-- Default Select Template (No Leading Element) -->\n<ng-template #defaultSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Icon Select Template -->\n<ng-template #iconSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <div class=\"app-select-leading\">\n <ng-container *ngTemplateOutlet=\"iconLeadingElement; context: { option: getSelectedOption(), icon: leadingIcon }\"></ng-container>\n </div>\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Avatar Select Template -->\n<ng-template #avatarSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <div class=\"app-select-leading\">\n <ng-container *ngTemplateOutlet=\"avatarLeadingElement; context: { option: getSelectedOption(), avatar: leadingAvatar }\"></ng-container>\n </div>\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Dot Select Template -->\n<ng-template #dotSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <div class=\"app-select-leading\">\n <ng-container *ngTemplateOutlet=\"dotLeadingElement; context: { option: getSelectedOption(), color: leadingDotColor }\"></ng-container>\n </div>\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Search Input Template -->\n<ng-template #searchInputTemplate>\n <div class=\"app-select-input app-select-search-input\"\n [class.focused]=\"isOpen || searchFocused\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <!-- Search Icon -->\n <zen-icon [name]=\"'search'\"\n [customColor]=\"disabled ? '#9CA3AF' : '#667085'\">\n </zen-icon>\n \n <!-- Search Input Field -->\n <input type=\"text\"\n class=\"app-select-search-field\"\n [(ngModel)]=\"searchInputValue\"\n (ngModelChange)=\"onSearchInputChange()\"\n (focus)=\"onSearchFocus()\"\n (blur)=\"onSearchBlur($event)\"\n [placeholder]=\"selectedDisplay || placeholder\"\n [disabled]=\"disabled\">\n </div>\n</ng-template>\n\n<!-- ============================================= -->\n<!-- SHARED COMPONENT TEMPLATES -->\n<!-- ============================================= -->\n\n<!-- Select Value Display -->\n<ng-template #selectValueDisplay>\n <div class=\"app-select-value-wrapper\">\n <span class=\"app-select-value\" [class.placeholder]=\"isModelEmpty()\">\n {{ selectedDisplay || placeholder | translate }}\n </span>\n <span class=\"app-select-secondary\" *ngIf=\"getSelectedSecondaryText() && !isModelEmpty()\">\n {{ getSelectedSecondaryText() }}\n </span>\n </div>\n</ng-template>\n\n<!-- Dropdown Arrow -->\n<ng-template #dropdownArrow>\n <zen-icon class=\"app-select-arrow\" \n [class.rotated]=\"isOpen\" \n [name]=\"'chevron-down'\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n</ng-template>\n\n<!-- ============================================= -->\n<!-- LEADING ELEMENT TEMPLATES -->\n<!-- ============================================= -->\n\n<!-- Icon Leading Element (with smart resolution) -->\n<ng-template #iconLeadingElement let-option=\"option\" let-icon=\"icon\">\n <ng-container *ngIf=\"icon || option?.icon || option?.iconName\">\n <ng-container *ngIf=\"getIconPath(option, icon) as iconPath\">\n <!-- If icon contains / or . treat as SVG path -->\n <ng-container *ngIf=\"(icon && (icon.includes('/') || icon.includes('.'))) || \n (option?.icon && (option.icon.includes('/') || option.icon.includes('.'))) ||\n (option?.iconName && (option.iconName.includes('/') || option.iconName.includes('.')))\">\n <!-- Use img tag for Excel to preserve colors -->\n <img *ngIf=\"iconPath.includes('excel')\" \n [src]=\"iconPath\" \n alt=\"\"\n style=\"width: 20px; height: 20px;\">\n <!-- Use zen-icon with src for other SVG files -->\n <zen-icon *ngIf=\"!iconPath.includes('excel')\"\n [src]=\"iconPath\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n </ng-container>\n <!-- Otherwise treat as Material icon name or special cases -->\n <ng-container *ngIf=\"!((icon && (icon.includes('/') || icon.includes('.'))) || \n (option?.icon && (option.icon.includes('/') || option.icon.includes('.'))) ||\n (option?.iconName && (option.iconName.includes('/') || option.iconName.includes('.'))))\">\n <!-- Special case for Excel icon - use img to preserve colors -->\n <img *ngIf=\"(icon === 'excel') || (option?.icon === 'excel') || (option?.iconName === 'excel')\"\n src=\"assets/ng-zenduit/icons/excel.svg\"\n alt=\"Excel\"\n style=\"width: 20px; height: 20px;\">\n <!-- Material icon names -->\n <zen-icon *ngIf=\"(icon !== 'excel') && (option?.icon !== 'excel') && (option?.iconName !== 'excel')\"\n [name]=\"icon || option?.icon || option?.iconName\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<!-- Avatar Leading Element -->\n<ng-template #avatarLeadingElement let-option=\"option\" let-avatar=\"avatar\">\n <div class=\"app-select-avatar\" *ngIf=\"avatar || option?.avatar\" >\n <img [src]=\"avatar || option?.avatar\" alt=\"\">\n </div>\n</ng-template>\n\n<!-- Dot Leading Element -->\n<ng-template #dotLeadingElement let-option=\"option\" let-color=\"color\">\n <div class=\"app-select-dot\"\n [style.background-color]=\"color || option?.dotColor || '#10B981'\">\n </div>\n</ng-template>", styles: [".text{margin:0;padding:0;color:#101828}.text-display-2xl{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:72px;line-height:90px;letter-spacing:-.02em}.text-display-xl{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:60px;line-height:72px;letter-spacing:-.02em}.text-display-lg{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:48px;line-height:60px;letter-spacing:-.02em}.text-display-md{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:36px;line-height:44px;letter-spacing:-.02em}.text-display-sm{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:30px;line-height:38px;letter-spacing:0}.text-display-xs{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:24px;line-height:32px;letter-spacing:0}.text-xl{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:20px;line-height:30px;letter-spacing:0}.text-lg{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:18px;line-height:28px;letter-spacing:0}.text-md{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0}.text-sm{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0}.text-xs{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:12px;line-height:18px;letter-spacing:0}.text-weight-regular{font-weight:400;font-style:normal}.text-weight-medium{font-weight:500;font-style:normal}.text-weight-semibold{font-weight:600;font-style:normal}.text-weight-bold{font-weight:700;font-style:normal}@media (max-width: 768px){.text-display-2xl{font-size:48px;line-height:56px}.text-display-xl{font-size:40px;line-height:48px}.text-display-lg{font-size:32px;line-height:40px}}.app-select-container{width:100%;position:relative}.app-select-label{display:flex;align-items:center;gap:4px;margin-bottom:6px;color:#344054}.app-select-label .required-indicator{color:#f04438}.app-select-label.disabled{color:#d0d5dd}.app-select-wrapper{position:relative;width:100%}.app-select-input{width:100%;min-height:44px;padding:10px 14px;box-sizing:border-box;display:flex;align-items:center;gap:8px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;color:#101828;text-align:left;cursor:pointer;transition:all .2s ease}.app-select-input.app-select-search-input{cursor:text}.app-select-input.app-select-search-input .app-select-search-field{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;flex:1;border:none;outline:none;background:transparent;color:#101828;min-width:0}.app-select-input.app-select-search-input .app-select-search-field::placeholder{color:#667085}.app-select-input.app-select-search-input .app-select-search-field:disabled{cursor:not-allowed;color:#667085}.app-select-input:hover:not(:disabled){border-color:#d0d5dd}.app-select-input.focused,.app-select-input:focus{outline:none;border-color:#88c1f1;box-shadow:0 1px 2px #1018280d,0 0 0 4px #e3eefb}.app-select-input:disabled{background:#F9FAFB;border-color:#d0d5dd;cursor:not-allowed;opacity:.6}.app-select-container.error .app-select-input:focus{box-shadow:0 1px 2px #1018280d,0 0 0 4px #fee4e2}.app-select-leading,.app-select-option-leading{display:flex;align-items:center;flex-shrink:0}.app-select-avatar,.app-select-option-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;flex-shrink:0}.app-select-avatar img,.app-select-option-avatar img{width:100%;height:100%;object-fit:cover}.app-select-avatar .avatar-placeholder,.app-select-option-avatar .avatar-placeholder{width:100%;height:100%;background:#F2F4F7;color:#667085;display:flex;align-items:center;justify-content:center;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:12px;line-height:18px;letter-spacing:0;font-weight:600;font-style:normal}.app-select-dot,.app-select-option-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.app-select-value-wrapper{flex:1;display:flex;align-items:center;gap:8px;overflow:hidden}.app-select-value-wrapper .app-select-secondary{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;color:#667085}.app-select-value{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-select-value.placeholder{color:#667085}.app-select-secondary,.app-select-option-secondary{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;color:#667085;white-space:nowrap;flex-shrink:0}.app-select-arrow{margin-left:auto;flex-shrink:0;transition:transform .2s ease}.app-select-arrow.rotated{transform:rotate(180deg)}.app-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:1000;background:#FFFFFF;border:1px solid #EAECF0;border-radius:8px;box-shadow:0 4px 6px -2px #10182808,0 12px 16px -4px #10182814;overflow:hidden;max-height:320px;display:flex;flex-direction:column}.app-select-dropdown.dropdown-up{top:auto;bottom:calc(100% + 4px)}.app-select-dropdown.dropdown-down,.app-select-dropdown.dropdown-auto{top:calc(100% + 4px);bottom:auto}.app-select-search{padding:12px;border-bottom:1px solid #EAECF0;display:flex;align-items:center;gap:8px}.app-select-search .app-select-search-input{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;flex:1;border:none;outline:none;color:#101828}.app-select-search .app-select-search-input::placeholder{color:#667085}.app-select-options{flex:1;overflow-y:auto;padding:4px 0}.app-select-options::-webkit-scrollbar{width:6px}.app-select-options::-webkit-scrollbar-track{background:transparent}.app-select-options::-webkit-scrollbar-thumb{background:#D0D5DD;border-radius:3px}.app-select-no-options{padding:32px 24px;text-align:center;color:#667085;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0}.app-select-option{width:100%;padding:10px 14px;display:flex;align-items:center;gap:8px;background:transparent;border:none;text-align:left;cursor:pointer;transition:background .15s ease}.app-select-option:hover,.app-select-option.selected{background:#F9FAFB}.app-select-option-text-wrapper{flex:1;display:flex;align-items:center;gap:8px;overflow:hidden}.app-select-option-text{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;color:#344054;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-select-option-text.app-select-option-truncate{max-width:200px}.app-select-option-check{margin-left:auto;flex-shrink:0}.app-select-checkbox{display:flex;align-items:center;flex-shrink:0;margin-right:8px}.app-select-checkbox .checkbox-wrapper{margin-bottom:0}.app-select-checkbox .checkbox-content{display:none}.app-select-checkbox .checkbox-input{margin-right:0}.app-select-supporting{margin-top:6px;color:#667085}.app-select-supporting .error-text{color:#f04438}.app-select-container.size-sm .app-select-input{min-height:36px;padding:8px 12px}.app-select-container.error .app-select-input{border-color:#fda29b}.app-select-container.error .app-select-supporting{color:#f04438}.app-select-container.destructive .app-select-input{border-color:#fda29b}.app-select-container.destructive .app-select-input:focus,.app-select-container.destructive .app-select-input.focused{box-shadow:0 1px 2px #1018280d,0 0 0 4px #fee4e2}.app-select-container.disabled .app-select-label,.app-select-container.disabled .app-select-value,.app-select-container.disabled .app-select-arrow,.app-select-container.disabled .app-select-leading zen-icon,.app-select-container.disabled .app-select-search-input zen-icon,.app-select-container.disabled .app-select-secondary,.app-select-container.disabled .app-select-search-field{opacity:.6}.app-select-container.disabled .app-select-input,.app-select-container.disabled .app-select-search-input{background:#F9FAFB;cursor:not-allowed}.app-select-hint{display:flex;align-items:center;gap:4px;margin-top:6px;color:#667085}.app-select-hint .hint-icon{font-size:16px;color:#f04438}.app-select-hint.destructive{color:#f04438}.app-select-option.select-all{border-bottom:1px solid #F2F4F7;margin-bottom:4px;padding-bottom:14px}.app-select-option.add-new-option{color:#136ab6;font-weight:500}.app-select-option.add-new-option:hover{background:#EFF8FF}.app-select-option.remove-option{color:#f04438;font-weight:500}.app-select-option.remove-option:hover{background:#FEF3F2}.app-select-spinner{display:flex;justify-content:center;padding:16px}.app-select-spinner .spinner-small{width:20px;height:20px;border:2px solid #F2F4F7;border-top-color:#136ab6;border-radius:50%;animation:spin .6s linear infinite}.app-select-load-more{padding:8px 14px}.app-select-load-more .app-select-load-more-btn{width:100%;padding:8px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:6px;color:#344054;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0;font-weight:500;font-style:normal;cursor:pointer;transition:all .15s ease}.app-select-load-more .app-select-load-more-btn:hover{background:#F9FAFB;border-color:#667085}@keyframes spin{to{transform:rotate(360deg)}}.app-select-dropdown ::ng-deep zen-groups .zen-groups-inline{display:flex;flex-direction:column;max-height:310px}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree{flex:1;overflow-y:auto;padding:4px 0}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree::-webkit-scrollbar{width:6px}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree::-webkit-scrollbar-track{background:transparent}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree::-webkit-scrollbar-thumb{background:#D0D5DD;border-radius:3px}.app-select-dropdown ::ng-deep zen-groups .action-item-checkbox{padding:10px 14px;font-weight:400;font-size:14px;line-height:20px;color:#344054}.app-select-dropdown ::ng-deep zen-groups .action-item-checkbox:hover{background:#F9FAFB}.app-select-dropdown ::ng-deep zen-groups .select-all{border-bottom:none;margin-bottom:0;font-weight:500}.app-select-dropdown ::ng-deep zen-groups .tree-item[style*=padding-left]{padding-right:14px}.app-select-dropdown ::ng-deep zen-groups .tree-item-badge{background:#f1f7fe;color:#105494}.app-select-dropdown ::ng-deep zen-groups .checkbox-component .app-checkbox-label{font-weight:400;color:#344054}.app-select-dropdown ::ng-deep zen-groups .zen-groups-no-results{padding:32px 24px;text-align:center;color:#667085}@media (max-width: 640px){.app-select-dropdown{position:fixed;inset:auto 0 0;max-height:70vh;border-radius:16px 16px 0 0}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ZenduCheckboxComponent, selector: "zen-checkbox", inputs: ["checked", "label", "labelColor", "disabled", "disableValueChange", "indeterminate", "imageUrl", "size", "supportingText"], outputs: ["checkedChange"] }, { kind: "component", type: i4.ZenduGroupsComponent, selector: "zen-groups", inputs: ["dataSource", "filteredDataSource", "hideSelectAll", "isSelectedAll", "inline", "width", "placeholder", "hideSearch", "idProp", "displayProp"], outputs: ["isSelectedAllChange", "checkedChange"] }, { kind: "component", type: i5.ZenduIconComponent, selector: "zen-icon", inputs: ["src", "name", "size", "color", "theme", "customColor"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] });
750
+ ZenduSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduSelectComponent, selector: "zen-select", inputs: { selectModel: "selectModel", options: "options", label: "label", supportingText: "supportingText", hintText: "hintText", placeholder: "placeholder", leadingType: "leadingType", leadingIcon: "leadingIcon", leadingAvatar: "leadingAvatar", leadingDotColor: "leadingDotColor", displayProp: "displayProp", idProp: "idProp", hasSearch: "hasSearch", isMultiselect: "isMultiselect", multiselect: "multiselect", hideSelectAll: "hideSelectAll", hideTreeSearch: "hideTreeSearch", required: "required", disabled: "disabled", error: "error", errorMessage: "errorMessage", destructive: "destructive", size: "size", returnOption: "returnOption", isTruncate: "isTruncate", enableAddNewOption: "enableAddNewOption", showDefaultAddOption: "showDefaultAddOption", newOptionText: "newOptionText", enableRemoveOption: "enableRemoveOption", removeOptionText: "removeOptionText", isLazyLoading: "isLazyLoading", lazyLoader: "lazyLoader", preferredOpenDirection: "preferredOpenDirection" }, outputs: { selectModelChange: "selectModelChange", addNewOption: "addNewOption", removeOption: "removeOption", closed: "closed" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, queries: [{ propertyName: "optionTemplate", first: true, predicate: ZenduSelectOptionDirective, descendants: true }, { propertyName: "valueTemplate", first: true, predicate: ZenduSelectValueDirective, descendants: true }, { propertyName: "buttonTemplate", first: true, predicate: ZenduSelectButtonDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [class]=\"getStateClasses()\">\n <!-- Label -->\n <label class=\"app-select-label text text-sm text-weight-medium\" *ngIf=\"label\"\n [ngClass]=\"{'required': required, 'disabled': disabled, 'destructive': destructive}\">\n {{ label | translate }}\n <span *ngIf=\"required\" class=\"required-indicator\">*</span>\n </label>\n\n <!-- Select Input -->\n <div class=\"app-select-wrapper\">\n <!-- Template Selection Based on Leading Type -->\n <ng-container [ngSwitch]=\"leadingType\">\n <!-- Default Select (no leading element) -->\n <ng-container *ngSwitchCase=\"'default'\">\n <ng-container *ngTemplateOutlet=\"defaultSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Icon Leading Select -->\n <ng-container *ngSwitchCase=\"'icon'\">\n <ng-container *ngTemplateOutlet=\"iconSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Avatar Leading Select -->\n <ng-container *ngSwitchCase=\"'avatar'\">\n <ng-container *ngTemplateOutlet=\"avatarSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Dot Leading Select -->\n <ng-container *ngSwitchCase=\"'dot'\">\n <ng-container *ngTemplateOutlet=\"dotSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Search Input Select -->\n <ng-container *ngSwitchCase=\"'search'\">\n <ng-container *ngTemplateOutlet=\"searchInputTemplate\"></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Dropdown Menu -->\n <div class=\"app-select-dropdown\" \n [ngClass]=\"getDropdownDirectionClass()\"\n *ngIf=\"isOpen\">\n \n <!-- Tree Mode: embed zen-groups inline -->\n <ng-container *ngIf=\"isTreeMode && isMultiselect; else flatList\">\n <zen-groups [inline]=\"true\"\n [dataSource]=\"$any(options)\"\n [filteredDataSource]=\"treeFilteredDataSource\"\n [hideSelectAll]=\"hideSelectAll\"\n [hideSearch]=\"hideTreeSearch\"\n [idProp]=\"idProp\"\n [displayProp]=\"displayProp\"\n [(isSelectedAll)]=\"isSelectedAll\"\n (isSelectedAllChange)=\"onTreeSelectAllChange($event)\"\n (checkedChange)=\"onTreeCheckedChange($event)\">\n </zen-groups>\n </ng-container>\n\n <!-- Flat List Mode (default) -->\n <ng-template #flatList>\n <!-- Search Box for hasSearch (not for search type as it has inline search) -->\n <div class=\"app-select-search\" *ngIf=\"leadingType !== 'search' && hasSearch && !disabled\">\n <zen-icon [name]=\"'search'\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"onSearchChange()\"\n (keydown.enter)=\"onSearchEnter($event)\"\n placeholder=\"Search\"\n class=\"app-select-search-input\">\n </div>\n\n <!-- Options List -->\n <div class=\"app-select-options\">\n <!-- Select All Option for Multiselect -->\n <button *ngIf=\"isMultiselect && !hideSelectAll && filteredOptions.length > 0\"\n class=\"app-select-option select-all\"\n (click)=\"toggleSelectAll()\">\n <zen-checkbox class=\"app-select-checkbox\"\n [checked]=\"isAllSelected()\"\n [disableValueChange]=\"true\"\n [label]=\"''\"\n size=\"sm\">\n </zen-checkbox>\n <span class=\"app-select-option-text\">\n Select All\n </span>\n </button>\n\n <!-- Add New Option -->\n <button *ngIf=\"enableAddNewOption && (showDefaultAddOption || searchText)\"\n class=\"app-select-option add-new-option\"\n (click)=\"handleAddNewOption(); $event.stopPropagation()\">\n <zen-icon [name]=\"'plus'\" [customColor]=\"'#136AB6'\"></zen-icon>\n <span class=\"app-select-option-text\">\n {{ (newOptionText || 'Add New Option') + (searchText ? ': \"' + searchText + '\"' : '') }}\n </span>\n </button>\n\n <div *ngIf=\"filteredOptions.length === 0 && !enableAddNewOption\" class=\"app-select-no-options\">\n No matching options found\n </div>\n\n <button *ngFor=\"let option of filteredOptions\"\n class=\"app-select-option\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"selectOption(option)\">\n\n <!-- Checkbox for Multiselect -->\n <zen-checkbox class=\"app-select-checkbox\"\n *ngIf=\"isMultiselect\"\n [checked]=\"isSelected(option)\"\n [disableValueChange]=\"true\"\n [label]=\"''\"\n size=\"sm\">\n </zen-checkbox>\n\n <!-- Option Leading Element -->\n <div class=\"app-select-option-leading\" *ngIf=\"leadingType !== 'default'\">\n <ng-container [ngSwitch]=\"leadingType\">\n <ng-container *ngSwitchCase=\"'icon'\">\n <ng-container *ngTemplateOutlet=\"iconLeadingElement; context: { option: option }\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'avatar'\">\n <ng-container *ngTemplateOutlet=\"avatarLeadingElement; context: { option: option }\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'dot'\">\n <ng-container *ngTemplateOutlet=\"dotLeadingElement; context: { option: option }\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Option Text -->\n <div class=\"app-select-option-text-wrapper\">\n <!-- Use custom template if provided -->\n <ng-container *ngIf=\"!isMultiselect && optionTemplate; else defaultOptionText\">\n <ng-template [ngTemplateOutlet]=\"optionTemplate.template\"\n [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-template>\n </ng-container>\n <ng-template #defaultOptionText>\n <span class=\"app-select-option-text\" [class.app-select-option-truncate]=\"isTruncate\">\n {{ getName(option) | translate }}\n </span>\n <span class=\"app-select-option-secondary\" *ngIf=\"option.secondaryText\">\n {{ option.secondaryText }}\n </span>\n </ng-template>\n </div>\n\n <!-- Check Icon for Single Select -->\n <zen-icon *ngIf=\"!isMultiselect && isSelected(option)\"\n class=\"app-select-option-check\"\n [name]=\"'check'\"\n [customColor]=\"'#136AB6'\">\n </zen-icon>\n </button>\n </div>\n </ng-template>\n </div>\n </div>\n \n <!-- Hint text / Error message -->\n <div *ngIf=\"(destructive && errorMessage) || hintText\" \n class=\"app-select-hint text text-sm text-weight-regular\"\n [ngClass]=\"{'destructive': destructive}\">\n <i *ngIf=\"destructive\" class=\"material-icons-outlined hint-icon\">error_outline</i>\n <span>{{ ((destructive && errorMessage) ? errorMessage : hintText) | translate }}</span>\n </div>\n</div>\n\n<!-- ============================================= -->\n<!-- MAIN SELECT INPUT TEMPLATES -->\n<!-- ============================================= -->\n\n<!-- Default Select Template (No Leading Element) -->\n<ng-template #defaultSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Icon Select Template -->\n<ng-template #iconSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <div class=\"app-select-leading\">\n <ng-container *ngTemplateOutlet=\"iconLeadingElement; context: { option: getSelectedOption(), icon: leadingIcon }\"></ng-container>\n </div>\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Avatar Select Template -->\n<ng-template #avatarSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <div class=\"app-select-leading\">\n <ng-container *ngTemplateOutlet=\"avatarLeadingElement; context: { option: getSelectedOption(), avatar: leadingAvatar }\"></ng-container>\n </div>\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Dot Select Template -->\n<ng-template #dotSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <div class=\"app-select-leading\">\n <ng-container *ngTemplateOutlet=\"dotLeadingElement; context: { option: getSelectedOption(), color: leadingDotColor }\"></ng-container>\n </div>\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Search Input Template -->\n<ng-template #searchInputTemplate>\n <div class=\"app-select-input app-select-search-input\"\n [class.focused]=\"isOpen || searchFocused\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <!-- Search Icon -->\n <zen-icon [name]=\"'search'\"\n [customColor]=\"disabled ? '#9CA3AF' : '#667085'\">\n </zen-icon>\n \n <!-- Search Input Field -->\n <input type=\"text\"\n class=\"app-select-search-field\"\n [(ngModel)]=\"searchInputValue\"\n (ngModelChange)=\"onSearchInputChange()\"\n (keydown.enter)=\"onSearchEnter($event)\"\n (focus)=\"onSearchFocus()\"\n (blur)=\"onSearchBlur($event)\"\n [placeholder]=\"selectedDisplay || placeholder\"\n [disabled]=\"disabled\">\n </div>\n</ng-template>\n\n<!-- ============================================= -->\n<!-- SHARED COMPONENT TEMPLATES -->\n<!-- ============================================= -->\n\n<!-- Select Value Display -->\n<ng-template #selectValueDisplay>\n <div class=\"app-select-value-wrapper\">\n <span class=\"app-select-value\" [class.placeholder]=\"isModelEmpty()\">\n {{ selectedDisplay || placeholder | translate }}\n </span>\n <span class=\"app-select-secondary\" *ngIf=\"getSelectedSecondaryText() && !isModelEmpty()\">\n {{ getSelectedSecondaryText() }}\n </span>\n </div>\n</ng-template>\n\n<!-- Dropdown Arrow -->\n<ng-template #dropdownArrow>\n <zen-icon class=\"app-select-arrow\" \n [class.rotated]=\"isOpen\" \n [name]=\"'chevron-down'\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n</ng-template>\n\n<!-- ============================================= -->\n<!-- LEADING ELEMENT TEMPLATES -->\n<!-- ============================================= -->\n\n<!-- Icon Leading Element (with smart resolution) -->\n<ng-template #iconLeadingElement let-option=\"option\" let-icon=\"icon\">\n <ng-container *ngIf=\"icon || option?.icon || option?.iconName\">\n <ng-container *ngIf=\"getIconPath(option, icon) as iconPath\">\n <!-- If icon contains / or . treat as SVG path -->\n <ng-container *ngIf=\"(icon && (icon.includes('/') || icon.includes('.'))) || \n (option?.icon && (option.icon.includes('/') || option.icon.includes('.'))) ||\n (option?.iconName && (option.iconName.includes('/') || option.iconName.includes('.')))\">\n <!-- Use img tag for Excel to preserve colors -->\n <img *ngIf=\"iconPath.includes('excel')\" \n [src]=\"iconPath\" \n alt=\"\"\n style=\"width: 20px; height: 20px;\">\n <!-- Use zen-icon with src for other SVG files -->\n <zen-icon *ngIf=\"!iconPath.includes('excel')\"\n [src]=\"iconPath\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n </ng-container>\n <!-- Otherwise treat as Material icon name or special cases -->\n <ng-container *ngIf=\"!((icon && (icon.includes('/') || icon.includes('.'))) || \n (option?.icon && (option.icon.includes('/') || option.icon.includes('.'))) ||\n (option?.iconName && (option.iconName.includes('/') || option.iconName.includes('.'))))\">\n <!-- Special case for Excel icon - use img to preserve colors -->\n <img *ngIf=\"(icon === 'excel') || (option?.icon === 'excel') || (option?.iconName === 'excel')\"\n src=\"assets/ng-zenduit/icons/excel.svg\"\n alt=\"Excel\"\n style=\"width: 20px; height: 20px;\">\n <!-- Material icon names -->\n <zen-icon *ngIf=\"(icon !== 'excel') && (option?.icon !== 'excel') && (option?.iconName !== 'excel')\"\n [name]=\"icon || option?.icon || option?.iconName\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<!-- Avatar Leading Element -->\n<ng-template #avatarLeadingElement let-option=\"option\" let-avatar=\"avatar\">\n <div class=\"app-select-avatar\" *ngIf=\"avatar || option?.avatar\" >\n <img [src]=\"avatar || option?.avatar\" alt=\"\">\n </div>\n</ng-template>\n\n<!-- Dot Leading Element -->\n<ng-template #dotLeadingElement let-option=\"option\" let-color=\"color\">\n <div class=\"app-select-dot\"\n [style.background-color]=\"color || option?.dotColor || '#10B981'\">\n </div>\n</ng-template>", styles: [".text{margin:0;padding:0;color:#101828}.text-display-2xl{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:72px;line-height:90px;letter-spacing:-.02em}.text-display-xl{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:60px;line-height:72px;letter-spacing:-.02em}.text-display-lg{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:48px;line-height:60px;letter-spacing:-.02em}.text-display-md{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:36px;line-height:44px;letter-spacing:-.02em}.text-display-sm{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:30px;line-height:38px;letter-spacing:0}.text-display-xs{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:24px;line-height:32px;letter-spacing:0}.text-xl{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:20px;line-height:30px;letter-spacing:0}.text-lg{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:18px;line-height:28px;letter-spacing:0}.text-md{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0}.text-sm{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0}.text-xs{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:12px;line-height:18px;letter-spacing:0}.text-weight-regular{font-weight:400;font-style:normal}.text-weight-medium{font-weight:500;font-style:normal}.text-weight-semibold{font-weight:600;font-style:normal}.text-weight-bold{font-weight:700;font-style:normal}@media (max-width: 768px){.text-display-2xl{font-size:48px;line-height:56px}.text-display-xl{font-size:40px;line-height:48px}.text-display-lg{font-size:32px;line-height:40px}}.app-select-container{width:100%;position:relative}.app-select-label{display:flex;align-items:center;gap:4px;margin-bottom:6px;color:#344054}.app-select-label .required-indicator{color:#f04438}.app-select-label.disabled{color:#d0d5dd}.app-select-wrapper{position:relative;width:100%}.app-select-input{width:100%;min-height:44px;padding:10px 14px;box-sizing:border-box;display:flex;align-items:center;gap:8px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;color:#101828;text-align:left;cursor:pointer;transition:all .2s ease}.app-select-input.app-select-search-input{cursor:text}.app-select-input.app-select-search-input .app-select-search-field{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;flex:1;border:none;outline:none;background:transparent;color:#101828;min-width:0}.app-select-input.app-select-search-input .app-select-search-field::placeholder{color:#667085}.app-select-input.app-select-search-input .app-select-search-field:disabled{cursor:not-allowed;color:#667085}.app-select-input:hover:not(:disabled){border-color:#d0d5dd}.app-select-input.focused,.app-select-input:focus{outline:none;border-color:#88c1f1;box-shadow:0 1px 2px #1018280d,0 0 0 4px #e3eefb}.app-select-input:disabled{background:#F9FAFB;border-color:#d0d5dd;cursor:not-allowed;opacity:.6}.app-select-container.error .app-select-input:focus{box-shadow:0 1px 2px #1018280d,0 0 0 4px #fee4e2}.app-select-leading,.app-select-option-leading{display:flex;align-items:center;flex-shrink:0}.app-select-avatar,.app-select-option-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;flex-shrink:0}.app-select-avatar img,.app-select-option-avatar img{width:100%;height:100%;object-fit:cover}.app-select-avatar .avatar-placeholder,.app-select-option-avatar .avatar-placeholder{width:100%;height:100%;background:#F2F4F7;color:#667085;display:flex;align-items:center;justify-content:center;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:12px;line-height:18px;letter-spacing:0;font-weight:600;font-style:normal}.app-select-dot,.app-select-option-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.app-select-value-wrapper{flex:1;display:flex;align-items:center;gap:8px;overflow:hidden}.app-select-value-wrapper .app-select-secondary{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;color:#667085}.app-select-value{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-select-value.placeholder{color:#667085}.app-select-secondary,.app-select-option-secondary{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;color:#667085;white-space:nowrap;flex-shrink:0}.app-select-arrow{margin-left:auto;flex-shrink:0;transition:transform .2s ease}.app-select-arrow.rotated{transform:rotate(180deg)}.app-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:1000;background:#FFFFFF;border:1px solid #EAECF0;border-radius:8px;box-shadow:0 4px 6px -2px #10182808,0 12px 16px -4px #10182814;overflow:hidden;max-height:320px;display:flex;flex-direction:column}.app-select-dropdown.dropdown-up{top:auto;bottom:calc(100% + 4px)}.app-select-dropdown.dropdown-down,.app-select-dropdown.dropdown-auto{top:calc(100% + 4px);bottom:auto}.app-select-search{padding:12px;border-bottom:1px solid #EAECF0;display:flex;align-items:center;gap:8px}.app-select-search .app-select-search-input{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;flex:1;border:none;outline:none;color:#101828}.app-select-search .app-select-search-input::placeholder{color:#667085}.app-select-options{flex:1;overflow-y:auto;padding:4px 0}.app-select-options::-webkit-scrollbar{width:6px}.app-select-options::-webkit-scrollbar-track{background:transparent}.app-select-options::-webkit-scrollbar-thumb{background:#D0D5DD;border-radius:3px}.app-select-no-options{padding:32px 24px;text-align:center;color:#667085;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0}.app-select-option{width:100%;padding:10px 14px;display:flex;align-items:center;gap:8px;background:transparent;border:none;text-align:left;cursor:pointer;transition:background .15s ease}.app-select-option:hover,.app-select-option.selected{background:#F9FAFB}.app-select-option-text-wrapper{flex:1;display:flex;align-items:center;gap:8px;overflow:hidden}.app-select-option-text{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;color:#344054;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-select-option-text.app-select-option-truncate{max-width:200px}.app-select-option-check{margin-left:auto;flex-shrink:0}.app-select-checkbox{display:flex;align-items:center;flex-shrink:0;margin-right:8px}.app-select-checkbox .checkbox-wrapper{margin-bottom:0}.app-select-checkbox .checkbox-content{display:none}.app-select-checkbox .checkbox-input{margin-right:0}.app-select-supporting{margin-top:6px;color:#667085}.app-select-supporting .error-text{color:#f04438}.app-select-container.size-sm .app-select-input{min-height:36px;padding:8px 12px}.app-select-container.error .app-select-input{border-color:#fda29b}.app-select-container.error .app-select-supporting{color:#f04438}.app-select-container.destructive .app-select-input{border-color:#fda29b}.app-select-container.destructive .app-select-input:focus,.app-select-container.destructive .app-select-input.focused{box-shadow:0 1px 2px #1018280d,0 0 0 4px #fee4e2}.app-select-container.disabled .app-select-label,.app-select-container.disabled .app-select-value,.app-select-container.disabled .app-select-arrow,.app-select-container.disabled .app-select-leading zen-icon,.app-select-container.disabled .app-select-search-input zen-icon,.app-select-container.disabled .app-select-secondary,.app-select-container.disabled .app-select-search-field{opacity:.6}.app-select-container.disabled .app-select-input,.app-select-container.disabled .app-select-search-input{background:#F9FAFB;cursor:not-allowed}.app-select-hint{display:flex;align-items:center;gap:4px;margin-top:6px;color:#667085}.app-select-hint .hint-icon{font-size:16px;color:#f04438}.app-select-hint.destructive{color:#f04438}.app-select-option.select-all{border-bottom:1px solid #F2F4F7;margin-bottom:4px;padding-bottom:14px}.app-select-option.add-new-option{color:#136ab6;font-weight:500}.app-select-option.add-new-option:hover{background:#EFF8FF}.app-select-option.remove-option{color:#f04438;font-weight:500}.app-select-option.remove-option:hover{background:#FEF3F2}.app-select-spinner{display:flex;justify-content:center;padding:16px}.app-select-spinner .spinner-small{width:20px;height:20px;border:2px solid #F2F4F7;border-top-color:#136ab6;border-radius:50%;animation:spin .6s linear infinite}.app-select-load-more{padding:8px 14px}.app-select-load-more .app-select-load-more-btn{width:100%;padding:8px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:6px;color:#344054;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0;font-weight:500;font-style:normal;cursor:pointer;transition:all .15s ease}.app-select-load-more .app-select-load-more-btn:hover{background:#F9FAFB;border-color:#667085}@keyframes spin{to{transform:rotate(360deg)}}.app-select-dropdown ::ng-deep zen-groups .zen-groups-inline{display:flex;flex-direction:column;max-height:310px}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree{flex:1;overflow-y:auto;padding:4px 0}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree::-webkit-scrollbar{width:6px}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree::-webkit-scrollbar-track{background:transparent}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree::-webkit-scrollbar-thumb{background:#D0D5DD;border-radius:3px}.app-select-dropdown ::ng-deep zen-groups .action-item-checkbox{padding:10px 14px;font-weight:400;font-size:14px;line-height:20px;color:#344054}.app-select-dropdown ::ng-deep zen-groups .action-item-checkbox:hover{background:#F9FAFB}.app-select-dropdown ::ng-deep zen-groups .select-all{border-bottom:none;margin-bottom:0;font-weight:500}.app-select-dropdown ::ng-deep zen-groups .tree-item[style*=padding-left]{padding-right:14px}.app-select-dropdown ::ng-deep zen-groups .tree-item-badge{background:#f1f7fe;color:#105494}.app-select-dropdown ::ng-deep zen-groups .checkbox-component .app-checkbox-label{font-weight:400;color:#344054}.app-select-dropdown ::ng-deep zen-groups .zen-groups-no-results{padding:32px 24px;text-align:center;color:#667085}@media (max-width: 640px){.app-select-dropdown{position:fixed;inset:auto 0 0;max-height:70vh;border-radius:16px 16px 0 0}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.ZenduCheckboxComponent, selector: "zen-checkbox", inputs: ["checked", "label", "labelColor", "disabled", "disableValueChange", "indeterminate", "imageUrl", "size", "supportingText"], outputs: ["checkedChange"] }, { kind: "component", type: i4.ZenduGroupsComponent, selector: "zen-groups", inputs: ["dataSource", "filteredDataSource", "hideSelectAll", "isSelectedAll", "inline", "width", "placeholder", "hideSearch", "idProp", "displayProp"], outputs: ["isSelectedAllChange", "checkedChange"] }, { kind: "component", type: i5.ZenduIconComponent, selector: "zen-icon", inputs: ["src", "name", "size", "color", "theme", "customColor"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] });
739
751
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduSelectComponent, decorators: [{
740
752
  type: Component,
741
- args: [{ selector: 'zen-select', template: "<div [class]=\"getStateClasses()\">\n <!-- Label -->\n <label class=\"app-select-label text text-sm text-weight-medium\" *ngIf=\"label\"\n [ngClass]=\"{'required': required, 'disabled': disabled, 'destructive': destructive}\">\n {{ label | translate }}\n <span *ngIf=\"required\" class=\"required-indicator\">*</span>\n </label>\n\n <!-- Select Input -->\n <div class=\"app-select-wrapper\">\n <!-- Template Selection Based on Leading Type -->\n <ng-container [ngSwitch]=\"leadingType\">\n <!-- Default Select (no leading element) -->\n <ng-container *ngSwitchCase=\"'default'\">\n <ng-container *ngTemplateOutlet=\"defaultSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Icon Leading Select -->\n <ng-container *ngSwitchCase=\"'icon'\">\n <ng-container *ngTemplateOutlet=\"iconSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Avatar Leading Select -->\n <ng-container *ngSwitchCase=\"'avatar'\">\n <ng-container *ngTemplateOutlet=\"avatarSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Dot Leading Select -->\n <ng-container *ngSwitchCase=\"'dot'\">\n <ng-container *ngTemplateOutlet=\"dotSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Search Input Select -->\n <ng-container *ngSwitchCase=\"'search'\">\n <ng-container *ngTemplateOutlet=\"searchInputTemplate\"></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Dropdown Menu -->\n <div class=\"app-select-dropdown\" \n [ngClass]=\"getDropdownDirectionClass()\"\n *ngIf=\"isOpen\">\n \n <!-- Tree Mode: embed zen-groups inline -->\n <ng-container *ngIf=\"isTreeMode && isMultiselect; else flatList\">\n <zen-groups [inline]=\"true\"\n [dataSource]=\"$any(options)\"\n [filteredDataSource]=\"treeFilteredDataSource\"\n [hideSelectAll]=\"hideSelectAll\"\n [hideSearch]=\"hideTreeSearch\"\n [idProp]=\"idProp\"\n [displayProp]=\"displayProp\"\n [(isSelectedAll)]=\"isSelectedAll\"\n (isSelectedAllChange)=\"onTreeSelectAllChange($event)\"\n (checkedChange)=\"onTreeCheckedChange($event)\">\n </zen-groups>\n </ng-container>\n\n <!-- Flat List Mode (default) -->\n <ng-template #flatList>\n <!-- Search Box for hasSearch (not for search type as it has inline search) -->\n <div class=\"app-select-search\" *ngIf=\"leadingType !== 'search' && hasSearch && !disabled\">\n <zen-icon [name]=\"'search'\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"onSearchChange()\"\n placeholder=\"Search\"\n class=\"app-select-search-input\">\n </div>\n\n <!-- Options List -->\n <div class=\"app-select-options\">\n <!-- Select All Option for Multiselect -->\n <button *ngIf=\"isMultiselect && !hideSelectAll && filteredOptions.length > 0\"\n class=\"app-select-option select-all\"\n (click)=\"toggleSelectAll()\">\n <zen-checkbox class=\"app-select-checkbox\"\n [checked]=\"isAllSelected()\"\n [disableValueChange]=\"true\"\n [label]=\"''\"\n size=\"sm\">\n </zen-checkbox>\n <span class=\"app-select-option-text\">\n Select All\n </span>\n </button>\n\n <div *ngIf=\"filteredOptions.length === 0\" class=\"app-select-no-options\">\n No matching options found\n </div>\n\n <button *ngFor=\"let option of filteredOptions\"\n class=\"app-select-option\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"selectOption(option)\">\n\n <!-- Checkbox for Multiselect -->\n <zen-checkbox class=\"app-select-checkbox\"\n *ngIf=\"isMultiselect\"\n [checked]=\"isSelected(option)\"\n [disableValueChange]=\"true\"\n [label]=\"''\"\n size=\"sm\">\n </zen-checkbox>\n\n <!-- Option Leading Element -->\n <div class=\"app-select-option-leading\" *ngIf=\"leadingType !== 'default'\">\n <ng-container [ngSwitch]=\"leadingType\">\n <ng-container *ngSwitchCase=\"'icon'\">\n <ng-container *ngTemplateOutlet=\"iconLeadingElement; context: { option: option }\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'avatar'\">\n <ng-container *ngTemplateOutlet=\"avatarLeadingElement; context: { option: option }\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'dot'\">\n <ng-container *ngTemplateOutlet=\"dotLeadingElement; context: { option: option }\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Option Text -->\n <div class=\"app-select-option-text-wrapper\">\n <!-- Use custom template if provided -->\n <ng-container *ngIf=\"!isMultiselect && optionTemplate; else defaultOptionText\">\n <ng-template [ngTemplateOutlet]=\"optionTemplate.template\"\n [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-template>\n </ng-container>\n <ng-template #defaultOptionText>\n <span class=\"app-select-option-text\" [class.app-select-option-truncate]=\"isTruncate\">\n {{ getName(option) | translate }}\n </span>\n <span class=\"app-select-option-secondary\" *ngIf=\"option.secondaryText\">\n {{ option.secondaryText }}\n </span>\n </ng-template>\n </div>\n\n <!-- Check Icon for Single Select -->\n <zen-icon *ngIf=\"!isMultiselect && isSelected(option)\"\n class=\"app-select-option-check\"\n [name]=\"'check'\"\n [customColor]=\"'#136AB6'\">\n </zen-icon>\n </button>\n </div>\n </ng-template>\n </div>\n </div>\n \n <!-- Hint text / Error message -->\n <div *ngIf=\"(destructive && errorMessage) || hintText\" \n class=\"app-select-hint text text-sm text-weight-regular\"\n [ngClass]=\"{'destructive': destructive}\">\n <i *ngIf=\"destructive\" class=\"material-icons-outlined hint-icon\">error_outline</i>\n <span>{{ ((destructive && errorMessage) ? errorMessage : hintText) | translate }}</span>\n </div>\n</div>\n\n<!-- ============================================= -->\n<!-- MAIN SELECT INPUT TEMPLATES -->\n<!-- ============================================= -->\n\n<!-- Default Select Template (No Leading Element) -->\n<ng-template #defaultSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Icon Select Template -->\n<ng-template #iconSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <div class=\"app-select-leading\">\n <ng-container *ngTemplateOutlet=\"iconLeadingElement; context: { option: getSelectedOption(), icon: leadingIcon }\"></ng-container>\n </div>\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Avatar Select Template -->\n<ng-template #avatarSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <div class=\"app-select-leading\">\n <ng-container *ngTemplateOutlet=\"avatarLeadingElement; context: { option: getSelectedOption(), avatar: leadingAvatar }\"></ng-container>\n </div>\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Dot Select Template -->\n<ng-template #dotSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <div class=\"app-select-leading\">\n <ng-container *ngTemplateOutlet=\"dotLeadingElement; context: { option: getSelectedOption(), color: leadingDotColor }\"></ng-container>\n </div>\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Search Input Template -->\n<ng-template #searchInputTemplate>\n <div class=\"app-select-input app-select-search-input\"\n [class.focused]=\"isOpen || searchFocused\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <!-- Search Icon -->\n <zen-icon [name]=\"'search'\"\n [customColor]=\"disabled ? '#9CA3AF' : '#667085'\">\n </zen-icon>\n \n <!-- Search Input Field -->\n <input type=\"text\"\n class=\"app-select-search-field\"\n [(ngModel)]=\"searchInputValue\"\n (ngModelChange)=\"onSearchInputChange()\"\n (focus)=\"onSearchFocus()\"\n (blur)=\"onSearchBlur($event)\"\n [placeholder]=\"selectedDisplay || placeholder\"\n [disabled]=\"disabled\">\n </div>\n</ng-template>\n\n<!-- ============================================= -->\n<!-- SHARED COMPONENT TEMPLATES -->\n<!-- ============================================= -->\n\n<!-- Select Value Display -->\n<ng-template #selectValueDisplay>\n <div class=\"app-select-value-wrapper\">\n <span class=\"app-select-value\" [class.placeholder]=\"isModelEmpty()\">\n {{ selectedDisplay || placeholder | translate }}\n </span>\n <span class=\"app-select-secondary\" *ngIf=\"getSelectedSecondaryText() && !isModelEmpty()\">\n {{ getSelectedSecondaryText() }}\n </span>\n </div>\n</ng-template>\n\n<!-- Dropdown Arrow -->\n<ng-template #dropdownArrow>\n <zen-icon class=\"app-select-arrow\" \n [class.rotated]=\"isOpen\" \n [name]=\"'chevron-down'\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n</ng-template>\n\n<!-- ============================================= -->\n<!-- LEADING ELEMENT TEMPLATES -->\n<!-- ============================================= -->\n\n<!-- Icon Leading Element (with smart resolution) -->\n<ng-template #iconLeadingElement let-option=\"option\" let-icon=\"icon\">\n <ng-container *ngIf=\"icon || option?.icon || option?.iconName\">\n <ng-container *ngIf=\"getIconPath(option, icon) as iconPath\">\n <!-- If icon contains / or . treat as SVG path -->\n <ng-container *ngIf=\"(icon && (icon.includes('/') || icon.includes('.'))) || \n (option?.icon && (option.icon.includes('/') || option.icon.includes('.'))) ||\n (option?.iconName && (option.iconName.includes('/') || option.iconName.includes('.')))\">\n <!-- Use img tag for Excel to preserve colors -->\n <img *ngIf=\"iconPath.includes('excel')\" \n [src]=\"iconPath\" \n alt=\"\"\n style=\"width: 20px; height: 20px;\">\n <!-- Use zen-icon with src for other SVG files -->\n <zen-icon *ngIf=\"!iconPath.includes('excel')\"\n [src]=\"iconPath\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n </ng-container>\n <!-- Otherwise treat as Material icon name or special cases -->\n <ng-container *ngIf=\"!((icon && (icon.includes('/') || icon.includes('.'))) || \n (option?.icon && (option.icon.includes('/') || option.icon.includes('.'))) ||\n (option?.iconName && (option.iconName.includes('/') || option.iconName.includes('.'))))\">\n <!-- Special case for Excel icon - use img to preserve colors -->\n <img *ngIf=\"(icon === 'excel') || (option?.icon === 'excel') || (option?.iconName === 'excel')\"\n src=\"assets/ng-zenduit/icons/excel.svg\"\n alt=\"Excel\"\n style=\"width: 20px; height: 20px;\">\n <!-- Material icon names -->\n <zen-icon *ngIf=\"(icon !== 'excel') && (option?.icon !== 'excel') && (option?.iconName !== 'excel')\"\n [name]=\"icon || option?.icon || option?.iconName\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<!-- Avatar Leading Element -->\n<ng-template #avatarLeadingElement let-option=\"option\" let-avatar=\"avatar\">\n <div class=\"app-select-avatar\" *ngIf=\"avatar || option?.avatar\" >\n <img [src]=\"avatar || option?.avatar\" alt=\"\">\n </div>\n</ng-template>\n\n<!-- Dot Leading Element -->\n<ng-template #dotLeadingElement let-option=\"option\" let-color=\"color\">\n <div class=\"app-select-dot\"\n [style.background-color]=\"color || option?.dotColor || '#10B981'\">\n </div>\n</ng-template>", styles: [".text{margin:0;padding:0;color:#101828}.text-display-2xl{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:72px;line-height:90px;letter-spacing:-.02em}.text-display-xl{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:60px;line-height:72px;letter-spacing:-.02em}.text-display-lg{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:48px;line-height:60px;letter-spacing:-.02em}.text-display-md{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:36px;line-height:44px;letter-spacing:-.02em}.text-display-sm{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:30px;line-height:38px;letter-spacing:0}.text-display-xs{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:24px;line-height:32px;letter-spacing:0}.text-xl{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:20px;line-height:30px;letter-spacing:0}.text-lg{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:18px;line-height:28px;letter-spacing:0}.text-md{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0}.text-sm{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0}.text-xs{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:12px;line-height:18px;letter-spacing:0}.text-weight-regular{font-weight:400;font-style:normal}.text-weight-medium{font-weight:500;font-style:normal}.text-weight-semibold{font-weight:600;font-style:normal}.text-weight-bold{font-weight:700;font-style:normal}@media (max-width: 768px){.text-display-2xl{font-size:48px;line-height:56px}.text-display-xl{font-size:40px;line-height:48px}.text-display-lg{font-size:32px;line-height:40px}}.app-select-container{width:100%;position:relative}.app-select-label{display:flex;align-items:center;gap:4px;margin-bottom:6px;color:#344054}.app-select-label .required-indicator{color:#f04438}.app-select-label.disabled{color:#d0d5dd}.app-select-wrapper{position:relative;width:100%}.app-select-input{width:100%;min-height:44px;padding:10px 14px;box-sizing:border-box;display:flex;align-items:center;gap:8px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;color:#101828;text-align:left;cursor:pointer;transition:all .2s ease}.app-select-input.app-select-search-input{cursor:text}.app-select-input.app-select-search-input .app-select-search-field{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;flex:1;border:none;outline:none;background:transparent;color:#101828;min-width:0}.app-select-input.app-select-search-input .app-select-search-field::placeholder{color:#667085}.app-select-input.app-select-search-input .app-select-search-field:disabled{cursor:not-allowed;color:#667085}.app-select-input:hover:not(:disabled){border-color:#d0d5dd}.app-select-input.focused,.app-select-input:focus{outline:none;border-color:#88c1f1;box-shadow:0 1px 2px #1018280d,0 0 0 4px #e3eefb}.app-select-input:disabled{background:#F9FAFB;border-color:#d0d5dd;cursor:not-allowed;opacity:.6}.app-select-container.error .app-select-input:focus{box-shadow:0 1px 2px #1018280d,0 0 0 4px #fee4e2}.app-select-leading,.app-select-option-leading{display:flex;align-items:center;flex-shrink:0}.app-select-avatar,.app-select-option-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;flex-shrink:0}.app-select-avatar img,.app-select-option-avatar img{width:100%;height:100%;object-fit:cover}.app-select-avatar .avatar-placeholder,.app-select-option-avatar .avatar-placeholder{width:100%;height:100%;background:#F2F4F7;color:#667085;display:flex;align-items:center;justify-content:center;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:12px;line-height:18px;letter-spacing:0;font-weight:600;font-style:normal}.app-select-dot,.app-select-option-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.app-select-value-wrapper{flex:1;display:flex;align-items:center;gap:8px;overflow:hidden}.app-select-value-wrapper .app-select-secondary{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;color:#667085}.app-select-value{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-select-value.placeholder{color:#667085}.app-select-secondary,.app-select-option-secondary{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;color:#667085;white-space:nowrap;flex-shrink:0}.app-select-arrow{margin-left:auto;flex-shrink:0;transition:transform .2s ease}.app-select-arrow.rotated{transform:rotate(180deg)}.app-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:1000;background:#FFFFFF;border:1px solid #EAECF0;border-radius:8px;box-shadow:0 4px 6px -2px #10182808,0 12px 16px -4px #10182814;overflow:hidden;max-height:320px;display:flex;flex-direction:column}.app-select-dropdown.dropdown-up{top:auto;bottom:calc(100% + 4px)}.app-select-dropdown.dropdown-down,.app-select-dropdown.dropdown-auto{top:calc(100% + 4px);bottom:auto}.app-select-search{padding:12px;border-bottom:1px solid #EAECF0;display:flex;align-items:center;gap:8px}.app-select-search .app-select-search-input{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;flex:1;border:none;outline:none;color:#101828}.app-select-search .app-select-search-input::placeholder{color:#667085}.app-select-options{flex:1;overflow-y:auto;padding:4px 0}.app-select-options::-webkit-scrollbar{width:6px}.app-select-options::-webkit-scrollbar-track{background:transparent}.app-select-options::-webkit-scrollbar-thumb{background:#D0D5DD;border-radius:3px}.app-select-no-options{padding:32px 24px;text-align:center;color:#667085;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0}.app-select-option{width:100%;padding:10px 14px;display:flex;align-items:center;gap:8px;background:transparent;border:none;text-align:left;cursor:pointer;transition:background .15s ease}.app-select-option:hover,.app-select-option.selected{background:#F9FAFB}.app-select-option-text-wrapper{flex:1;display:flex;align-items:center;gap:8px;overflow:hidden}.app-select-option-text{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;color:#344054;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-select-option-text.app-select-option-truncate{max-width:200px}.app-select-option-check{margin-left:auto;flex-shrink:0}.app-select-checkbox{display:flex;align-items:center;flex-shrink:0;margin-right:8px}.app-select-checkbox .checkbox-wrapper{margin-bottom:0}.app-select-checkbox .checkbox-content{display:none}.app-select-checkbox .checkbox-input{margin-right:0}.app-select-supporting{margin-top:6px;color:#667085}.app-select-supporting .error-text{color:#f04438}.app-select-container.size-sm .app-select-input{min-height:36px;padding:8px 12px}.app-select-container.error .app-select-input{border-color:#fda29b}.app-select-container.error .app-select-supporting{color:#f04438}.app-select-container.destructive .app-select-input{border-color:#fda29b}.app-select-container.destructive .app-select-input:focus,.app-select-container.destructive .app-select-input.focused{box-shadow:0 1px 2px #1018280d,0 0 0 4px #fee4e2}.app-select-container.disabled .app-select-label,.app-select-container.disabled .app-select-value,.app-select-container.disabled .app-select-arrow,.app-select-container.disabled .app-select-leading zen-icon,.app-select-container.disabled .app-select-search-input zen-icon,.app-select-container.disabled .app-select-secondary,.app-select-container.disabled .app-select-search-field{opacity:.6}.app-select-container.disabled .app-select-input,.app-select-container.disabled .app-select-search-input{background:#F9FAFB;cursor:not-allowed}.app-select-hint{display:flex;align-items:center;gap:4px;margin-top:6px;color:#667085}.app-select-hint .hint-icon{font-size:16px;color:#f04438}.app-select-hint.destructive{color:#f04438}.app-select-option.select-all{border-bottom:1px solid #F2F4F7;margin-bottom:4px;padding-bottom:14px}.app-select-option.add-new-option{color:#136ab6;font-weight:500}.app-select-option.add-new-option:hover{background:#EFF8FF}.app-select-option.remove-option{color:#f04438;font-weight:500}.app-select-option.remove-option:hover{background:#FEF3F2}.app-select-spinner{display:flex;justify-content:center;padding:16px}.app-select-spinner .spinner-small{width:20px;height:20px;border:2px solid #F2F4F7;border-top-color:#136ab6;border-radius:50%;animation:spin .6s linear infinite}.app-select-load-more{padding:8px 14px}.app-select-load-more .app-select-load-more-btn{width:100%;padding:8px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:6px;color:#344054;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0;font-weight:500;font-style:normal;cursor:pointer;transition:all .15s ease}.app-select-load-more .app-select-load-more-btn:hover{background:#F9FAFB;border-color:#667085}@keyframes spin{to{transform:rotate(360deg)}}.app-select-dropdown ::ng-deep zen-groups .zen-groups-inline{display:flex;flex-direction:column;max-height:310px}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree{flex:1;overflow-y:auto;padding:4px 0}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree::-webkit-scrollbar{width:6px}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree::-webkit-scrollbar-track{background:transparent}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree::-webkit-scrollbar-thumb{background:#D0D5DD;border-radius:3px}.app-select-dropdown ::ng-deep zen-groups .action-item-checkbox{padding:10px 14px;font-weight:400;font-size:14px;line-height:20px;color:#344054}.app-select-dropdown ::ng-deep zen-groups .action-item-checkbox:hover{background:#F9FAFB}.app-select-dropdown ::ng-deep zen-groups .select-all{border-bottom:none;margin-bottom:0;font-weight:500}.app-select-dropdown ::ng-deep zen-groups .tree-item[style*=padding-left]{padding-right:14px}.app-select-dropdown ::ng-deep zen-groups .tree-item-badge{background:#f1f7fe;color:#105494}.app-select-dropdown ::ng-deep zen-groups .checkbox-component .app-checkbox-label{font-weight:400;color:#344054}.app-select-dropdown ::ng-deep zen-groups .zen-groups-no-results{padding:32px 24px;text-align:center;color:#667085}@media (max-width: 640px){.app-select-dropdown{position:fixed;inset:auto 0 0;max-height:70vh;border-radius:16px 16px 0 0}}\n"] }]
753
+ args: [{ selector: 'zen-select', template: "<div [class]=\"getStateClasses()\">\n <!-- Label -->\n <label class=\"app-select-label text text-sm text-weight-medium\" *ngIf=\"label\"\n [ngClass]=\"{'required': required, 'disabled': disabled, 'destructive': destructive}\">\n {{ label | translate }}\n <span *ngIf=\"required\" class=\"required-indicator\">*</span>\n </label>\n\n <!-- Select Input -->\n <div class=\"app-select-wrapper\">\n <!-- Template Selection Based on Leading Type -->\n <ng-container [ngSwitch]=\"leadingType\">\n <!-- Default Select (no leading element) -->\n <ng-container *ngSwitchCase=\"'default'\">\n <ng-container *ngTemplateOutlet=\"defaultSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Icon Leading Select -->\n <ng-container *ngSwitchCase=\"'icon'\">\n <ng-container *ngTemplateOutlet=\"iconSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Avatar Leading Select -->\n <ng-container *ngSwitchCase=\"'avatar'\">\n <ng-container *ngTemplateOutlet=\"avatarSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Dot Leading Select -->\n <ng-container *ngSwitchCase=\"'dot'\">\n <ng-container *ngTemplateOutlet=\"dotSelectTemplate\"></ng-container>\n </ng-container>\n \n <!-- Search Input Select -->\n <ng-container *ngSwitchCase=\"'search'\">\n <ng-container *ngTemplateOutlet=\"searchInputTemplate\"></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Dropdown Menu -->\n <div class=\"app-select-dropdown\" \n [ngClass]=\"getDropdownDirectionClass()\"\n *ngIf=\"isOpen\">\n \n <!-- Tree Mode: embed zen-groups inline -->\n <ng-container *ngIf=\"isTreeMode && isMultiselect; else flatList\">\n <zen-groups [inline]=\"true\"\n [dataSource]=\"$any(options)\"\n [filteredDataSource]=\"treeFilteredDataSource\"\n [hideSelectAll]=\"hideSelectAll\"\n [hideSearch]=\"hideTreeSearch\"\n [idProp]=\"idProp\"\n [displayProp]=\"displayProp\"\n [(isSelectedAll)]=\"isSelectedAll\"\n (isSelectedAllChange)=\"onTreeSelectAllChange($event)\"\n (checkedChange)=\"onTreeCheckedChange($event)\">\n </zen-groups>\n </ng-container>\n\n <!-- Flat List Mode (default) -->\n <ng-template #flatList>\n <!-- Search Box for hasSearch (not for search type as it has inline search) -->\n <div class=\"app-select-search\" *ngIf=\"leadingType !== 'search' && hasSearch && !disabled\">\n <zen-icon [name]=\"'search'\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"onSearchChange()\"\n (keydown.enter)=\"onSearchEnter($event)\"\n placeholder=\"Search\"\n class=\"app-select-search-input\">\n </div>\n\n <!-- Options List -->\n <div class=\"app-select-options\">\n <!-- Select All Option for Multiselect -->\n <button *ngIf=\"isMultiselect && !hideSelectAll && filteredOptions.length > 0\"\n class=\"app-select-option select-all\"\n (click)=\"toggleSelectAll()\">\n <zen-checkbox class=\"app-select-checkbox\"\n [checked]=\"isAllSelected()\"\n [disableValueChange]=\"true\"\n [label]=\"''\"\n size=\"sm\">\n </zen-checkbox>\n <span class=\"app-select-option-text\">\n Select All\n </span>\n </button>\n\n <!-- Add New Option -->\n <button *ngIf=\"enableAddNewOption && (showDefaultAddOption || searchText)\"\n class=\"app-select-option add-new-option\"\n (click)=\"handleAddNewOption(); $event.stopPropagation()\">\n <zen-icon [name]=\"'plus'\" [customColor]=\"'#136AB6'\"></zen-icon>\n <span class=\"app-select-option-text\">\n {{ (newOptionText || 'Add New Option') + (searchText ? ': \"' + searchText + '\"' : '') }}\n </span>\n </button>\n\n <div *ngIf=\"filteredOptions.length === 0 && !enableAddNewOption\" class=\"app-select-no-options\">\n No matching options found\n </div>\n\n <button *ngFor=\"let option of filteredOptions\"\n class=\"app-select-option\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"selectOption(option)\">\n\n <!-- Checkbox for Multiselect -->\n <zen-checkbox class=\"app-select-checkbox\"\n *ngIf=\"isMultiselect\"\n [checked]=\"isSelected(option)\"\n [disableValueChange]=\"true\"\n [label]=\"''\"\n size=\"sm\">\n </zen-checkbox>\n\n <!-- Option Leading Element -->\n <div class=\"app-select-option-leading\" *ngIf=\"leadingType !== 'default'\">\n <ng-container [ngSwitch]=\"leadingType\">\n <ng-container *ngSwitchCase=\"'icon'\">\n <ng-container *ngTemplateOutlet=\"iconLeadingElement; context: { option: option }\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'avatar'\">\n <ng-container *ngTemplateOutlet=\"avatarLeadingElement; context: { option: option }\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'dot'\">\n <ng-container *ngTemplateOutlet=\"dotLeadingElement; context: { option: option }\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n\n <!-- Option Text -->\n <div class=\"app-select-option-text-wrapper\">\n <!-- Use custom template if provided -->\n <ng-container *ngIf=\"!isMultiselect && optionTemplate; else defaultOptionText\">\n <ng-template [ngTemplateOutlet]=\"optionTemplate.template\"\n [ngTemplateOutletContext]=\"{ option: option }\">\n </ng-template>\n </ng-container>\n <ng-template #defaultOptionText>\n <span class=\"app-select-option-text\" [class.app-select-option-truncate]=\"isTruncate\">\n {{ getName(option) | translate }}\n </span>\n <span class=\"app-select-option-secondary\" *ngIf=\"option.secondaryText\">\n {{ option.secondaryText }}\n </span>\n </ng-template>\n </div>\n\n <!-- Check Icon for Single Select -->\n <zen-icon *ngIf=\"!isMultiselect && isSelected(option)\"\n class=\"app-select-option-check\"\n [name]=\"'check'\"\n [customColor]=\"'#136AB6'\">\n </zen-icon>\n </button>\n </div>\n </ng-template>\n </div>\n </div>\n \n <!-- Hint text / Error message -->\n <div *ngIf=\"(destructive && errorMessage) || hintText\" \n class=\"app-select-hint text text-sm text-weight-regular\"\n [ngClass]=\"{'destructive': destructive}\">\n <i *ngIf=\"destructive\" class=\"material-icons-outlined hint-icon\">error_outline</i>\n <span>{{ ((destructive && errorMessage) ? errorMessage : hintText) | translate }}</span>\n </div>\n</div>\n\n<!-- ============================================= -->\n<!-- MAIN SELECT INPUT TEMPLATES -->\n<!-- ============================================= -->\n\n<!-- Default Select Template (No Leading Element) -->\n<ng-template #defaultSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Icon Select Template -->\n<ng-template #iconSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <div class=\"app-select-leading\">\n <ng-container *ngTemplateOutlet=\"iconLeadingElement; context: { option: getSelectedOption(), icon: leadingIcon }\"></ng-container>\n </div>\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Avatar Select Template -->\n<ng-template #avatarSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <div class=\"app-select-leading\">\n <ng-container *ngTemplateOutlet=\"avatarLeadingElement; context: { option: getSelectedOption(), avatar: leadingAvatar }\"></ng-container>\n </div>\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Dot Select Template -->\n<ng-template #dotSelectTemplate>\n <button class=\"app-select-input\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown()\"\n [class.focused]=\"isOpen\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <div class=\"app-select-leading\">\n <ng-container *ngTemplateOutlet=\"dotLeadingElement; context: { option: getSelectedOption(), color: leadingDotColor }\"></ng-container>\n </div>\n \n <ng-container *ngTemplateOutlet=\"selectValueDisplay\"></ng-container>\n <ng-container *ngTemplateOutlet=\"dropdownArrow\"></ng-container>\n </button>\n</ng-template>\n\n<!-- Search Input Template -->\n<ng-template #searchInputTemplate>\n <div class=\"app-select-input app-select-search-input\"\n [class.focused]=\"isOpen || searchFocused\"\n [class.has-value]=\"!isModelEmpty()\">\n \n <!-- Search Icon -->\n <zen-icon [name]=\"'search'\"\n [customColor]=\"disabled ? '#9CA3AF' : '#667085'\">\n </zen-icon>\n \n <!-- Search Input Field -->\n <input type=\"text\"\n class=\"app-select-search-field\"\n [(ngModel)]=\"searchInputValue\"\n (ngModelChange)=\"onSearchInputChange()\"\n (keydown.enter)=\"onSearchEnter($event)\"\n (focus)=\"onSearchFocus()\"\n (blur)=\"onSearchBlur($event)\"\n [placeholder]=\"selectedDisplay || placeholder\"\n [disabled]=\"disabled\">\n </div>\n</ng-template>\n\n<!-- ============================================= -->\n<!-- SHARED COMPONENT TEMPLATES -->\n<!-- ============================================= -->\n\n<!-- Select Value Display -->\n<ng-template #selectValueDisplay>\n <div class=\"app-select-value-wrapper\">\n <span class=\"app-select-value\" [class.placeholder]=\"isModelEmpty()\">\n {{ selectedDisplay || placeholder | translate }}\n </span>\n <span class=\"app-select-secondary\" *ngIf=\"getSelectedSecondaryText() && !isModelEmpty()\">\n {{ getSelectedSecondaryText() }}\n </span>\n </div>\n</ng-template>\n\n<!-- Dropdown Arrow -->\n<ng-template #dropdownArrow>\n <zen-icon class=\"app-select-arrow\" \n [class.rotated]=\"isOpen\" \n [name]=\"'chevron-down'\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n</ng-template>\n\n<!-- ============================================= -->\n<!-- LEADING ELEMENT TEMPLATES -->\n<!-- ============================================= -->\n\n<!-- Icon Leading Element (with smart resolution) -->\n<ng-template #iconLeadingElement let-option=\"option\" let-icon=\"icon\">\n <ng-container *ngIf=\"icon || option?.icon || option?.iconName\">\n <ng-container *ngIf=\"getIconPath(option, icon) as iconPath\">\n <!-- If icon contains / or . treat as SVG path -->\n <ng-container *ngIf=\"(icon && (icon.includes('/') || icon.includes('.'))) || \n (option?.icon && (option.icon.includes('/') || option.icon.includes('.'))) ||\n (option?.iconName && (option.iconName.includes('/') || option.iconName.includes('.')))\">\n <!-- Use img tag for Excel to preserve colors -->\n <img *ngIf=\"iconPath.includes('excel')\" \n [src]=\"iconPath\" \n alt=\"\"\n style=\"width: 20px; height: 20px;\">\n <!-- Use zen-icon with src for other SVG files -->\n <zen-icon *ngIf=\"!iconPath.includes('excel')\"\n [src]=\"iconPath\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n </ng-container>\n <!-- Otherwise treat as Material icon name or special cases -->\n <ng-container *ngIf=\"!((icon && (icon.includes('/') || icon.includes('.'))) || \n (option?.icon && (option.icon.includes('/') || option.icon.includes('.'))) ||\n (option?.iconName && (option.iconName.includes('/') || option.iconName.includes('.'))))\">\n <!-- Special case for Excel icon - use img to preserve colors -->\n <img *ngIf=\"(icon === 'excel') || (option?.icon === 'excel') || (option?.iconName === 'excel')\"\n src=\"assets/ng-zenduit/icons/excel.svg\"\n alt=\"Excel\"\n style=\"width: 20px; height: 20px;\">\n <!-- Material icon names -->\n <zen-icon *ngIf=\"(icon !== 'excel') && (option?.icon !== 'excel') && (option?.iconName !== 'excel')\"\n [name]=\"icon || option?.icon || option?.iconName\"\n [customColor]=\"'#667085'\">\n </zen-icon>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<!-- Avatar Leading Element -->\n<ng-template #avatarLeadingElement let-option=\"option\" let-avatar=\"avatar\">\n <div class=\"app-select-avatar\" *ngIf=\"avatar || option?.avatar\" >\n <img [src]=\"avatar || option?.avatar\" alt=\"\">\n </div>\n</ng-template>\n\n<!-- Dot Leading Element -->\n<ng-template #dotLeadingElement let-option=\"option\" let-color=\"color\">\n <div class=\"app-select-dot\"\n [style.background-color]=\"color || option?.dotColor || '#10B981'\">\n </div>\n</ng-template>", styles: [".text{margin:0;padding:0;color:#101828}.text-display-2xl{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:72px;line-height:90px;letter-spacing:-.02em}.text-display-xl{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:60px;line-height:72px;letter-spacing:-.02em}.text-display-lg{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:48px;line-height:60px;letter-spacing:-.02em}.text-display-md{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:36px;line-height:44px;letter-spacing:-.02em}.text-display-sm{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:30px;line-height:38px;letter-spacing:0}.text-display-xs{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:24px;line-height:32px;letter-spacing:0}.text-xl{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:20px;line-height:30px;letter-spacing:0}.text-lg{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:18px;line-height:28px;letter-spacing:0}.text-md{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0}.text-sm{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0}.text-xs{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:12px;line-height:18px;letter-spacing:0}.text-weight-regular{font-weight:400;font-style:normal}.text-weight-medium{font-weight:500;font-style:normal}.text-weight-semibold{font-weight:600;font-style:normal}.text-weight-bold{font-weight:700;font-style:normal}@media (max-width: 768px){.text-display-2xl{font-size:48px;line-height:56px}.text-display-xl{font-size:40px;line-height:48px}.text-display-lg{font-size:32px;line-height:40px}}.app-select-container{width:100%;position:relative}.app-select-label{display:flex;align-items:center;gap:4px;margin-bottom:6px;color:#344054}.app-select-label .required-indicator{color:#f04438}.app-select-label.disabled{color:#d0d5dd}.app-select-wrapper{position:relative;width:100%}.app-select-input{width:100%;min-height:44px;padding:10px 14px;box-sizing:border-box;display:flex;align-items:center;gap:8px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;color:#101828;text-align:left;cursor:pointer;transition:all .2s ease}.app-select-input.app-select-search-input{cursor:text}.app-select-input.app-select-search-input .app-select-search-field{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;flex:1;border:none;outline:none;background:transparent;color:#101828;min-width:0}.app-select-input.app-select-search-input .app-select-search-field::placeholder{color:#667085}.app-select-input.app-select-search-input .app-select-search-field:disabled{cursor:not-allowed;color:#667085}.app-select-input:hover:not(:disabled){border-color:#d0d5dd}.app-select-input.focused,.app-select-input:focus{outline:none;border-color:#88c1f1;box-shadow:0 1px 2px #1018280d,0 0 0 4px #e3eefb}.app-select-input:disabled{background:#F9FAFB;border-color:#d0d5dd;cursor:not-allowed;opacity:.6}.app-select-container.error .app-select-input:focus{box-shadow:0 1px 2px #1018280d,0 0 0 4px #fee4e2}.app-select-leading,.app-select-option-leading{display:flex;align-items:center;flex-shrink:0}.app-select-avatar,.app-select-option-avatar{width:24px;height:24px;border-radius:50%;overflow:hidden;flex-shrink:0}.app-select-avatar img,.app-select-option-avatar img{width:100%;height:100%;object-fit:cover}.app-select-avatar .avatar-placeholder,.app-select-option-avatar .avatar-placeholder{width:100%;height:100%;background:#F2F4F7;color:#667085;display:flex;align-items:center;justify-content:center;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:12px;line-height:18px;letter-spacing:0;font-weight:600;font-style:normal}.app-select-dot,.app-select-option-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.app-select-value-wrapper{flex:1;display:flex;align-items:center;gap:8px;overflow:hidden}.app-select-value-wrapper .app-select-secondary{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;color:#667085}.app-select-value{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-select-value.placeholder{color:#667085}.app-select-secondary,.app-select-option-secondary{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;color:#667085;white-space:nowrap;flex-shrink:0}.app-select-arrow{margin-left:auto;flex-shrink:0;transition:transform .2s ease}.app-select-arrow.rotated{transform:rotate(180deg)}.app-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:1000;background:#FFFFFF;border:1px solid #EAECF0;border-radius:8px;box-shadow:0 4px 6px -2px #10182808,0 12px 16px -4px #10182814;overflow:hidden;max-height:320px;display:flex;flex-direction:column}.app-select-dropdown.dropdown-up{top:auto;bottom:calc(100% + 4px)}.app-select-dropdown.dropdown-down,.app-select-dropdown.dropdown-auto{top:calc(100% + 4px);bottom:auto}.app-select-search{padding:12px;border-bottom:1px solid #EAECF0;display:flex;align-items:center;gap:8px}.app-select-search .app-select-search-input{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;flex:1;border:none;outline:none;color:#101828}.app-select-search .app-select-search-input::placeholder{color:#667085}.app-select-options{flex:1;overflow-y:auto;padding:4px 0}.app-select-options::-webkit-scrollbar{width:6px}.app-select-options::-webkit-scrollbar-track{background:transparent}.app-select-options::-webkit-scrollbar-thumb{background:#D0D5DD;border-radius:3px}.app-select-no-options{padding:32px 24px;text-align:center;color:#667085;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0}.app-select-option{width:100%;padding:10px 14px;display:flex;align-items:center;gap:8px;background:transparent;border:none;text-align:left;cursor:pointer;transition:background .15s ease}.app-select-option:hover,.app-select-option.selected{background:#F9FAFB}.app-select-option-text-wrapper{flex:1;display:flex;align-items:center;gap:8px;overflow:hidden}.app-select-option-text{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;line-height:24px;letter-spacing:0;font-weight:400;font-style:normal;color:#344054;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-select-option-text.app-select-option-truncate{max-width:200px}.app-select-option-check{margin-left:auto;flex-shrink:0}.app-select-checkbox{display:flex;align-items:center;flex-shrink:0;margin-right:8px}.app-select-checkbox .checkbox-wrapper{margin-bottom:0}.app-select-checkbox .checkbox-content{display:none}.app-select-checkbox .checkbox-input{margin-right:0}.app-select-supporting{margin-top:6px;color:#667085}.app-select-supporting .error-text{color:#f04438}.app-select-container.size-sm .app-select-input{min-height:36px;padding:8px 12px}.app-select-container.error .app-select-input{border-color:#fda29b}.app-select-container.error .app-select-supporting{color:#f04438}.app-select-container.destructive .app-select-input{border-color:#fda29b}.app-select-container.destructive .app-select-input:focus,.app-select-container.destructive .app-select-input.focused{box-shadow:0 1px 2px #1018280d,0 0 0 4px #fee4e2}.app-select-container.disabled .app-select-label,.app-select-container.disabled .app-select-value,.app-select-container.disabled .app-select-arrow,.app-select-container.disabled .app-select-leading zen-icon,.app-select-container.disabled .app-select-search-input zen-icon,.app-select-container.disabled .app-select-secondary,.app-select-container.disabled .app-select-search-field{opacity:.6}.app-select-container.disabled .app-select-input,.app-select-container.disabled .app-select-search-input{background:#F9FAFB;cursor:not-allowed}.app-select-hint{display:flex;align-items:center;gap:4px;margin-top:6px;color:#667085}.app-select-hint .hint-icon{font-size:16px;color:#f04438}.app-select-hint.destructive{color:#f04438}.app-select-option.select-all{border-bottom:1px solid #F2F4F7;margin-bottom:4px;padding-bottom:14px}.app-select-option.add-new-option{color:#136ab6;font-weight:500}.app-select-option.add-new-option:hover{background:#EFF8FF}.app-select-option.remove-option{color:#f04438;font-weight:500}.app-select-option.remove-option:hover{background:#FEF3F2}.app-select-spinner{display:flex;justify-content:center;padding:16px}.app-select-spinner .spinner-small{width:20px;height:20px;border:2px solid #F2F4F7;border-top-color:#136ab6;border-radius:50%;animation:spin .6s linear infinite}.app-select-load-more{padding:8px 14px}.app-select-load-more .app-select-load-more-btn{width:100%;padding:8px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:6px;color:#344054;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:14px;line-height:20px;letter-spacing:0;font-weight:500;font-style:normal;cursor:pointer;transition:all .15s ease}.app-select-load-more .app-select-load-more-btn:hover{background:#F9FAFB;border-color:#667085}@keyframes spin{to{transform:rotate(360deg)}}.app-select-dropdown ::ng-deep zen-groups .zen-groups-inline{display:flex;flex-direction:column;max-height:310px}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree{flex:1;overflow-y:auto;padding:4px 0}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree::-webkit-scrollbar{width:6px}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree::-webkit-scrollbar-track{background:transparent}.app-select-dropdown ::ng-deep zen-groups .zen-groups-tree::-webkit-scrollbar-thumb{background:#D0D5DD;border-radius:3px}.app-select-dropdown ::ng-deep zen-groups .action-item-checkbox{padding:10px 14px;font-weight:400;font-size:14px;line-height:20px;color:#344054}.app-select-dropdown ::ng-deep zen-groups .action-item-checkbox:hover{background:#F9FAFB}.app-select-dropdown ::ng-deep zen-groups .select-all{border-bottom:none;margin-bottom:0;font-weight:500}.app-select-dropdown ::ng-deep zen-groups .tree-item[style*=padding-left]{padding-right:14px}.app-select-dropdown ::ng-deep zen-groups .tree-item-badge{background:#f1f7fe;color:#105494}.app-select-dropdown ::ng-deep zen-groups .checkbox-component .app-checkbox-label{font-weight:400;color:#344054}.app-select-dropdown ::ng-deep zen-groups .zen-groups-no-results{padding:32px 24px;text-align:center;color:#667085}@media (max-width: 640px){.app-select-dropdown{position:fixed;inset:auto 0 0;max-height:70vh;border-radius:16px 16px 0 0}}\n"] }]
742
754
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { selectModel: [{
743
755
  type: Input
744
756
  }], selectModelChange: [{
@@ -826,4 +838,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
826
838
  type: HostListener,
827
839
  args: ['document:click', ['$event']]
828
840
  }] } });
829
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9zZWxlY3QvemVuZHUtc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9zZWxlY3QvemVuZHUtc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFxQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0ksT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDckYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7Ozs7O0FBcUR2RixNQUFNLE9BQU8sb0JBQW9CO0lBeU8vQixZQUFvQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBbE8xQzs7V0FFRztRQUNPLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFlLENBQUM7UUFFOUQ7O1dBRUc7UUFDTSxZQUFPLEdBQTJCLEVBQUUsQ0FBQztRQVk5Qzs7V0FFRztRQUNNLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFFdkI7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLFFBQVEsQ0FBQztRQUVoQzs7V0FFRztRQUNNLGdCQUFXLEdBQXFELFNBQVMsQ0FBQztRQWlCbkY7O1dBRUc7UUFDTSxnQkFBVyxHQUFXLE1BQU0sQ0FBQztRQUV0Qzs7V0FFRztRQUNNLFdBQU0sR0FBVyxJQUFJLENBQUM7UUFFL0I7O1dBRUc7UUFDTSxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRTNCOztXQUVHO1FBQ00sa0JBQWEsR0FB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QUFLO2dCQWdCRyxhQUFhO3NCQUFyQixLQUFLO2dCQUtHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFLRyxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQU1HLFlBQVk7c0JBQXBCLEtBQUs7Z0JBTUcsVUFBVTtzQkFBbEIsS0FBSztnQkFLRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBS0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUtHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0ksWUFBWTtzQkFBckIsTUFBTTtnQkFLRSxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBS0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUtHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFLRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBS0ksWUFBWTtzQkFBckIsTUFBTTtnQkFLRyxNQUFNO3NCQUFmLE1BQU07Z0JBdUJtQyxjQUFjO3NCQUF2RCxZQUFZO3VCQUFDLDBCQUEwQjtnQkFLQyxhQUFhO3NCQUFyRCxZQUFZO3VCQUFDLHlCQUF5QjtnQkFLRyxjQUFjO3NCQUF2RCxZQUFZO3VCQUFDLDBCQUEwQjtnQkFrZnhDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24sIENvbnRlbnRDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgWmVuZHVTZWxlY3RPcHRpb25EaXJlY3RpdmUgfSBmcm9tICcuL3RlbXBsYXRlcy96ZW5kdS1zZWxlY3Qtb3B0aW9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBaZW5kdVNlbGVjdFZhbHVlRGlyZWN0aXZlIH0gZnJvbSAnLi90ZW1wbGF0ZXMvemVuZHUtc2VsZWN0LXZhbHVlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBaZW5kdVNlbGVjdEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4vdGVtcGxhdGVzL3plbmR1LXNlbGVjdC1idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuLi9maWx0ZXIvZmlsdGVyc0NvbmZpZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF6eUxvYWRlclNlYXJjaCB7XG4gIHRleHQ/OiBzdHJpbmc7XG4gIGlkcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhenlMb2FkZXJSZXN1bHQge1xuICBpZDogc3RyaW5nIHwgbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nIHwgbnVtYmVyOyAgLy8gQ29tcGF0aWJsZSB3aXRoIERhdGFTb3VyY2VcbiAgdGV4dD86IHN0cmluZzsgICAgICAgICAgIC8vIE9yaWdpbmFsIHByb3BlcnR5XG4gIGNoZWNrZWQ/OiBib29sZWFuO1xuICBpbWFnZVVybD86IHN0cmluZztcbiAgaXNPcGVuPzogYm9vbGVhbjtcbiAgY2hpbGRyZW4/OiBzdHJpbmdbXTtcbiAgcGFyZW50SWQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGxldmVsPzogbnVtYmVyO1xuICBpbmRleD86IG51bWJlcjtcbiAgYmFkZ2VCZ0NvbG9yPzogc3RyaW5nO1xuICBiYWRnZUNvbG9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBMYXp5TG9hZGVyRnVuY3Rpb24gPSAoXG4gIHNlYXJjaDogTGF6eUxvYWRlclNlYXJjaCwgXG4gIG9mZnNldDogbnVtYmVyLCBcbiAgbGltaXQ6IG51bWJlclxuKSA9PiBQcm9taXNlPExhenlMb2FkZXJSZXN1bHRbXT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkT3B0aW9uRXZlbnQge1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZU9wdGlvbkV2ZW50IHtcbiAgcmVtb3ZlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RPcHRpb24ge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIGlkPzogc3RyaW5nIHwgbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xuICBpY29uTmFtZT86IHN0cmluZztcbiAgYXZhdGFyPzogc3RyaW5nO1xuICBkb3RDb2xvcj86IHN0cmluZztcbiAgc2Vjb25kYXJ5VGV4dD86IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd6ZW4tc2VsZWN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vemVuZHUtc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi96ZW5kdS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBaZW5kdVNlbGVjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiAyLVdheSBjb21wb25lbnQgcHJvcGVydHkgZm9yIHNlbGVjdGVkIGl0ZW1zLlxuICAgKiBEb24ndCBpbml0aWFsaXplIHByb3BlcnR5IG9uIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgY2hhbmdlIHNvdXJjZSBwYXJhbWV0ZXJcbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdE1vZGVsOiBhbnkgfCBhbnlbXTtcbiAgXG4gIC8qKlxuICAgKiBjYWxsYmFjayB0byBlbWl0IGNoYW5nZXMgZm9yIHBhcmVudCBjb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKSBzZWxlY3RNb2RlbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55IHwgYW55W10+KCk7XG4gIFxuICAvKipcbiAgICogTGlzdCBvZiBvcHRpb25zXG4gICAqL1xuICBASW5wdXQoKSBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSB8IGFueVtdID0gW107XG4gIFxuICAvKipcbiAgICogTGFiZWwgdGV4dCBhYm92ZSB0aGUgc2VsZWN0XG4gICAqL1xuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZztcbiAgXG4gIC8qKlxuICAgKiBTdXBwb3J0aW5nIHRleHQgYmVsb3cgdGhlIHNlbGVjdFxuICAgKi9cbiAgQElucHV0KCkgc3VwcG9ydGluZ1RleHQ/OiBzdHJpbmc7XG4gIFxuICAvKipcbiAgICogSGludCB0ZXh0IChzaG93biBiZWxvdyBzZWxlY3QpXG4gICAqL1xuICBASW5wdXQoKSBoaW50VGV4dCA9ICcnO1xuICBcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHRcbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1NlbGVjdCc7XG4gIFxuICAvKipcbiAgICogTGVhZGluZyBlbGVtZW50IHR5cGVcbiAgICovXG4gIEBJbnB1dCgpIGxlYWRpbmdUeXBlOiAnZGVmYXVsdCcgfCAnaWNvbicgfCAnYXZhdGFyJyB8ICdkb3QnIHwgJ3NlYXJjaCcgPSAnZGVmYXVsdCc7XG4gIFxuICAvKipcbiAgICogSWNvbiBmb3IgaWNvbiBsZWFkaW5nIHR5cGVcbiAgICovXG4gIEBJbnB1dCgpIGxlYWRpbmdJY29uPzogc3RyaW5nO1xuICBcbiAgLyoqXG4gICAqIEF2YXRhciBVUkwgZm9yIGF2YXRhciBsZWFkaW5nIHR5cGVcbiAgICovXG4gIEBJbnB1dCgpIGxlYWRpbmdBdmF0YXI/OiBzdHJpbmc7XG4gIFxuICAvKipcbiAgICogRG90IGNvbG9yIGZvciBkb3QgbGVhZGluZyB0eXBlXG4gICAqL1xuICBASW5wdXQoKSBsZWFkaW5nRG90Q29sb3I/OiBzdHJpbmc7XG4gIFxuICAvKipcbiAgICogVGhpcyBpcyBhIGtleSB2YWx1ZSB0byBnZXQgZGlzcGxheSBuYW1lIGZyb20gb3B0aW9uIG9iamVjdFxuICAgKi9cbiAgQElucHV0KCkgZGlzcGxheVByb3A6IHN0cmluZyA9ICduYW1lJztcbiAgXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEga2V5IHZhbHVlIHRvIGdldCBpZCBmcm9tIG9wdGlvbiBvYmplY3RcbiAgICovXG4gIEBJbnB1dCgpIGlkUHJvcDogc3RyaW5nID0gJ2lkJztcbiAgXG4gIC8qKlxuICAgKiBFbmFibGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHlcbiAgICovXG4gIEBJbnB1dCgpIGhhc1NlYXJjaCA9IGZhbHNlO1xuICBcbiAgLyoqXG4gICAqIENvbXBvbmVudCBwcm9wZXJ0eSB0byBlbmFibGUgbXVsdGlzZWxlY3RcbiAgICovXG4gIEBJbnB1dCgpIGlzTXVsdGlzZWxlY3QgPSBmYWxzZTtcbiAgXG4gIC8qKlxuICAgKiBBbGlhcyBmb3IgaXNNdWx0aXNlbGVjdCBmb3IgZWFzaWVyIHVzYWdlXG4gICAqL1xuICBASW5wdXQoKSBcbiAgc2V0IG11bHRpc2VsZWN0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc011bHRpc2VsZWN0ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IG11bHRpc2VsZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTXVsdGlzZWxlY3Q7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBBdXRvLWRldGVjdGVkIHRyZWUgbW9kZTogdHJ1ZSBpZiBhbnkgb3B0aW9uIGhhcyBhIGBjaGlsZHJlbmAgYXJyYXlcbiAgICovXG4gIHB1YmxpYyBpc1RyZWVNb2RlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEhpZGUgXCJTZWxlY3QgQWxsXCIgb3B0aW9uIGluIGJvdGggdHJlZSBtb2RlIGFuZCBmbGF0IG11bHRpc2VsZWN0XG4gICAqL1xuICBASW5wdXQoKSBoaWRlU2VsZWN0QWxsID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEhpZGUgc2VhcmNoIGJveCBpbiB0cmVlIG1vZGVcbiAgICovXG4gIEBJbnB1dCgpIGhpZGVUcmVlU2VhcmNoID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE1hcmsgdGhlIHNlbGVjdCBhcyByZXF1aXJlZCAoc2hvd3MgKiBpbmRpY2F0b3Igb24gbGFiZWwpXG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRoZSBzZWxlY3RcbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIFxuICAvKipcbiAgICogU2hvdyBlcnJvciBzdGF0ZVxuICAgKi9cbiAgQElucHV0KCkgZXJyb3IgPSBmYWxzZTtcbiAgXG4gIC8qKlxuICAgKiBFcnJvciBtZXNzYWdlIHRvIGRpc3BsYXlcbiAgICovXG4gIEBJbnB1dCgpIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgXG4gIC8qKlxuICAgKiBEZXN0cnVjdGl2ZS9lcnJvciBzdGF0ZSAoc2ltaWxhciB0byB6ZW4taW5wdXQpXG4gICAqL1xuICBASW5wdXQoKSBkZXN0cnVjdGl2ZSA9IGZhbHNlO1xuICBcbiAgLyoqXG4gICAqIFNpemUgdmFyaWFudFxuICAgKi9cbiAgQElucHV0KCkgc2l6ZTogJ3NtJyB8ICdtZCcgPSAnbWQnO1xuICBcbiAgLyoqXG4gICAqIENvbXBvbmVudCBwcm9wZXJ0eSB0byByZXR1cm4gd2hvbGUgb3B0aW9uIG9iamVjdFxuICAgKiBCeSBkZWZhdWx0IG9ubHkgaWQgdmFsdWUgaXMgcmV0dXJuZWRcbiAgICovXG4gIEBJbnB1dCgpIHJldHVybk9wdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgXG4gIC8qKlxuICAgKiBUcnVuY2F0ZSB0ZXh0IHdpdGggXCIuLi5cIiBhdCB0aGUgZW5kXG4gICAqL1xuICBASW5wdXQoKSBpc1RydW5jYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvKipcbiAgICogc2hvdyBBZGQgTmV3IE9wdGlvbiBhdCBmaXJzdCBwbGFjZVxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlQWRkTmV3T3B0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvKipcbiAgICogU2hvdyBBZGQgTmV3IG9wdGlvbiB0ZXh0IGJ5IGRlZmF1bHQgaWYgbmV3T3B0aW9uVGV4dCBlbXB0eVxuICAgKi9cbiAgQElucHV0KCkgc2hvd0RlZmF1bHRBZGRPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBcbiAgLyoqXG4gICAqIGRpc3BsYXkgY3VzdG9tIHRleHQgZm9yIEFkZCBOZXcgT3B0aW9uXG4gICAqL1xuICBASW5wdXQoKSBuZXdPcHRpb25UZXh0OiBzdHJpbmc7XG4gIFxuICAvKipcbiAgICogRW1pdCBldmVudCB3aGVuIEFkZCBOZXcgT3B0aW9uIGlzIGNsaWNrZWRcbiAgICovXG4gIEBPdXRwdXQoKSBhZGROZXdPcHRpb246IEV2ZW50RW1pdHRlcjxBZGRPcHRpb25FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFkZE9wdGlvbkV2ZW50PigpO1xuICBcbiAgLyoqXG4gICAqIHNob3cgcmVtb3ZlIE9wdGlvbiBhdCBmaXJzdCBwbGFjZVxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlUmVtb3ZlT3B0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvKipcbiAgICogZGlzcGxheSBjdXN0b20gdGV4dCBmb3IgcmVtb3ZlIE9wdGlvblxuICAgKi9cbiAgQElucHV0KCkgcmVtb3ZlT3B0aW9uVGV4dDogc3RyaW5nO1xuICBcbiAgLyoqXG4gICAqIEVuYWJsZSBsYXp5IGxvYWRpbmcgZm9yIG9wdGlvbnNcbiAgICovXG4gIEBJbnB1dCgpIGlzTGF6eUxvYWRpbmcgPSBmYWxzZTtcbiAgXG4gIC8qKlxuICAgKiBMYXp5IGxvYWRlciBmdW5jdGlvbiB0byBmZXRjaCBvcHRpb25zXG4gICAqL1xuICBASW5wdXQoKSBsYXp5TG9hZGVyPzogTGF6eUxvYWRlckZ1bmN0aW9uO1xuICBcbiAgLyoqXG4gICAqIFByZWZlcnJlZCBkaXJlY3Rpb24gZm9yIGRyb3Bkb3duIHRvIG9wZW5cbiAgICovXG4gIEBJbnB1dCgpIHByZWZlcnJlZE9wZW5EaXJlY3Rpb246ICdhdXRvJyB8ICd1cCcgfCAnZG93bicgPSAnYXV0byc7XG4gIFxuICAvKipcbiAgICogRW1pdCBldmVudCB3aGVuIHJlbW92ZSBPcHRpb24gaXMgY2xpY2tlZFxuICAgKi9cbiAgQE91dHB1dCgpIHJlbW92ZU9wdGlvbjogRXZlbnRFbWl0dGVyPFJlbW92ZU9wdGlvbkV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVtb3ZlT3B0aW9uRXZlbnQ+KCk7XG4gIFxuICAvKipcbiAgICogRW1pdCBldmVudCB3aGVuIHNlbGVjdCBpcyBjbG9zZWQsIHNlbmRpbmcgdGhlIHNlbGVjdGVkIGRhdGFcbiAgICovXG4gIEBPdXRwdXQoKSBjbG9zZWQ6IEV2ZW50RW1pdHRlcjxhbnkgfCBhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueSB8IGFueVtdPigpO1xuICBcbiAgLyoqXG4gICAqIFN0YXRlIHRyYWNraW5nXG4gICAqL1xuICBwdWJsaWMgaXNPcGVuID0gZmFsc2U7XG4gIHB1YmxpYyBzZWFyY2hUZXh0ID0gJyc7XG4gIHB1YmxpYyBzZWFyY2hJbnB1dFZhbHVlID0gJyc7XG4gIHB1YmxpYyBzZWFyY2hGb2N1c2VkID0gZmFsc2U7XG4gIHB1YmxpYyBmaWx0ZXJlZE9wdGlvbnM6IFNlbGVjdE9wdGlvbltdIHwgYW55W10gPSBbXTtcbiAgcHVibGljIHNlbGVjdGVkRGlzcGxheSA9ICcnO1xuICBwdWJsaWMgbGFiZWxUZXh0ID0gJyc7XG4gIHB1YmxpYyBvcHRpb246IFNlbGVjdE9wdGlvbiB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgY2FuTG9hZE1vcmUgPSBmYWxzZTtcbiAgcHVibGljIGlzTG9hZGluZ05vdyA9IGZhbHNlO1xuXG4gIC8vIFRyZWUgbW9kZSBwcm9wZXJ0aWVzXG4gIHB1YmxpYyB0cmVlRmlsdGVyZWREYXRhU291cmNlOiBEYXRhU291cmNlW10gPSBbXTtcbiAgcHVibGljIGlzU2VsZWN0ZWRBbGwgPSBmYWxzZTtcbiAgXG4gIC8qKlxuICAgKiBTZWxlY3QgT3B0aW9uIFRlbXBsYXRlIGZvciBjdXN0b20gSFRNTFxuICAgKi9cbiAgQENvbnRlbnRDaGlsZChaZW5kdVNlbGVjdE9wdGlvbkRpcmVjdGl2ZSkgb3B0aW9uVGVtcGxhdGU6IFplbmR1U2VsZWN0T3B0aW9uRGlyZWN0aXZlO1xuICBcbiAgLyoqXG4gICAqIFNlbGVjdCBWYWx1ZSBUZW1wbGF0ZSBmb3IgY3VzdG9tIEhUTUxcbiAgICovXG4gIEBDb250ZW50Q2hpbGQoWmVuZHVTZWxlY3RWYWx1ZURpcmVjdGl2ZSkgdmFsdWVUZW1wbGF0ZTogWmVuZHVTZWxlY3RWYWx1ZURpcmVjdGl2ZTtcbiAgXG4gIC8qKlxuICAgKiBTZWxlY3QgQnV0dG9uIFRlbXBsYXRlIGZvciBjdXN0b20gSFRNTFxuICAgKi9cbiAgQENvbnRlbnRDaGlsZChaZW5kdVNlbGVjdEJ1dHRvbkRpcmVjdGl2ZSkgYnV0dG9uVGVtcGxhdGU6IFplbmR1U2VsZWN0QnV0dG9uRGlyZWN0aXZlO1xuICBcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxuXG4gIC8qKlxuICAgKiBHZXQgZHJvcGRvd24gZGlyZWN0aW9uIGNsYXNzIGJhc2VkIG9uIHByZWZlcnJlZE9wZW5EaXJlY3Rpb25cbiAgICovXG4gIGdldERyb3Bkb3duRGlyZWN0aW9uQ2xhc3MoKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHRoaXMucHJlZmVycmVkT3BlbkRpcmVjdGlvbikge1xuICAgICAgY2FzZSAndXAnOlxuICAgICAgICByZXR1cm4gJ2Ryb3Bkb3duLXVwJztcbiAgICAgIGNhc2UgJ2Rvd24nOlxuICAgICAgICByZXR1cm4gJ2Ryb3Bkb3duLWRvd24nO1xuICAgICAgY2FzZSAnYXV0byc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5zaG91bGRPcGVuVXB3YXJkKDMyMCkgPyAnZHJvcGRvd24tdXAnIDogJ2Ryb3Bkb3duLWRvd24nO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkT3BlblVwd2FyZChkcm9wZG93bkhlaWdodDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiAod2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC5ib3R0b20pIDwgZHJvcGRvd25IZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBpY29uIHBhdGggd2l0aCBmYWxsYmFjayB0byBhc3NldHMgZm9sZGVyXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVJY29uUGF0aChpY29uTmFtZT86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghaWNvbk5hbWUpIHJldHVybiBudWxsO1xuICAgIFxuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhIGZ1bGwgcGF0aCBvciBVUkwsIHJldHVybiBhcyBpc1xuICAgIGlmIChpY29uTmFtZS5pbmNsdWRlcygnLycpIHx8IGljb25OYW1lLmluY2x1ZGVzKCcuJykpIHtcbiAgICAgIHJldHVybiBpY29uTmFtZTtcbiAgICB9XG4gICAgXG4gICAgLy8gVHJ5IGFzc2V0cyBmb2xkZXIgd2l0aCAuc3ZnIGV4dGVuc2lvblxuICAgIHJldHVybiBgYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvJHtpY29uTmFtZX0uc3ZnYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaWNvbiBmb3IgZGlzcGxheSAod2l0aCBmYWxsYmFjayBsb2dpYylcbiAgICovXG4gIHB1YmxpYyBnZXRJY29uUGF0aChvcHRpb24/OiBTZWxlY3RPcHRpb24sIGxlYWRpbmdJY29uPzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gUHJpb3JpdHk6IGxlYWRpbmdJY29uIC0+IG9wdGlvbi5pY29uIC0+IG9wdGlvbi5pY29uTmFtZSAtPiBhc3NldHMve2ljb25OYW1lfS5zdmdcbiAgICBpZiAobGVhZGluZ0ljb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVJY29uUGF0aChsZWFkaW5nSWNvbik7XG4gICAgfVxuICAgIFxuICAgIGlmIChvcHRpb24/Lmljb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVJY29uUGF0aChvcHRpb24uaWNvbik7XG4gICAgfVxuICAgIFxuICAgIGlmIChvcHRpb24/Lmljb25OYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlSWNvblBhdGgob3B0aW9uLmljb25OYW1lKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIG5nT25DaGFuZ2VzKGNoYW5nZU9iajogeyBba2V5OiBzdHJpbmddOiB7IGN1cnJlbnRWYWx1ZTogdW5rbm93bjsgcHJldmlvdXNWYWx1ZTogdW5rbm93bjsgZmlyc3RDaGFuZ2U6IGJvb2xlYW4gfSB9KTogdm9pZCB7XG4gICAgdGhpcy5pc1RyZWVNb2RlID0gdGhpcy5vcHRpb25zPy5zb21lKChvcHQ6IGFueSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBvcHQuY2hpbGRyZW4gfHwgb3B0LkNoaWxkcmVuIHx8IG9wdC5DaGlsZHJlbnM7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShjaGlsZHJlbikgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMDtcbiAgICB9KSA/PyBmYWxzZTtcbiAgICBpZiAodGhpcy5pc1RyZWVNb2RlKSB7XG4gICAgICB0aGlzLmluaXRUcmVlRGF0YSgpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcbiAgICB0aGlzLmZpbHRlck9wdGlvbnMoKTtcbiAgICB0aGlzLnVwZGF0ZUxhYmVsKCk7XG5cbiAgICBpZiAoY2hhbmdlT2JqW1wic2VsZWN0TW9kZWxcIl0pIHtcbiAgICAgIGlmICh0aGlzLmlzTGF6eUxvYWRpbmcgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdE1vZGVsKSAmJiB0aGlzLnNlbGVjdE1vZGVsLmxlbmd0aCkge1xuICAgICAgICBpZiAoIXRoaXMuZmlsdGVyZWRPcHRpb25zPy5sZW5ndGggJiYgIXRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgLy8gcHJlbG9hZCBkYXRhIHRvIHNob3cgdGhlIGxhYmVsc1xuICAgICAgICAgIHRoaXMubG9hZE1vcmUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBUb2dnbGUgZHJvcGRvd25cbiAgICovXG4gIHRvZ2dsZURyb3Bkb3duKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgXG4gICAgdGhpcy5pc09wZW4gPSAhdGhpcy5pc09wZW47XG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICAgIHRoaXMuZmlsdGVyT3B0aW9ucygpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBvcHRpb24gc2VsZWN0aW9uXG4gICAqL1xuICBzZWxlY3RPcHRpb24ob3B0aW9uOiBTZWxlY3RPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbiA9IG9wdGlvbjtcbiAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMucmV0dXJuT3B0aW9uID8gb3B0aW9uIDogdGhpcy5nZXRPcHRpb25WYWx1ZShvcHRpb24pO1xuICAgIFxuICAgIGlmICh0aGlzLmlzTXVsdGlzZWxlY3QpIHtcbiAgICAgIHRoaXMudG9nZ2xlTXVsdGlzZWxlY3RPcHRpb24ob3B0aW9uVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdE1vZGVsID0gb3B0aW9uVmFsdWU7XG4gICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgLy8gVXBkYXRlIHNlYXJjaCBpbnB1dCB2YWx1ZSBmb3Igc2VhcmNoIHR5cGVcbiAgICAgIGlmICh0aGlzLmxlYWRpbmdUeXBlID09PSAnc2VhcmNoJykge1xuICAgICAgICB0aGlzLnNlYXJjaElucHV0VmFsdWUgPSB0aGlzLmdldE9wdGlvbkRpc3BsYXkob3B0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBUb2dnbGUgb3B0aW9uIGluIG11bHRpc2VsZWN0IG1vZGVcbiAgICovXG4gIHByaXZhdGUgdG9nZ2xlTXVsdGlzZWxlY3RPcHRpb24odmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdE1vZGVsKSkge1xuICAgICAgdGhpcy5zZWxlY3RNb2RlbCA9IFtdO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0RWxlbWVudEluZGV4KHZhbHVlKTtcbiAgICBcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICB0aGlzLnNlbGVjdE1vZGVsLnB1c2godmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdE1vZGVsLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMudXBkYXRlTGFiZWwoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIG9wdGlvbiBpcyBzZWxlY3RlZFxuICAgKi9cbiAgaXNTZWxlY3RlZChvcHRpb246IFNlbGVjdE9wdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzTW9kZWxFbXB0eSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IG9wdGlvbklkID0gdGhpcy5nZXRJZChvcHRpb24pO1xuICAgIFxuICAgIGlmICh0aGlzLmlzTXVsdGlzZWxlY3QgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdE1vZGVsKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0TW9kZWwuZmluZEluZGV4KGVsID0+IHRoaXMuZ2V0SWQoZWwgYXMgU2VsZWN0T3B0aW9uKSA9PT0gb3B0aW9uSWQpID49IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmdldElkKHRoaXMuc2VsZWN0TW9kZWwgYXMgU2VsZWN0T3B0aW9uKSA9PT0gb3B0aW9uSWQ7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGRpc3BsYXkgdGV4dCBmb3Igb3B0aW9uXG4gICAqL1xuICBnZXRPcHRpb25EaXNwbGF5KG9wdGlvbjogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcgJiYgb3B0aW9uICE9PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5kaXNwbGF5UHJvcCkge1xuICAgICAgICBjb25zdCBjb21iaW5lZFByb3BzID0gdGhpcy5kaXNwbGF5UHJvcC5zcGxpdChcInxcIilcbiAgICAgICAgICAubWFwKGkgPT4gdGhpcy5nZXRSZWN1cnNpdmVQcm9wZXJ0eShvcHRpb24sIGkpKVxuICAgICAgICAgIC5maWx0ZXIodiA9PiB2KSAvLyBGaWx0ZXIgb3V0IG51bGwgdmFsdWVzXG4gICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgICByZXR1cm4gY29tYmluZWRQcm9wcyB8fCAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FwcC1TZWxlY3Q6IHdoZW4gdXNpbmcgb2JqZWN0cyBhcyBtb2RlbCwgYSBkaXNwbGF5UHJvcCB2YWx1ZSBpcyBtYW5kYXRvcnkuJyk7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKG9wdGlvbik7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBBbGlhcyBmb3IgZ2V0T3B0aW9uRGlzcGxheSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgKi9cbiAgcHVibGljIGdldE5hbWUob3B0aW9uOiBzdHJpbmcgfCBvYmplY3QpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkRpc3BsYXkob3B0aW9uKTtcbiAgfVxuICBcbiAgXG4gIC8qKlxuICAgKiBHZXQgdmFsdWUgZm9yIG9wdGlvbiAodXNpbmcgaWRQcm9wKVxuICAgKi9cbiAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uOiBTZWxlY3RPcHRpb24pOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldElkKG9wdGlvbik7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgaWQgdmFsdWUgZnJvbSBvcHRpb25cbiAgICovXG4gIHByaXZhdGUgZ2V0SWQob3B0aW9uOiBzdHJpbmcgfCBudW1iZXIgfCBvYmplY3QpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0JyAmJiBvcHRpb24gIT09IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLmlkUHJvcCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZWN1cnNpdmVQcm9wZXJ0eShvcHRpb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHRoaXMuaWRQcm9wKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FwcC1TZWxlY3Q6IHdoZW4gdXNpbmcgb2JqZWN0cyBhcyBtb2RlbCwgYSBpZFByb3AgdmFsdWUgaXMgbWFuZGF0b3J5LicpO1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9wdGlvbiBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogVXBkYXRlIGRpc3BsYXllZCB0ZXh0XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZURpc3BsYXkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2RlbEVtcHR5KCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREaXNwbGF5ID0gJyc7XG4gICAgICB0aGlzLmxhYmVsVGV4dCA9ICcnO1xuICAgICAgLy8gQWxzbyBjbGVhciBzZWFyY2ggaW5wdXQgZm9yIHNlYXJjaCB0eXBlXG4gICAgICBpZiAodGhpcy5sZWFkaW5nVHlwZSA9PT0gJ3NlYXJjaCcpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dFZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLmlzTXVsdGlzZWxlY3QgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdE1vZGVsKSkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0TW9kZWwubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuZmluZE9wdGlvbkJ5VmFsdWUodGhpcy5zZWxlY3RNb2RlbFswXSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREaXNwbGF5ID0gb3B0aW9uID8gdGhpcy5nZXRPcHRpb25EaXNwbGF5KG9wdGlvbikgOiAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREaXNwbGF5ID0gYCR7dGhpcy5zZWxlY3RNb2RlbC5sZW5ndGh9IHNlbGVjdGVkYDtcbiAgICAgIH1cbiAgICAgIC8vIEZvciBtdWx0aXNlbGVjdCBzZWFyY2ggdHlwZSwgc2hvdyBjb3VudCBpbiBzZWFyY2ggaW5wdXQgd2hlbiBjbG9zZWRcbiAgICAgIGlmICh0aGlzLmxlYWRpbmdUeXBlID09PSAnc2VhcmNoJyAmJiAhdGhpcy5zZWFyY2hGb2N1c2VkKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXRWYWx1ZSA9IHRoaXMuc2VsZWN0ZWREaXNwbGF5O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcHRpb24gPSB0aGlzLmZpbmRPcHRpb25CeVZhbHVlKHRoaXMuc2VsZWN0TW9kZWwpO1xuICAgICAgdGhpcy5zZWxlY3RlZERpc3BsYXkgPSBvcHRpb24gPyB0aGlzLmdldE9wdGlvbkRpc3BsYXkob3B0aW9uKSA6ICcnO1xuICAgICAgLy8gQWxzbyB1cGRhdGUgc2VhcmNoIGlucHV0IGZvciBzZWFyY2ggdHlwZVxuICAgICAgaWYgKHRoaXMubGVhZGluZ1R5cGUgPT09ICdzZWFyY2gnICYmIG9wdGlvbikge1xuICAgICAgICB0aGlzLnNlYXJjaElucHV0VmFsdWUgPSB0aGlzLmdldE9wdGlvbkRpc3BsYXkob3B0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGaW5kIG9wdGlvbiBieSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kT3B0aW9uQnlWYWx1ZSh2YWx1ZTogYW55KTogU2VsZWN0T3B0aW9uIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMucmV0dXJuT3B0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbmQob3B0ID0+IG9wdCA9PT0gdmFsdWUpIHx8IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZChvcHQgPT4gdGhpcy5nZXRJZChvcHQpID09PSB2YWx1ZSkgfHwgbnVsbDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIG1vZGVsIGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgaXNNb2RlbEVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzTXVsdGlzZWxlY3QpIHtcbiAgICAgIHJldHVybiAhQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdE1vZGVsKSB8fCAhdGhpcy5zZWxlY3RNb2RlbC5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdE1vZGVsID09PSBudWxsIHx8IHRoaXMuc2VsZWN0TW9kZWwgPT09IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgZWxlbWVudCBpbmRleCBpbiBtdWx0aXNlbGVjdCBhcnJheVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFbGVtZW50SW5kZXgodmFsdWU6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0TW9kZWwpKSByZXR1cm4gLTE7XG4gICAgXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IHZhbHVlSWQgPSB0aGlzLmdldElkKHZhbHVlKTtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdE1vZGVsLmZpbmRJbmRleChlbCA9PiB0aGlzLmdldElkKGVsIGFzIFNlbGVjdE9wdGlvbikgPT09IHZhbHVlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RNb2RlbC5pbmRleE9mKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBUb2dnbGUgYWxsIG9wdGlvbnMgaW4gbXVsdGlzZWxlY3RcbiAgICovXG4gIHB1YmxpYyB0b2dnbGVBbGwoKTogdm9pZCB7XG4gICAgY29uc3QgbW9kZWxBcnJheSA9IEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RNb2RlbCkgPyB0aGlzLnNlbGVjdE1vZGVsIDogW107XG4gICAgaWYgKG1vZGVsQXJyYXkubGVuZ3RoICE9PSB0aGlzLm9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNlbGVjdE1vZGVsID0gdGhpcy5vcHRpb25zLm1hcCgoZWw6IFNlbGVjdE9wdGlvbikgPT4gdGhpcy5yZXR1cm5PcHRpb24gPyBlbCA6IHRoaXMuZ2V0SWQoZWwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RNb2RlbCA9IFtdO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcbiAgICB0aGlzLnVwZGF0ZUxhYmVsKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBUb2dnbGUgU2VsZWN0IEFsbCBvcHRpb24gZm9yIGZsYXQgbXVsdGlzZWxlY3RcbiAgICovXG4gIHB1YmxpYyB0b2dnbGVTZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCgpKSB7XG4gICAgICAvLyBEZXNlbGVjdCBhbGxcbiAgICAgIHRoaXMuc2VsZWN0TW9kZWwgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2VsZWN0IGFsbCBmaWx0ZXJlZCBvcHRpb25zXG4gICAgICB0aGlzLnNlbGVjdE1vZGVsID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMubWFwKChlbDogU2VsZWN0T3B0aW9uKSA9PiBcbiAgICAgICAgdGhpcy5yZXR1cm5PcHRpb24gPyBlbCA6IHRoaXMuZ2V0SWQoZWwpXG4gICAgICApO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcbiAgICB0aGlzLnVwZGF0ZUxhYmVsKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbGwgZmlsdGVyZWQgb3B0aW9ucyBhcmUgc2VsZWN0ZWRcbiAgICovXG4gIHB1YmxpYyBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc011bHRpc2VsZWN0IHx8ICFBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0TW9kZWwpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgYWxsIGZpbHRlcmVkIG9wdGlvbnMgYXJlIGluIHRoZSBzZWxlY3RNb2RlbFxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkT3B0aW9ucy5ldmVyeShvcHRpb24gPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uSWQgPSB0aGlzLmdldElkKG9wdGlvbik7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RNb2RlbC5zb21lKChzZWxlY3RlZDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSB0aGlzLnJldHVybk9wdGlvbiA/IHRoaXMuZ2V0SWQoc2VsZWN0ZWQpIDogc2VsZWN0ZWQ7XG4gICAgICAgIHJldHVybiBzZWxlY3RlZElkID09PSBvcHRpb25JZDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHJlY3Vyc2l2ZSBwcm9wZXJ0eSBmcm9tIG5lc3RlZCBvYmplY3RcbiAgICovXG4gIHByaXZhdGUgZ2V0UmVjdXJzaXZlUHJvcGVydHkob2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcGF0aDogc3RyaW5nKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgob2JqLCB4KSA9PiB7XG4gICAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHggaW4gb2JqKSB7XG4gICAgICAgIHJldHVybiAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVt4XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sIG9iamVjdCBhcyB1bmtub3duKSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgbGFiZWwgdGV4dFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUxhYmVsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTW9kZWxFbXB0eSgpKSB7XG4gICAgICB0aGlzLmxhYmVsVGV4dCA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5pc011bHRpc2VsZWN0ICYmIEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RNb2RlbCkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSB0aGlzLnNlbGVjdE1vZGVsLmxlbmd0aDtcbiAgICAgIFxuICAgICAgaWYgKHNlbGVjdGVkQ291bnQgPT09IDEpIHtcbiAgICAgICAgdGhpcy5sYWJlbFRleHQgPSB0aGlzLmdldE5hbWVGcm9tVmFsdWUodGhpcy5zZWxlY3RNb2RlbFswXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxhYmVsVGV4dCA9IGAke3NlbGVjdGVkQ291bnR9IFNlbGVjdGVkYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYWJlbFRleHQgPSB0aGlzLmdldE5hbWVGcm9tVmFsdWUodGhpcy5zZWxlY3RNb2RlbCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IG5hbWUgZnJvbSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIGdldE5hbWVGcm9tVmFsdWUodmFsOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnJldHVybk9wdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uRGlzcGxheSh2YWwgYXMgU2VsZWN0T3B0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuaXNMYXp5TG9hZGluZykge1xuICAgICAgICBjb25zdCBvcHQgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucz8uZmluZChpID0+IHRoaXMuZ2V0SWQoaSkgPT0gdmFsKTtcbiAgICAgICAgcmV0dXJuIG9wdCA/IHRoaXMuZ2V0T3B0aW9uRGlzcGxheShvcHQpIDogU3RyaW5nKHZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucyB8fCAhdGhpcy5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoZWwgPT4gdGhpcy5nZXRJZChlbCkgPT09IHZhbCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9wdGlvbkRpc3BsYXkob3B0aW9uID8/IHZhbCBhcyBTZWxlY3RPcHRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEVtaXQgY2hhbmdlIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIGVtaXRDaGFuZ2UoKTogdm9pZCB7XG4gICAgLy8gbm90aWZ5IHdpdGggdGltZW91dFxuICAgIC8vIGFsbG93IG91dHB1dCBwcm9wZXJ0eSBcImVuYWJsZWRcIiBhcHBsaWVkIGJ5IHBhcmVudCBmaXJzdCBhbmQgdGhlbiBlbWl0IHRoZSBvbkNoYW5nZVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RNb2RlbENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0TW9kZWwpO1xuICAgIH0sIDEpO1xuICB9XG4gIFxuICAvKipcbiAgICogRmlsdGVyIG9wdGlvbnMgYmFzZWQgb24gc2VhcmNoXG4gICAqL1xuICBmaWx0ZXJPcHRpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWFyY2hUZXh0KSB7XG4gICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IFsuLi50aGlzLm9wdGlvbnNdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBzZWFyY2hMb3dlciA9IHRoaXMuc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5vcHRpb25zLmZpbHRlcihvcHRpb24gPT4ge1xuICAgICAgY29uc3QgZGlzcGxheSA9IHRoaXMuZ2V0T3B0aW9uRGlzcGxheShvcHRpb24pLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gZGlzcGxheS5pbmNsdWRlcyhzZWFyY2hMb3dlcik7XG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VhcmNoIGlucHV0XG4gICAqL1xuICBvblNlYXJjaENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlck9wdGlvbnMoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBzZWFyY2ggaW5wdXQgY2hhbmdlIGZvciBzZWFyY2ggdHlwZVxuICAgKi9cbiAgb25TZWFyY2hJbnB1dENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaElucHV0VmFsdWU7XG4gICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XG4gICAgaWYgKCF0aGlzLmlzT3BlbiAmJiB0aGlzLnNlYXJjaElucHV0VmFsdWUpIHtcbiAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VhcmNoIGlucHV0IGZvY3VzXG4gICAqL1xuICBvblNlYXJjaEZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoRm9jdXNlZCA9IHRydWU7XG4gICAgLy8gQ2xlYXIgdGhlIHNlYXJjaCBpbnB1dCB3aGVuIGZvY3VzZWQgc28gdXNlciBjYW4gdHlwZSBmcmVzaFxuICAgIHRoaXMuc2VhcmNoSW5wdXRWYWx1ZSA9ICcnO1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xuICAgIC8vIE9wZW4gZHJvcGRvd24gdG8gc2hvdyBhbGwgb3B0aW9uc1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAvLyBSZXNldCBmaWx0ZXJlZCBvcHRpb25zIHRvIHNob3cgYWxsXG4gICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VhcmNoIGlucHV0IGJsdXJcbiAgICovXG4gIG9uU2VhcmNoQmx1cihldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIC8vIERvbid0IGNsb3NlIGltbWVkaWF0ZWx5IGlmIGNsaWNraW5nIG9uIGRyb3Bkb3duXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmICghcmVsYXRlZFRhcmdldCB8fCAhdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hGb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICB0aGlzLnNlYXJjaElucHV0VmFsdWUgPSB0aGlzLnNlbGVjdGVkRGlzcGxheTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDIwMCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0ZWQgb3B0aW9uIGZvciBsZWFkaW5nIGRpc3BsYXlcbiAgICovXG4gIGdldFNlbGVjdGVkT3B0aW9uKCk6IFNlbGVjdE9wdGlvbiB8IG51bGwge1xuICAgIGlmICghdGhpcy5zZWxlY3RNb2RlbCkgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgaWYgKHRoaXMuaXNNdWx0aXNlbGVjdCAmJiBBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0TW9kZWwpKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RNb2RlbC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZE9wdGlvbkJ5VmFsdWUodGhpcy5zZWxlY3RNb2RlbFswXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuZmluZE9wdGlvbkJ5VmFsdWUodGhpcy5zZWxlY3RNb2RlbCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0ZWQgc2Vjb25kYXJ5IHRleHQgZm9yIGRpc3BsYXlcbiAgICovXG4gIGdldFNlbGVjdGVkU2Vjb25kYXJ5VGV4dCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0TW9kZWwpIHJldHVybiBudWxsO1xuICAgIFxuICAgIGlmICh0aGlzLmlzTXVsdGlzZWxlY3QgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdE1vZGVsKSkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0TW9kZWwubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuZmluZE9wdGlvbkJ5VmFsdWUodGhpcy5zZWxlY3RNb2RlbFswXSk7XG4gICAgICAgIHJldHVybiBvcHRpb24/LnNlY29uZGFyeVRleHQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIEZvciBtdWx0aXBsZSBzZWxlY3Rpb24sIHdlIHdvbid0IHNob3cgc2Vjb25kYXJ5IHRleHQgdG8gYXZvaWQgY29uZnVzaW9uXG4gICAgICByZXR1cm4gbnVsbDsgXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuZmluZE9wdGlvbkJ5VmFsdWUodGhpcy5zZWxlY3RNb2RlbCk7XG4gICAgcmV0dXJuIG9wdGlvbj8uc2Vjb25kYXJ5VGV4dCB8fCBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xvc2UgZHJvcGRvd24gb24gb3V0c2lkZSBjbGlja1xuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHRoaXMuaGlkZURyb3BEb3duKHRydWUpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEhpZGUgZHJvcGRvd25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBoaWRlRHJvcERvd24odXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gT25seSBlbWl0IGNsb3NlZCBldmVudCBpZiBpdCB3YXMgb3BlbiBBTkQgdHJpZ2dlcmVkIGJ5IHVzZXIgYWN0aW9uXG4gICAgaWYgKHVzZXJBY3Rpb24gJiYgdGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMuY2xvc2VkLmVtaXQodGhpcy5zZWxlY3RNb2RlbCk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgYWRkIG5ldyBvcHRpb25cbiAgICovXG4gIHB1YmxpYyBoYW5kbGVBZGROZXdPcHRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5hZGROZXdPcHRpb24uZW1pdCh7IHZhbHVlOiB0aGlzLnNlYXJjaFRleHQgfSk7XG4gICAgdGhpcy5oaWRlRHJvcERvd24odHJ1ZSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgcmVtb3ZlIG9wdGlvblxuICAgKi9cbiAgcHVibGljIGhhbmRsZVJlbW92ZU9wdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZU9wdGlvbi5lbWl0KHsgcmVtb3ZlZDogdHJ1ZSB9KTtcbiAgICB0aGlzLmhpZGVEcm9wRG93bih0cnVlKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBzdGF0ZSBjbGFzc2VzXG4gICAqL1xuICBnZXRTdGF0ZUNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbGFzc2VzID0gWydhcHAtc2VsZWN0LWNvbnRhaW5lciddO1xuICAgIFxuICAgIGlmICh0aGlzLmlzT3BlbikgY2xhc3Nlcy5wdXNoKCdvcGVuJyk7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIGNsYXNzZXMucHVzaCgnZGlzYWJsZWQnKTtcbiAgICBpZiAodGhpcy5lcnJvcikgY2xhc3Nlcy5wdXNoKCdlcnJvcicpO1xuICAgIGlmICh0aGlzLmRlc3RydWN0aXZlKSBjbGFzc2VzLnB1c2goJ2Rlc3RydWN0aXZlJyk7XG4gICAgaWYgKHRoaXMubGFiZWwpIGNsYXNzZXMucHVzaCgnd2l0aC1sYWJlbCcpO1xuICAgIGlmICh0aGlzLnN1cHBvcnRpbmdUZXh0KSBjbGFzc2VzLnB1c2goJ3dpdGgtc3VwcG9ydGluZycpO1xuICAgIFxuICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIExvYWQgbW9yZSBpdGVtcyBmb3IgbGF6eSBsb2FkaW5nXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZE1vcmUoc2hvd1NlbGVjdGVkT25Ub3A6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pc0xvYWRpbmdOb3cgPSB0cnVlO1xuICAgICAgaWYgKCF0aGlzLmxhenlMb2FkZXIpIHtcbiAgICAgICAgdGhyb3cgYGxvYWRlciBpcyBub3QgYXZhaWxhYmxlYDtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5maWx0ZXJlZE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gbG9hZCBmaXJzdCAxMCByZWNvcmRzIGZvciB0aGUgZmlyc3QgdGltZVxuICAgICAgY29uc3QgbGltaXQgPSAodGhpcy5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoID09IDApID8gMTAgOiAxMDA7XG4gICAgICBsZXQgbmV3SXRlbXM6IExhenlMb2FkZXJSZXN1bHRbXSA9IGF3YWl0IHRoaXMubGF6eUxvYWRlcih7IHRleHQ6IHRoaXMuc2VhcmNoVGV4dCB8fCBcIlwiIH0sIHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCwgbGltaXQpO1xuICAgICAgXG4gICAgICB0aGlzLmNhbkxvYWRNb3JlID0gKG5ld0l0ZW1zLmxlbmd0aCA9PSBsaW1pdCk7XG4gICAgICBcbiAgICAgIC8vIHRoZSBzZWxlY3RNb2RlbCBjb250YWlucyB0aGUgc2VsZWN0ZWQgaXRlbXMgaWRzICBcbiAgICAgIGNvbnN0IGNoZWNrZWRJZHMgPSBBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0TW9kZWwpIFxuICAgICAgICA/IHRoaXMuc2VsZWN0TW9kZWwubWFwKGl0ZW0gPT4gU3RyaW5nKHRoaXMuZ2V0SWQoaXRlbSBhcyBTZWxlY3RPcHRpb24pKSlcbiAgICAgICAgOiBbXTtcbiAgICAgIFxuICAgICAgaWYgKHNob3dTZWxlY3RlZE9uVG9wICYmIGNoZWNrZWRJZHM/Lmxlbmd0aCkge1xuICAgICAgICAvLyByZW1vdmUgdGhlIGNoZWNrZWQgaXRlbXMgZmlyc3RcbiAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucy5maWx0ZXIoaSA9PiAhY2hlY2tlZElkcy5pbmNsdWRlcyhTdHJpbmcodGhpcy5nZXRJZChpKSkpKTtcbiAgICAgICAgbmV3SXRlbXMgPSBuZXdJdGVtcy5maWx0ZXIoaSA9PiAhY2hlY2tlZElkcy5pbmNsdWRlcyhTdHJpbmcoaS5pZCkpKTtcbiAgICAgICAgXG4gICAgICAgIC8vIGFkZCBhbGwgY2hlY2tlZCBpdGVtcyB0byB0aGUgdG9wXG4gICAgICAgIGNvbnN0IGNoZWNrZWRJdGVtczogTGF6eUxvYWRlclJlc3VsdFtdID0gYXdhaXQgdGhpcy5sYXp5TG9hZGVyKHsgaWRzOiBjaGVja2VkSWRzIH0sIDAsIDEwMCk7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gWy4uLihjaGVja2VkSXRlbXMgYXMgU2VsZWN0T3B0aW9uW10pLCAuLi50aGlzLmZpbHRlcmVkT3B0aW9uc107XG4gICAgICAgIFxuICAgICAgICB0aGlzLnVwZGF0ZUxhYmVsKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIHRoZSBmaWx0ZXJlZERhdGFTb3VyY2UgY29udGFpbnMgdGhlIGl0ZW1zIHRoYXQgaXMgdmlzaWJsZSB0byB1c2VyIGF0IHRoZSBjdXJyZW50IG1vbWVudFxuICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBbLi4udGhpcy5maWx0ZXJlZE9wdGlvbnMsIC4uLihuZXdJdGVtcyBhcyBTZWxlY3RPcHRpb25bXSldO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzTG9hZGluZ05vdyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRyZWUgZGF0YSBieSBzeW5jaW5nIHNlbGVjdE1vZGVsIElEcyB0byBEYXRhU291cmNlIGNoZWNrZWQgZmxhZ3NcbiAgICovXG4gIHByaXZhdGUgaW5pdFRyZWVEYXRhKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1RyZWVNb2RlIHx8ICF0aGlzLm9wdGlvbnM/Lmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gbmV3IFNldChcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RNb2RlbClcbiAgICAgICAgPyB0aGlzLnNlbGVjdE1vZGVsLm1hcCh2ID0+IFN0cmluZyh0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyB0aGlzLmdldElkKHYpIDogdikpXG4gICAgICAgIDogW11cbiAgICApO1xuICAgICh0aGlzLm9wdGlvbnMgYXMgYW55W10pLmZvckVhY2gob3B0ID0+IHtcbiAgICAgIG9wdC5jaGVja2VkID0gc2VsZWN0ZWRJZHMuaGFzKFN0cmluZyhvcHRbdGhpcy5pZFByb3BdKSk7XG4gICAgfSk7XG4gICAgdGhpcy50cmVlRmlsdGVyZWREYXRhU291cmNlID0gWy4uLnRoaXMub3B0aW9uc10gYXMgRGF0YVNvdXJjZVtdO1xuICAgIHRoaXMudXBkYXRlVHJlZVNlbGVjdEFsbFN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNoZWNrZWQgY2hhbmdlIGZyb20gemVuLWdyb3VwcyBpbiB0cmVlIG1vZGVcbiAgICovXG4gIHB1YmxpYyBvblRyZWVDaGVja2VkQ2hhbmdlKGRzSXRlbTogRGF0YVNvdXJjZSk6IHZvaWQge1xuICAgIGNvbnN0IGNoZWNrZWRJdGVtcyA9ICh0aGlzLm9wdGlvbnMgYXMgYW55W10pLmZpbHRlcihvcHQgPT4gb3B0LmNoZWNrZWQpO1xuICAgIHRoaXMuc2VsZWN0TW9kZWwgPSBjaGVja2VkSXRlbXMubWFwKG9wdCA9PlxuICAgICAgdGhpcy5yZXR1cm5PcHRpb24gPyBvcHQgOiBvcHRbdGhpcy5pZFByb3BdXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVRyZWVTZWxlY3RBbGxTdGF0ZSgpO1xuICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuICAgIHRoaXMudXBkYXRlTGFiZWwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VsZWN0IGFsbCBjaGFuZ2UgZnJvbSB6ZW4tZ3JvdXBzIGluIHRyZWUgbW9kZVxuICAgKi9cbiAgcHVibGljIG9uVHJlZVNlbGVjdEFsbENoYW5nZShpc1NlbGVjdGVkQWxsOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc1NlbGVjdGVkQWxsID0gaXNTZWxlY3RlZEFsbDtcbiAgICBjb25zdCBjaGVja2VkSXRlbXMgPSAodGhpcy5vcHRpb25zIGFzIGFueVtdKS5maWx0ZXIob3B0ID0+IG9wdC5jaGVja2VkKTtcbiAgICB0aGlzLnNlbGVjdE1vZGVsID0gY2hlY2tlZEl0ZW1zLm1hcChvcHQgPT5cbiAgICAgIHRoaXMucmV0dXJuT3B0aW9uID8gb3B0IDogb3B0W3RoaXMuaWRQcm9wXVxuICAgICk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG4gICAgdGhpcy51cGRhdGVMYWJlbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgaXNTZWxlY3RlZEFsbCBmbGFnIGJhc2VkIG9uIGN1cnJlbnQgY2hlY2tlZCBzdGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUcmVlU2VsZWN0QWxsU3RhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnM/Lmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMuaXNTZWxlY3RlZEFsbCA9ICh0aGlzLm9wdGlvbnMgYXMgYW55W10pLmV2ZXJ5KG9wdCA9PiBvcHQuY2hlY2tlZCk7XG4gIH1cblxufSIsIjxkaXYgW2NsYXNzXT1cImdldFN0YXRlQ2xhc3NlcygpXCI+XG4gIDwhLS0gTGFiZWwgLS0+XG4gIDxsYWJlbCBjbGFzcz1cImFwcC1zZWxlY3QtbGFiZWwgdGV4dCB0ZXh0LXNtIHRleHQtd2VpZ2h0LW1lZGl1bVwiICpuZ0lmPVwibGFiZWxcIlxuICAgICAgICAgW25nQ2xhc3NdPVwieydyZXF1aXJlZCc6IHJlcXVpcmVkLCAnZGlzYWJsZWQnOiBkaXNhYmxlZCwgJ2Rlc3RydWN0aXZlJzogZGVzdHJ1Y3RpdmV9XCI+XG4gICAge3sgbGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICA8c3BhbiAqbmdJZj1cInJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZC1pbmRpY2F0b3JcIj4qPC9zcGFuPlxuICA8L2xhYmVsPlxuXG4gIDwhLS0gU2VsZWN0IElucHV0IC0tPlxuICA8ZGl2IGNsYXNzPVwiYXBwLXNlbGVjdC13cmFwcGVyXCI+XG4gICAgPCEtLSBUZW1wbGF0ZSBTZWxlY3Rpb24gQmFzZWQgb24gTGVhZGluZyBUeXBlIC0tPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImxlYWRpbmdUeXBlXCI+XG4gICAgICA8IS0tIERlZmF1bHQgU2VsZWN0IChubyBsZWFkaW5nIGVsZW1lbnQpIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RlZmF1bHQnXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWZhdWx0U2VsZWN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgXG4gICAgICA8IS0tIEljb24gTGVhZGluZyBTZWxlY3QgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaWNvbidcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImljb25TZWxlY3RUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICBcbiAgICAgIDwhLS0gQXZhdGFyIExlYWRpbmcgU2VsZWN0IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2F2YXRhcidcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImF2YXRhclNlbGVjdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIFxuICAgICAgPCEtLSBEb3QgTGVhZGluZyBTZWxlY3QgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZG90J1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZG90U2VsZWN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgXG4gICAgICA8IS0tIFNlYXJjaCBJbnB1dCBTZWxlY3QgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VhcmNoJ1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VhcmNoSW5wdXRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIERyb3Bkb3duIE1lbnUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFwcC1zZWxlY3QtZHJvcGRvd25cIiBcbiAgICAgICAgIFtuZ0NsYXNzXT1cImdldERyb3Bkb3duRGlyZWN0aW9uQ2xhc3MoKVwiXG4gICAgICAgICAqbmdJZj1cImlzT3BlblwiPlxuICAgICAgICBcbiAgICAgIDwhLS0gVHJlZSBNb2RlOiBlbWJlZCB6ZW4tZ3JvdXBzIGlubGluZSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1RyZWVNb2RlICYmIGlzTXVsdGlzZWxlY3Q7IGVsc2UgZmxhdExpc3RcIj5cbiAgICAgICAgPHplbi1ncm91cHMgW2lubGluZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwiJGFueShvcHRpb25zKVwiXG4gICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJlZERhdGFTb3VyY2VdPVwidHJlZUZpbHRlcmVkRGF0YVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgIFtoaWRlU2VsZWN0QWxsXT1cImhpZGVTZWxlY3RBbGxcIlxuICAgICAgICAgICAgICAgICAgICBbaGlkZVNlYXJjaF09XCJoaWRlVHJlZVNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgIFtpZFByb3BdPVwiaWRQcm9wXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlQcm9wXT1cImRpc3BsYXlQcm9wXCJcbiAgICAgICAgICAgICAgICAgICAgWyhpc1NlbGVjdGVkQWxsKV09XCJpc1NlbGVjdGVkQWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGlzU2VsZWN0ZWRBbGxDaGFuZ2UpPVwib25UcmVlU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJvblRyZWVDaGVja2VkQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPC96ZW4tZ3JvdXBzPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gRmxhdCBMaXN0IE1vZGUgKGRlZmF1bHQpIC0tPlxuICAgICAgPG5nLXRlbXBsYXRlICNmbGF0TGlzdD5cbiAgICAgICAgPCEtLSBTZWFyY2ggQm94IGZvciBoYXNTZWFyY2ggKG5vdCBmb3Igc2VhcmNoIHR5cGUgYXMgaXQgaGFzIGlubGluZSBzZWFyY2gpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLXNlbGVjdC1zZWFyY2hcIiAqbmdJZj1cImxlYWRpbmdUeXBlICE9PSAnc2VhcmNoJyAmJiBoYXNTZWFyY2ggJiYgIWRpc2FibGVkXCI+XG4gICAgICAgICAgPHplbi1pY29uIFtuYW1lXT1cIidzZWFyY2gnXCJcbiAgICAgICAgICAgICAgICAgICAgW2N1c3RvbUNvbG9yXT1cIicjNjY3MDg1J1wiPlxuICAgICAgICAgIDwvemVuLWljb24+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCJcbiAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2hDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcHAtc2VsZWN0LXNlYXJjaC1pbnB1dFwiPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE9wdGlvbnMgTGlzdCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1zZWxlY3Qtb3B0aW9uc1wiPlxuICAgICAgICAgIDwhLS0gU2VsZWN0IEFsbCBPcHRpb24gZm9yIE11bHRpc2VsZWN0IC0tPlxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpc011bHRpc2VsZWN0ICYmICFoaWRlU2VsZWN0QWxsICYmIGZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXBwLXNlbGVjdC1vcHRpb24gc2VsZWN0LWFsbFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VsZWN0QWxsKClcIj5cbiAgICAgICAgICAgIDx6ZW4tY2hlY2tib3ggY2xhc3M9XCJhcHAtc2VsZWN0LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNBbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVWYWx1ZUNoYW5nZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCI+XG4gICAgICAgICAgICA8L3plbi1jaGVja2JveD5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXBwLXNlbGVjdC1vcHRpb24tdGV4dFwiPlxuICAgICAgICAgICAgICBTZWxlY3QgQWxsXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiYXBwLXNlbGVjdC1uby1vcHRpb25zXCI+XG4gICAgICAgICAgICBObyBtYXRjaGluZyBvcHRpb25zIGZvdW5kXG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXBwLXNlbGVjdC1vcHRpb25cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImlzU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0T3B0aW9uKG9wdGlvbilcIj5cblxuICAgICAgICAgICAgPCEtLSBDaGVja2JveCBmb3IgTXVsdGlzZWxlY3QgLS0+XG4gICAgICAgICAgICA8emVuLWNoZWNrYm94IGNsYXNzPVwiYXBwLXNlbGVjdC1jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNNdWx0aXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlVmFsdWVDaGFuZ2VdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiPlxuICAgICAgICAgICAgPC96ZW4tY2hlY2tib3g+XG5cbiAgICAgICAgICAgIDwhLS0gT3B0aW9uIExlYWRpbmcgRWxlbWVudCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtc2VsZWN0LW9wdGlvbi1sZWFkaW5nXCIgKm5nSWY9XCJsZWFkaW5nVHlwZSAhPT0gJ2RlZmF1bHQnXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImxlYWRpbmdUeXBlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ljb24nXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaWNvbkxlYWRpbmdFbGVtZW50OyBjb250ZXh0OiB7IG9wdGlvbjogb3B0aW9uIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXZhdGFyJ1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImF2YXRhckxlYWRpbmdFbGVtZW50OyBjb250ZXh0OiB7IG9wdGlvbjogb3B0aW9uIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZG90J1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRvdExlYWRpbmdFbGVtZW50OyBjb250ZXh0OiB7IG9wdGlvbjogb3B0aW9uIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBPcHRpb24gVGV4dCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtc2VsZWN0LW9wdGlvbi10ZXh0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPCEtLSBVc2UgY3VzdG9tIHRlbXBsYXRlIGlmIHByb3ZpZGVkIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTXVsdGlzZWxlY3QgJiYgb3B0aW9uVGVtcGxhdGU7IGVsc2UgZGVmYXVsdE9wdGlvblRleHRcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uVGVtcGxhdGUudGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBvcHRpb246IG9wdGlvbiB9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE9wdGlvblRleHQ+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcHAtc2VsZWN0LW9wdGlvbi10ZXh0XCIgW2NsYXNzLmFwcC1zZWxlY3Qtb3B0aW9uLXRydW5jYXRlXT1cImlzVHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGdldE5hbWUob3B0aW9uKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFwcC1zZWxlY3Qtb3B0aW9uLXNlY29uZGFyeVwiICpuZ0lmPVwib3B0aW9uLnNlY29uZGFyeVRleHRcIj5cbiAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5zZWNvbmRhcnlUZXh0IH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gQ2hlY2sgSWNvbiBmb3IgU2luZ2xlIFNlbGVjdCAtLT5cbiAgICAgICAgICAgIDx6ZW4taWNvbiAqbmdJZj1cIiFpc011bHRpc2VsZWN0ICYmIGlzU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcHAtc2VsZWN0LW9wdGlvbi1jaGVja1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ2NoZWNrJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2N1c3RvbUNvbG9yXT1cIicjMTM2QUI2J1wiPlxuICAgICAgICAgICAgPC96ZW4taWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgXG4gIDwhLS0gSGludCB0ZXh0IC8gRXJyb3IgbWVzc2FnZSAtLT5cbiAgPGRpdiAqbmdJZj1cIihkZXN0cnVjdGl2ZSAmJiBlcnJvck1lc3NhZ2UpIHx8IGhpbnRUZXh0XCIgXG4gICAgICAgY2xhc3M9XCJhcHAtc2VsZWN0LWhpbnQgdGV4dCB0ZXh0LXNtIHRleHQtd2VpZ2h0LXJlZ3VsYXJcIlxuICAgICAgIFtuZ0NsYXNzXT1cInsnZGVzdHJ1Y3RpdmUnOiBkZXN0cnVjdGl2ZX1cIj5cbiAgICA8aSAqbmdJZj1cImRlc3RydWN0aXZlXCIgY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZCBoaW50LWljb25cIj5lcnJvcl9vdXRsaW5lPC9pPlxuICAgIDxzcGFuPnt7ICgoZGVzdHJ1Y3RpdmUgJiYgZXJyb3JNZXNzYWdlKSA/IGVycm9yTWVzc2FnZSA6IGhpbnRUZXh0KSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+XG48IS0tIE1BSU4gU0VMRUNUIElOUFVUIFRFTVBMQVRFUyAtLT5cbjwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPlxuXG48IS0tIERlZmF1bHQgU2VsZWN0IFRlbXBsYXRlIChObyBMZWFkaW5nIEVsZW1lbnQpIC0tPlxuPG5nLXRlbXBsYXRlICNkZWZhdWx0U2VsZWN0VGVtcGxhdGU+XG4gIDxidXR0b24gY2xhc3M9XCJhcHAtc2VsZWN0LWlucHV0XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bigpXCJcbiAgICAgICAgICBbY2xhc3MuZm9jdXNlZF09XCJpc09wZW5cIlxuICAgICAgICAgIFtjbGFzcy5oYXMtdmFsdWVdPVwiIWlzTW9kZWxFbXB0eSgpXCI+XG4gICAgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlbGVjdFZhbHVlRGlzcGxheVwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93bkFycm93XCI+PC9uZy1jb250YWluZXI+XG4gIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBJY29uIFNlbGVjdCBUZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjaWNvblNlbGVjdFRlbXBsYXRlPlxuICA8YnV0dG9uIGNsYXNzPVwiYXBwLXNlbGVjdC1pbnB1dFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKVwiXG4gICAgICAgICAgW2NsYXNzLmZvY3VzZWRdPVwiaXNPcGVuXCJcbiAgICAgICAgICBbY2xhc3MuaGFzLXZhbHVlXT1cIiFpc01vZGVsRW1wdHkoKVwiPlxuICAgIFxuICAgIDxkaXYgY2xhc3M9XCJhcHAtc2VsZWN0LWxlYWRpbmdcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpY29uTGVhZGluZ0VsZW1lbnQ7IGNvbnRleHQ6IHsgb3B0aW9uOiBnZXRTZWxlY3RlZE9wdGlvbigpLCBpY29uOiBsZWFkaW5nSWNvbiB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlbGVjdFZhbHVlRGlzcGxheVwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93bkFycm93XCI+PC9uZy1jb250YWluZXI+XG4gIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBBdmF0YXIgU2VsZWN0IFRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNhdmF0YXJTZWxlY3RUZW1wbGF0ZT5cbiAgPGJ1dHRvbiBjbGFzcz1cImFwcC1zZWxlY3QtaW5wdXRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKClcIlxuICAgICAgICAgIFtjbGFzcy5mb2N1c2VkXT1cImlzT3BlblwiXG4gICAgICAgICAgW2NsYXNzLmhhcy12YWx1ZV09XCIhaXNNb2RlbEVtcHR5KClcIj5cbiAgICBcbiAgICA8ZGl2IGNsYXNzPVwiYXBwLXNlbGVjdC1sZWFkaW5nXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXZhdGFyTGVhZGluZ0VsZW1lbnQ7IGNvbnRleHQ6IHsgb3B0aW9uOiBnZXRTZWxlY3RlZE9wdGlvbigpLCBhdmF0YXI6IGxlYWRpbmdBdmF0YXIgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3RWYWx1ZURpc3BsYXlcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd25BcnJvd1wiPjwvbmctY29udGFpbmVyPlxuICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gRG90IFNlbGVjdCBUZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjZG90U2VsZWN0VGVtcGxhdGU+XG4gIDxidXR0b24gY2xhc3M9XCJhcHAtc2VsZWN0LWlucHV0XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bigpXCJcbiAgICAgICAgICBbY2xhc3MuZm9jdXNlZF09XCJpc09wZW5cIlxuICAgICAgICAgIFtjbGFzcy5oYXMtdmFsdWVdPVwiIWlzTW9kZWxFbXB0eSgpXCI+XG4gICAgXG4gICAgPGRpdiBjbGFzcz1cImFwcC1zZWxlY3QtbGVhZGluZ1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRvdExlYWRpbmdFbGVtZW50OyBjb250ZXh0OiB7IG9wdGlvbjogZ2V0U2VsZWN0ZWRPcHRpb24oKSwgY29sb3I6IGxlYWRpbmdEb3RDb2xvciB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlbGVjdFZhbHVlRGlzcGxheVwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93bkFycm93XCI+PC9uZy1jb250YWluZXI+XG4gIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBTZWFyY2ggSW5wdXQgVGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI3NlYXJjaElucHV0VGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJhcHAtc2VsZWN0LWlucHV0IGFwcC1zZWxlY3Qtc2VhcmNoLWlucHV0XCJcbiAgICAgICBbY2xhc3MuZm9jdXNlZF09XCJpc09wZW4gfHwgc2VhcmNoRm9jdXNlZFwiXG4gICAgICAgW2NsYXNzLmhhcy12YWx1ZV09XCIhaXNNb2RlbEVtcHR5KClcIj5cbiAgICBcbiAgICA8IS0tIFNlYXJjaCBJY29uIC0tPlxuICAgIDx6ZW4taWNvbiBbbmFtZV09XCInc2VhcmNoJ1wiXG4gICAgICAgICAgICAgIFtjdXN0b21Db2xvcl09XCJkaXNhYmxlZCA/ICcjOUNBM0FGJyA6ICcjNjY3MDg1J1wiPlxuICAgIDwvemVuLWljb24+XG4gICAgXG4gICAgPCEtLSBTZWFyY2ggSW5wdXQgRmllbGQgLS0+XG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgY2xhc3M9XCJhcHAtc2VsZWN0LXNlYXJjaC1maWVsZFwiXG4gICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoSW5wdXRWYWx1ZVwiXG4gICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoSW5wdXRDaGFuZ2UoKVwiXG4gICAgICAgICAgIChmb2N1cyk9XCJvblNlYXJjaEZvY3VzKClcIlxuICAgICAgICAgICAoYmx1cik9XCJvblNlYXJjaEJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWxlY3RlZERpc3BsYXkgfHwgcGxhY2Vob2xkZXJcIlxuICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cbjwhLS0gU0hBUkVEIENPTVBPTkVOVCBURU1QTEFURVMgLS0+XG48IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cblxuPCEtLSBTZWxlY3QgVmFsdWUgRGlzcGxheSAtLT5cbjxuZy10ZW1wbGF0ZSAjc2VsZWN0VmFsdWVEaXNwbGF5PlxuICA8ZGl2IGNsYXNzPVwiYXBwLXNlbGVjdC12YWx1ZS13cmFwcGVyXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJhcHAtc2VsZWN0LXZhbHVlXCIgW2NsYXNzLnBsYWNlaG9sZGVyXT1cImlzTW9kZWxFbXB0eSgpXCI+XG4gICAgICB7eyBzZWxlY3RlZERpc3BsYXkgfHwgcGxhY2Vob2xkZXIgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJhcHAtc2VsZWN0LXNlY29uZGFyeVwiICpuZ0lmPVwiZ2V0U2VsZWN0ZWRTZWNvbmRhcnlUZXh0KCkgJiYgIWlzTW9kZWxFbXB0eSgpXCI+XG4gICAgICB7eyBnZXRTZWxlY3RlZFNlY29uZGFyeVRleHQoKSB9fVxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIERyb3Bkb3duIEFycm93IC0tPlxuPG5nLXRlbXBsYXRlICNkcm9wZG93bkFycm93PlxuICA8emVuLWljb24gY2xhc3M9XCJhcHAtc2VsZWN0LWFycm93XCIgXG4gICAgICAgICAgICBbY2xhc3Mucm90YXRlZF09XCJpc09wZW5cIiBcbiAgICAgICAgICAgIFtuYW1lXT1cIidjaGV2cm9uLWRvd24nXCJcbiAgICAgICAgICAgIFtjdXN0b21Db2xvcl09XCInIzY2NzA4NSdcIj5cbiAgPC96ZW4taWNvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPlxuPCEtLSBMRUFESU5HIEVMRU1FTlQgVEVNUExBVEVTIC0tPlxuPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+XG5cbjwhLS0gSWNvbiBMZWFkaW5nIEVsZW1lbnQgKHdpdGggc21hcnQgcmVzb2x1dGlvbikgLS0+XG48bmctdGVtcGxhdGUgI2ljb25MZWFkaW5nRWxlbWVudCBsZXQtb3B0aW9uPVwib3B0aW9uXCIgbGV0LWljb249XCJpY29uXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpY29uIHx8IG9wdGlvbj8uaWNvbiB8fCBvcHRpb24/Lmljb25OYW1lXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEljb25QYXRoKG9wdGlvbiwgaWNvbikgYXMgaWNvblBhdGhcIj5cbiAgICAgIDwhLS0gSWYgaWNvbiBjb250YWlucyAvIG9yIC4gdHJlYXQgYXMgU1ZHIHBhdGggLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGljb24gJiYgKGljb24uaW5jbHVkZXMoJy8nKSB8fCBpY29uLmluY2x1ZGVzKCcuJykpKSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb24/Lmljb24gJiYgKG9wdGlvbi5pY29uLmluY2x1ZGVzKCcvJykgfHwgb3B0aW9uLmljb24uaW5jbHVkZXMoJy4nKSkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uPy5pY29uTmFtZSAmJiAob3B0aW9uLmljb25OYW1lLmluY2x1ZGVzKCcvJykgfHwgb3B0aW9uLmljb25OYW1lLmluY2x1ZGVzKCcuJykpKVwiPlxuICAgICAgICA8IS0tIFVzZSBpbWcgdGFnIGZvciBFeGNlbCB0byBwcmVzZXJ2ZSBjb2xvcnMgLS0+XG4gICAgICAgIDxpbWcgKm5nSWY9XCJpY29uUGF0aC5pbmNsdWRlcygnZXhjZWwnKVwiIFxuICAgICAgICAgICAgIFtzcmNdPVwiaWNvblBhdGhcIiBcbiAgICAgICAgICAgICBhbHQ9XCJcIlxuICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDIwcHg7IGhlaWdodDogMjBweDtcIj5cbiAgICAgICAgPCEtLSBVc2UgemVuLWljb24gd2l0aCBzcmMgZm9yIG90aGVyIFNWRyBmaWxlcyAtLT5cbiAgICAgICAgPHplbi1pY29uICpuZ0lmPVwiIWljb25QYXRoLmluY2x1ZGVzKCdleGNlbCcpXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwiaWNvblBhdGhcIlxuICAgICAgICAgICAgICAgICAgW2N1c3RvbUNvbG9yXT1cIicjNjY3MDg1J1wiPlxuICAgICAgICA8L3plbi1pY29uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIE90aGVyd2lzZSB0cmVhdCBhcyBNYXRlcmlhbCBpY29uIG5hbWUgb3Igc3BlY2lhbCBjYXNlcyAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKChpY29uICYmIChpY29uLmluY2x1ZGVzKCcvJykgfHwgaWNvbi5pbmNsdWRlcygnLicpKSkgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbj8uaWNvbiAmJiAob3B0aW9uLmljb24uaW5jbHVkZXMoJy8nKSB8fCBvcHRpb24uaWNvbi5pbmNsdWRlcygnLicpKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uPy5pY29uTmFtZSAmJiAob3B0aW9uLmljb25OYW1lLmluY2x1ZGVzKCcvJykgfHwgb3B0aW9uLmljb25OYW1lLmluY2x1ZGVzKCcuJykpKSlcIj5cbiAgICAgICAgPCEtLSBTcGVjaWFsIGNhc2UgZm9yIEV4Y2VsIGljb24gLSB1c2UgaW1nIHRvIHByZXNlcnZlIGNvbG9ycyAtLT5cbiAgICAgICAgPGltZyAqbmdJZj1cIihpY29uID09PSAnZXhjZWwnKSB8fCAob3B0aW9uPy5pY29uID09PSAnZXhjZWwnKSB8fCAob3B0aW9uPy5pY29uTmFtZSA9PT0gJ2V4Y2VsJylcIlxuICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2V4Y2VsLnN2Z1wiXG4gICAgICAgICAgICAgYWx0PVwiRXhjZWxcIlxuICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDIwcHg7IGhlaWdodDogMjBweDtcIj5cbiAgICAgICAgPCEtLSBNYXRlcmlhbCBpY29uIG5hbWVzIC0tPlxuICAgICAgICA8emVuLWljb24gKm5nSWY9XCIoaWNvbiAhPT0gJ2V4Y2VsJykgJiYgKG9wdGlvbj8uaWNvbiAhPT0gJ2V4Y2VsJykgJiYgKG9wdGlvbj8uaWNvbk5hbWUgIT09ICdleGNlbCcpXCJcbiAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImljb24gfHwgb3B0aW9uPy5pY29uIHx8IG9wdGlvbj8uaWNvbk5hbWVcIlxuICAgICAgICAgICAgICAgICAgW2N1c3RvbUNvbG9yXT1cIicjNjY3MDg1J1wiPlxuICAgICAgICA8L3plbi1pY29uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBBdmF0YXIgTGVhZGluZyBFbGVtZW50IC0tPlxuPG5nLXRlbXBsYXRlICNhdmF0YXJMZWFkaW5nRWxlbWVudCBsZXQtb3B0aW9uPVwib3B0aW9uXCIgbGV0LWF2YXRhcj1cImF2YXRhclwiPlxuICA8ZGl2IGNsYXNzPVwiYXBwLXNlbGVjdC1hdmF0YXJcIiAqbmdJZj1cImF2YXRhciB8fCBvcHRpb24/LmF2YXRhclwiID5cbiAgICA8aW1nIFtzcmNdPVwiYXZhdGFyIHx8IG9wdGlvbj8uYXZhdGFyXCIgYWx0PVwiXCI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBEb3QgTGVhZGluZyBFbGVtZW50IC0tPlxuPG5nLXRlbXBsYXRlICNkb3RMZWFkaW5nRWxlbWVudCBsZXQtb3B0aW9uPVwib3B0aW9uXCIgbGV0LWNvbG9yPVwiY29sb3JcIj5cbiAgPGRpdiBjbGFzcz1cImFwcC1zZWxlY3QtZG90XCJcbiAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJjb2xvciB8fCBvcHRpb24/LmRvdENvbG9yIHx8ICcjMTBCOTgxJ1wiPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19
841
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9zZWxlY3QvemVuZHUtc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9zZWxlY3QvemVuZHUtc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFxQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0ksT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDckYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7Ozs7O0FBcUR2RixNQUFNLE9BQU8sb0JBQW9CO0lBME8vQixZQUFvQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBbk8xQzs7V0FFRztRQUNPLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFlLENBQUM7UUFFOUQ7O1dBRUc7UUFDTSxZQUFPLEdBQTJCLEVBQUUsQ0FBQztRQVk5Qzs7V0FFRztRQUNNLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFFdkI7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLFFBQVEsQ0FBQztRQUVoQzs7V0FFRztRQUNNLGdCQUFXLEdBQXFELFNBQVMsQ0FBQztRQWlCbkY7O1dBRUc7UUFDTSxnQkFBVyxHQUFXLE1BQU0sQ0FBQztRQUV0Qzs7V0FFRztRQUNNLFdBQU0sR0FBVyxJQUFJLENBQUM7UUFFL0I7O1dBRUc7UUFDTSxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRTNCOztXQUVHO1FBQ00sa0JBQWEsR0FB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QUFDLDBCQUEwQjtnQkFLQyxhQUFhO3NCQUFyRCxZQUFZO3VCQUFDLHlCQUF5QjtnQkFLRyxjQUFjO3NCQUF2RCxZQUFZO3VCQUFDLDBCQUEwQjtnQkFtZnhDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24sIENvbnRlbnRDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgWmVuZHVTZWxlY3RPcHRpb25EaXJlY3RpdmUgfSBmcm9tICcuL3RlbXBsYXRlcy96ZW5kdS1zZWxlY3Qtb3B0aW9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBaZW5kdVNlbGVjdFZhbHVlRGlyZWN0aXZlIH0gZnJvbSAnLi90ZW1wbGF0ZXMvemVuZHUtc2VsZWN0LXZhbHVlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBaZW5kdVNlbGVjdEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4vdGVtcGxhdGVzL3plbmR1LXNlbGVjdC1idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuLi9maWx0ZXIvZmlsdGVyc0NvbmZpZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF6eUxvYWRlclNlYXJjaCB7XG4gIHRleHQ/OiBzdHJpbmc7XG4gIGlkcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhenlMb2FkZXJSZXN1bHQge1xuICBpZDogc3RyaW5nIHwgbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nIHwgbnVtYmVyOyAgLy8gQ29tcGF0aWJsZSB3aXRoIERhdGFTb3VyY2VcbiAgdGV4dD86IHN0cmluZzsgICAgICAgICAgIC8vIE9yaWdpbmFsIHByb3BlcnR5XG4gIGNoZWNrZWQ/OiBib29sZWFuO1xuICBpbWFnZVVybD86IHN0cmluZztcbiAgaXNPcGVuPzogYm9vbGVhbjtcbiAgY2hpbGRyZW4/OiBzdHJpbmdbXTtcbiAgcGFyZW50SWQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGxldmVsPzogbnVtYmVyO1xuICBpbmRleD86IG51bWJlcjtcbiAgYmFkZ2VCZ0NvbG9yPzogc3RyaW5nO1xuICBiYWRnZUNvbG9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBMYXp5TG9hZGVyRnVuY3Rpb24gPSAoXG4gIHNlYXJjaDogTGF6eUxvYWRlclNlYXJjaCwgXG4gIG9mZnNldDogbnVtYmVyLCBcbiAgbGltaXQ6IG51bWJlclxuKSA9PiBQcm9taXNlPExhenlMb2FkZXJSZXN1bHRbXT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkT3B0aW9uRXZlbnQge1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZU9wdGlvbkV2ZW50IHtcbiAgcmVtb3ZlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RPcHRpb24ge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIGlkPzogc3RyaW5nIHwgbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xuICBpY29uTmFtZT86IHN0cmluZztcbiAgYXZhdGFyPzogc3RyaW5nO1xuICBkb3RDb2xvcj86IHN0cmluZztcbiAgc2Vjb25kYXJ5VGV4dD86IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd6ZW4tc2VsZWN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vemVuZHUtc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi96ZW5kdS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBaZW5kdVNlbGVjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiAyLVdheSBjb21wb25lbnQgcHJvcGVydHkgZm9yIHNlbGVjdGVkIGl0ZW1zLlxuICAgKiBEb24ndCBpbml0aWFsaXplIHByb3BlcnR5IG9uIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgY2hhbmdlIHNvdXJjZSBwYXJhbWV0ZXJcbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdE1vZGVsOiBhbnkgfCBhbnlbXTtcbiAgXG4gIC8qKlxuICAgKiBjYWxsYmFjayB0byBlbWl0IGNoYW5nZXMgZm9yIHBhcmVudCBjb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKSBzZWxlY3RNb2RlbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55IHwgYW55W10+KCk7XG4gIFxuICAvKipcbiAgICogTGlzdCBvZiBvcHRpb25zXG4gICAqL1xuICBASW5wdXQoKSBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSB8IGFueVtdID0gW107XG4gIFxuICAvKipcbiAgICogTGFiZWwgdGV4dCBhYm92ZSB0aGUgc2VsZWN0XG4gICAqL1xuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZztcbiAgXG4gIC8qKlxuICAgKiBTdXBwb3J0aW5nIHRleHQgYmVsb3cgdGhlIHNlbGVjdFxuICAgKi9cbiAgQElucHV0KCkgc3VwcG9ydGluZ1RleHQ/OiBzdHJpbmc7XG4gIFxuICAvKipcbiAgICogSGludCB0ZXh0IChzaG93biBiZWxvdyBzZWxlY3QpXG4gICAqL1xuICBASW5wdXQoKSBoaW50VGV4dCA9ICcnO1xuICBcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHRcbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1NlbGVjdCc7XG4gIFxuICAvKipcbiAgICogTGVhZGluZyBlbGVtZW50IHR5cGVcbiAgICovXG4gIEBJbnB1dCgpIGxlYWRpbmdUeXBlOiAnZGVmYXVsdCcgfCAnaWNvbicgfCAnYXZhdGFyJyB8ICdkb3QnIHwgJ3NlYXJjaCcgPSAnZGVmYXVsdCc7XG4gIFxuICAvKipcbiAgICogSWNvbiBmb3IgaWNvbiBsZWFkaW5nIHR5cGVcbiAgICovXG4gIEBJbnB1dCgpIGxlYWRpbmdJY29uPzogc3RyaW5nO1xuICBcbiAgLyoqXG4gICAqIEF2YXRhciBVUkwgZm9yIGF2YXRhciBsZWFkaW5nIHR5cGVcbiAgICovXG4gIEBJbnB1dCgpIGxlYWRpbmdBdmF0YXI/OiBzdHJpbmc7XG4gIFxuICAvKipcbiAgICogRG90IGNvbG9yIGZvciBkb3QgbGVhZGluZyB0eXBlXG4gICAqL1xuICBASW5wdXQoKSBsZWFkaW5nRG90Q29sb3I/OiBzdHJpbmc7XG4gIFxuICAvKipcbiAgICogVGhpcyBpcyBhIGtleSB2YWx1ZSB0byBnZXQgZGlzcGxheSBuYW1lIGZyb20gb3B0aW9uIG9iamVjdFxuICAgKi9cbiAgQElucHV0KCkgZGlzcGxheVByb3A6IHN0cmluZyA9ICduYW1lJztcbiAgXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEga2V5IHZhbHVlIHRvIGdldCBpZCBmcm9tIG9wdGlvbiBvYmplY3RcbiAgICovXG4gIEBJbnB1dCgpIGlkUHJvcDogc3RyaW5nID0gJ2lkJztcbiAgXG4gIC8qKlxuICAgKiBFbmFibGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHlcbiAgICovXG4gIEBJbnB1dCgpIGhhc1NlYXJjaCA9IGZhbHNlO1xuICBcbiAgLyoqXG4gICAqIENvbXBvbmVudCBwcm9wZXJ0eSB0byBlbmFibGUgbXVsdGlzZWxlY3RcbiAgICovXG4gIEBJbnB1dCgpIGlzTXVsdGlzZWxlY3QgPSBmYWxzZTtcbiAgXG4gIC8qKlxuICAgKiBBbGlhcyBmb3IgaXNNdWx0aXNlbGVjdCBmb3IgZWFzaWVyIHVzYWdlXG4gICAqL1xuICBASW5wdXQoKSBcbiAgc2V0IG11bHRpc2VsZWN0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc011bHRpc2VsZWN0ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IG11bHRpc2VsZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTXVsdGlzZWxlY3Q7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBBdXRvLWRldGVjdGVkIHRyZWUgbW9kZTogdHJ1ZSBpZiBhbnkgb3B0aW9uIGhhcyBhIGBjaGlsZHJlbmAgYXJyYXlcbiAgICovXG4gIHB1YmxpYyBpc1RyZWVNb2RlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEhpZGUgXCJTZWxlY3QgQWxsXCIgb3B0aW9uIGluIGJvdGggdHJlZSBtb2RlIGFuZCBmbGF0IG11bHRpc2VsZWN0XG4gICAqL1xuICBASW5wdXQoKSBoaWRlU2VsZWN0QWxsID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEhpZGUgc2VhcmNoIGJveCBpbiB0cmVlIG1vZGVcbiAgICovXG4gIEBJbnB1dCgpIGhpZGVUcmVlU2VhcmNoID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE1hcmsgdGhlIHNlbGVjdCBhcyByZXF1aXJlZCAoc2hvd3MgKiBpbmRpY2F0b3Igb24gbGFiZWwpXG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRoZSBzZWxlY3RcbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIFxuICAvKipcbiAgICogU2hvdyBlcnJvciBzdGF0ZVxuICAgKi9cbiAgQElucHV0KCkgZXJyb3IgPSBmYWxzZTtcbiAgXG4gIC8qKlxuICAgKiBFcnJvciBtZXNzYWdlIHRvIGRpc3BsYXlcbiAgICovXG4gIEBJbnB1dCgpIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgXG4gIC8qKlxuICAgKiBEZXN0cnVjdGl2ZS9lcnJvciBzdGF0ZSAoc2ltaWxhciB0byB6ZW4taW5wdXQpXG4gICAqL1xuICBASW5wdXQoKSBkZXN0cnVjdGl2ZSA9IGZhbHNlO1xuICBcbiAgLyoqXG4gICAqIFNpemUgdmFyaWFudFxuICAgKi9cbiAgQElucHV0KCkgc2l6ZTogJ3NtJyB8ICdtZCcgPSAnbWQnO1xuICBcbiAgLyoqXG4gICAqIENvbXBvbmVudCBwcm9wZXJ0eSB0byByZXR1cm4gd2hvbGUgb3B0aW9uIG9iamVjdFxuICAgKiBCeSBkZWZhdWx0IG9ubHkgaWQgdmFsdWUgaXMgcmV0dXJuZWRcbiAgICovXG4gIEBJbnB1dCgpIHJldHVybk9wdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgXG4gIC8qKlxuICAgKiBUcnVuY2F0ZSB0ZXh0IHdpdGggXCIuLi5cIiBhdCB0aGUgZW5kXG4gICAqL1xuICBASW5wdXQoKSBpc1RydW5jYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvKipcbiAgICogc2hvdyBBZGQgTmV3IE9wdGlvbiBhdCBmaXJzdCBwbGFjZVxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlQWRkTmV3T3B0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvKipcbiAgICogU2hvdyBBZGQgTmV3IG9wdGlvbiB0ZXh0IGJ5IGRlZmF1bHQgaWYgbmV3T3B0aW9uVGV4dCBlbXB0eVxuICAgKi9cbiAgQElucHV0KCkgc2hvd0RlZmF1bHRBZGRPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBcbiAgLyoqXG4gICAqIGRpc3BsYXkgY3VzdG9tIHRleHQgZm9yIEFkZCBOZXcgT3B0aW9uXG4gICAqL1xuICBASW5wdXQoKSBuZXdPcHRpb25UZXh0OiBzdHJpbmc7XG5cbiAgXG4gIC8qKlxuICAgKiBFbWl0IGV2ZW50IHdoZW4gQWRkIE5ldyBPcHRpb24gaXMgY2xpY2tlZFxuICAgKi9cbiAgQE91dHB1dCgpIGFkZE5ld09wdGlvbjogRXZlbnRFbWl0dGVyPEFkZE9wdGlvbkV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QWRkT3B0aW9uRXZlbnQ+KCk7XG4gIFxuICAvKipcbiAgICogc2hvdyByZW1vdmUgT3B0aW9uIGF0IGZpcnN0IHBsYWNlXG4gICAqL1xuICBASW5wdXQoKSBlbmFibGVSZW1vdmVPcHRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8qKlxuICAgKiBkaXNwbGF5IGN1c3RvbSB0ZXh0IGZvciByZW1vdmUgT3B0aW9uXG4gICAqL1xuICBASW5wdXQoKSByZW1vdmVPcHRpb25UZXh0OiBzdHJpbmc7XG4gIFxuICAvKipcbiAgICogRW5hYmxlIGxhenkgbG9hZGluZyBmb3Igb3B0aW9uc1xuICAgKi9cbiAgQElucHV0KCkgaXNMYXp5TG9hZGluZyA9IGZhbHNlO1xuICBcbiAgLyoqXG4gICAqIExhenkgbG9hZGVyIGZ1bmN0aW9uIHRvIGZldGNoIG9wdGlvbnNcbiAgICovXG4gIEBJbnB1dCgpIGxhenlMb2FkZXI/OiBMYXp5TG9hZGVyRnVuY3Rpb247XG4gIFxuICAvKipcbiAgICogUHJlZmVycmVkIGRpcmVjdGlvbiBmb3IgZHJvcGRvd24gdG8gb3BlblxuICAgKi9cbiAgQElucHV0KCkgcHJlZmVycmVkT3BlbkRpcmVjdGlvbjogJ2F1dG8nIHwgJ3VwJyB8ICdkb3duJyA9ICdhdXRvJztcbiAgXG4gIC8qKlxuICAgKiBFbWl0IGV2ZW50IHdoZW4gcmVtb3ZlIE9wdGlvbiBpcyBjbGlja2VkXG4gICAqL1xuICBAT3V0cHV0KCkgcmVtb3ZlT3B0aW9uOiBFdmVudEVtaXR0ZXI8UmVtb3ZlT3B0aW9uRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZW1vdmVPcHRpb25FdmVudD4oKTtcbiAgXG4gIC8qKlxuICAgKiBFbWl0IGV2ZW50IHdoZW4gc2VsZWN0IGlzIGNsb3NlZCwgc2VuZGluZyB0aGUgc2VsZWN0ZWQgZGF0YVxuICAgKi9cbiAgQE91dHB1dCgpIGNsb3NlZDogRXZlbnRFbWl0dGVyPGFueSB8IGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55IHwgYW55W10+KCk7XG4gIFxuICAvKipcbiAgICogU3RhdGUgdHJhY2tpbmdcbiAgICovXG4gIHB1YmxpYyBpc09wZW4gPSBmYWxzZTtcbiAgcHVibGljIHNlYXJjaFRleHQgPSAnJztcbiAgcHVibGljIHNlYXJjaElucHV0VmFsdWUgPSAnJztcbiAgcHVibGljIHNlYXJjaEZvY3VzZWQgPSBmYWxzZTtcbiAgcHVibGljIGZpbHRlcmVkT3B0aW9uczogU2VsZWN0T3B0aW9uW10gfCBhbnlbXSA9IFtdO1xuICBwdWJsaWMgc2VsZWN0ZWREaXNwbGF5ID0gJyc7XG4gIHB1YmxpYyBsYWJlbFRleHQgPSAnJztcbiAgcHVibGljIG9wdGlvbjogU2VsZWN0T3B0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBjYW5Mb2FkTW9yZSA9IGZhbHNlO1xuICBwdWJsaWMgaXNMb2FkaW5nTm93ID0gZmFsc2U7XG5cbiAgLy8gVHJlZSBtb2RlIHByb3BlcnRpZXNcbiAgcHVibGljIHRyZWVGaWx0ZXJlZERhdGFTb3VyY2U6IERhdGFTb3VyY2VbXSA9IFtdO1xuICBwdWJsaWMgaXNTZWxlY3RlZEFsbCA9IGZhbHNlO1xuICBcbiAgLyoqXG4gICAqIFNlbGVjdCBPcHRpb24gVGVtcGxhdGUgZm9yIGN1c3RvbSBIVE1MXG4gICAqL1xuICBAQ29udGVudENoaWxkKFplbmR1U2VsZWN0T3B0aW9uRGlyZWN0aXZlKSBvcHRpb25UZW1wbGF0ZTogWmVuZHVTZWxlY3RPcHRpb25EaXJlY3RpdmU7XG4gIFxuICAvKipcbiAgICogU2VsZWN0IFZhbHVlIFRlbXBsYXRlIGZvciBjdXN0b20gSFRNTFxuICAgKi9cbiAgQENvbnRlbnRDaGlsZChaZW5kdVNlbGVjdFZhbHVlRGlyZWN0aXZlKSB2YWx1ZVRlbXBsYXRlOiBaZW5kdVNlbGVjdFZhbHVlRGlyZWN0aXZlO1xuICBcbiAgLyoqXG4gICAqIFNlbGVjdCBCdXR0b24gVGVtcGxhdGUgZm9yIGN1c3RvbSBIVE1MXG4gICAqL1xuICBAQ29udGVudENoaWxkKFplbmR1U2VsZWN0QnV0dG9uRGlyZWN0aXZlKSBidXR0b25UZW1wbGF0ZTogWmVuZHVTZWxlY3RCdXR0b25EaXJlY3RpdmU7XG4gIFxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHt9XG5cbiAgLyoqXG4gICAqIEdldCBkcm9wZG93biBkaXJlY3Rpb24gY2xhc3MgYmFzZWQgb24gcHJlZmVycmVkT3BlbkRpcmVjdGlvblxuICAgKi9cbiAgZ2V0RHJvcGRvd25EaXJlY3Rpb25DbGFzcygpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGhpcy5wcmVmZXJyZWRPcGVuRGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICd1cCc6XG4gICAgICAgIHJldHVybiAnZHJvcGRvd24tdXAnO1xuICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgIHJldHVybiAnZHJvcGRvd24tZG93bic7XG4gICAgICBjYXNlICdhdXRvJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLnNob3VsZE9wZW5VcHdhcmQoMzIwKSA/ICdkcm9wZG93bi11cCcgOiAnZHJvcGRvd24tZG93bic7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRPcGVuVXB3YXJkKGRyb3Bkb3duSGVpZ2h0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuICh3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LmJvdHRvbSkgPCBkcm9wZG93bkhlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGljb24gcGF0aCB3aXRoIGZhbGxiYWNrIHRvIGFzc2V0cyBmb2xkZXJcbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUljb25QYXRoKGljb25OYW1lPzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFpY29uTmFtZSkgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgLy8gSWYgaXQncyBhbHJlYWR5IGEgZnVsbCBwYXRoIG9yIFVSTCwgcmV0dXJuIGFzIGlzXG4gICAgaWYgKGljb25OYW1lLmluY2x1ZGVzKCcvJykgfHwgaWNvbk5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgcmV0dXJuIGljb25OYW1lO1xuICAgIH1cbiAgICBcbiAgICAvLyBUcnkgYXNzZXRzIGZvbGRlciB3aXRoIC5zdmcgZXh0ZW5zaW9uXG4gICAgcmV0dXJuIGBhc3NldHMvbmctemVuZHVpdC9pY29ucy8ke2ljb25OYW1lfS5zdmdgO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBpY29uIGZvciBkaXNwbGF5ICh3aXRoIGZhbGxiYWNrIGxvZ2ljKVxuICAgKi9cbiAgcHVibGljIGdldEljb25QYXRoKG9wdGlvbj86IFNlbGVjdE9wdGlvbiwgbGVhZGluZ0ljb24/OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBQcmlvcml0eTogbGVhZGluZ0ljb24gLT4gb3B0aW9uLmljb24gLT4gb3B0aW9uLmljb25OYW1lIC0+IGFzc2V0cy97aWNvbk5hbWV9LnN2Z1xuICAgIGlmIChsZWFkaW5nSWNvbikge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUljb25QYXRoKGxlYWRpbmdJY29uKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKG9wdGlvbj8uaWNvbikge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUljb25QYXRoKG9wdGlvbi5pY29uKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKG9wdGlvbj8uaWNvbk5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVJY29uUGF0aChvcHRpb24uaWNvbk5hbWUpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgbmdPbkNoYW5nZXMoY2hhbmdlT2JqOiB7IFtrZXk6IHN0cmluZ106IHsgY3VycmVudFZhbHVlOiB1bmtub3duOyBwcmV2aW91c1ZhbHVlOiB1bmtub3duOyBmaXJzdENoYW5nZTogYm9vbGVhbiB9IH0pOiB2b2lkIHtcbiAgICB0aGlzLmlzVHJlZU1vZGUgPSB0aGlzLm9wdGlvbnM/LnNvbWUoKG9wdDogYW55KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IG9wdC5jaGlsZHJlbiB8fCBvcHQuQ2hpbGRyZW4gfHwgb3B0LkNoaWxkcmVucztcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJiBjaGlsZHJlbi5sZW5ndGggPiAwO1xuICAgIH0pID8/IGZhbHNlO1xuICAgIGlmICh0aGlzLmlzVHJlZU1vZGUpIHtcbiAgICAgIHRoaXMuaW5pdFRyZWVEYXRhKCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuICAgIHRoaXMuZmlsdGVyT3B0aW9ucygpO1xuICAgIHRoaXMudXBkYXRlTGFiZWwoKTtcblxuICAgIGlmIChjaGFuZ2VPYmpbXCJzZWxlY3RNb2RlbFwiXSkge1xuICAgICAgaWYgKHRoaXMuaXNMYXp5TG9hZGluZyAmJiBBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0TW9kZWwpICYmIHRoaXMuc2VsZWN0TW9kZWwubGVuZ3RoKSB7XG4gICAgICAgIGlmICghdGhpcy5maWx0ZXJlZE9wdGlvbnM/Lmxlbmd0aCAmJiAhdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAvLyBwcmVsb2FkIGRhdGEgdG8gc2hvdyB0aGUgbGFiZWxzXG4gICAgICAgICAgdGhpcy5sb2FkTW9yZSh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFRvZ2dsZSBkcm9wZG93blxuICAgKi9cbiAgdG9nZ2xlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICBcbiAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xuICAgICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIG9wdGlvbiBzZWxlY3Rpb25cbiAgICovXG4gIHNlbGVjdE9wdGlvbihvcHRpb246IFNlbGVjdE9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMub3B0aW9uID0gb3B0aW9uO1xuICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5yZXR1cm5PcHRpb24gPyBvcHRpb24gOiB0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbik7XG4gICAgXG4gICAgaWYgKHRoaXMuaXNNdWx0aXNlbGVjdCkge1xuICAgICAgdGhpcy50b2dnbGVNdWx0aXNlbGVjdE9wdGlvbihvcHRpb25WYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0TW9kZWwgPSBvcHRpb25WYWx1ZTtcbiAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAvLyBVcGRhdGUgc2VhcmNoIGlucHV0IHZhbHVlIGZvciBzZWFyY2ggdHlwZVxuICAgICAgaWYgKHRoaXMubGVhZGluZ1R5cGUgPT09ICdzZWFyY2gnKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXRWYWx1ZSA9IHRoaXMuZ2V0T3B0aW9uRGlzcGxheShvcHRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXkoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFRvZ2dsZSBvcHRpb24gaW4gbXVsdGlzZWxlY3QgbW9kZVxuICAgKi9cbiAgcHJpdmF0ZSB0b2dnbGVNdWx0aXNlbGVjdE9wdGlvbih2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0TW9kZWwpKSB7XG4gICAgICB0aGlzLnNlbGVjdE1vZGVsID0gW107XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRFbGVtZW50SW5kZXgodmFsdWUpO1xuICAgIFxuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0TW9kZWwucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0TW9kZWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy51cGRhdGVMYWJlbCgpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgb3B0aW9uIGlzIHNlbGVjdGVkXG4gICAqL1xuICBpc1NlbGVjdGVkKG9wdGlvbjogU2VsZWN0T3B0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNNb2RlbEVtcHR5KCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qgb3B0aW9uSWQgPSB0aGlzLmdldElkKG9wdGlvbik7XG4gICAgXG4gICAgaWYgKHRoaXMuaXNNdWx0aXNlbGVjdCAmJiBBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0TW9kZWwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RNb2RlbC5maW5kSW5kZXgoZWwgPT4gdGhpcy5nZXRJZChlbCBhcyBTZWxlY3RPcHRpb24pID09PSBvcHRpb25JZCkgPj0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0SWQodGhpcy5zZWxlY3RNb2RlbCBhcyBTZWxlY3RPcHRpb24pID09PSBvcHRpb25JZDtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgZGlzcGxheSB0ZXh0IGZvciBvcHRpb25cbiAgICovXG4gIGdldE9wdGlvbkRpc3BsYXkob3B0aW9uOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0JyAmJiBvcHRpb24gIT09IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLmRpc3BsYXlQcm9wKSB7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkUHJvcHMgPSB0aGlzLmRpc3BsYXlQcm9wLnNwbGl0KFwifFwiKVxuICAgICAgICAgIC5tYXAoaSA9PiB0aGlzLmdldFJlY3Vyc2l2ZVByb3BlcnR5KG9wdGlvbiwgaSkpXG4gICAgICAgICAgLmZpbHRlcih2ID0+IHYpIC8vIEZpbHRlciBvdXQgbnVsbCB2YWx1ZXNcbiAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgICAgIHJldHVybiBjb21iaW5lZFByb3BzIHx8ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQXBwLVNlbGVjdDogd2hlbiB1c2luZyBvYmplY3RzIGFzIG1vZGVsLCBhIGRpc3BsYXlQcm9wIHZhbHVlIGlzIG1hbmRhdG9yeS4nKTtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcob3B0aW9uKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEFsaWFzIGZvciBnZXRPcHRpb25EaXNwbGF5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBwdWJsaWMgZ2V0TmFtZShvcHRpb246IHN0cmluZyB8IG9iamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uRGlzcGxheShvcHRpb24pO1xuICB9XG4gIFxuICBcbiAgLyoqXG4gICAqIEdldCB2YWx1ZSBmb3Igb3B0aW9uICh1c2luZyBpZFByb3ApXG4gICAqL1xuICBnZXRPcHRpb25WYWx1ZShvcHRpb246IFNlbGVjdE9wdGlvbik6IHN0cmluZyB8IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SWQob3B0aW9uKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBpZCB2YWx1ZSBmcm9tIG9wdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXRJZChvcHRpb246IHN0cmluZyB8IG51bWJlciB8IG9iamVjdCk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnICYmIG9wdGlvbiAhPT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuaWRQcm9wKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlY3Vyc2l2ZVByb3BlcnR5KG9wdGlvbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgdGhpcy5pZFByb3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQXBwLVNlbGVjdDogd2hlbiB1c2luZyBvYmplY3RzIGFzIG1vZGVsLCBhIGlkUHJvcCB2YWx1ZSBpcyBtYW5kYXRvcnkuJyk7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3B0aW9uIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgZGlzcGxheWVkIHRleHRcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlRGlzcGxheSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc01vZGVsRW1wdHkoKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZERpc3BsYXkgPSAnJztcbiAgICAgIHRoaXMubGFiZWxUZXh0ID0gJyc7XG4gICAgICAvLyBBbHNvIGNsZWFyIHNlYXJjaCBpbnB1dCBmb3Igc2VhcmNoIHR5cGVcbiAgICAgIGlmICh0aGlzLmxlYWRpbmdUeXBlID09PSAnc2VhcmNoJykge1xuICAgICAgICB0aGlzLnNlYXJjaElucHV0VmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMuaXNNdWx0aXNlbGVjdCAmJiBBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0TW9kZWwpKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RNb2RlbC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5maW5kT3B0aW9uQnlWYWx1ZSh0aGlzLnNlbGVjdE1vZGVsWzBdKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERpc3BsYXkgPSBvcHRpb24gPyB0aGlzLmdldE9wdGlvbkRpc3BsYXkob3B0aW9uKSA6ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERpc3BsYXkgPSBgJHt0aGlzLnNlbGVjdE1vZGVsLmxlbmd0aH0gc2VsZWN0ZWRgO1xuICAgICAgfVxuICAgICAgLy8gRm9yIG11bHRpc2VsZWN0IHNlYXJjaCB0eXBlLCBzaG93IGNvdW50IGluIHNlYXJjaCBpbnB1dCB3aGVuIGNsb3NlZFxuICAgICAgaWYgKHRoaXMubGVhZGluZ1R5cGUgPT09ICdzZWFyY2gnICYmICF0aGlzLnNlYXJjaEZvY3VzZWQpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dFZhbHVlID0gdGhpcy5zZWxlY3RlZERpc3BsYXk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuZmluZE9wdGlvbkJ5VmFsdWUodGhpcy5zZWxlY3RNb2RlbCk7XG4gICAgICB0aGlzLnNlbGVjdGVkRGlzcGxheSA9IG9wdGlvbiA/IHRoaXMuZ2V0T3B0aW9uRGlzcGxheShvcHRpb24pIDogJyc7XG4gICAgICAvLyBBbHNvIHVwZGF0ZSBzZWFyY2ggaW5wdXQgZm9yIHNlYXJjaCB0eXBlXG4gICAgICBpZiAodGhpcy5sZWFkaW5nVHlwZSA9PT0gJ3NlYXJjaCcgJiYgb3B0aW9uKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXRWYWx1ZSA9IHRoaXMuZ2V0T3B0aW9uRGlzcGxheShvcHRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEZpbmQgb3B0aW9uIGJ5IHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGZpbmRPcHRpb25CeVZhbHVlKHZhbHVlOiBhbnkpOiBTZWxlY3RPcHRpb24gfCBudWxsIHtcbiAgICBpZiAodGhpcy5yZXR1cm5PcHRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZChvcHQgPT4gb3B0ID09PSB2YWx1ZSkgfHwgbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maW5kKG9wdCA9PiB0aGlzLmdldElkKG9wdCkgPT09IHZhbHVlKSB8fCBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgbW9kZWwgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc01vZGVsRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNNdWx0aXNlbGVjdCkge1xuICAgICAgcmV0dXJuICFBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0TW9kZWwpIHx8ICF0aGlzLnNlbGVjdE1vZGVsLmxlbmd0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0TW9kZWwgPT09IG51bGwgfHwgdGhpcy5zZWxlY3RNb2RlbCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBlbGVtZW50IGluZGV4IGluIG11bHRpc2VsZWN0IGFycmF5XG4gICAqL1xuICBwcml2YXRlIGdldEVsZW1lbnRJbmRleCh2YWx1ZTogYW55KTogbnVtYmVyIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RNb2RlbCkpIHJldHVybiAtMTtcbiAgICBcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgdmFsdWVJZCA9IHRoaXMuZ2V0SWQodmFsdWUpO1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0TW9kZWwuZmluZEluZGV4KGVsID0+IHRoaXMuZ2V0SWQoZWwgYXMgU2VsZWN0T3B0aW9uKSA9PT0gdmFsdWVJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdE1vZGVsLmluZGV4T2YodmFsdWUpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFRvZ2dsZSBhbGwgb3B0aW9ucyBpbiBtdWx0aXNlbGVjdFxuICAgKi9cbiAgcHVibGljIHRvZ2dsZUFsbCgpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RlbEFycmF5ID0gQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdE1vZGVsKSA/IHRoaXMuc2VsZWN0TW9kZWwgOiBbXTtcbiAgICBpZiAobW9kZWxBcnJheS5sZW5ndGggIT09IHRoaXMub3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0TW9kZWwgPSB0aGlzLm9wdGlvbnMubWFwKChlbDogU2VsZWN0T3B0aW9uKSA9PiB0aGlzLnJldHVybk9wdGlvbiA/IGVsIDogdGhpcy5nZXRJZChlbCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdE1vZGVsID0gW107XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuICAgIHRoaXMudXBkYXRlTGFiZWwoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFRvZ2dsZSBTZWxlY3QgQWxsIG9wdGlvbiBmb3IgZmxhdCBtdWx0aXNlbGVjdFxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKCkpIHtcbiAgICAgIC8vIERlc2VsZWN0IGFsbFxuICAgICAgdGhpcy5zZWxlY3RNb2RlbCA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTZWxlY3QgYWxsIGZpbHRlcmVkIG9wdGlvbnNcbiAgICAgIHRoaXMuc2VsZWN0TW9kZWwgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucy5tYXAoKGVsOiBTZWxlY3RPcHRpb24pID0+IFxuICAgICAgICB0aGlzLnJldHVybk9wdGlvbiA/IGVsIDogdGhpcy5nZXRJZChlbClcbiAgICAgICk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuICAgIHRoaXMudXBkYXRlTGFiZWwoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIGFsbCBmaWx0ZXJlZCBvcHRpb25zIGFyZSBzZWxlY3RlZFxuICAgKi9cbiAgcHVibGljIGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzTXVsdGlzZWxlY3QgfHwgIUFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RNb2RlbCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBpZiBhbGwgZmlsdGVyZWQgb3B0aW9ucyBhcmUgaW4gdGhlIHNlbGVjdE1vZGVsXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcHRpb25zLmV2ZXJ5KG9wdGlvbiA9PiB7XG4gICAgICBjb25zdCBvcHRpb25JZCA9IHRoaXMuZ2V0SWQob3B0aW9uKTtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdE1vZGVsLnNvbWUoKHNlbGVjdGVkOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZCA9IHRoaXMucmV0dXJuT3B0aW9uID8gdGhpcy5nZXRJZChzZWxlY3RlZCkgOiBzZWxlY3RlZDtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkSWQgPT09IG9wdGlvbklkO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgcmVjdXJzaXZlIHByb3BlcnR5IGZyb20gbmVzdGVkIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSZWN1cnNpdmVQcm9wZXJ0eShvYmplY3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChvYmosIHgpID0+IHtcbiAgICAgIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgeCBpbiBvYmopIHtcbiAgICAgICAgcmV0dXJuIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3hdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSwgb2JqZWN0IGFzIHVua25vd24pIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFVwZGF0ZSBsYWJlbCB0ZXh0XG4gICAqL1xuICBwdWJsaWMgdXBkYXRlTGFiZWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2RlbEVtcHR5KCkpIHtcbiAgICAgIHRoaXMubGFiZWxUZXh0ID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLmlzTXVsdGlzZWxlY3QgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdE1vZGVsKSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IHRoaXMuc2VsZWN0TW9kZWwubGVuZ3RoO1xuICAgICAgXG4gICAgICBpZiAoc2VsZWN0ZWRDb3VudCA9PT0gMSkge1xuICAgICAgICB0aGlzLmxhYmVsVGV4dCA9IHRoaXMuZ2V0TmFtZUZyb21WYWx1ZSh0aGlzLnNlbGVjdE1vZGVsWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGFiZWxUZXh0ID0gYCR7c2VsZWN0ZWRDb3VudH0gU2VsZWN0ZWRgO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxhYmVsVGV4dCA9IHRoaXMuZ2V0TmFtZUZyb21WYWx1ZSh0aGlzLnNlbGVjdE1vZGVsKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgbmFtZSBmcm9tIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0TmFtZUZyb21WYWx1ZSh2YWw6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucmV0dXJuT3B0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRPcHRpb25EaXNwbGF5KHZhbCBhcyBTZWxlY3RPcHRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5pc0xhenlMb2FkaW5nKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zPy5maW5kKGkgPT4gdGhpcy5nZXRJZChpKSA9PSB2YWwpO1xuICAgICAgICByZXR1cm4gb3B0ID8gdGhpcy5nZXRPcHRpb25EaXNwbGF5KG9wdCkgOiBTdHJpbmcodmFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zIHx8ICF0aGlzLm9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChlbCA9PiB0aGlzLmdldElkKGVsKSA9PT0gdmFsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uRGlzcGxheShvcHRpb24gPz8gdmFsIGFzIFNlbGVjdE9wdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRW1pdCBjaGFuZ2UgZXZlbnRcbiAgICovXG4gIHByaXZhdGUgZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICAvLyBub3RpZnkgd2l0aCB0aW1lb3V0XG4gICAgLy8gYWxsb3cgb3V0cHV0IHByb3BlcnR5IFwiZW5hYmxlZFwiIGFwcGxpZWQgYnkgcGFyZW50IGZpcnN0IGFuZCB0aGVuIGVtaXQgdGhlIG9uQ2hhbmdlXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdE1vZGVsQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RNb2RlbCk7XG4gICAgfSwgMSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGaWx0ZXIgb3B0aW9ucyBiYXNlZCBvbiBzZWFyY2hcbiAgICovXG4gIGZpbHRlck9wdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlYXJjaFRleHQpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gWy4uLnRoaXMub3B0aW9uc107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoTG93ZXIgPSB0aGlzLnNlYXJjaFRleHQudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IHtcbiAgICAgIGNvbnN0IGRpc3BsYXkgPSB0aGlzLmdldE9wdGlvbkRpc3BsYXkob3B0aW9uKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIGRpc3BsYXkuaW5jbHVkZXMoc2VhcmNoTG93ZXIpO1xuICAgIH0pO1xuXG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VhcmNoIGlucHV0XG4gICAqL1xuICBvblNlYXJjaENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlck9wdGlvbnMoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBzZWFyY2ggaW5wdXQgY2hhbmdlIGZvciBzZWFyY2ggdHlwZVxuICAgKi9cbiAgb25TZWFyY2hJbnB1dENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaElucHV0VmFsdWU7XG4gICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XG4gICAgaWYgKCF0aGlzLmlzT3BlbiAmJiB0aGlzLnNlYXJjaElucHV0VmFsdWUpIHtcbiAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VhcmNoIGlucHV0IGZvY3VzXG4gICAqL1xuICBvblNlYXJjaEZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoRm9jdXNlZCA9IHRydWU7XG4gICAgLy8gQ2xlYXIgdGhlIHNlYXJjaCBpbnB1dCB3aGVuIGZvY3VzZWQgc28gdXNlciBjYW4gdHlwZSBmcmVzaFxuICAgIHRoaXMuc2VhcmNoSW5wdXRWYWx1ZSA9ICcnO1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xuICAgIC8vIE9wZW4gZHJvcGRvd24gdG8gc2hvdyBhbGwgb3B0aW9uc1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAvLyBSZXNldCBmaWx0ZXJlZCBvcHRpb25zIHRvIHNob3cgYWxsXG4gICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VhcmNoIGlucHV0IGJsdXJcbiAgICovXG4gIG9uU2VhcmNoQmx1cihldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIC8vIERvbid0IGNsb3NlIGltbWVkaWF0ZWx5IGlmIGNsaWNraW5nIG9uIGRyb3Bkb3duXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmICghcmVsYXRlZFRhcmdldCB8fCAhdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hGb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICB0aGlzLnNlYXJjaElucHV0VmFsdWUgPSB0aGlzLnNlbGVjdGVkRGlzcGxheTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDIwMCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0ZWQgb3B0aW9uIGZvciBsZWFkaW5nIGRpc3BsYXlcbiAgICovXG4gIGdldFNlbGVjdGVkT3B0aW9uKCk6IFNlbGVjdE9wdGlvbiB8IG51bGwge1xuICAgIGlmICghdGhpcy5zZWxlY3RNb2RlbCkgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgaWYgKHRoaXMuaXNNdWx0aXNlbGVjdCAmJiBBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0TW9kZWwpKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RNb2RlbC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZE9wdGlvbkJ5VmFsdWUodGhpcy5zZWxlY3RNb2RlbFswXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuZmluZE9wdGlvbkJ5VmFsdWUodGhpcy5zZWxlY3RNb2RlbCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgc2VsZWN0ZWQgc2Vjb25kYXJ5IHRleHQgZm9yIGRpc3BsYXlcbiAgICovXG4gIGdldFNlbGVjdGVkU2Vjb25kYXJ5VGV4dCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0TW9kZWwpIHJldHVybiBudWxsO1xuICAgIFxuICAgIGlmICh0aGlzLmlzTXVsdGlzZWxlY3QgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdE1vZGVsKSkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0TW9kZWwubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuZmluZE9wdGlvbkJ5VmFsdWUodGhpcy5zZWxlY3RNb2RlbFswXSk7XG4gICAgICAgIHJldHVybiBvcHRpb24/LnNlY29uZGFyeVRleHQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIEZvciBtdWx0aXBsZSBzZWxlY3Rpb24sIHdlIHdvbid0IHNob3cgc2Vjb25kYXJ5IHRleHQgdG8gYXZvaWQgY29uZnVzaW9uXG4gICAgICByZXR1cm4gbnVsbDsgXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuZmluZE9wdGlvbkJ5VmFsdWUodGhpcy5zZWxlY3RNb2RlbCk7XG4gICAgcmV0dXJuIG9wdGlvbj8uc2Vjb25kYXJ5VGV4dCB8fCBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xvc2UgZHJvcGRvd24gb24gb3V0c2lkZSBjbGlja1xuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHRoaXMuaGlkZURyb3BEb3duKHRydWUpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEhpZGUgZHJvcGRvd25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBoaWRlRHJvcERvd24odXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gT25seSBlbWl0IGNsb3NlZCBldmVudCBpZiBpdCB3YXMgb3BlbiBBTkQgdHJpZ2dlcmVkIGJ5IHVzZXIgYWN0aW9uXG4gICAgaWYgKHVzZXJBY3Rpb24gJiYgdGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMuY2xvc2VkLmVtaXQodGhpcy5zZWxlY3RNb2RlbCk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgRW50ZXIga2V5IG9uIHNlYXJjaCBpbnB1dFxuICAgKi9cbiAgb25TZWFyY2hFbnRlcihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICh0aGlzLmVuYWJsZUFkZE5ld09wdGlvbiAmJiB0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPT09IDAgJiYgKHRoaXMuc2VhcmNoVGV4dCB8fCB0aGlzLnNlYXJjaElucHV0VmFsdWUpPy50cmltKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlQWRkTmV3T3B0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhZGQgbmV3IG9wdGlvblxuICAgKi9cbiAgcHVibGljIGhhbmRsZUFkZE5ld09wdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmFkZE5ld09wdGlvbi5lbWl0KHsgdmFsdWU6IHRoaXMuc2VhcmNoVGV4dCB8fCB0aGlzLnNlYXJjaElucHV0VmFsdWUgfSk7XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XG4gICAgdGhpcy5zZWFyY2hJbnB1dFZhbHVlID0gJyc7XG4gICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XG4gICAgdGhpcy5oaWRlRHJvcERvd24odHJ1ZSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgcmVtb3ZlIG9wdGlvblxuICAgKi9cbiAgcHVibGljIGhhbmRsZVJlbW92ZU9wdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZU9wdGlvbi5lbWl0KHsgcmVtb3ZlZDogdHJ1ZSB9KTtcbiAgICB0aGlzLmhpZGVEcm9wRG93bih0cnVlKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBzdGF0ZSBjbGFzc2VzXG4gICAqL1xuICBnZXRTdGF0ZUNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbGFzc2VzID0gWydhcHAtc2VsZWN0LWNvbnRhaW5lciddO1xuICAgIFxuICAgIGlmICh0aGlzLmlzT3BlbikgY2xhc3Nlcy5wdXNoKCdvcGVuJyk7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIGNsYXNzZXMucHVzaCgnZGlzYWJsZWQnKTtcbiAgICBpZiAodGhpcy5lcnJvcikgY2xhc3Nlcy5wdXNoKCdlcnJvcicpO1xuICAgIGlmICh0aGlzLmRlc3RydWN0aXZlKSBjbGFzc2VzLnB1c2goJ2Rlc3RydWN0aXZlJyk7XG4gICAgaWYgKHRoaXMubGFiZWwpIGNsYXNzZXMucHVzaCgnd2l0aC1sYWJlbCcpO1xuICAgIGlmICh0aGlzLnN1cHBvcnRpbmdUZXh0KSBjbGFzc2VzLnB1c2goJ3dpdGgtc3VwcG9ydGluZycpO1xuICAgIFxuICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIExvYWQgbW9yZSBpdGVtcyBmb3IgbGF6eSBsb2FkaW5nXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZE1vcmUoc2hvd1NlbGVjdGVkT25Ub3A6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pc0xvYWRpbmdOb3cgPSB0cnVlO1xuICAgICAgaWYgKCF0aGlzLmxhenlMb2FkZXIpIHtcbiAgICAgICAgdGhyb3cgYGxvYWRlciBpcyBub3QgYXZhaWxhYmxlYDtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5maWx0ZXJlZE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gbG9hZCBmaXJzdCAxMCByZWNvcmRzIGZvciB0aGUgZmlyc3QgdGltZVxuICAgICAgY29uc3QgbGltaXQgPSAodGhpcy5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoID09IDApID8gMTAgOiAxMDA7XG4gICAgICBsZXQgbmV3SXRlbXM6IExhenlMb2FkZXJSZXN1bHRbXSA9IGF3YWl0IHRoaXMubGF6eUxvYWRlcih7IHRleHQ6IHRoaXMuc2VhcmNoVGV4dCB8fCBcIlwiIH0sIHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCwgbGltaXQpO1xuICAgICAgXG4gICAgICB0aGlzLmNhbkxvYWRNb3JlID0gKG5ld0l0ZW1zLmxlbmd0aCA9PSBsaW1pdCk7XG4gICAgICBcbiAgICAgIC8vIHRoZSBzZWxlY3RNb2RlbCBjb250YWlucyB0aGUgc2VsZWN0ZWQgaXRlbXMgaWRzICBcbiAgICAgIGNvbnN0IGNoZWNrZWRJZHMgPSBBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0TW9kZWwpIFxuICAgICAgICA/IHRoaXMuc2VsZWN0TW9kZWwubWFwKGl0ZW0gPT4gU3RyaW5nKHRoaXMuZ2V0SWQoaXRlbSBhcyBTZWxlY3RPcHRpb24pKSlcbiAgICAgICAgOiBbXTtcbiAgICAgIFxuICAgICAgaWYgKHNob3dTZWxlY3RlZE9uVG9wICYmIGNoZWNrZWRJZHM/Lmxlbmd0aCkge1xuICAgICAgICAvLyByZW1vdmUgdGhlIGNoZWNrZWQgaXRlbXMgZmlyc3RcbiAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucy5maWx0ZXIoaSA9PiAhY2hlY2tlZElkcy5pbmNsdWRlcyhTdHJpbmcodGhpcy5nZXRJZChpKSkpKTtcbiAgICAgICAgbmV3SXRlbXMgPSBuZXdJdGVtcy5maWx0ZXIoaSA9PiAhY2hlY2tlZElkcy5pbmNsdWRlcyhTdHJpbmcoaS5pZCkpKTtcbiAgICAgICAgXG4gICAgICAgIC8vIGFkZCBhbGwgY2hlY2tlZCBpdGVtcyB0byB0aGUgdG9wXG4gICAgICAgIGNvbnN0IGNoZWNrZWRJdGVtczogTGF6eUxvYWRlclJlc3VsdFtdID0gYXdhaXQgdGhpcy5sYXp5TG9hZGVyKHsgaWRzOiBjaGVja2VkSWRzIH0sIDAsIDEwMCk7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gWy4uLihjaGVja2VkSXRlbXMgYXMgU2VsZWN0T3B0aW9uW10pLCAuLi50aGlzLmZpbHRlcmVkT3B0aW9uc107XG4gICAgICAgIFxuICAgICAgICB0aGlzLnVwZGF0ZUxhYmVsKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIHRoZSBmaWx0ZXJlZERhdGFTb3VyY2UgY29udGFpbnMgdGhlIGl0ZW1zIHRoYXQgaXMgdmlzaWJsZSB0byB1c2VyIGF0IHRoZSBjdXJyZW50IG1vbWVudFxuICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBbLi4udGhpcy5maWx0ZXJlZE9wdGlvbnMsIC4uLihuZXdJdGVtcyBhcyBTZWxlY3RPcHRpb25bXSldO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzTG9hZGluZ05vdyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRyZWUgZGF0YSBieSBzeW5jaW5nIHNlbGVjdE1vZGVsIElEcyB0byBEYXRhU291cmNlIGNoZWNrZWQgZmxhZ3NcbiAgICovXG4gIHByaXZhdGUgaW5pdFRyZWVEYXRhKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1RyZWVNb2RlIHx8ICF0aGlzLm9wdGlvbnM/Lmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gbmV3IFNldChcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RNb2RlbClcbiAgICAgICAgPyB0aGlzLnNlbGVjdE1vZGVsLm1hcCh2ID0+IFN0cmluZyh0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyB0aGlzLmdldElkKHYpIDogdikpXG4gICAgICAgIDogW11cbiAgICApO1xuICAgICh0aGlzLm9wdGlvbnMgYXMgYW55W10pLmZvckVhY2gob3B0ID0+IHtcbiAgICAgIG9wdC5jaGVja2VkID0gc2VsZWN0ZWRJZHMuaGFzKFN0cmluZyhvcHRbdGhpcy5pZFByb3BdKSk7XG4gICAgfSk7XG4gICAgdGhpcy50cmVlRmlsdGVyZWREYXRhU291cmNlID0gWy4uLnRoaXMub3B0aW9uc10gYXMgRGF0YVNvdXJjZVtdO1xuICAgIHRoaXMudXBkYXRlVHJlZVNlbGVjdEFsbFN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNoZWNrZWQgY2hhbmdlIGZyb20gemVuLWdyb3VwcyBpbiB0cmVlIG1vZGVcbiAgICovXG4gIHB1YmxpYyBvblRyZWVDaGVja2VkQ2hhbmdlKGRzSXRlbTogRGF0YVNvdXJjZSk6IHZvaWQge1xuICAgIGNvbnN0IGNoZWNrZWRJdGVtcyA9ICh0aGlzLm9wdGlvbnMgYXMgYW55W10pLmZpbHRlcihvcHQgPT4gb3B0LmNoZWNrZWQpO1xuICAgIHRoaXMuc2VsZWN0TW9kZWwgPSBjaGVja2VkSXRlbXMubWFwKG9wdCA9PlxuICAgICAgdGhpcy5yZXR1cm5PcHRpb24gPyBvcHQgOiBvcHRbdGhpcy5pZFByb3BdXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVRyZWVTZWxlY3RBbGxTdGF0ZSgpO1xuICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheSgpO1xuICAgIHRoaXMudXBkYXRlTGFiZWwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VsZWN0IGFsbCBjaGFuZ2UgZnJvbSB6ZW4tZ3JvdXBzIGluIHRyZWUgbW9kZVxuICAgKi9cbiAgcHVibGljIG9uVHJlZVNlbGVjdEFsbENoYW5nZShpc1NlbGVjdGVkQWxsOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc1NlbGVjdGVkQWxsID0gaXNTZWxlY3RlZEFsbDtcbiAgICBjb25zdCBjaGVja2VkSXRlbXMgPSAodGhpcy5vcHRpb25zIGFzIGFueVtdKS5maWx0ZXIob3B0ID0+IG9wdC5jaGVja2VkKTtcbiAgICB0aGlzLnNlbGVjdE1vZGVsID0gY2hlY2tlZEl0ZW1zLm1hcChvcHQgPT5cbiAgICAgIHRoaXMucmV0dXJuT3B0aW9uID8gb3B0IDogb3B0W3RoaXMuaWRQcm9wXVxuICAgICk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG4gICAgdGhpcy51cGRhdGVMYWJlbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgaXNTZWxlY3RlZEFsbCBmbGFnIGJhc2VkIG9uIGN1cnJlbnQgY2hlY2tlZCBzdGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUcmVlU2VsZWN0QWxsU3RhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnM/Lmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMuaXNTZWxlY3RlZEFsbCA9ICh0aGlzLm9wdGlvbnMgYXMgYW55W10pLmV2ZXJ5KG9wdCA9PiBvcHQuY2hlY2tlZCk7XG4gIH1cblxufSIsIjxkaXYgW2NsYXNzXT1cImdldFN0YXRlQ2xhc3NlcygpXCI+XG4gIDwhLS0gTGFiZWwgLS0+XG4gIDxsYWJlbCBjbGFzcz1cImFwcC1zZWxlY3QtbGFiZWwgdGV4dCB0ZXh0LXNtIHRleHQtd2VpZ2h0LW1lZGl1bVwiICpuZ0lmPVwibGFiZWxcIlxuICAgICAgICAgW25nQ2xhc3NdPVwieydyZXF1aXJlZCc6IHJlcXVpcmVkLCAnZGlzYWJsZWQnOiBkaXNhYmxlZCwgJ2Rlc3RydWN0aXZlJzogZGVzdHJ1Y3RpdmV9XCI+XG4gICAge3sgbGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICA8c3BhbiAqbmdJZj1cInJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZC1pbmRpY2F0b3JcIj4qPC9zcGFuPlxuICA8L2xhYmVsPlxuXG4gIDwhLS0gU2VsZWN0IElucHV0IC0tPlxuICA8ZGl2IGNsYXNzPVwiYXBwLXNlbGVjdC13cmFwcGVyXCI+XG4gICAgPCEtLSBUZW1wbGF0ZSBTZWxlY3Rpb24gQmFzZWQgb24gTGVhZGluZyBUeXBlIC0tPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImxlYWRpbmdUeXBlXCI+XG4gICAgICA8IS0tIERlZmF1bHQgU2VsZWN0IChubyBsZWFkaW5nIGVsZW1lbnQpIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RlZmF1bHQnXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWZhdWx0U2VsZWN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgXG4gICAgICA8IS0tIEljb24gTGVhZGluZyBTZWxlY3QgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaWNvbidcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImljb25TZWxlY3RUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICBcbiAgICAgIDwhLS0gQXZhdGFyIExlYWRpbmcgU2VsZWN0IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2F2YXRhcidcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImF2YXRhclNlbGVjdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIFxuICAgICAgPCEtLSBEb3QgTGVhZGluZyBTZWxlY3QgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZG90J1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZG90U2VsZWN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgXG4gICAgICA8IS0tIFNlYXJjaCBJbnB1dCBTZWxlY3QgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VhcmNoJ1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VhcmNoSW5wdXRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIERyb3Bkb3duIE1lbnUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFwcC1zZWxlY3QtZHJvcGRvd25cIiBcbiAgICAgICAgIFtuZ0NsYXNzXT1cImdldERyb3Bkb3duRGlyZWN0aW9uQ2xhc3MoKVwiXG4gICAgICAgICAqbmdJZj1cImlzT3BlblwiPlxuICAgICAgICBcbiAgICAgIDwhLS0gVHJlZSBNb2RlOiBlbWJlZCB6ZW4tZ3JvdXBzIGlubGluZSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1RyZWVNb2RlICYmIGlzTXVsdGlzZWxlY3Q7IGVsc2UgZmxhdExpc3RcIj5cbiAgICAgICAgPHplbi1ncm91cHMgW2lubGluZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwiJGFueShvcHRpb25zKVwiXG4gICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJlZERhdGFTb3VyY2VdPVwidHJlZUZpbHRlcmVkRGF0YVNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgIFtoaWRlU2VsZWN0QWxsXT1cImhpZGVTZWxlY3RBbGxcIlxuICAgICAgICAgICAgICAgICAgICBbaGlkZVNlYXJjaF09XCJoaWRlVHJlZVNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgIFtpZFByb3BdPVwiaWRQcm9wXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlQcm9wXT1cImRpc3BsYXlQcm9wXCJcbiAgICAgICAgICAgICAgICAgICAgWyhpc1NlbGVjdGVkQWxsKV09XCJpc1NlbGVjdGVkQWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGlzU2VsZWN0ZWRBbGxDaGFuZ2UpPVwib25UcmVlU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJvblRyZWVDaGVja2VkQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPC96ZW4tZ3JvdXBzPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gRmxhdCBMaXN0IE1vZGUgKGRlZmF1bHQpIC0tPlxuICAgICAgPG5nLXRlbXBsYXRlICNmbGF0TGlzdD5cbiAgICAgICAgPCEtLSBTZWFyY2ggQm94IGZvciBoYXNTZWFyY2ggKG5vdCBmb3Igc2VhcmNoIHR5cGUgYXMgaXQgaGFzIGlubGluZSBzZWFyY2gpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLXNlbGVjdC1zZWFyY2hcIiAqbmdJZj1cImxlYWRpbmdUeXBlICE9PSAnc2VhcmNoJyAmJiBoYXNTZWFyY2ggJiYgIWRpc2FibGVkXCI+XG4gICAgICAgICAgPHplbi1pY29uIFtuYW1lXT1cIidzZWFyY2gnXCJcbiAgICAgICAgICAgICAgICAgICAgW2N1c3RvbUNvbG9yXT1cIicjNjY3MDg1J1wiPlxuICAgICAgICAgIDwvemVuLWljb24+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCJcbiAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2hDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uU2VhcmNoRW50ZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcHAtc2VsZWN0LXNlYXJjaC1pbnB1dFwiPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE9wdGlvbnMgTGlzdCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1zZWxlY3Qtb3B0aW9uc1wiPlxuICAgICAgICAgIDwhLS0gU2VsZWN0IEFsbCBPcHRpb24gZm9yIE11bHRpc2VsZWN0IC0tPlxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpc011bHRpc2VsZWN0ICYmICFoaWRlU2VsZWN0QWxsICYmIGZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXBwLXNlbGVjdC1vcHRpb24gc2VsZWN0LWFsbFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VsZWN0QWxsKClcIj5cbiAgICAgICAgICAgIDx6ZW4tY2hlY2tib3ggY2xhc3M9XCJhcHAtc2VsZWN0LWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNBbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVWYWx1ZUNoYW5nZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCI+XG4gICAgICAgICAgICA8L3plbi1jaGVja2JveD5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXBwLXNlbGVjdC1vcHRpb24tdGV4dFwiPlxuICAgICAgICAgICAgICBTZWxlY3QgQWxsXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIEFkZCBOZXcgT3B0aW9uIC0tPlxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlbmFibGVBZGROZXdPcHRpb24gJiYgKHNob3dEZWZhdWx0QWRkT3B0aW9uIHx8IHNlYXJjaFRleHQpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXBwLXNlbGVjdC1vcHRpb24gYWRkLW5ldy1vcHRpb25cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUFkZE5ld09wdGlvbigpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgIDx6ZW4taWNvbiBbbmFtZV09XCIncGx1cydcIiBbY3VzdG9tQ29sb3JdPVwiJyMxMzZBQjYnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXBwLXNlbGVjdC1vcHRpb24tdGV4dFwiPlxuICAgICAgICAgICAgICB7eyAobmV3T3B0aW9uVGV4dCB8fCAnQWRkIE5ldyBPcHRpb24nKSArIChzZWFyY2hUZXh0ID8gJzogXCInICsgc2VhcmNoVGV4dCArICdcIicgOiAnJykgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoID09PSAwICYmICFlbmFibGVBZGROZXdPcHRpb25cIiBjbGFzcz1cImFwcC1zZWxlY3Qtbm8tb3B0aW9uc1wiPlxuICAgICAgICAgICAgTm8gbWF0Y2hpbmcgb3B0aW9ucyBmb3VuZFxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFwcC1zZWxlY3Qtb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpc1NlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE9wdGlvbihvcHRpb24pXCI+XG5cbiAgICAgICAgICAgIDwhLS0gQ2hlY2tib3ggZm9yIE11bHRpc2VsZWN0IC0tPlxuICAgICAgICAgICAgPHplbi1jaGVja2JveCBjbGFzcz1cImFwcC1zZWxlY3QtY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzTXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZVZhbHVlQ2hhbmdlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIj5cbiAgICAgICAgICAgIDwvemVuLWNoZWNrYm94PlxuXG4gICAgICAgICAgICA8IS0tIE9wdGlvbiBMZWFkaW5nIEVsZW1lbnQgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLXNlbGVjdC1vcHRpb24tbGVhZGluZ1wiICpuZ0lmPVwibGVhZGluZ1R5cGUgIT09ICdkZWZhdWx0J1wiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJsZWFkaW5nVHlwZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpY29uJ1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImljb25MZWFkaW5nRWxlbWVudDsgY29udGV4dDogeyBvcHRpb246IG9wdGlvbiB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2F2YXRhcidcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhdmF0YXJMZWFkaW5nRWxlbWVudDsgY29udGV4dDogeyBvcHRpb246IG9wdGlvbiB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RvdCdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkb3RMZWFkaW5nRWxlbWVudDsgY29udGV4dDogeyBvcHRpb246IG9wdGlvbiB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gT3B0aW9uIFRleHQgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLXNlbGVjdC1vcHRpb24tdGV4dC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDwhLS0gVXNlIGN1c3RvbSB0ZW1wbGF0ZSBpZiBwcm92aWRlZCAtLT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc011bHRpc2VsZWN0ICYmIG9wdGlvblRlbXBsYXRlOyBlbHNlIGRlZmF1bHRPcHRpb25UZXh0XCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvblRlbXBsYXRlLnRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgb3B0aW9uOiBvcHRpb24gfVwiPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRPcHRpb25UZXh0PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXBwLXNlbGVjdC1vcHRpb24tdGV4dFwiIFtjbGFzcy5hcHAtc2VsZWN0LW9wdGlvbi10cnVuY2F0ZV09XCJpc1RydW5jYXRlXCI+XG4gICAgICAgICAgICAgICAgICB7eyBnZXROYW1lKG9wdGlvbikgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcHAtc2VsZWN0LW9wdGlvbi1zZWNvbmRhcnlcIiAqbmdJZj1cIm9wdGlvbi5zZWNvbmRhcnlUZXh0XCI+XG4gICAgICAgICAgICAgICAgICB7eyBvcHRpb24uc2Vjb25kYXJ5VGV4dCB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIENoZWNrIEljb24gZm9yIFNpbmdsZSBTZWxlY3QgLS0+XG4gICAgICAgICAgICA8emVuLWljb24gKm5nSWY9XCIhaXNNdWx0aXNlbGVjdCAmJiBpc1NlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXBwLXNlbGVjdC1vcHRpb24tY2hlY2tcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidjaGVjaydcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjdXN0b21Db2xvcl09XCInIzEzNkFCNidcIj5cbiAgICAgICAgICAgIDwvemVuLWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIFxuICA8IS0tIEhpbnQgdGV4dCAvIEVycm9yIG1lc3NhZ2UgLS0+XG4gIDxkaXYgKm5nSWY9XCIoZGVzdHJ1Y3RpdmUgJiYgZXJyb3JNZXNzYWdlKSB8fCBoaW50VGV4dFwiIFxuICAgICAgIGNsYXNzPVwiYXBwLXNlbGVjdC1oaW50IHRleHQgdGV4dC1zbSB0ZXh0LXdlaWdodC1yZWd1bGFyXCJcbiAgICAgICBbbmdDbGFzc109XCJ7J2Rlc3RydWN0aXZlJzogZGVzdHJ1Y3RpdmV9XCI+XG4gICAgPGkgKm5nSWY9XCJkZXN0cnVjdGl2ZVwiIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWQgaGludC1pY29uXCI+ZXJyb3Jfb3V0bGluZTwvaT5cbiAgICA8c3Bhbj57eyAoKGRlc3RydWN0aXZlICYmIGVycm9yTWVzc2FnZSkgPyBlcnJvck1lc3NhZ2UgOiBoaW50VGV4dCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPlxuPCEtLSBNQUlOIFNFTEVDVCBJTlBVVCBURU1QTEFURVMgLS0+XG48IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cblxuPCEtLSBEZWZhdWx0IFNlbGVjdCBUZW1wbGF0ZSAoTm8gTGVhZGluZyBFbGVtZW50KSAtLT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFNlbGVjdFRlbXBsYXRlPlxuICA8YnV0dG9uIGNsYXNzPVwiYXBwLXNlbGVjdC1pbnB1dFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKVwiXG4gICAgICAgICAgW2NsYXNzLmZvY3VzZWRdPVwiaXNPcGVuXCJcbiAgICAgICAgICBbY2xhc3MuaGFzLXZhbHVlXT1cIiFpc01vZGVsRW1wdHkoKVwiPlxuICAgIFxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3RWYWx1ZURpc3BsYXlcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd25BcnJvd1wiPjwvbmctY29udGFpbmVyPlxuICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gSWNvbiBTZWxlY3QgVGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI2ljb25TZWxlY3RUZW1wbGF0ZT5cbiAgPGJ1dHRvbiBjbGFzcz1cImFwcC1zZWxlY3QtaW5wdXRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKClcIlxuICAgICAgICAgIFtjbGFzcy5mb2N1c2VkXT1cImlzT3BlblwiXG4gICAgICAgICAgW2NsYXNzLmhhcy12YWx1ZV09XCIhaXNNb2RlbEVtcHR5KClcIj5cbiAgICBcbiAgICA8ZGl2IGNsYXNzPVwiYXBwLXNlbGVjdC1sZWFkaW5nXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaWNvbkxlYWRpbmdFbGVtZW50OyBjb250ZXh0OiB7IG9wdGlvbjogZ2V0U2VsZWN0ZWRPcHRpb24oKSwgaWNvbjogbGVhZGluZ0ljb24gfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3RWYWx1ZURpc3BsYXlcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd25BcnJvd1wiPjwvbmctY29udGFpbmVyPlxuICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gQXZhdGFyIFNlbGVjdCBUZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjYXZhdGFyU2VsZWN0VGVtcGxhdGU+XG4gIDxidXR0b24gY2xhc3M9XCJhcHAtc2VsZWN0LWlucHV0XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bigpXCJcbiAgICAgICAgICBbY2xhc3MuZm9jdXNlZF09XCJpc09wZW5cIlxuICAgICAgICAgIFtjbGFzcy5oYXMtdmFsdWVdPVwiIWlzTW9kZWxFbXB0eSgpXCI+XG4gICAgXG4gICAgPGRpdiBjbGFzcz1cImFwcC1zZWxlY3QtbGVhZGluZ1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImF2YXRhckxlYWRpbmdFbGVtZW50OyBjb250ZXh0OiB7IG9wdGlvbjogZ2V0U2VsZWN0ZWRPcHRpb24oKSwgYXZhdGFyOiBsZWFkaW5nQXZhdGFyIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VsZWN0VmFsdWVEaXNwbGF5XCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRyb3Bkb3duQXJyb3dcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIERvdCBTZWxlY3QgVGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI2RvdFNlbGVjdFRlbXBsYXRlPlxuICA8YnV0dG9uIGNsYXNzPVwiYXBwLXNlbGVjdC1pbnB1dFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKVwiXG4gICAgICAgICAgW2NsYXNzLmZvY3VzZWRdPVwiaXNPcGVuXCJcbiAgICAgICAgICBbY2xhc3MuaGFzLXZhbHVlXT1cIiFpc01vZGVsRW1wdHkoKVwiPlxuICAgIFxuICAgIDxkaXYgY2xhc3M9XCJhcHAtc2VsZWN0LWxlYWRpbmdcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkb3RMZWFkaW5nRWxlbWVudDsgY29udGV4dDogeyBvcHRpb246IGdldFNlbGVjdGVkT3B0aW9uKCksIGNvbG9yOiBsZWFkaW5nRG90Q29sb3IgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3RWYWx1ZURpc3BsYXlcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd25BcnJvd1wiPjwvbmctY29udGFpbmVyPlxuICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gU2VhcmNoIElucHV0IFRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNzZWFyY2hJbnB1dFRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiYXBwLXNlbGVjdC1pbnB1dCBhcHAtc2VsZWN0LXNlYXJjaC1pbnB1dFwiXG4gICAgICAgW2NsYXNzLmZvY3VzZWRdPVwiaXNPcGVuIHx8IHNlYXJjaEZvY3VzZWRcIlxuICAgICAgIFtjbGFzcy5oYXMtdmFsdWVdPVwiIWlzTW9kZWxFbXB0eSgpXCI+XG4gICAgXG4gICAgPCEtLSBTZWFyY2ggSWNvbiAtLT5cbiAgICA8emVuLWljb24gW25hbWVdPVwiJ3NlYXJjaCdcIlxuICAgICAgICAgICAgICBbY3VzdG9tQ29sb3JdPVwiZGlzYWJsZWQgPyAnIzlDQTNBRicgOiAnIzY2NzA4NSdcIj5cbiAgICA8L3plbi1pY29uPlxuICAgIFxuICAgIDwhLS0gU2VhcmNoIElucHV0IEZpZWxkIC0tPlxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgIGNsYXNzPVwiYXBwLXNlbGVjdC1zZWFyY2gtZmllbGRcIlxuICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaElucHV0VmFsdWVcIlxuICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlYXJjaElucHV0Q2hhbmdlKClcIlxuICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvblNlYXJjaEVudGVyKCRldmVudClcIlxuICAgICAgICAgICAoZm9jdXMpPVwib25TZWFyY2hGb2N1cygpXCJcbiAgICAgICAgICAgKGJsdXIpPVwib25TZWFyY2hCbHVyKCRldmVudClcIlxuICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VsZWN0ZWREaXNwbGF5IHx8IHBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+XG48IS0tIFNIQVJFRCBDT01QT05FTlQgVEVNUExBVEVTIC0tPlxuPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+XG5cbjwhLS0gU2VsZWN0IFZhbHVlIERpc3BsYXkgLS0+XG48bmctdGVtcGxhdGUgI3NlbGVjdFZhbHVlRGlzcGxheT5cbiAgPGRpdiBjbGFzcz1cImFwcC1zZWxlY3QtdmFsdWUtd3JhcHBlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwiYXBwLXNlbGVjdC12YWx1ZVwiIFtjbGFzcy5wbGFjZWhvbGRlcl09XCJpc01vZGVsRW1wdHkoKVwiPlxuICAgICAge3sgc2VsZWN0ZWREaXNwbGF5IHx8IHBsYWNlaG9sZGVyIHwgdHJhbnNsYXRlIH19XG4gICAgPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwiYXBwLXNlbGVjdC1zZWNvbmRhcnlcIiAqbmdJZj1cImdldFNlbGVjdGVkU2Vjb25kYXJ5VGV4dCgpICYmICFpc01vZGVsRW1wdHkoKVwiPlxuICAgICAge3sgZ2V0U2VsZWN0ZWRTZWNvbmRhcnlUZXh0KCkgfX1cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBEcm9wZG93biBBcnJvdyAtLT5cbjxuZy10ZW1wbGF0ZSAjZHJvcGRvd25BcnJvdz5cbiAgPHplbi1pY29uIGNsYXNzPVwiYXBwLXNlbGVjdC1hcnJvd1wiIFxuICAgICAgICAgICAgW2NsYXNzLnJvdGF0ZWRdPVwiaXNPcGVuXCIgXG4gICAgICAgICAgICBbbmFtZV09XCInY2hldnJvbi1kb3duJ1wiXG4gICAgICAgICAgICBbY3VzdG9tQ29sb3JdPVwiJyM2NjcwODUnXCI+XG4gIDwvemVuLWljb24+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cbjwhLS0gTEVBRElORyBFTEVNRU5UIFRFTVBMQVRFUyAtLT5cbjwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPlxuXG48IS0tIEljb24gTGVhZGluZyBFbGVtZW50ICh3aXRoIHNtYXJ0IHJlc29sdXRpb24pIC0tPlxuPG5nLXRlbXBsYXRlICNpY29uTGVhZGluZ0VsZW1lbnQgbGV0LW9wdGlvbj1cIm9wdGlvblwiIGxldC1pY29uPVwiaWNvblwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaWNvbiB8fCBvcHRpb24/Lmljb24gfHwgb3B0aW9uPy5pY29uTmFtZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRJY29uUGF0aChvcHRpb24sIGljb24pIGFzIGljb25QYXRoXCI+XG4gICAgICA8IS0tIElmIGljb24gY29udGFpbnMgLyBvciAuIHRyZWF0IGFzIFNWRyBwYXRoIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihpY29uICYmIChpY29uLmluY2x1ZGVzKCcvJykgfHwgaWNvbi5pbmNsdWRlcygnLicpKSkgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uPy5pY29uICYmIChvcHRpb24uaWNvbi5pbmNsdWRlcygnLycpIHx8IG9wdGlvbi5pY29uLmluY2x1ZGVzKCcuJykpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbj8uaWNvbk5hbWUgJiYgKG9wdGlvbi5pY29uTmFtZS5pbmNsdWRlcygnLycpIHx8IG9wdGlvbi5pY29uTmFtZS5pbmNsdWRlcygnLicpKSlcIj5cbiAgICAgICAgPCEtLSBVc2UgaW1nIHRhZyBmb3IgRXhjZWwgdG8gcHJlc2VydmUgY29sb3JzIC0tPlxuICAgICAgICA8aW1nICpuZ0lmPVwiaWNvblBhdGguaW5jbHVkZXMoJ2V4Y2VsJylcIiBcbiAgICAgICAgICAgICBbc3JjXT1cImljb25QYXRoXCIgXG4gICAgICAgICAgICAgYWx0PVwiXCJcbiAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAyMHB4OyBoZWlnaHQ6IDIwcHg7XCI+XG4gICAgICAgIDwhLS0gVXNlIHplbi1pY29uIHdpdGggc3JjIGZvciBvdGhlciBTVkcgZmlsZXMgLS0+XG4gICAgICAgIDx6ZW4taWNvbiAqbmdJZj1cIiFpY29uUGF0aC5pbmNsdWRlcygnZXhjZWwnKVwiXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cImljb25QYXRoXCJcbiAgICAgICAgICAgICAgICAgIFtjdXN0b21Db2xvcl09XCInIzY2NzA4NSdcIj5cbiAgICAgICAgPC96ZW4taWNvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPCEtLSBPdGhlcndpc2UgdHJlYXQgYXMgTWF0ZXJpYWwgaWNvbiBuYW1lIG9yIHNwZWNpYWwgY2FzZXMgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiISgoaWNvbiAmJiAoaWNvbi5pbmNsdWRlcygnLycpIHx8IGljb24uaW5jbHVkZXMoJy4nKSkpIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb24/Lmljb24gJiYgKG9wdGlvbi5pY29uLmluY2x1ZGVzKCcvJykgfHwgb3B0aW9uLmljb24uaW5jbHVkZXMoJy4nKSkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbj8uaWNvbk5hbWUgJiYgKG9wdGlvbi5pY29uTmFtZS5pbmNsdWRlcygnLycpIHx8IG9wdGlvbi5pY29uTmFtZS5pbmNsdWRlcygnLicpKSkpXCI+XG4gICAgICAgIDwhLS0gU3BlY2lhbCBjYXNlIGZvciBFeGNlbCBpY29uIC0gdXNlIGltZyB0byBwcmVzZXJ2ZSBjb2xvcnMgLS0+XG4gICAgICAgIDxpbWcgKm5nSWY9XCIoaWNvbiA9PT0gJ2V4Y2VsJykgfHwgKG9wdGlvbj8uaWNvbiA9PT0gJ2V4Y2VsJykgfHwgKG9wdGlvbj8uaWNvbk5hbWUgPT09ICdleGNlbCcpXCJcbiAgICAgICAgICAgICBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9leGNlbC5zdmdcIlxuICAgICAgICAgICAgIGFsdD1cIkV4Y2VsXCJcbiAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAyMHB4OyBoZWlnaHQ6IDIwcHg7XCI+XG4gICAgICAgIDwhLS0gTWF0ZXJpYWwgaWNvbiBuYW1lcyAtLT5cbiAgICAgICAgPHplbi1pY29uICpuZ0lmPVwiKGljb24gIT09ICdleGNlbCcpICYmIChvcHRpb24/Lmljb24gIT09ICdleGNlbCcpICYmIChvcHRpb24/Lmljb25OYW1lICE9PSAnZXhjZWwnKVwiXG4gICAgICAgICAgICAgICAgICBbbmFtZV09XCJpY29uIHx8IG9wdGlvbj8uaWNvbiB8fCBvcHRpb24/Lmljb25OYW1lXCJcbiAgICAgICAgICAgICAgICAgIFtjdXN0b21Db2xvcl09XCInIzY2NzA4NSdcIj5cbiAgICAgICAgPC96ZW4taWNvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gQXZhdGFyIExlYWRpbmcgRWxlbWVudCAtLT5cbjxuZy10ZW1wbGF0ZSAjYXZhdGFyTGVhZGluZ0VsZW1lbnQgbGV0LW9wdGlvbj1cIm9wdGlvblwiIGxldC1hdmF0YXI9XCJhdmF0YXJcIj5cbiAgPGRpdiBjbGFzcz1cImFwcC1zZWxlY3QtYXZhdGFyXCIgKm5nSWY9XCJhdmF0YXIgfHwgb3B0aW9uPy5hdmF0YXJcIiA+XG4gICAgPGltZyBbc3JjXT1cImF2YXRhciB8fCBvcHRpb24/LmF2YXRhclwiIGFsdD1cIlwiPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gRG90IExlYWRpbmcgRWxlbWVudCAtLT5cbjxuZy10ZW1wbGF0ZSAjZG90TGVhZGluZ0VsZW1lbnQgbGV0LW9wdGlvbj1cIm9wdGlvblwiIGxldC1jb2xvcj1cImNvbG9yXCI+XG4gIDxkaXYgY2xhc3M9XCJhcHAtc2VsZWN0LWRvdFwiXG4gICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiY29sb3IgfHwgb3B0aW9uPy5kb3RDb2xvciB8fCAnIzEwQjk4MSdcIj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==