verben-ng-ui 0.4.6 → 0.4.7

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.
@@ -192,7 +192,7 @@ export class DataExportComponent {
192
192
  this.showAllGroups = !this.showAllGroups;
193
193
  }
194
194
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataExportComponent, deps: [{ token: i1.DataExportService }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
195
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DataExportComponent, selector: "lib-data-export", inputs: { columns: "columns", data: "data" }, outputs: { exportDataEvent: "exportDataEvent" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid #D4A007'\"\n bgColor=\"#FFFFFF\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'#3479E9'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n <div class=\"operation-grid\">\n <verben-drop-down\n width=\"'8rem'\"\n height=\"'1.25rem'\"\n placeholder=\"Select field\"\n [options]=\"numericProperties.concat(stringProperties)\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n <verben-drop-down\n width=\"'8rem'\"\n height=\"'1.25rem'\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n [(ngModel)]=\"newOperation.operator\"\n >\n </verben-drop-down>\n <verben-drop-down\n width=\"'8rem'\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"exportData()\">Export</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:#6b7280;cursor:pointer}.divider{border:none;border-top:1px solid #e8eaf1}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:#3479e9;font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:#ffe681;color:#404040;font-size:.75rem;font-weight:600;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i5.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i7.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "fontSize", "icon", "textPass"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
195
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DataExportComponent, selector: "lib-data-export", inputs: { columns: "columns", data: "data" }, outputs: { exportDataEvent: "exportDataEvent" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid #D4A007'\"\n bgColor=\"#FFFFFF\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'#3479E9'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n <div class=\"operation-grid\">\n <verben-drop-down\n width=\"'8rem'\"\n height=\"'1.25rem'\"\n placeholder=\"Select field\"\n [options]=\"numericProperties.concat(stringProperties)\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n <verben-drop-down\n width=\"'8rem'\"\n height=\"'1.25rem'\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n [(ngModel)]=\"newOperation.operator\"\n >\n </verben-drop-down>\n <verben-drop-down\n width=\"'8rem'\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"exportData()\">Export</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:#6b7280;cursor:pointer}.divider{border:none;border-top:1px solid #e8eaf1}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:#3479e9;font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:#ffe681;color:#404040;font-size:.75rem;font-weight:600;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i5.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i7.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "fontSize", "icon", "textPass"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
196
196
  }
197
197
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataExportComponent, decorators: [{
198
198
  type: Component,
@@ -134,7 +134,7 @@ export class DataFilterComponent {
134
134
  return this.savedFilters.filter((filter) => filter.selected).length;
135
135
  }
136
136
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
137
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DataFilterComponent, selector: "lib-data-filter", inputs: { columns: "columns", data: "data" }, outputs: { filterApplied: "filterApplied" }, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid #D4A007'\"\n bgColor=\"#FFFFFF\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">\n Filter <sup>({{ activeFilterCount }})</sup>\n </h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'#3479E9'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n\n <div card-body class=\"card-body\">\n <!-- Saved Filters Section -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Filters</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n\n <div *ngFor=\"let filter of visibleFilters\" class=\"item\">\n <div class=\"item-label\">\n <input type=\"checkbox\" [(ngModel)]=\"filter.selected\" />\n <label>{{ getFilterDescription(filter) }}</label>\n </div>\n </div>\n\n <div\n *ngIf=\"savedFilters.length > maxVisibleItems\"\n class=\"show-more\"\n (click)=\"showAllFilters = !showAllFilters\"\n >\n {{ showAllFilters ? \"Show Less\" : \"Show More\" }}\n </div>\n </section>\n\n <hr class=\"divider\" />\n\n <!-- New Filter Operation -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n\n <div class=\"operation-grid\">\n <!-- Column Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select column\"\n [options]=\"filterableColumns\"\n optionLabel=\"header\"\n optionValue=\"id\"\n [(ngModel)]=\"currentFilter.columnId\"\n (ngModelChange)=\"onColumnSelect($event)\"\n ></verben-drop-down>\n\n <!-- Operator Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.operator\"\n ></verben-drop-down>\n\n <!-- Value Input based on type -->\n <ng-container [ngSwitch]=\"currentColumnType\">\n <!-- Date Input -->\n <verbena-input\n *ngSwitchCase=\"'date'\"\n type=\"date\"\n placeholder=\"Select date\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Number Input -->\n <verbena-input\n *ngSwitchCase=\"'number'\"\n type=\"number\"\n placeholder=\"Enter number\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Text Input (default) -->\n <verbena-input\n *ngSwitchCase=\"'string'\"\n type=\"text\"\n placeholder=\"Enter text\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n </ng-container>\n </div>\n\n <button class=\"add-button ml-auto\" (click)=\"addFilter()\">+ Add</button>\n </section>\n </div>\n\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"applyFilters()\">Filter</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:#6b7280;cursor:pointer}.divider{border:none;border-top:1px solid #e8eaf1}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:#3479e9;font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:#ffe681;color:#404040;font-size:.75rem;font-weight:600;cursor:pointer}sup{color:#3479e9}\n"], dependencies: [{ 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.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { 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.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i4.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i5.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "fontSize", "icon", "textPass"], outputs: ["valueChange"] }] });
137
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DataFilterComponent, selector: "lib-data-filter", inputs: { columns: "columns", data: "data" }, outputs: { filterApplied: "filterApplied" }, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid #D4A007'\"\n bgColor=\"#FFFFFF\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">\n Filter <sup>({{ activeFilterCount }})</sup>\n </h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'#3479E9'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n\n <div card-body class=\"card-body\">\n <!-- Saved Filters Section -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Filters</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n\n <div *ngFor=\"let filter of visibleFilters\" class=\"item\">\n <div class=\"item-label\">\n <input type=\"checkbox\" [(ngModel)]=\"filter.selected\" />\n <label>{{ getFilterDescription(filter) }}</label>\n </div>\n </div>\n\n <div\n *ngIf=\"savedFilters.length > maxVisibleItems\"\n class=\"show-more\"\n (click)=\"showAllFilters = !showAllFilters\"\n >\n {{ showAllFilters ? \"Show Less\" : \"Show More\" }}\n </div>\n </section>\n\n <hr class=\"divider\" />\n\n <!-- New Filter Operation -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n\n <div class=\"operation-grid\">\n <!-- Column Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select column\"\n [options]=\"filterableColumns\"\n optionLabel=\"header\"\n optionValue=\"id\"\n [(ngModel)]=\"currentFilter.columnId\"\n (ngModelChange)=\"onColumnSelect($event)\"\n ></verben-drop-down>\n\n <!-- Operator Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.operator\"\n ></verben-drop-down>\n\n <!-- Value Input based on type -->\n <ng-container [ngSwitch]=\"currentColumnType\">\n <!-- Date Input -->\n <verbena-input\n *ngSwitchCase=\"'date'\"\n type=\"date\"\n placeholder=\"Select date\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Number Input -->\n <verbena-input\n *ngSwitchCase=\"'number'\"\n type=\"number\"\n placeholder=\"Enter number\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Text Input (default) -->\n <verbena-input\n *ngSwitchCase=\"'string'\"\n type=\"text\"\n placeholder=\"Enter text\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n </ng-container>\n </div>\n\n <button class=\"add-button ml-auto\" (click)=\"addFilter()\">+ Add</button>\n </section>\n </div>\n\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"applyFilters()\">Filter</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:#6b7280;cursor:pointer}.divider{border:none;border-top:1px solid #e8eaf1}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:#3479e9;font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:#ffe681;color:#404040;font-size:.75rem;font-weight:600;cursor:pointer}sup{color:#3479e9}\n"], dependencies: [{ 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.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { 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.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i4.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i5.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "fontSize", "icon", "textPass"], outputs: ["valueChange"] }] });
138
138
  }
139
139
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataFilterComponent, decorators: [{
140
140
  type: Component,
@@ -236,7 +236,7 @@ export class DataXportComponent {
236
236
  : column.header;
237
237
  }
238
238
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataXportComponent, deps: [{ token: i1.DataXportService }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
239
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DataXportComponent, selector: "lib-data-xport", inputs: { data: "data", columns: "columns" }, outputs: { exportDataEvent: "exportDataEvent" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid #D4A007'\"\n bgColor=\"#FFFFFF\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'#3479E9'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n\n <div class=\"operation-grid\">\n <!-- First Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n fontSize=\"11px\"\n placeholder=\"Select field\"\n [options]=\"columnOptions\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n\n <!-- Operator/Join Selection -->\n <ng-container *ngIf=\"newOperation.type === 'arithmetic'\">\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"arithmeticOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"newOperation.operator\"\n fontSize=\"11px\"\n >\n </verben-drop-down>\n </ng-container>\n <ng-container *ngIf=\"newOperation.type === 'string'\">\n <verbena-input\n placeholder=\"Join by\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"newOperation.joinBy\"\n ></verbena-input>\n </ng-container>\n\n <!-- Second Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"exportData()\">Export</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:#6b7280;cursor:pointer}.divider{border:none;border-top:1px solid #e8eaf1}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:#3479e9;font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:#ffe681;color:#404040;font-size:.75rem;font-weight:600;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i5.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i7.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "fontSize", "icon", "textPass"], outputs: ["valueChange"] }] });
239
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DataXportComponent, selector: "lib-data-xport", inputs: { data: "data", columns: "columns" }, outputs: { exportDataEvent: "exportDataEvent" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid #D4A007'\"\n bgColor=\"#FFFFFF\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'#3479E9'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#3479E9\"\n fill=\"white\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"#E20000\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"black\"\n stroke=\"black\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"grey\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n\n <div class=\"operation-grid\">\n <!-- First Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n fontSize=\"11px\"\n placeholder=\"Select field\"\n [options]=\"columnOptions\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n\n <!-- Operator/Join Selection -->\n <ng-container *ngIf=\"newOperation.type === 'arithmetic'\">\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"arithmeticOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"newOperation.operator\"\n fontSize=\"11px\"\n >\n </verben-drop-down>\n </ng-container>\n <ng-container *ngIf=\"newOperation.type === 'string'\">\n <verbena-input\n placeholder=\"Join by\"\n border=\"1px solid #ccc\"\n borderRadius=\"5px\"\n textColor=\"black\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"newOperation.joinBy\"\n ></verbena-input>\n </ng-container>\n\n <!-- Second Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"exportData()\">Export</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:#6b7280;cursor:pointer}.divider{border:none;border-top:1px solid #e8eaf1}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:#3479e9;font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:#ffe681;color:#404040;font-size:.75rem;font-weight:600;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i5.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i7.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "fontSize", "icon", "textPass"], outputs: ["valueChange"] }] });
240
240
  }
241
241
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataXportComponent, decorators: [{
242
242
  type: Component,
@@ -115,7 +115,7 @@ export class DatePickerComponent {
115
115
  this.showCalendar = false;
116
116
  }
117
117
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
118
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DatePickerComponent, selector: "app-date-picker", inputs: { placeholder: "placeholder", format: "format", minDate: "minDate", maxDate: "maxDate", useDropdowns: "useDropdowns", yearPlaceholder: "yearPlaceholder", monthPlaceholder: "monthPlaceholder" }, outputs: { dateChange: "dateChange" }, ngImport: i0, template: "<div class=\"date-picker\">\n <input\n type=\"text\"\n [placeholder]=\"placeholder\"\n [value]=\"displayDate\"\n (focus)=\"toggleCalendar()\"\n readonly\n />\n <div *ngIf=\"showCalendar\" class=\"calendar\">\n <div class=\"calendar-header\">\n <ng-container *ngIf=\"!useDropdowns; else dropdowns\">\n <button (click)=\"previousMonth()\">\n <verben-svg [width]=\"20\" [icon]=\"'chevron-left'\"></verben-svg>\n </button>\n \n <!-- Display the current month and year -->\n <span>{{ months[selectedMonth] }} {{ selectedYear }}</span>\n \n <button (click)=\"nextMonth()\">\n <verben-svg [width]=\"20\" [icon]=\"'chevron-right'\"></verben-svg>\n </button>\n </ng-container>\n \n <ng-template #dropdowns>\n <verben-drop-down\n [placeholder]=\"yearPlaceholder\"\n (onChange)=\"onDropdownYearChange($event)\"\n [options]=\"yearRange\"\n [(ngModel)]=\"selectedYear\"\n ></verben-drop-down>\n <verben-drop-down\n placeholder=\"Select a month\"\n (onChange)=\"onDropdownMonthChange($event)\"\n [options]=\"months\"\n [(ngModel)]=\"selectedMonth\"\n ></verben-drop-down>\n </ng-template>\n </div>\n \n <div class=\"calendar-body\">\n <div class=\"weekdays\">\n <span *ngFor=\"let day of weekDays\">{{ day }}</span>\n </div>\n <div class=\"dates\">\n <button\n *ngFor=\"let day of getDaysInMonth()\"\n [class.selected]=\"isSelected(day)\"\n (click)=\"selectTemporaryDate(day)\"\n >\n {{ day.getDate() }}\n </button>\n </div>\n </div>\n <div class=\"calendar-footer\">\n <button (click)=\"cancel()\">Cancel</button>\n <button (click)=\"confirm()\">OK</button>\n </div>\n </div>\n </div>\n ", styles: [".date-picker{position:relative;width:250px}input{width:100%;padding:10px;border:1px solid #ccc;border-radius:4px;cursor:pointer}.calendar{position:absolute;top:100%;left:0;width:fit-content;border:1px solid #ccc;background-color:#fff;z-index:10;border-radius:4px}.calendar-header{display:flex;justify-content:space-between;gap:10px;padding:10px;background-color:#f0f0f0}.weekdays,.dates{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;gap:6px;padding:10px}button{border:none;background:none;cursor:pointer;padding:5px;width:40px;height:40px}button.selected{background-color:#ffe681;color:#000;border-radius:30px}.calendar-footer{display:flex;justify-content:end;gap:20px;padding:4px 10px;color:purple;font-weight:600}\n"], dependencies: [{ kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i4.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }] });
118
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DatePickerComponent, selector: "app-date-picker", inputs: { placeholder: "placeholder", format: "format", minDate: "minDate", maxDate: "maxDate", useDropdowns: "useDropdowns", yearPlaceholder: "yearPlaceholder", monthPlaceholder: "monthPlaceholder" }, outputs: { dateChange: "dateChange" }, ngImport: i0, template: "<div class=\"date-picker\">\n <input\n type=\"text\"\n [placeholder]=\"placeholder\"\n [value]=\"displayDate\"\n (focus)=\"toggleCalendar()\"\n readonly\n />\n <div *ngIf=\"showCalendar\" class=\"calendar\">\n <div class=\"calendar-header\">\n <ng-container *ngIf=\"!useDropdowns; else dropdowns\">\n <button (click)=\"previousMonth()\">\n <verben-svg [width]=\"20\" [icon]=\"'chevron-left'\"></verben-svg>\n </button>\n \n <!-- Display the current month and year -->\n <span>{{ months[selectedMonth] }} {{ selectedYear }}</span>\n \n <button (click)=\"nextMonth()\">\n <verben-svg [width]=\"20\" [icon]=\"'chevron-right'\"></verben-svg>\n </button>\n </ng-container>\n \n <ng-template #dropdowns>\n <verben-drop-down\n [placeholder]=\"yearPlaceholder\"\n (onChange)=\"onDropdownYearChange($event)\"\n [options]=\"yearRange\"\n [(ngModel)]=\"selectedYear\"\n ></verben-drop-down>\n <verben-drop-down\n placeholder=\"Select a month\"\n (onChange)=\"onDropdownMonthChange($event)\"\n [options]=\"months\"\n [(ngModel)]=\"selectedMonth\"\n ></verben-drop-down>\n </ng-template>\n </div>\n \n <div class=\"calendar-body\">\n <div class=\"weekdays\">\n <span *ngFor=\"let day of weekDays\">{{ day }}</span>\n </div>\n <div class=\"dates\">\n <button\n *ngFor=\"let day of getDaysInMonth()\"\n [class.selected]=\"isSelected(day)\"\n (click)=\"selectTemporaryDate(day)\"\n >\n {{ day.getDate() }}\n </button>\n </div>\n </div>\n <div class=\"calendar-footer\">\n <button (click)=\"cancel()\">Cancel</button>\n <button (click)=\"confirm()\">OK</button>\n </div>\n </div>\n </div>\n ", styles: [".date-picker{position:relative;width:250px}input{width:100%;padding:10px;border:1px solid #ccc;border-radius:4px;cursor:pointer}.calendar{position:absolute;top:100%;left:0;width:fit-content;border:1px solid #ccc;background-color:#fff;z-index:10;border-radius:4px}.calendar-header{display:flex;justify-content:space-between;gap:10px;padding:10px;background-color:#f0f0f0}.weekdays,.dates{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;gap:6px;padding:10px}button{border:none;background:none;cursor:pointer;padding:5px;width:40px;height:40px}button.selected{background-color:#ffe681;color:#000;border-radius:30px}.calendar-footer{display:flex;justify-content:end;gap:20px;padding:4px 10px;color:purple;font-weight:600}\n"], dependencies: [{ kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }, { kind: "component", type: i4.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }] });
119
119
  }
120
120
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DatePickerComponent, decorators: [{
121
121
  type: Component,
@@ -12,6 +12,7 @@ export class DropDownItemComponent {
12
12
  groupTemplate = null;
13
13
  activeItem;
14
14
  activeItems;
15
+ selectKey = null;
15
16
  optionValue;
16
17
  optionLabel;
17
18
  optionSubLabel;
@@ -25,11 +26,16 @@ export class DropDownItemComponent {
25
26
  constructor() { }
26
27
  ngOnInit() { }
27
28
  isEqual(value, other) {
28
- return isEqual(value, other);
29
+ return this.selectKey
30
+ ? isEqual(value[this.selectKey], other[this.selectKey])
31
+ : isEqual(value, other);
29
32
  }
30
33
  isSelected(value, other) {
31
34
  for (let val of value) {
32
- if (isEqual(val, other)) {
35
+ const equalityCheck = this.selectKey
36
+ ? isEqual(val[this.selectKey], other[this.selectKey])
37
+ : isEqual(val, other);
38
+ if (equalityCheck) {
33
39
  return true;
34
40
  }
35
41
  }
@@ -60,7 +66,7 @@ export class DropDownItemComponent {
60
66
  return typeof item === 'string' ? item : item[this.optionSubLabel];
61
67
  }
62
68
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DropDownItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
63
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DropDownItemComponent, isStandalone: true, selector: "drop-down-item", inputs: { itemTemplate: "itemTemplate", groupTemplate: "groupTemplate", activeItem: "activeItem", activeItems: "activeItems", optionValue: "optionValue", optionLabel: "optionLabel", optionSubLabel: "optionSubLabel", loadMoreCaption: "loadMoreCaption", multiselect: "multiselect", options: "options", group: "group", onExpand: "onExpand", onLoadMore: "onLoadMore", onSelect: "onSelect" }, ngImport: i0, template: "<!-- If group mode is false, display a flat list -->\n<ng-container *ngIf=\"!group\">\n\n <div class=\"option-items-container flex flex-col\">\n <ng-container *ngFor=\"let item of options\">\n <ng-container *ngIf=\"itemTemplate; else defaultItem\">\n <div *ngIf=\"!multiselect\" [ngClass]=\"{'active-item': isEqual(this.activeItem, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"item-wrapper\">\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\"></ng-container>\n </div>\n <div *ngIf=\"multiselect\"\n [ngClass]=\"{'multi-select-active-item': isSelected(this.activeItems, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"item-wrapper multi-select flex\">\n <input type=\"checkbox\" [checked]=\"isSelected(this.activeItems, this.getValue(item))\"\n class=\"custom-checkbox\" />\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\"></ng-container>\n </div>\n </ng-container>\n\n <ng-template #defaultItem>\n <div *ngIf=\"!multiselect\" [ngClass]=\"{'active-item': isEqual(this.activeItem, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"default-item item-wrapper flex flex-col\">\n <div [ngClass]=\"{'has-sub-label': optionSubLabel}\" class=\"item-label\">{{this.getOptionLabel(item)}}</div>\n <div *ngIf=\"optionSubLabel || (group && item.subLabel)\" class=\"item-sub-label\">\n {{this.getOptionSubLabel(item)}}</div>\n </div>\n <div *ngIf=\"multiselect\"\n [ngClass]=\"{'multi-select-active-item': isSelected(this.activeItems, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"default-item item-wrapper multi-select flex\">\n <input type=\"checkbox\" [checked]=\"isSelected(this.activeItems, this.getValue(item))\"\n class=\"custom-checkbox\" />\n <div class=\"flex flex-col\">\n <div [ngClass]=\"{'has-sub-label': optionSubLabel}\" class=\"item-label\">{{this.getOptionLabel(item)}}</div>\n <div *ngIf=\"optionSubLabel || (group && item.subLabel)\" class=\"item-sub-label\">\n {{this.getOptionSubLabel(item)}}</div>\n </div>\n </div>\n </ng-template>\n </ng-container>\n </div>\n</ng-container>\n\n<!-- If group mode is true, display groups and sub-groups recursively -->\n<ng-container *ngIf=\"group\">\n <div class=\"option-items-container flex flex-col\">\n <ng-container *ngFor=\"let item of options\">\n <!-- Display as group header if the item has children -->\n <div *ngIf=\"!item.items\">\n <ng-container *ngIf=\"itemTemplate; else defaultItem\">\n <div *ngIf=\"!multiselect\" [ngClass]=\"{'active-item': isEqual(this.activeItem, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"item-wrapper\">\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\"></ng-container>\n </div>\n <div *ngIf=\"multiselect\"\n [ngClass]=\"{'multi-select-active-item': isSelected(this.activeItems, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"item-wrapper multi-select flex\">\n <input type=\"checkbox\" [checked]=\"isSelected(this.activeItems, this.getValue(item))\"\n class=\"custom-checkbox\" />\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\"></ng-container>\n </div>\n </ng-container>\n\n <ng-template #defaultItem>\n <div *ngIf=\"!multiselect\" [ngClass]=\"{'active-item': isEqual(this.activeItem, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"default-item item-wrapper flex flex-col\">\n <div [ngClass]=\"{'has-sub-label': item.subLabel}\" class=\"item-label\">{{item.label}}</div>\n <div *ngIf=\"item.subLabel\" class=\"item-sub-label\">{{item.subLabel}}</div>\n </div>\n <div *ngIf=\"multiselect\"\n [ngClass]=\"{'multi-select-active-item': isSelected(this.activeItems, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"default-item item-wrapper multi-select flex\">\n <input type=\"checkbox\" [checked]=\"isSelected(this.activeItems, this.getValue(item))\"\n class=\"custom-checkbox\" />\n <div class=\"flex flex-col\">\n <div [ngClass]=\"{'has-sub-label': item.subLabel}\" class=\"item-label\">{{item.label}}</div>\n <div *ngIf=\"item.subLabel\" class=\"item-sub-label\">{{item.subLabel}}</div>\n </div>\n </div>\n </ng-template>\n </div>\n\n <!-- Display as normal item if it doesn't have children -->\n <div class=\"flex flex-col\" *ngIf=\"item.items\">\n <ng-container *ngIf=\"groupTemplate; else defaultGroup\">\n <div class=\"group-wrapper\" (click)=\"onExpand && onExpand(item, options)\">\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { $implicit: item }\"></ng-container>\n </div>\n </ng-container>\n\n <ng-template #defaultGroup>\n <div (click)=\"onExpand && onExpand(item, options)\" class=\"default-group group-wrapper flex\">\n <span *ngIf=\"!item.expanded\">\n <verben-svg icon=\"plus\" fill=\"#5d6674\" [width]=\"15\" [height]=\"15\"></verben-svg>\n <!-- <svg class=\"plus-minus-icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.33214 6.66578H5.26102C3.95858 6.66578 2.65614 6.6663 1.35371 6.66544C1.06528 6.66527 0.850553 6.53571 0.728192 6.27369C0.525115 5.83859 0.844383 5.33734 1.32491 5.33322C1.64624 5.33031 1.96756 5.33271 2.28889 5.33271C3.28285 5.33271 4.27682 5.33271 5.27079 5.33271H5.33214V5.27633C5.33214 3.96674 5.33214 2.65714 5.33214 1.34755C5.33214 1.03086 5.53162 0.767472 5.82998 0.688643C6.25515 0.576225 6.66577 0.896512 6.66645 1.34327C6.66748 1.96311 6.66679 2.58294 6.66679 3.20278C6.66679 3.89254 6.66679 4.58229 6.66679 5.27222V5.33305H6.7242C8.0323 5.33305 9.34056 5.33305 10.6487 5.33305C10.933 5.33305 11.1737 5.48848 11.2788 5.73902C11.4659 6.18527 11.1431 6.66475 10.6533 6.66595C10.1549 6.66698 9.6564 6.66612 9.15805 6.66612C8.34968 6.66612 7.54148 6.66612 6.73311 6.66612H6.66679V6.72713C6.66679 8.03535 6.66679 9.34357 6.66679 10.6516C6.66679 10.9808 6.45343 11.2475 6.13485 11.3177C5.75989 11.4003 5.38252 11.1309 5.33899 10.749C5.33471 10.7107 5.33231 10.6722 5.33231 10.6336C5.33197 9.33123 5.33197 8.02867 5.33197 6.72627V6.66612L5.33214 6.66578Z\"\n fill=\"currentColor\" />\n </svg> -->\n </span>\n <span *ngIf=\"item.expanded\">\n <verben-svg icon=\"minus\" fill=\"#5d6674\" [width]=\"15\" [height]=\"2\"></verben-svg>\n <!-- <svg class=\"plus-minus-icon\" width=\"10\" height=\"2\" viewBox=\"0 0 10 2\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0.333984 0.332031H9.66732V1.66536H0.333984V0.332031Z\" fill=\"currentColor\" />\n </svg> -->\n </span>\n <div class=\"default-item flex flex-col\">\n <div [ngClass]=\"{'has-sub-label': item.subLabel}\" class=\"item-label\">{{item.label}}</div>\n <div *ngIf=\"item.subLabel\" class=\"item-sub-label\">{{item.subLabel}}</div>\n </div>\n </div>\n </ng-template>\n <!-- Recursive rendering of sub-items (groups or individual items) -->\n <ng-container *ngIf=\"item.expanded\">\n <div class=\"group-wrapper-items flex flex-col\">\n <drop-down-item [itemTemplate]=\"itemTemplate\" [groupTemplate]=\"groupTemplate\" [activeItem]=\"activeItem\"\n [activeItems]=\"activeItems\" [multiselect]=\"multiselect\" [optionValue]=\"optionValue\"\n [optionLabel]=\"optionLabel\" [optionSubLabel]=\"optionSubLabel\" [loadMoreCaption]=\"loadMoreCaption\"\n [options]=\"item.items\" [group]=\"group\" [onExpand]=\"onExpand\" [onLoadMore]=\"onLoadMore\"\n [onSelect]=\"onSelect\"></drop-down-item>\n <div *ngIf=\"item.lazyLoad\" class=\"see-more-container flex\">\n <span class=\"see-more-caption\" (click)=\"onLoadMore && onLoadMore(item)\">{{loadMoreCaption}}</span>\n </div>\n <div *ngIf=\"item.isLoading\" class=\"loading-overlay\">\n <div class=\"loader\"></div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n</ng-container>\n", styles: ["*{font-family:sans-serif;font-size:.9rem}.w-100{width:100%}.h-100{height:100%}.flex{display:flex}.flex-col{flex-direction:column}.font-bold{font-weight:700}.justify-center{justify-content:center}.justify-end{justify-content:end}.align-items-center{align-items:center}.grid{display:grid}.verben-error-message{font-size:.8rem;color:red}.verben-input{border:1px solid #cbd5e1;outline:none;border-radius:5px;color:#334155;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s,outline-color .2s}.verben-input::placeholder{color:#64748b}.verben-input:hover{border:1px solid #697e97}.verben-input.disabled{opacity:1;background-color:light-dark(rgba(239,239,239,.3),rgba(59,59,59,.3));pointer-events:none;color:#64748b}.verben-input:disabled{opacity:1;background-color:light-dark(rgba(239,239,239,.3),rgba(59,59,59,.3));pointer-events:none;color:#64748b}.verben-input.focused{border-color:#3b82f6;outline:none}.verben-input:focus{border-color:#3b82f6;outline:none}.verben-input.ng-invalid{border-color:red}.verben-button{padding:8px 15px;border-radius:4px;border:none;text-align:center}.verben-button.primary{background-color:#ffe681}.verben-button.secondary{background-color:#d9d9d940}.option-items-container{gap:5px}.see-more-container{padding:5px}.see-more-caption{font-size:12px;color:#3b82f6}.item-wrapper{padding:10px;border-radius:4px}.item-wrapper.multi-select{align-items:center;gap:5px}.item-wrapper:hover{background-color:#b4cdf53d}.item-wrapper.active-item{background-color:#3b82f63d}.item-wrapper.multi-select-active-item{background-color:#b4cdf53d}.item-wrapper.active-item>div{color:#1d4ed8}.group-wrapper{padding:5px}.group-wrapper-items{padding-left:15px;position:relative;z-index:0}.item-label{font-weight:500;white-space:normal;word-wrap:break-word;word-break:break-all}.item-label.has-sub-label{font-weight:600}.item-sub-label{font-size:12px;color:#4d4d4d}.default-group{gap:5px;align-items:center}.default-item{flex:1 1 0}.plus-minus-icon{color:#5d6674;width:.8rem;height:.8rem}.loading-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#4d4b4b80;z-index:10;display:flex;justify-content:center;align-items:center;pointer-events:none}.loader{width:50px;padding:8px;aspect-ratio:1;border-radius:50%;background:#3b82f6;--_m: conic-gradient(#0000 10%, #000), linear-gradient(#000 0 0) content-box;-webkit-mask:var(--_m);mask:var(--_m);-webkit-mask-composite:source-out;mask-composite:subtract;animation:l3 1s infinite linear}@keyframes l3{to{transform:rotate(1turn)}}\n"], dependencies: [{ kind: "component", type: DropDownItemComponent, selector: "drop-down-item", inputs: ["itemTemplate", "groupTemplate", "activeItem", "activeItems", "optionValue", "optionLabel", "optionSubLabel", "loadMoreCaption", "multiselect", "options", "group", "onExpand", "onLoadMore", "onSelect"] }, { kind: "ngmodule", type: CommonModule }, { 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: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: SvgModule }, { kind: "component", type: i2.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }] });
69
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: DropDownItemComponent, isStandalone: true, selector: "drop-down-item", inputs: { itemTemplate: "itemTemplate", groupTemplate: "groupTemplate", activeItem: "activeItem", activeItems: "activeItems", selectKey: "selectKey", optionValue: "optionValue", optionLabel: "optionLabel", optionSubLabel: "optionSubLabel", loadMoreCaption: "loadMoreCaption", multiselect: "multiselect", options: "options", group: "group", onExpand: "onExpand", onLoadMore: "onLoadMore", onSelect: "onSelect" }, ngImport: i0, template: "<!-- If group mode is false, display a flat list -->\n<ng-container *ngIf=\"!group\">\n\n <div class=\"option-items-container flex flex-col\">\n <ng-container *ngFor=\"let item of options\">\n <ng-container *ngIf=\"itemTemplate; else defaultItem\">\n <div *ngIf=\"!multiselect\" [ngClass]=\"{'active-item': isEqual(this.activeItem, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"item-wrapper\">\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\"></ng-container>\n </div>\n <div *ngIf=\"multiselect\"\n [ngClass]=\"{'multi-select-active-item': isSelected(this.activeItems, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"item-wrapper multi-select flex\">\n <input type=\"checkbox\" [checked]=\"isSelected(this.activeItems, this.getValue(item))\"\n class=\"custom-checkbox\" />\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\"></ng-container>\n </div>\n </ng-container>\n\n <ng-template #defaultItem>\n <div *ngIf=\"!multiselect\" [ngClass]=\"{'active-item': isEqual(this.activeItem, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"default-item item-wrapper flex flex-col\">\n <div [ngClass]=\"{'has-sub-label': optionSubLabel}\" class=\"item-label\">{{this.getOptionLabel(item)}}</div>\n <div *ngIf=\"optionSubLabel || (group && item.subLabel)\" class=\"item-sub-label\">\n {{this.getOptionSubLabel(item)}}</div>\n </div>\n <div *ngIf=\"multiselect\"\n [ngClass]=\"{'multi-select-active-item': isSelected(this.activeItems, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"default-item item-wrapper multi-select flex\">\n <input type=\"checkbox\" [checked]=\"isSelected(this.activeItems, this.getValue(item))\"\n class=\"custom-checkbox\" />\n <div class=\"flex flex-col\">\n <div [ngClass]=\"{'has-sub-label': optionSubLabel}\" class=\"item-label\">{{this.getOptionLabel(item)}}</div>\n <div *ngIf=\"optionSubLabel || (group && item.subLabel)\" class=\"item-sub-label\">\n {{this.getOptionSubLabel(item)}}</div>\n </div>\n </div>\n </ng-template>\n </ng-container>\n </div>\n</ng-container>\n\n<!-- If group mode is true, display groups and sub-groups recursively -->\n<ng-container *ngIf=\"group\">\n <div class=\"option-items-container flex flex-col\">\n <ng-container *ngFor=\"let item of options\">\n <!-- Display as group header if the item has children -->\n <div *ngIf=\"!item.items\">\n <ng-container *ngIf=\"itemTemplate; else defaultItem\">\n <div *ngIf=\"!multiselect\" [ngClass]=\"{'active-item': isEqual(this.activeItem, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"item-wrapper\">\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\"></ng-container>\n </div>\n <div *ngIf=\"multiselect\"\n [ngClass]=\"{'multi-select-active-item': isSelected(this.activeItems, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"item-wrapper multi-select flex\">\n <input type=\"checkbox\" [checked]=\"isSelected(this.activeItems, this.getValue(item))\"\n class=\"custom-checkbox\" />\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\"></ng-container>\n </div>\n </ng-container>\n\n <ng-template #defaultItem>\n <div *ngIf=\"!multiselect\" [ngClass]=\"{'active-item': isEqual(this.activeItem, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"default-item item-wrapper flex flex-col\">\n <div [ngClass]=\"{'has-sub-label': item.subLabel}\" class=\"item-label\">{{item.label}}</div>\n <div *ngIf=\"item.subLabel\" class=\"item-sub-label\">{{item.subLabel}}</div>\n </div>\n <div *ngIf=\"multiselect\"\n [ngClass]=\"{'multi-select-active-item': isSelected(this.activeItems, this.getValue(item))}\"\n (click)=\"onSelect && onSelect(item, $event)\" class=\"default-item item-wrapper multi-select flex\">\n <input type=\"checkbox\" [checked]=\"isSelected(this.activeItems, this.getValue(item))\"\n class=\"custom-checkbox\" />\n <div class=\"flex flex-col\">\n <div [ngClass]=\"{'has-sub-label': item.subLabel}\" class=\"item-label\">{{item.label}}</div>\n <div *ngIf=\"item.subLabel\" class=\"item-sub-label\">{{item.subLabel}}</div>\n </div>\n </div>\n </ng-template>\n </div>\n\n <!-- Display as normal item if it doesn't have children -->\n <div class=\"flex flex-col\" *ngIf=\"item.items\">\n <ng-container *ngIf=\"groupTemplate; else defaultGroup\">\n <div class=\"group-wrapper\" (click)=\"onExpand && onExpand(item, options)\">\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { $implicit: item }\"></ng-container>\n </div>\n </ng-container>\n\n <ng-template #defaultGroup>\n <div (click)=\"onExpand && onExpand(item, options)\" class=\"default-group group-wrapper flex\">\n <span *ngIf=\"!item.expanded\">\n <verben-svg icon=\"plus\" fill=\"#5d6674\" [width]=\"15\" [height]=\"15\"></verben-svg>\n <!-- <svg class=\"plus-minus-icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5.33214 6.66578H5.26102C3.95858 6.66578 2.65614 6.6663 1.35371 6.66544C1.06528 6.66527 0.850553 6.53571 0.728192 6.27369C0.525115 5.83859 0.844383 5.33734 1.32491 5.33322C1.64624 5.33031 1.96756 5.33271 2.28889 5.33271C3.28285 5.33271 4.27682 5.33271 5.27079 5.33271H5.33214V5.27633C5.33214 3.96674 5.33214 2.65714 5.33214 1.34755C5.33214 1.03086 5.53162 0.767472 5.82998 0.688643C6.25515 0.576225 6.66577 0.896512 6.66645 1.34327C6.66748 1.96311 6.66679 2.58294 6.66679 3.20278C6.66679 3.89254 6.66679 4.58229 6.66679 5.27222V5.33305H6.7242C8.0323 5.33305 9.34056 5.33305 10.6487 5.33305C10.933 5.33305 11.1737 5.48848 11.2788 5.73902C11.4659 6.18527 11.1431 6.66475 10.6533 6.66595C10.1549 6.66698 9.6564 6.66612 9.15805 6.66612C8.34968 6.66612 7.54148 6.66612 6.73311 6.66612H6.66679V6.72713C6.66679 8.03535 6.66679 9.34357 6.66679 10.6516C6.66679 10.9808 6.45343 11.2475 6.13485 11.3177C5.75989 11.4003 5.38252 11.1309 5.33899 10.749C5.33471 10.7107 5.33231 10.6722 5.33231 10.6336C5.33197 9.33123 5.33197 8.02867 5.33197 6.72627V6.66612L5.33214 6.66578Z\"\n fill=\"currentColor\" />\n </svg> -->\n </span>\n <span *ngIf=\"item.expanded\">\n <verben-svg icon=\"minus\" fill=\"#5d6674\" [width]=\"15\" [height]=\"2\"></verben-svg>\n <!-- <svg class=\"plus-minus-icon\" width=\"10\" height=\"2\" viewBox=\"0 0 10 2\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0.333984 0.332031H9.66732V1.66536H0.333984V0.332031Z\" fill=\"currentColor\" />\n </svg> -->\n </span>\n <div class=\"default-item flex flex-col\">\n <div [ngClass]=\"{'has-sub-label': item.subLabel}\" class=\"item-label\">{{item.label}}</div>\n <div *ngIf=\"item.subLabel\" class=\"item-sub-label\">{{item.subLabel}}</div>\n </div>\n </div>\n </ng-template>\n <!-- Recursive rendering of sub-items (groups or individual items) -->\n <ng-container *ngIf=\"item.expanded\">\n <div class=\"group-wrapper-items flex flex-col\">\n <drop-down-item [itemTemplate]=\"itemTemplate\" [groupTemplate]=\"groupTemplate\" [activeItem]=\"activeItem\"\n [activeItems]=\"activeItems\" [multiselect]=\"multiselect\" [optionValue]=\"optionValue\"\n [optionLabel]=\"optionLabel\" [optionSubLabel]=\"optionSubLabel\" [loadMoreCaption]=\"loadMoreCaption\"\n [options]=\"item.items\" [group]=\"group\" [onExpand]=\"onExpand\" [onLoadMore]=\"onLoadMore\"\n [onSelect]=\"onSelect\"></drop-down-item>\n <div *ngIf=\"item.lazyLoad\" class=\"see-more-container flex\">\n <span class=\"see-more-caption\" (click)=\"onLoadMore && onLoadMore(item)\">{{loadMoreCaption}}</span>\n </div>\n <div *ngIf=\"item.isLoading\" class=\"loading-overlay\">\n <div class=\"loader\"></div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n</ng-container>\n", styles: ["*{font-family:sans-serif;font-size:.9rem}.w-100{width:100%}.h-100{height:100%}.flex{display:flex}.flex-col{flex-direction:column}.font-bold{font-weight:700}.justify-center{justify-content:center}.justify-end{justify-content:end}.align-items-center{align-items:center}.grid{display:grid}.verben-error-message{font-size:.8rem;color:red}.verben-input{border:1px solid #cbd5e1;outline:none;border-radius:5px;color:#334155;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s,outline-color .2s}.verben-input::placeholder{color:#64748b}.verben-input:hover{border:1px solid #697e97}.verben-input.disabled{opacity:1;background-color:light-dark(rgba(239,239,239,.3),rgba(59,59,59,.3));pointer-events:none;color:#64748b}.verben-input:disabled{opacity:1;background-color:light-dark(rgba(239,239,239,.3),rgba(59,59,59,.3));pointer-events:none;color:#64748b}.verben-input.focused{border-color:#3b82f6;outline:none}.verben-input:focus{border-color:#3b82f6;outline:none}.verben-input.ng-invalid{border-color:red}.verben-button{padding:8px 15px;border-radius:4px;border:none;text-align:center}.verben-button.primary{background-color:#ffe681}.verben-button.secondary{background-color:#d9d9d940}.option-items-container{gap:5px}.see-more-container{padding:5px}.see-more-caption{font-size:12px;color:#3b82f6}.item-wrapper{padding:10px;border-radius:4px}.item-wrapper.multi-select{align-items:center;gap:5px}.item-wrapper:hover{background-color:#b4cdf53d}.item-wrapper.active-item{background-color:#3b82f63d}.item-wrapper.multi-select-active-item{background-color:#b4cdf53d}.item-wrapper.active-item>div{color:#1d4ed8}.group-wrapper{padding:5px}.group-wrapper-items{padding-left:15px;position:relative;z-index:0}.item-label{font-weight:500;white-space:normal;word-wrap:break-word;word-break:break-all}.item-label.has-sub-label{font-weight:600}.item-sub-label{font-size:12px;color:#4d4d4d}.default-group{gap:5px;align-items:center}.default-item{flex:1 1 0}.plus-minus-icon{color:#5d6674;width:.8rem;height:.8rem}.loading-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#4d4b4b80;z-index:10;display:flex;justify-content:center;align-items:center;pointer-events:none}.loader{width:50px;padding:8px;aspect-ratio:1;border-radius:50%;background:#3b82f6;--_m: conic-gradient(#0000 10%, #000), linear-gradient(#000 0 0) content-box;-webkit-mask:var(--_m);mask:var(--_m);-webkit-mask-composite:source-out;mask-composite:subtract;animation:l3 1s infinite linear}@keyframes l3{to{transform:rotate(1turn)}}\n"], dependencies: [{ kind: "component", type: DropDownItemComponent, selector: "drop-down-item", inputs: ["itemTemplate", "groupTemplate", "activeItem", "activeItems", "selectKey", "optionValue", "optionLabel", "optionSubLabel", "loadMoreCaption", "multiselect", "options", "group", "onExpand", "onLoadMore", "onSelect"] }, { kind: "ngmodule", type: CommonModule }, { 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: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: SvgModule }, { kind: "component", type: i2.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "size"] }] });
64
70
  }
65
71
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DropDownItemComponent, decorators: [{
66
72
  type: Component,
@@ -73,6 +79,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImpor
73
79
  type: Input
74
80
  }], activeItems: [{
75
81
  type: Input
82
+ }], selectKey: [{
83
+ type: Input
76
84
  }], optionValue: [{
77
85
  type: Input
78
86
  }], optionLabel: [{
@@ -94,4 +102,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImpor
94
102
  }], onSelect: [{
95
103
  type: Input
96
104
  }] } });
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcC1kb3duLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kcm9wLWRvd24vZHJvcC1kb3duLWl0ZW0vZHJvcC1kb3duLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kcm9wLWRvd24vZHJvcC1kb3duLWl0ZW0vZHJvcC1kb3duLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxLQUFLLEdBS04sTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLDJEQUEyRDtBQUMzRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sb0NBQW9DLENBQUE7Ozs7QUFTNUQsTUFBTSxPQUFPLHFCQUFxQjtJQUN2QixZQUFZLEdBQTRCLElBQUksQ0FBQyxDQUFDLHNDQUFzQztJQUNwRixhQUFhLEdBQTRCLElBQUksQ0FBQztJQUU5QyxVQUFVLENBQU87SUFDakIsV0FBVyxDQUFPO0lBQ2xCLFdBQVcsQ0FBVTtJQUNyQixXQUFXLENBQVU7SUFDckIsY0FBYyxDQUFVO0lBQ3hCLGVBQWUsQ0FBVTtJQUN6QixXQUFXLEdBQVksS0FBSyxDQUFDO0lBQzdCLE9BQU8sR0FBVSxFQUFFLENBQUM7SUFDcEIsS0FBSyxHQUFZLEtBQUssQ0FBQztJQUN2QixRQUFRLENBR0U7SUFDVixVQUFVLENBQW9EO0lBQzlELFFBQVEsQ0FBc0M7SUFFdkQsZ0JBQWUsQ0FBQztJQUNoQixRQUFRLEtBQVUsQ0FBQztJQUVuQixPQUFPLENBQUMsS0FBVSxFQUFFLEtBQVU7UUFDNUIsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBWSxFQUFFLEtBQVU7UUFDakMsS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN0QixJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFTO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFTO1FBQ3RCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQVM7UUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdkIsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNyRSxDQUFDO3VHQTdEVSxxQkFBcUI7MkZBQXJCLHFCQUFxQiw4Y0N6QmxDLHd3UkFxSUEseWhGRDVHYSxxQkFBcUIsOFFBSnRCLFlBQVksb2dCQUFFLFdBQVcsOEJBQUUsU0FBUzs7MkZBSW5DLHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDRSxnQkFBZ0IsY0FDZCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQzt3REFLdEMsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRlbXBsYXRlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vVGVtcGxhdGVEaXJlY3RpdmUuZGlyZWN0aXZlJztcbmltcG9ydCB7IERyb3Bkb3duTWVudUl0ZW1XcmFwcGVyIH0gZnJvbSAnLi4vZHJvcC1kb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbi8vIGltcG9ydCB7IFN2Z01vZHVsZSB9IGZyb20gJ3ZlcmJlbi1uZy11aS9zcmMvcHVibGljLWFwaSc7XG5pbXBvcnQge1N2Z01vZHVsZX0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9zdmcvc3ZnLm1vZHVsZSdcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZHJvcC1kb3duLWl0ZW0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgU3ZnTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2Ryb3AtZG93bi1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2Ryb3AtZG93bi1pdGVtLmNvbXBvbmVudC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBEcm9wRG93bkl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBpdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsID0gbnVsbDsgLy8gQWxsb3cgbnVsbCBmb3IgY3VzdG9tIGl0ZW0gdGVtcGxhdGVcbiAgQElucHV0KCkgZ3JvdXBUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGFjdGl2ZUl0ZW0/OiBhbnk7XG4gIEBJbnB1dCgpIGFjdGl2ZUl0ZW1zPzogYW55O1xuICBASW5wdXQoKSBvcHRpb25WYWx1ZT86IHN0cmluZztcbiAgQElucHV0KCkgb3B0aW9uTGFiZWw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG9wdGlvblN1YkxhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBsb2FkTW9yZUNhcHRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG11bHRpc2VsZWN0OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIGdyb3VwOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9uRXhwYW5kPzogKFxuICAgIGl0ZW06IERyb3Bkb3duTWVudUl0ZW1XcmFwcGVyLFxuICAgIHNpYmxpbmdzOiBEcm9wZG93bk1lbnVJdGVtV3JhcHBlcltdXG4gICkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgQElucHV0KCkgb25Mb2FkTW9yZT86IChpdGVtOiBEcm9wZG93bk1lbnVJdGVtV3JhcHBlcikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgQElucHV0KCkgb25TZWxlY3Q/OiAodmFsdWU6IGFueSwgZXZlbnQ6IEV2ZW50KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cbiAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gIGlzRXF1YWwodmFsdWU6IGFueSwgb3RoZXI6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0VxdWFsKHZhbHVlLCBvdGhlcik7XG4gIH1cblxuICBpc1NlbGVjdGVkKHZhbHVlOiBhbnlbXSwgb3RoZXI6IGFueSk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IHZhbCBvZiB2YWx1ZSkge1xuICAgICAgaWYgKGlzRXF1YWwodmFsLCBvdGhlcikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldFZhbHVlKGl0ZW06IGFueSk6IGFueSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvblZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5ncm91cCA/IGl0ZW0udmFsdWUgOiBpdGVtO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ncm91cCA/IGl0ZW0udmFsdWVbdGhpcy5vcHRpb25WYWx1ZV0gOiBpdGVtW3RoaXMub3B0aW9uVmFsdWVdO1xuICB9XG5cbiAgZ2V0T3B0aW9uTGFiZWwoaXRlbTogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5ncm91cCkge1xuICAgICAgcmV0dXJuIGl0ZW0ubGFiZWw7XG4gICAgfVxuICAgIGlmICghdGhpcy5vcHRpb25MYWJlbCkge1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgPyBpdGVtIDogaXRlbVt0aGlzLm9wdGlvbkxhYmVsXTtcbiAgfVxuXG4gIGdldE9wdGlvblN1YkxhYmVsKGl0ZW06IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcbiAgICAgIHJldHVybiBpdGVtLnN1YkxhYmVsO1xuICAgIH1cbiAgICBpZiAoIXRoaXMub3B0aW9uU3ViTGFiZWwpIHtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnID8gaXRlbSA6IGl0ZW1bdGhpcy5vcHRpb25TdWJMYWJlbF07XG4gIH1cbn1cbiIsIjwhLS0gSWYgZ3JvdXAgbW9kZSBpcyBmYWxzZSwgZGlzcGxheSBhIGZsYXQgbGlzdCAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhZ3JvdXBcIj5cblxuICA8ZGl2IGNsYXNzPVwib3B0aW9uLWl0ZW1zLWNvbnRhaW5lciBmbGV4IGZsZXgtY29sXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBvcHRpb25zXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbVRlbXBsYXRlOyBlbHNlIGRlZmF1bHRJdGVtXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbXVsdGlzZWxlY3RcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZS1pdGVtJzogaXNFcXVhbCh0aGlzLmFjdGl2ZUl0ZW0sIHRoaXMuZ2V0VmFsdWUoaXRlbSkpfVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0ICYmIG9uU2VsZWN0KGl0ZW0sICRldmVudClcIiBjbGFzcz1cIml0ZW0td3JhcHBlclwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBpdGVtIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJtdWx0aXNlbGVjdFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydtdWx0aS1zZWxlY3QtYWN0aXZlLWl0ZW0nOiBpc1NlbGVjdGVkKHRoaXMuYWN0aXZlSXRlbXMsIHRoaXMuZ2V0VmFsdWUoaXRlbSkpfVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0ICYmIG9uU2VsZWN0KGl0ZW0sICRldmVudClcIiBjbGFzcz1cIml0ZW0td3JhcHBlciBtdWx0aS1zZWxlY3QgZmxleFwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKHRoaXMuYWN0aXZlSXRlbXMsIHRoaXMuZ2V0VmFsdWUoaXRlbSkpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94XCIgLz5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaXRlbSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEl0ZW0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbXVsdGlzZWxlY3RcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZS1pdGVtJzogaXNFcXVhbCh0aGlzLmFjdGl2ZUl0ZW0sIHRoaXMuZ2V0VmFsdWUoaXRlbSkpfVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0ICYmIG9uU2VsZWN0KGl0ZW0sICRldmVudClcIiBjbGFzcz1cImRlZmF1bHQtaXRlbSBpdGVtLXdyYXBwZXIgZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydoYXMtc3ViLWxhYmVsJzogb3B0aW9uU3ViTGFiZWx9XCIgY2xhc3M9XCJpdGVtLWxhYmVsXCI+e3t0aGlzLmdldE9wdGlvbkxhYmVsKGl0ZW0pfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwib3B0aW9uU3ViTGFiZWwgfHwgKGdyb3VwICYmIGl0ZW0uc3ViTGFiZWwpXCIgY2xhc3M9XCJpdGVtLXN1Yi1sYWJlbFwiPlxuICAgICAgICAgICAge3t0aGlzLmdldE9wdGlvblN1YkxhYmVsKGl0ZW0pfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJtdWx0aXNlbGVjdFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieydtdWx0aS1zZWxlY3QtYWN0aXZlLWl0ZW0nOiBpc1NlbGVjdGVkKHRoaXMuYWN0aXZlSXRlbXMsIHRoaXMuZ2V0VmFsdWUoaXRlbSkpfVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0ICYmIG9uU2VsZWN0KGl0ZW0sICRldmVudClcIiBjbGFzcz1cImRlZmF1bHQtaXRlbSBpdGVtLXdyYXBwZXIgbXVsdGktc2VsZWN0IGZsZXhcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZCh0aGlzLmFjdGl2ZUl0ZW1zLCB0aGlzLmdldFZhbHVlKGl0ZW0pKVwiXG4gICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydoYXMtc3ViLWxhYmVsJzogb3B0aW9uU3ViTGFiZWx9XCIgY2xhc3M9XCJpdGVtLWxhYmVsXCI+e3t0aGlzLmdldE9wdGlvbkxhYmVsKGl0ZW0pfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcHRpb25TdWJMYWJlbCB8fCAoZ3JvdXAgJiYgaXRlbS5zdWJMYWJlbClcIiBjbGFzcz1cIml0ZW0tc3ViLWxhYmVsXCI+XG4gICAgICAgICAgICAgIHt7dGhpcy5nZXRPcHRpb25TdWJMYWJlbChpdGVtKX19PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPCEtLSBJZiBncm91cCBtb2RlIGlzIHRydWUsIGRpc3BsYXkgZ3JvdXBzIGFuZCBzdWItZ3JvdXBzIHJlY3Vyc2l2ZWx5IC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyb3VwXCI+XG4gIDxkaXYgY2xhc3M9XCJvcHRpb24taXRlbXMtY29udGFpbmVyIGZsZXggZmxleC1jb2xcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIG9wdGlvbnNcIj5cbiAgICAgIDwhLS0gRGlzcGxheSBhcyBncm91cCBoZWFkZXIgaWYgdGhlIGl0ZW0gaGFzIGNoaWxkcmVuIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIiFpdGVtLml0ZW1zXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtVGVtcGxhdGU7IGVsc2UgZGVmYXVsdEl0ZW1cIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIW11bHRpc2VsZWN0XCIgW25nQ2xhc3NdPVwieydhY3RpdmUtaXRlbSc6IGlzRXF1YWwodGhpcy5hY3RpdmVJdGVtLCB0aGlzLmdldFZhbHVlKGl0ZW0pKX1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0ICYmIG9uU2VsZWN0KGl0ZW0sICRldmVudClcIiBjbGFzcz1cIml0ZW0td3JhcHBlclwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJtdWx0aXNlbGVjdFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J211bHRpLXNlbGVjdC1hY3RpdmUtaXRlbSc6IGlzU2VsZWN0ZWQodGhpcy5hY3RpdmVJdGVtcywgdGhpcy5nZXRWYWx1ZShpdGVtKSl9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblNlbGVjdCAmJiBvblNlbGVjdChpdGVtLCAkZXZlbnQpXCIgY2xhc3M9XCJpdGVtLXdyYXBwZXIgbXVsdGktc2VsZWN0IGZsZXhcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKHRoaXMuYWN0aXZlSXRlbXMsIHRoaXMuZ2V0VmFsdWUoaXRlbSkpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjdXN0b20tY2hlY2tib3hcIiAvPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJdGVtPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhbXVsdGlzZWxlY3RcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZS1pdGVtJzogaXNFcXVhbCh0aGlzLmFjdGl2ZUl0ZW0sIHRoaXMuZ2V0VmFsdWUoaXRlbSkpfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3QgJiYgb25TZWxlY3QoaXRlbSwgJGV2ZW50KVwiIGNsYXNzPVwiZGVmYXVsdC1pdGVtIGl0ZW0td3JhcHBlciBmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnaGFzLXN1Yi1sYWJlbCc6IGl0ZW0uc3ViTGFiZWx9XCIgY2xhc3M9XCJpdGVtLWxhYmVsXCI+e3tpdGVtLmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnN1YkxhYmVsXCIgY2xhc3M9XCJpdGVtLXN1Yi1sYWJlbFwiPnt7aXRlbS5zdWJMYWJlbH19PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIm11bHRpc2VsZWN0XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbXVsdGktc2VsZWN0LWFjdGl2ZS1pdGVtJzogaXNTZWxlY3RlZCh0aGlzLmFjdGl2ZUl0ZW1zLCB0aGlzLmdldFZhbHVlKGl0ZW0pKX1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0ICYmIG9uU2VsZWN0KGl0ZW0sICRldmVudClcIiBjbGFzcz1cImRlZmF1bHQtaXRlbSBpdGVtLXdyYXBwZXIgbXVsdGktc2VsZWN0IGZsZXhcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKHRoaXMuYWN0aXZlSXRlbXMsIHRoaXMuZ2V0VmFsdWUoaXRlbSkpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjdXN0b20tY2hlY2tib3hcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J2hhcy1zdWItbGFiZWwnOiBpdGVtLnN1YkxhYmVsfVwiIGNsYXNzPVwiaXRlbS1sYWJlbFwiPnt7aXRlbS5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnN1YkxhYmVsXCIgY2xhc3M9XCJpdGVtLXN1Yi1sYWJlbFwiPnt7aXRlbS5zdWJMYWJlbH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIERpc3BsYXkgYXMgbm9ybWFsIGl0ZW0gaWYgaXQgZG9lc24ndCBoYXZlIGNoaWxkcmVuIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIiAqbmdJZj1cIml0ZW0uaXRlbXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyb3VwVGVtcGxhdGU7IGVsc2UgZGVmYXVsdEdyb3VwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLXdyYXBwZXJcIiAoY2xpY2spPVwib25FeHBhbmQgJiYgb25FeHBhbmQoaXRlbSwgb3B0aW9ucylcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncm91cFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaXRlbSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEdyb3VwPlxuICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uRXhwYW5kICYmIG9uRXhwYW5kKGl0ZW0sIG9wdGlvbnMpXCIgY2xhc3M9XCJkZWZhdWx0LWdyb3VwIGdyb3VwLXdyYXBwZXIgZmxleFwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXRlbS5leHBhbmRlZFwiPlxuICAgICAgICAgICAgICA8dmVyYmVuLXN2ZyBpY29uPVwicGx1c1wiIGZpbGw9XCIjNWQ2Njc0XCIgW3dpZHRoXT1cIjE1XCIgW2hlaWdodF09XCIxNVwiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgPCEtLSA8c3ZnIGNsYXNzPVwicGx1cy1taW51cy1pY29uXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgIGQ9XCJNNS4zMzIxNCA2LjY2NTc4SDUuMjYxMDJDMy45NTg1OCA2LjY2NTc4IDIuNjU2MTQgNi42NjYzIDEuMzUzNzEgNi42NjU0NEMxLjA2NTI4IDYuNjY1MjcgMC44NTA1NTMgNi41MzU3MSAwLjcyODE5MiA2LjI3MzY5QzAuNTI1MTE1IDUuODM4NTkgMC44NDQzODMgNS4zMzczNCAxLjMyNDkxIDUuMzMzMjJDMS42NDYyNCA1LjMzMDMxIDEuOTY3NTYgNS4zMzI3MSAyLjI4ODg5IDUuMzMyNzFDMy4yODI4NSA1LjMzMjcxIDQuMjc2ODIgNS4zMzI3MSA1LjI3MDc5IDUuMzMyNzFINS4zMzIxNFY1LjI3NjMzQzUuMzMyMTQgMy45NjY3NCA1LjMzMjE0IDIuNjU3MTQgNS4zMzIxNCAxLjM0NzU1QzUuMzMyMTQgMS4wMzA4NiA1LjUzMTYyIDAuNzY3NDcyIDUuODI5OTggMC42ODg2NDNDNi4yNTUxNSAwLjU3NjIyNSA2LjY2NTc3IDAuODk2NTEyIDYuNjY2NDUgMS4zNDMyN0M2LjY2NzQ4IDEuOTYzMTEgNi42NjY3OSAyLjU4Mjk0IDYuNjY2NzkgMy4yMDI3OEM2LjY2Njc5IDMuODkyNTQgNi42NjY3OSA0LjU4MjI5IDYuNjY2NzkgNS4yNzIyMlY1LjMzMzA1SDYuNzI0MkM4LjAzMjMgNS4zMzMwNSA5LjM0MDU2IDUuMzMzMDUgMTAuNjQ4NyA1LjMzMzA1QzEwLjkzMyA1LjMzMzA1IDExLjE3MzcgNS40ODg0OCAxMS4yNzg4IDUuNzM5MDJDMTEuNDY1OSA2LjE4NTI3IDExLjE0MzEgNi42NjQ3NSAxMC42NTMzIDYuNjY1OTVDMTAuMTU0OSA2LjY2Njk4IDkuNjU2NCA2LjY2NjEyIDkuMTU4MDUgNi42NjYxMkM4LjM0OTY4IDYuNjY2MTIgNy41NDE0OCA2LjY2NjEyIDYuNzMzMTEgNi42NjYxMkg2LjY2Njc5VjYuNzI3MTNDNi42NjY3OSA4LjAzNTM1IDYuNjY2NzkgOS4zNDM1NyA2LjY2Njc5IDEwLjY1MTZDNi42NjY3OSAxMC45ODA4IDYuNDUzNDMgMTEuMjQ3NSA2LjEzNDg1IDExLjMxNzdDNS43NTk4OSAxMS40MDAzIDUuMzgyNTIgMTEuMTMwOSA1LjMzODk5IDEwLjc0OUM1LjMzNDcxIDEwLjcxMDcgNS4zMzIzMSAxMC42NzIyIDUuMzMyMzEgMTAuNjMzNkM1LjMzMTk3IDkuMzMxMjMgNS4zMzE5NyA4LjAyODY3IDUuMzMxOTcgNi43MjYyN1Y2LjY2NjEyTDUuMzMyMTQgNi42NjU3OFpcIlxuICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPiAtLT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5leHBhbmRlZFwiPlxuICAgICAgICAgICAgICA8dmVyYmVuLXN2ZyBpY29uPVwibWludXNcIiBmaWxsPVwiIzVkNjY3NFwiIFt3aWR0aF09XCIxNVwiIFtoZWlnaHRdPVwiMlwiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgPCEtLSA8c3ZnIGNsYXNzPVwicGx1cy1taW51cy1pY29uXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjJcIiB2aWV3Qm94PVwiMCAwIDEwIDJcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMC4zMzM5ODQgMC4zMzIwMzFIOS42NjczMlYxLjY2NTM2SDAuMzMzOTg0VjAuMzMyMDMxWlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiAvPlxuICAgICAgICAgICAgICA8L3N2Zz4gLS0+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVmYXVsdC1pdGVtIGZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J2hhcy1zdWItbGFiZWwnOiBpdGVtLnN1YkxhYmVsfVwiIGNsYXNzPVwiaXRlbS1sYWJlbFwiPnt7aXRlbS5sYWJlbH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnN1YkxhYmVsXCIgY2xhc3M9XCJpdGVtLXN1Yi1sYWJlbFwiPnt7aXRlbS5zdWJMYWJlbH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPCEtLSBSZWN1cnNpdmUgcmVuZGVyaW5nIG9mIHN1Yi1pdGVtcyAoZ3JvdXBzIG9yIGluZGl2aWR1YWwgaXRlbXMpIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5leHBhbmRlZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC13cmFwcGVyLWl0ZW1zIGZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgIDxkcm9wLWRvd24taXRlbSBbaXRlbVRlbXBsYXRlXT1cIml0ZW1UZW1wbGF0ZVwiIFtncm91cFRlbXBsYXRlXT1cImdyb3VwVGVtcGxhdGVcIiBbYWN0aXZlSXRlbV09XCJhY3RpdmVJdGVtXCJcbiAgICAgICAgICAgICAgW2FjdGl2ZUl0ZW1zXT1cImFjdGl2ZUl0ZW1zXCIgW211bHRpc2VsZWN0XT1cIm11bHRpc2VsZWN0XCIgW29wdGlvblZhbHVlXT1cIm9wdGlvblZhbHVlXCJcbiAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXT1cIm9wdGlvbkxhYmVsXCIgW29wdGlvblN1YkxhYmVsXT1cIm9wdGlvblN1YkxhYmVsXCIgW2xvYWRNb3JlQ2FwdGlvbl09XCJsb2FkTW9yZUNhcHRpb25cIlxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJpdGVtLml0ZW1zXCIgW2dyb3VwXT1cImdyb3VwXCIgW29uRXhwYW5kXT1cIm9uRXhwYW5kXCIgW29uTG9hZE1vcmVdPVwib25Mb2FkTW9yZVwiXG4gICAgICAgICAgICAgIFtvblNlbGVjdF09XCJvblNlbGVjdFwiPjwvZHJvcC1kb3duLWl0ZW0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5sYXp5TG9hZFwiIGNsYXNzPVwic2VlLW1vcmUtY29udGFpbmVyIGZsZXhcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWUtbW9yZS1jYXB0aW9uXCIgKGNsaWNrKT1cIm9uTG9hZE1vcmUgJiYgb25Mb2FkTW9yZShpdGVtKVwiPnt7bG9hZE1vcmVDYXB0aW9ufX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmlzTG9hZGluZ1wiIGNsYXNzPVwibG9hZGluZy1vdmVybGF5XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcC1kb3duLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kcm9wLWRvd24vZHJvcC1kb3duLWl0ZW0vZHJvcC1kb3duLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLW5nLXVpL3NyYy9saWIvY29tcG9uZW50cy9kcm9wLWRvd24vZHJvcC1kb3duLWl0ZW0vZHJvcC1kb3duLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxLQUFLLEdBS04sTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLDJEQUEyRDtBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7QUFTL0QsTUFBTSxPQUFPLHFCQUFxQjtJQUN2QixZQUFZLEdBQTRCLElBQUksQ0FBQyxDQUFDLHNDQUFzQztJQUNwRixhQUFhLEdBQTRCLElBQUksQ0FBQztJQUU5QyxVQUFVLENBQU87SUFDakIsV0FBVyxDQUFPO0lBQ2xCLFNBQVMsR0FBa0IsSUFBSSxDQUFDO0lBQ2hDLFdBQVcsQ0FBVTtJQUNyQixXQUFXLENBQVU7SUFDckIsY0FBYyxDQUFVO0lBQ3hCLGVBQWUsQ0FBVTtJQUN6QixXQUFXLEdBQVksS0FBSyxDQUFDO0lBQzdCLE9BQU8sR0FBVSxFQUFFLENBQUM7SUFDcEIsS0FBSyxHQUFZLEtBQUssQ0FBQztJQUN2QixRQUFRLENBR0U7SUFDVixVQUFVLENBQW9EO0lBQzlELFFBQVEsQ0FBc0M7SUFFdkQsZ0JBQWUsQ0FBQztJQUNoQixRQUFRLEtBQVUsQ0FBQztJQUVuQixPQUFPLENBQUMsS0FBVSxFQUFFLEtBQVU7UUFDNUIsT0FBTyxJQUFJLENBQUMsU0FBUztZQUNuQixDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN2RCxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVksRUFBRSxLQUFVO1FBQ2pDLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7WUFDdEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVM7Z0JBQ2xDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4QixJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNsQixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsUUFBUSxDQUFDLElBQVM7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVM7UUFDdEIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsaUJBQWlCLENBQUMsSUFBUztRQUN6QixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7dUdBbkVVLHFCQUFxQjsyRkFBckIscUJBQXFCLHNlQ3pCbEMsd3dSQXFJQSx5aEZENUdhLHFCQUFxQiwyUkFKdEIsWUFBWSxvZ0JBQUUsV0FBVyw4QkFBRSxTQUFTOzsyRkFJbkMscUJBQXFCO2tCQVBqQyxTQUFTOytCQUNFLGdCQUFnQixjQUNkLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDO3dEQUt0QyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL1RlbXBsYXRlRGlyZWN0aXZlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEcm9wZG93bk1lbnVJdGVtV3JhcHBlciB9IGZyb20gJy4uL2Ryb3AtZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG4vLyBpbXBvcnQgeyBTdmdNb2R1bGUgfSBmcm9tICd2ZXJiZW4tbmctdWkvc3JjL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgU3ZnTW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9zdmcvc3ZnLm1vZHVsZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Ryb3AtZG93bi1pdGVtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIFN2Z01vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9kcm9wLWRvd24taXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kcm9wLWRvd24taXRlbS5jb21wb25lbnQuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgRHJvcERvd25JdGVtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgaXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCA9IG51bGw7IC8vIEFsbG93IG51bGwgZm9yIGN1c3RvbSBpdGVtIHRlbXBsYXRlXG4gIEBJbnB1dCgpIGdyb3VwVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBhY3RpdmVJdGVtPzogYW55O1xuICBASW5wdXQoKSBhY3RpdmVJdGVtcz86IGFueTtcbiAgQElucHV0KCkgc2VsZWN0S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgb3B0aW9uVmFsdWU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG9wdGlvbkxhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBvcHRpb25TdWJMYWJlbD86IHN0cmluZztcbiAgQElucHV0KCkgbG9hZE1vcmVDYXB0aW9uPzogc3RyaW5nO1xuICBASW5wdXQoKSBtdWx0aXNlbGVjdDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBvcHRpb25zOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBncm91cDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBvbkV4cGFuZD86IChcbiAgICBpdGVtOiBEcm9wZG93bk1lbnVJdGVtV3JhcHBlcixcbiAgICBzaWJsaW5nczogRHJvcGRvd25NZW51SXRlbVdyYXBwZXJbXVxuICApID0+IFByb21pc2U8dm9pZD47XG4gIEBJbnB1dCgpIG9uTG9hZE1vcmU/OiAoaXRlbTogRHJvcGRvd25NZW51SXRlbVdyYXBwZXIpID0+IFByb21pc2U8dm9pZD47XG4gIEBJbnB1dCgpIG9uU2VsZWN0PzogKHZhbHVlOiBhbnksIGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG4gIG5nT25Jbml0KCk6IHZvaWQge31cblxuICBpc0VxdWFsKHZhbHVlOiBhbnksIG90aGVyOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RLZXlcbiAgICAgID8gaXNFcXVhbCh2YWx1ZVt0aGlzLnNlbGVjdEtleV0sIG90aGVyW3RoaXMuc2VsZWN0S2V5XSlcbiAgICAgIDogaXNFcXVhbCh2YWx1ZSwgb3RoZXIpO1xuICB9XG5cbiAgaXNTZWxlY3RlZCh2YWx1ZTogYW55W10sIG90aGVyOiBhbnkpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCB2YWwgb2YgdmFsdWUpIHtcbiAgICAgIGNvbnN0IGVxdWFsaXR5Q2hlY2sgPSB0aGlzLnNlbGVjdEtleVxuICAgICAgICA/IGlzRXF1YWwodmFsW3RoaXMuc2VsZWN0S2V5XSwgb3RoZXJbdGhpcy5zZWxlY3RLZXldKVxuICAgICAgICA6IGlzRXF1YWwodmFsLCBvdGhlcik7XG4gICAgICBpZiAoZXF1YWxpdHlDaGVjaykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0VmFsdWUoaXRlbTogYW55KTogYW55IHtcbiAgICBpZiAoIXRoaXMub3B0aW9uVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwID8gaXRlbS52YWx1ZSA6IGl0ZW07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdyb3VwID8gaXRlbS52YWx1ZVt0aGlzLm9wdGlvblZhbHVlXSA6IGl0ZW1bdGhpcy5vcHRpb25WYWx1ZV07XG4gIH1cblxuICBnZXRPcHRpb25MYWJlbChpdGVtOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLmdyb3VwKSB7XG4gICAgICByZXR1cm4gaXRlbS5sYWJlbDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm9wdGlvbkxhYmVsKSB7XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyA/IGl0ZW0gOiBpdGVtW3RoaXMub3B0aW9uTGFiZWxdO1xuICB9XG5cbiAgZ2V0T3B0aW9uU3ViTGFiZWwoaXRlbTogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5ncm91cCkge1xuICAgICAgcmV0dXJuIGl0ZW0uc3ViTGFiZWw7XG4gICAgfVxuICAgIGlmICghdGhpcy5vcHRpb25TdWJMYWJlbCkge1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgPyBpdGVtIDogaXRlbVt0aGlzLm9wdGlvblN1YkxhYmVsXTtcbiAgfVxufVxuIiwiPCEtLSBJZiBncm91cCBtb2RlIGlzIGZhbHNlLCBkaXNwbGF5IGEgZmxhdCBsaXN0IC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFncm91cFwiPlxuXG4gIDxkaXYgY2xhc3M9XCJvcHRpb24taXRlbXMtY29udGFpbmVyIGZsZXggZmxleC1jb2xcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIG9wdGlvbnNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtVGVtcGxhdGU7IGVsc2UgZGVmYXVsdEl0ZW1cIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFtdWx0aXNlbGVjdFwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlLWl0ZW0nOiBpc0VxdWFsKHRoaXMuYWN0aXZlSXRlbSwgdGhpcy5nZXRWYWx1ZShpdGVtKSl9XCJcbiAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3QgJiYgb25TZWxlY3QoaXRlbSwgJGV2ZW50KVwiIGNsYXNzPVwiaXRlbS13cmFwcGVyXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm11bHRpc2VsZWN0XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J211bHRpLXNlbGVjdC1hY3RpdmUtaXRlbSc6IGlzU2VsZWN0ZWQodGhpcy5hY3RpdmVJdGVtcywgdGhpcy5nZXRWYWx1ZShpdGVtKSl9XCJcbiAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3QgJiYgb25TZWxlY3QoaXRlbSwgJGV2ZW50KVwiIGNsYXNzPVwiaXRlbS13cmFwcGVyIG11bHRpLXNlbGVjdCBmbGV4XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzU2VsZWN0ZWQodGhpcy5hY3RpdmVJdGVtcywgdGhpcy5nZXRWYWx1ZShpdGVtKSlcIlxuICAgICAgICAgICAgY2xhc3M9XCJjdXN0b20tY2hlY2tib3hcIiAvPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBpdGVtIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SXRlbT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFtdWx0aXNlbGVjdFwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlLWl0ZW0nOiBpc0VxdWFsKHRoaXMuYWN0aXZlSXRlbSwgdGhpcy5nZXRWYWx1ZShpdGVtKSl9XCJcbiAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3QgJiYgb25TZWxlY3QoaXRlbSwgJGV2ZW50KVwiIGNsYXNzPVwiZGVmYXVsdC1pdGVtIGl0ZW0td3JhcHBlciBmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J2hhcy1zdWItbGFiZWwnOiBvcHRpb25TdWJMYWJlbH1cIiBjbGFzcz1cIml0ZW0tbGFiZWxcIj57e3RoaXMuZ2V0T3B0aW9uTGFiZWwoaXRlbSl9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcHRpb25TdWJMYWJlbCB8fCAoZ3JvdXAgJiYgaXRlbS5zdWJMYWJlbClcIiBjbGFzcz1cIml0ZW0tc3ViLWxhYmVsXCI+XG4gICAgICAgICAgICB7e3RoaXMuZ2V0T3B0aW9uU3ViTGFiZWwoaXRlbSl9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm11bHRpc2VsZWN0XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J211bHRpLXNlbGVjdC1hY3RpdmUtaXRlbSc6IGlzU2VsZWN0ZWQodGhpcy5hY3RpdmVJdGVtcywgdGhpcy5nZXRWYWx1ZShpdGVtKSl9XCJcbiAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3QgJiYgb25TZWxlY3QoaXRlbSwgJGV2ZW50KVwiIGNsYXNzPVwiZGVmYXVsdC1pdGVtIGl0ZW0td3JhcHBlciBtdWx0aS1zZWxlY3QgZmxleFwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKHRoaXMuYWN0aXZlSXRlbXMsIHRoaXMuZ2V0VmFsdWUoaXRlbSkpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J2hhcy1zdWItbGFiZWwnOiBvcHRpb25TdWJMYWJlbH1cIiBjbGFzcz1cIml0ZW0tbGFiZWxcIj57e3RoaXMuZ2V0T3B0aW9uTGFiZWwoaXRlbSl9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm9wdGlvblN1YkxhYmVsIHx8IChncm91cCAmJiBpdGVtLnN1YkxhYmVsKVwiIGNsYXNzPVwiaXRlbS1zdWItbGFiZWxcIj5cbiAgICAgICAgICAgICAge3t0aGlzLmdldE9wdGlvblN1YkxhYmVsKGl0ZW0pfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIElmIGdyb3VwIG1vZGUgaXMgdHJ1ZSwgZGlzcGxheSBncm91cHMgYW5kIHN1Yi1ncm91cHMgcmVjdXJzaXZlbHkgLS0+XG48bmctY29udGFpbmVyICpuZ0lmPVwiZ3JvdXBcIj5cbiAgPGRpdiBjbGFzcz1cIm9wdGlvbi1pdGVtcy1jb250YWluZXIgZmxleCBmbGV4LWNvbFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygb3B0aW9uc1wiPlxuICAgICAgPCEtLSBEaXNwbGF5IGFzIGdyb3VwIGhlYWRlciBpZiB0aGUgaXRlbSBoYXMgY2hpbGRyZW4gLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIWl0ZW0uaXRlbXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW1UZW1wbGF0ZTsgZWxzZSBkZWZhdWx0SXRlbVwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhbXVsdGlzZWxlY3RcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZS1pdGVtJzogaXNFcXVhbCh0aGlzLmFjdGl2ZUl0ZW0sIHRoaXMuZ2V0VmFsdWUoaXRlbSkpfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3QgJiYgb25TZWxlY3QoaXRlbSwgJGV2ZW50KVwiIGNsYXNzPVwiaXRlbS13cmFwcGVyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaXRlbSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIm11bHRpc2VsZWN0XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbXVsdGktc2VsZWN0LWFjdGl2ZS1pdGVtJzogaXNTZWxlY3RlZCh0aGlzLmFjdGl2ZUl0ZW1zLCB0aGlzLmdldFZhbHVlKGl0ZW0pKX1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0ICYmIG9uU2VsZWN0KGl0ZW0sICRldmVudClcIiBjbGFzcz1cIml0ZW0td3JhcHBlciBtdWx0aS1zZWxlY3QgZmxleFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzU2VsZWN0ZWQodGhpcy5hY3RpdmVJdGVtcywgdGhpcy5nZXRWYWx1ZShpdGVtKSlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiIC8+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaXRlbSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEl0ZW0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFtdWx0aXNlbGVjdFwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlLWl0ZW0nOiBpc0VxdWFsKHRoaXMuYWN0aXZlSXRlbSwgdGhpcy5nZXRWYWx1ZShpdGVtKSl9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblNlbGVjdCAmJiBvblNlbGVjdChpdGVtLCAkZXZlbnQpXCIgY2xhc3M9XCJkZWZhdWx0LWl0ZW0gaXRlbS13cmFwcGVyIGZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydoYXMtc3ViLWxhYmVsJzogaXRlbS5zdWJMYWJlbH1cIiBjbGFzcz1cIml0ZW0tbGFiZWxcIj57e2l0ZW0ubGFiZWx9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uc3ViTGFiZWxcIiBjbGFzcz1cIml0ZW0tc3ViLWxhYmVsXCI+e3tpdGVtLnN1YkxhYmVsfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwibXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtdWx0aS1zZWxlY3QtYWN0aXZlLWl0ZW0nOiBpc1NlbGVjdGVkKHRoaXMuYWN0aXZlSXRlbXMsIHRoaXMuZ2V0VmFsdWUoaXRlbSkpfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3QgJiYgb25TZWxlY3QoaXRlbSwgJGV2ZW50KVwiIGNsYXNzPVwiZGVmYXVsdC1pdGVtIGl0ZW0td3JhcHBlciBtdWx0aS1zZWxlY3QgZmxleFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzU2VsZWN0ZWQodGhpcy5hY3RpdmVJdGVtcywgdGhpcy5nZXRWYWx1ZShpdGVtKSlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnaGFzLXN1Yi1sYWJlbCc6IGl0ZW0uc3ViTGFiZWx9XCIgY2xhc3M9XCJpdGVtLWxhYmVsXCI+e3tpdGVtLmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uc3ViTGFiZWxcIiBjbGFzcz1cIml0ZW0tc3ViLWxhYmVsXCI+e3tpdGVtLnN1YkxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRGlzcGxheSBhcyBub3JtYWwgaXRlbSBpZiBpdCBkb2Vzbid0IGhhdmUgY2hpbGRyZW4gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiICpuZ0lmPVwiaXRlbS5pdGVtc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JvdXBUZW1wbGF0ZTsgZWxzZSBkZWZhdWx0R3JvdXBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtd3JhcHBlclwiIChjbGljayk9XCJvbkV4cGFuZCAmJiBvbkV4cGFuZChpdGVtLCBvcHRpb25zKVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdyb3VwVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBpdGVtIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0R3JvdXA+XG4gICAgICAgICAgPGRpdiAoY2xpY2spPVwib25FeHBhbmQgJiYgb25FeHBhbmQoaXRlbSwgb3B0aW9ucylcIiBjbGFzcz1cImRlZmF1bHQtZ3JvdXAgZ3JvdXAtd3JhcHBlciBmbGV4XCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpdGVtLmV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnIGljb249XCJwbHVzXCIgZmlsbD1cIiM1ZDY2NzRcIiBbd2lkdGhdPVwiMTVcIiBbaGVpZ2h0XT1cIjE1XCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgICA8IS0tIDxzdmcgY2xhc3M9XCJwbHVzLW1pbnVzLWljb25cIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgZD1cIk01LjMzMjE0IDYuNjY1NzhINS4yNjEwMkMzLjk1ODU4IDYuNjY1NzggMi42NTYxNCA2LjY2NjMgMS4zNTM3MSA2LjY2NTQ0QzEuMDY1MjggNi42NjUyNyAwLjg1MDU1MyA2LjUzNTcxIDAuNzI4MTkyIDYuMjczNjlDMC41MjUxMTUgNS44Mzg1OSAwLjg0NDM4MyA1LjMzNzM0IDEuMzI0OTEgNS4zMzMyMkMxLjY0NjI0IDUuMzMwMzEgMS45Njc1NiA1LjMzMjcxIDIuMjg4ODkgNS4zMzI3MUMzLjI4Mjg1IDUuMzMyNzEgNC4yNzY4MiA1LjMzMjcxIDUuMjcwNzkgNS4zMzI3MUg1LjMzMjE0VjUuMjc2MzNDNS4zMzIxNCAzLjk2Njc0IDUuMzMyMTQgMi42NTcxNCA1LjMzMjE0IDEuMzQ3NTVDNS4zMzIxNCAxLjAzMDg2IDUuNTMxNjIgMC43Njc0NzIgNS44Mjk5OCAwLjY4ODY0M0M2LjI1NTE1IDAuNTc2MjI1IDYuNjY1NzcgMC44OTY1MTIgNi42NjY0NSAxLjM0MzI3QzYuNjY3NDggMS45NjMxMSA2LjY2Njc5IDIuNTgyOTQgNi42NjY3OSAzLjIwMjc4QzYuNjY2NzkgMy44OTI1NCA2LjY2Njc5IDQuNTgyMjkgNi42NjY3OSA1LjI3MjIyVjUuMzMzMDVINi43MjQyQzguMDMyMyA1LjMzMzA1IDkuMzQwNTYgNS4zMzMwNSAxMC42NDg3IDUuMzMzMDVDMTAuOTMzIDUuMzMzMDUgMTEuMTczNyA1LjQ4ODQ4IDExLjI3ODggNS43MzkwMkMxMS40NjU5IDYuMTg1MjcgMTEuMTQzMSA2LjY2NDc1IDEwLjY1MzMgNi42NjU5NUMxMC4xNTQ5IDYuNjY2OTggOS42NTY0IDYuNjY2MTIgOS4xNTgwNSA2LjY2NjEyQzguMzQ5NjggNi42NjYxMiA3LjU0MTQ4IDYuNjY2MTIgNi43MzMxMSA2LjY2NjEySDYuNjY2NzlWNi43MjcxM0M2LjY2Njc5IDguMDM1MzUgNi42NjY3OSA5LjM0MzU3IDYuNjY2NzkgMTAuNjUxNkM2LjY2Njc5IDEwLjk4MDggNi40NTM0MyAxMS4yNDc1IDYuMTM0ODUgMTEuMzE3N0M1Ljc1OTg5IDExLjQwMDMgNS4zODI1MiAxMS4xMzA5IDUuMzM4OTkgMTAuNzQ5QzUuMzM0NzEgMTAuNzEwNyA1LjMzMjMxIDEwLjY3MjIgNS4zMzIzMSAxMC42MzM2QzUuMzMxOTcgOS4zMzEyMyA1LjMzMTk3IDguMDI4NjcgNS4zMzE5NyA2LjcyNjI3VjYuNjY2MTJMNS4zMzIxNCA2LjY2NTc4WlwiXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCIgLz5cbiAgICAgICAgICAgICAgPC9zdmc+IC0tPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLmV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnIGljb249XCJtaW51c1wiIGZpbGw9XCIjNWQ2Njc0XCIgW3dpZHRoXT1cIjE1XCIgW2hlaWdodF09XCIyXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgICA8IS0tIDxzdmcgY2xhc3M9XCJwbHVzLW1pbnVzLWljb25cIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMlwiIHZpZXdCb3g9XCIwIDAgMTAgMlwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wLjMzMzk4NCAwLjMzMjAzMUg5LjY2NzMyVjEuNjY1MzZIMC4zMzM5ODRWMC4zMzIwMzFaXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPiAtLT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZWZhdWx0LWl0ZW0gZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnaGFzLXN1Yi1sYWJlbCc6IGl0ZW0uc3ViTGFiZWx9XCIgY2xhc3M9XCJpdGVtLWxhYmVsXCI+e3tpdGVtLmxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uc3ViTGFiZWxcIiBjbGFzcz1cIml0ZW0tc3ViLWxhYmVsXCI+e3tpdGVtLnN1YkxhYmVsfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8IS0tIFJlY3Vyc2l2ZSByZW5kZXJpbmcgb2Ygc3ViLWl0ZW1zIChncm91cHMgb3IgaW5kaXZpZHVhbCBpdGVtcykgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmV4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLXdyYXBwZXItaXRlbXMgZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgPGRyb3AtZG93bi1pdGVtIFtpdGVtVGVtcGxhdGVdPVwiaXRlbVRlbXBsYXRlXCIgW2dyb3VwVGVtcGxhdGVdPVwiZ3JvdXBUZW1wbGF0ZVwiIFthY3RpdmVJdGVtXT1cImFjdGl2ZUl0ZW1cIlxuICAgICAgICAgICAgICBbYWN0aXZlSXRlbXNdPVwiYWN0aXZlSXRlbXNcIiBbbXVsdGlzZWxlY3RdPVwibXVsdGlzZWxlY3RcIiBbb3B0aW9uVmFsdWVdPVwib3B0aW9uVmFsdWVcIlxuICAgICAgICAgICAgICBbb3B0aW9uTGFiZWxdPVwib3B0aW9uTGFiZWxcIiBbb3B0aW9uU3ViTGFiZWxdPVwib3B0aW9uU3ViTGFiZWxcIiBbbG9hZE1vcmVDYXB0aW9uXT1cImxvYWRNb3JlQ2FwdGlvblwiXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cIml0ZW0uaXRlbXNcIiBbZ3JvdXBdPVwiZ3JvdXBcIiBbb25FeHBhbmRdPVwib25FeHBhbmRcIiBbb25Mb2FkTW9yZV09XCJvbkxvYWRNb3JlXCJcbiAgICAgICAgICAgICAgW29uU2VsZWN0XT1cIm9uU2VsZWN0XCI+PC9kcm9wLWRvd24taXRlbT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmxhenlMb2FkXCIgY2xhc3M9XCJzZWUtbW9yZS1jb250YWluZXIgZmxleFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlZS1tb3JlLWNhcHRpb25cIiAoY2xpY2spPVwib25Mb2FkTW9yZSAmJiBvbkxvYWRNb3JlKGl0ZW0pXCI+e3tsb2FkTW9yZUNhcHRpb259fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uaXNMb2FkaW5nXCIgY2xhc3M9XCJsb2FkaW5nLW92ZXJsYXlcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRlclwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=