{"version":3,"file":"sowatech-shared-swt-generic.mjs","sources":["../../../projects/shared/swt-generic/col/col-visibility.service.ts","../../../projects/shared/swt-generic/col/templates/col-select-dialog.templates.ts","../../../projects/shared/swt-generic/col/templates/col-select-dialog.inspinia.component.html","../../../projects/shared/swt-generic/col/templates/col-select-dialog.sneat.component.html","../../../projects/shared/swt-generic/col/col-select-dialog.component.ts","../../../projects/shared/swt-generic/col/col-select-dialog.component.html","../../../projects/shared/swt-generic/swt-grid/swt-grid-events.ts","../../../projects/shared/swt-generic/swt-grid/grid-cell-span.component.ts","../../../projects/shared/swt-generic/swt-grid/grid-cell-span.component.html","../../../projects/shared/swt-generic/swt-grid/multi-select-filter.component.ts","../../../projects/shared/swt-generic/swt-grid/disable-click-button.directive.ts","../../../projects/shared/swt-generic/col/col-hide.directive.ts","../../../projects/shared/swt-generic/swt-grid/swt-grid.component.ts","../../../projects/shared/swt-generic/swt-grid/swt-grid.component.html","../../../projects/shared/swt-generic/swt-grid/swt-grid-configuration.ts","../../../projects/shared/swt-generic/swt-generic-edit-dialog/swt-generic-edit-dialog.types.ts","../../../projects/shared/swt-generic/swt-generic-edit-dialog/swt-generic-edit-dialog-base.component.ts","../../../projects/shared/swt-generic/swt-generic-edit-dialog/swt-generic-edit-dialog.service.ts","../../../projects/shared/swt-generic/swt-generic-edit-dialog/templates/swt-generic-edit-dialog-form.templates.ts","../../../projects/shared/swt-generic/swt-generic-edit-dialog/templates/swt-generic-edit-dialog-form.inspinia.component.html","../../../projects/shared/swt-generic/swt-generic-edit-dialog/templates/swt-generic-edit-dialog-form.sneat.component.html","../../../projects/shared/swt-generic/swt-generic-edit-dialog/swt-generic-edit-dialog-form.component.ts","../../../projects/shared/swt-generic/swt-generic-edit-dialog/swt-generic-edit-dialog-form.component.html","../../../projects/shared/swt-generic/swt-generic-edit-dialog/templates/swt-generic-edit-dialog.templates.ts","../../../projects/shared/swt-generic/swt-generic-edit-dialog/templates/swt-generic-edit-dialog.inspinia.component.html","../../../projects/shared/swt-generic/swt-generic-edit-dialog/templates/swt-generic-edit-dialog.sneat.component.html","../../../projects/shared/swt-generic/swt-generic-edit-dialog/swt-generic-edit-dialog.component.ts","../../../projects/shared/swt-generic/swt-generic-edit-dialog/swt-generic-edit-dialog.component.html","../../../projects/shared/swt-generic/swt-generic-edit-dialog/swt-generic-edit-dialog-inline.component.ts","../../../projects/shared/swt-generic/swt-generic-edit-dialog/swt-generic-edit-dialog-inline.component.html","../../../projects/shared/swt-generic/swt-grid/swt-grid-loading.directive.ts","../../../projects/shared/swt-generic/swt-list-editor/swt-list-editor.component.ts","../../../projects/shared/swt-generic/swt-list-editor/swt-list-editor.component.html","../../../projects/shared/swt-generic/swt-generic.module.ts","../../../projects/shared/swt-generic/sowatech-shared-swt-generic.ts"],"sourcesContent":["import { EventEmitter, Injectable } from '@angular/core';\r\nimport { UserPropertiesStorageService } from '@sowatech/shared/user-properties-storage';\r\n\r\nconst STOREKEY_PREFIX = 'ColVisibility.';\r\n\r\nexport const COLUMN_HIDDEN_TEXT = 'hidden';\r\nexport const COLUMN_VISIBLE_TEXT = 'visible';\r\n\r\n@Injectable()\r\nexport class ColVisibilityService {\r\n\r\n    constructor(private userPropertiesStorage: UserPropertiesStorageService) { }\r\n\r\n    private storageKey(columnKey: string): string {\r\n        return STOREKEY_PREFIX + columnKey;\r\n    }\r\n\r\n    public isColumnVisible(columnKey: string, hiddenByDefault: boolean | undefined): boolean {\r\n        const visibilityStored = columnKey ? this.userPropertiesStorage.load(this.storageKey(columnKey)) : null;\r\n        if (visibilityStored === COLUMN_HIDDEN_TEXT) return false;\r\n        if (visibilityStored === COLUMN_VISIBLE_TEXT) return true;\r\n        return !hiddenByDefault;\r\n    }\r\n\r\n    public updateColumnVisibility(visibleColumns: Column[], hiddenColumns: Column[]) {\r\n        for (const col of visibleColumns) {\r\n            if (!col.hiddenByDefault) this.deleteFromStore(col);\r\n            else this.setVisible(col);\r\n        }\r\n\r\n        for (const col of hiddenColumns) {\r\n            if (col.hiddenByDefault) this.deleteFromStore(col);\r\n            else this.setHidden(col);\r\n        }\r\n\r\n        this.hiddenColumnsChanged.emit(hiddenColumns.map(col => col.columnKey));\r\n    }\r\n\r\n    public hiddenColumnsChanged: EventEmitter<string[]> = new EventEmitter<string[]>();\r\n\r\n    private deleteFromStore(col: Column) {\r\n        this.userPropertiesStorage.delete(this.storageKey(col.columnKey));\r\n    }\r\n\r\n    private setHidden(col: Column) {\r\n        this.userPropertiesStorage.save(this.storageKey(col.columnKey), COLUMN_HIDDEN_TEXT);\r\n    }\r\n\r\n    private setVisible(col: Column) {\r\n        this.userPropertiesStorage.save(this.storageKey(col.columnKey), COLUMN_VISIBLE_TEXT);\r\n    }\r\n}\r\n\r\ntype Column = {\r\n    columnKey: string;\r\n    hiddenByDefault: boolean;\r\n};\r\n","import { Component, Directive, Input, ViewChild } from '@angular/core';\r\nimport { ModalDirective } from 'ngx-bootstrap/modal';\r\n\r\nimport type { ColSelectDialogComponent } from '../col-select-dialog.component';\r\n\r\n@Directive()\r\nexport abstract class ColSelectDialogComponentBase {\r\n    @Input()\r\n    public component: ColSelectDialogComponent;\r\n\r\n    @ViewChild('dialog', { static: true })\r\n    public dialog: ModalDirective;\r\n}\r\n\r\n@Component({\r\n    selector: 'col-select-dialog-inspinia',\r\n    templateUrl: './col-select-dialog.inspinia.component.html',\r\n    standalone: false\r\n})\r\nexport class ColSelectDialogInspiniaComponent extends ColSelectDialogComponentBase { }\r\n\r\n@Component({\r\n    selector: 'col-select-dialog-sneat',\r\n    templateUrl: './col-select-dialog.sneat.component.html',\r\n    standalone: false\r\n})\r\nexport class ColSelectDialogSneatComponent extends ColSelectDialogComponentBase { }\r\n","<div class=\"modal-header\">\r\n  <button type=\"button\" class=\"close\" (click)=\"component.cancelDialog()\" aria-label=\"Close\">\r\n    <span aria-hidden=\"true\">&times;</span>\r\n  </button>\r\n  <ly-title context=\"dialog\" customClass=\"modal-title\" sizeClass=\"title-size-4\">{{component.dialogTitle}}</ly-title>\r\n</div>\r\n<div class=\"modal-body form-horizontal\">\r\n  @for (field of component.dialogFields; track field) {\r\n    <div class=\"form-group m-b-none\">\r\n      <label class=\"control-label col-sm-4\">{{field.text}}</label>\r\n      <div class=\"col-sm-8 form-control-static\">\r\n        <swt-checkbox [(ngModel)]=\"component.editItem[field.columnKey]\"></swt-checkbox>\r\n      </div>\r\n    </div>\r\n  }\r\n</div>\r\n<div class=\"modal-footer\">\r\n  <button type=\"button\" class=\"btn btn-default\" (click)=\"component.bsModalRef.hide()\"\r\n  i18n=\"@@Button.Cancel.act.Label\">Abbrechen</button>\r\n  <button type=\"button\" class=\"btn btn-primary\" (click)=\"component.submitDialog()\"\r\n  i18n=\"@@Button.Ok.act.Label\">OK</button>\r\n</div>\r\n","<div class=\"modal-header\">\r\n  <ly-title context=\"dialog\" customClass=\"modal-title\" sizeClass=\"title-size-4\">{{component.dialogTitle}}</ly-title>\r\n  <button type=\"button\" class=\"btn-close\" (click)=\"component.cancelDialog()\" aria-label=\"Close\">\r\n  </button>\r\n</div>\r\n<div class=\"modal-body ps-5 pe-5 mt-2\">\r\n  @for (field of component.dialogFields; track field) {\r\n    <div class=\"mb-2\">\r\n      <swt-checkbox [(ngModel)]=\"component.editItem[field.columnKey]\"></swt-checkbox>\r\n      <label class=\"ms-2 m-0\">{{field.text}}</label>\r\n    </div>\r\n  }\r\n</div>\r\n<div class=\"modal-footer\">\r\n  <button type=\"button\" class=\"btn btn-secondary\" (click)=\"component.bsModalRef.hide()\"\r\n  i18n=\"@@Button.Cancel.act.Label\">Abbrechen</button>\r\n  <button type=\"button\" class=\"btn btn-primary\" (click)=\"component.submitDialog()\"\r\n  i18n=\"@@Button.Ok.act.Label\">OK</button>\r\n</div>\r\n","/* eslint-disable @angular-eslint/no-output-on-prefix */\r\nimport { Component, EventEmitter, OnDestroy, OnInit, Output, QueryList, ViewChildren } from '@angular/core';\r\nimport { SharedConfigService } from '@sowatech/shared/shared-config';\r\nimport { BsModalRef, ModalDirective } from 'ngx-bootstrap/modal';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { ColVisibilityService } from './col-visibility.service';\r\nimport { ColSelectDialogComponentBase } from './templates/col-select-dialog.templates';\r\n\r\n@Component({\r\n    selector: 'col-select-dialog',\r\n    templateUrl: './col-select-dialog.component.html',\r\n    standalone: false\r\n})\r\n\r\nexport class ColSelectDialogComponent implements OnInit, OnDestroy {\r\n    constructor(\r\n        private colVisibilityService: ColVisibilityService,\r\n        sharedConfig: SharedConfigService,\r\n        public bsModalRef: BsModalRef\r\n    ) {\r\n        this.disableAnimation = sharedConfig.disableModalAnimation;\r\n    }\r\n\r\n    ngOnInit() {\r\n        this.dialogTitle = $localize`:@@Grid.SelectVisibleColumns.act.Title:Spalten auswählen`;\r\n        this.editItem = this.createColumnVisibility();\r\n    }\r\n\r\n    private readonly subscriptions: Subscription[] = [];\r\n    ngOnDestroy() {\r\n        this.subscriptions.forEach(s => s.unsubscribe());\r\n    }\r\n\r\n    public dialogTitle: string;\r\n    public disableAnimation: boolean;\r\n\r\n    @ViewChildren('template')\r\n    public template: QueryList<ColSelectDialogComponentBase>;\r\n\r\n    @Output()\r\n    public onSubmit: EventEmitter<string[]> = new EventEmitter<string[]>();\r\n\r\n    public get isConfigured(): boolean {\r\n        return this.dialogFields && this.dialogFields.length > 0;\r\n    }\r\n\r\n    public dialogFields: DialogField[];\r\n\r\n    public editItem: ColumnVisibility = {};\r\n\r\n    private createColumnVisibility(): ColumnVisibility {\r\n        const columnVisibilityDto: ColumnVisibility = {};\r\n        for (const dialogField of this.dialogFields) {\r\n            const isColVisible = this.colVisibilityService.isColumnVisible(dialogField.columnKey, dialogField.hiddenByDefault);\r\n            columnVisibilityDto[dialogField.columnKey] = isColVisible;\r\n        }\r\n        return columnVisibilityDto;\r\n    }\r\n\r\n    public cancelDialog() {\r\n        this.bsModalRef.hide();\r\n    }\r\n    public submitDialog() {\r\n        this.onSubmitColumnVisiblity();\r\n        this.bsModalRef.hide();\r\n    }\r\n\r\n    private onSubmitColumnVisiblity() {\r\n        const visibleColumns: Column[] = [];\r\n        const hiddenColumns: Column[] = [];\r\n\r\n        for (const dialogField of this.dialogFields) {\r\n            const columnIsVisible = this.editItem[dialogField.columnKey];\r\n            const pushTo = columnIsVisible ? visibleColumns : hiddenColumns;\r\n            pushTo.push({ columnKey: dialogField.columnKey, hiddenByDefault: dialogField.hiddenByDefault });\r\n        }\r\n        this.colVisibilityService.updateColumnVisibility(visibleColumns, hiddenColumns);\r\n        this.onSubmit.emit(hiddenColumns.map(c => c.columnKey));\r\n    }\r\n}\r\n\r\ntype ColumnVisibility = { [fieldname: string]: boolean; };\r\n\r\ninterface DialogField {\r\n    columnKey: string;\r\n    text: string;\r\n    type: string;\r\n    hiddenByDefault: boolean;\r\n}\r\n\r\nexport interface IColumnKeyText {\r\n    key: string;\r\n    text: string;\r\n    hiddenByDefault: boolean;\r\n}\r\n\r\ntype Column = {\r\n    columnKey: string;\r\n    hiddenByDefault: boolean;\r\n};\r\n","<switch-template [inspinia]=\"inspiniaTemplate\" [sneat]=\"sneatTemplate\"></switch-template>\r\n\r\n<ng-template #inspiniaTemplate>\r\n    <col-select-dialog-inspinia [component]=\"this\" #template></col-select-dialog-inspinia>\r\n</ng-template>\r\n\r\n<ng-template #sneatTemplate>\r\n    <col-select-dialog-sneat [component]=\"this\" #template></col-select-dialog-sneat>\r\n</ng-template>\r\n","export class GridDropEvent {\r\n    public sourceContainer: HTMLElement;\r\n    public destinationContainer: HTMLElement;\r\n    public dropElement: HTMLElement;\r\n    public nextElement?: HTMLElement;\r\n    public nextItem?: any;\r\n    public editItem: any;\r\n}\r\n\r\nexport class GridDropRemoveEvent {\r\n    public sourceContainer: HTMLElement;\r\n    public editItem: any;\r\n}\r\n\r\nexport class RowClickEvent {\r\n    public $event: MouseEvent;\r\n    public itemId: any;\r\n}\r\n\r\nexport class Html5DragDropEvent {\r\n    public $event: DragEvent;\r\n    public itemId: any;\r\n}\r\n\r\nexport class GridColumnButtonEvent {\r\n    public buttonIdent: string;\r\n    public itemId: any;\r\n    public event: MouseEvent;\r\n}\r\n\r\nexport class SpanClickEvent {\r\n    public ident: string;\r\n    public event: MouseEvent;\r\n    public listItem: any;\r\n}\r\n","import { Component, Input, Output, EventEmitter, input } from '@angular/core';\r\n\r\nimport { GridColumnSpan, IStackedProgressBar } from './swt-grid-configuration';\r\nimport { SpanClickEvent } from './swt-grid-events';\r\n\r\n@Component({\r\n    selector: 'grid-cell-span',\r\n    styleUrls: ['./scss/swt-grid.component.scss', './scss/swt-grid-print.scss'],\r\n    templateUrl: './grid-cell-span.component.html',\r\n    standalone: false\r\n})\r\nexport class GridCellSpanComponent {\r\n\r\n    @Input({ required: true }) public spans: GridColumnSpan[];\r\n    @Input() public listItem?: unknown;\r\n\r\n    @Output() public spanClick = new EventEmitter<SpanClickEvent>();\r\n\r\n    private readListItem(property: string) {\r\n        return this.listItem && property ? this.listItem[property] : undefined;\r\n    }\r\n\r\n    private joinedString(...values: (string | undefined | null)[]): string {\r\n        return values.filter(s => s).join(' '); // keine Elemente => Leerstring\r\n    }\r\n\r\n    public spanText(span: GridColumnSpan): string {\r\n        return this.joinedString(span.text, this.readListItem(span.textFieldname));\r\n    }\r\n\r\n    public spanNumber(span: GridColumnSpan): number {\r\n        return +(this.readListItem(span.textFieldname) ?? span.text ?? 0);\r\n    }\r\n\r\n    public spanNumberProgressBar(stackedProgressBar: IStackedProgressBar): number {\r\n        return +(this.readListItem(stackedProgressBar.valueFieldname) ?? stackedProgressBar.value ?? 0);\r\n    }\r\n\r\n    public spanTitle(span: GridColumnSpan): string {\r\n        return this.joinedString(span.title, this.readListItem(span.titleFieldname));\r\n    }\r\n\r\n    public spanClass(span: GridColumnSpan): string {\r\n        return this.joinedString(span.class, this.readListItem(span.classFieldname), this.isClickable(span) ? 'span-clickable' : '');\r\n    }\r\n\r\n    public spanClassProgressBar(stackedProgressBar: IStackedProgressBar): string {\r\n        return this.joinedString(stackedProgressBar.class, this.readListItem(stackedProgressBar.classFieldName));\r\n    }\r\n\r\n    public colorValue(span: GridColumnSpan, fieldType: string): string {\r\n        switch (fieldType) {\r\n            case 'color':\r\n                return this.readListItem(span.colorFieldname) ?? span.color ?? '';\r\n            case 'color2':\r\n                return this.readListItem(span.color2Fieldname) ?? span.color2 ?? '';\r\n            case 'backgroundColor':\r\n                return this.readListItem(span.backgroundColorFieldname) ?? span.backgroundColor ?? '';\r\n            default:\r\n                return '';\r\n        }\r\n    }\r\n\r\n    public spanRouterLink(span: GridColumnSpan): string {\r\n        return this.readListItem(span.routerLinkFieldname) ?? span.routerLink ?? null;\r\n    }\r\n\r\n    public spanQueryParams(span: GridColumnSpan): Record<string, unknown> {\r\n        return this.readListItem(span.queryParamsFieldname) ?? span.queryParams ?? null;\r\n    }\r\n\r\n    public isClickable(span: GridColumnSpan) {\r\n        return span.ident;\r\n    }\r\n\r\n    public spanClicked(span: GridColumnSpan, event: MouseEvent) {\r\n        if (this.isClickable(span)) {\r\n            event.stopPropagation(); //prevents bubble of click-event to tr\r\n            this.spanClick.emit({ ident: span.ident, event, listItem: this.listItem });\r\n        }\r\n    }\r\n}\r\n\r\n@Component({\r\n    selector: 'grid-cell-span-router-link',\r\n    template: `\r\n        <ng-template #content><ng-content></ng-content></ng-template>\r\n        @if (routerLink(); as link) {\r\n          <a [routerLink]=\"link\" [queryParams]=\"queryParams()\" (click)=\"handleClick($event)\">\r\n            <ng-container *ngTemplateOutlet=\"content\"></ng-container>\r\n          </a>\r\n        }\r\n        @if (!routerLink()) {\r\n          <ng-container *ngTemplateOutlet=\"content\"></ng-container>\r\n        }\r\n        `,\r\n    standalone: false\r\n})\r\nexport class GridCellSpanRouterLinkComponent {\r\n    public readonly routerLink = input.required<string[], string>({ transform: (value) => value ? [value] : null });\r\n    public readonly queryParams = input<Record<string, unknown>>();\r\n\r\n    protected handleClick(event: MouseEvent) {\r\n        event.stopPropagation();\r\n    }\r\n}\r\n","@for (span of spans; track span) {\r\n  <grid-cell-span-router-link style=\"outline:none\" [routerLink]=\"spanRouterLink(span)\" [queryParams]=\"spanQueryParams(span)\">\r\n    @switch (span.variant) {\r\n      @case ('label') {\r\n        <ng-container [ngTemplateOutlet]=\"label\"></ng-container>\r\n      }\r\n      @case ('icon') {\r\n        <ng-container [ngTemplateOutlet]=\"icon\"></ng-container>\r\n      }\r\n      @case ('progress') {\r\n        <ng-container [ngTemplateOutlet]=\"progress\"></ng-container>\r\n      }\r\n      @case ('stackedProgress') {\r\n        <ng-container [ngTemplateOutlet]=\"stackedProgress\"></ng-container>\r\n      }\r\n      @default {\r\n        @if (!span.variant && !span.isIcon) {\r\n          <ng-container [ngTemplateOutlet]=\"label\"></ng-container>\r\n        }\r\n        @if (span.isIcon) {\r\n          <ng-container [ngTemplateOutlet]=\"icon\"></ng-container>\r\n        }\r\n      }\r\n    }\r\n  </grid-cell-span-router-link>\r\n  <ng-template #label>\r\n    <span (click)=\"spanClicked(span,$event)\" [attr.data-ident]=\"span.ident\" [ngClass]=\"spanClass(span)\" [title]=\"spanTitle(span)\"\r\n    [style.color]=\"colorValue(span, 'color')\" [style.backgroundColor]=\"colorValue(span, 'backgroundColor')\">{{ spanText(span) }}</span>\r\n  </ng-template>\r\n  <ng-template #icon>\r\n    <i class=\"grid-icon\" (click)=\"spanClicked(span,$event)\" [attr.data-ident]=\"span.ident\" [ngClass]=\"spanClass(span)\" [title]=\"spanTitle(span)\"\r\n    [style.color]=\"colorValue(span, 'color')\" [style.backgroundColor]=\"colorValue(span, 'backgroundColor')\">{{ spanText(span) }}</i>\r\n  </ng-template>\r\n  <ng-template #progress>\r\n    <div [attr.data-ident]=\"span.ident\" (click)=\"spanClicked(span,$event)\">\r\n      @if (span.showProgressPercent !== false) {\r\n        <span class=\"stat-percent\" [title]=\"spanTitle(span)\">{{ spanNumber(span) | percent: \"1.0-0\" }}</span>\r\n      }\r\n      <div class=\"progress progress-mini\" [title]=\"spanTitle(span)\">\r\n        <div [ngClass]=\"['progress-bar', spanClass(span)]\" [style.width.%]=\"spanNumber(span) * 100\"></div>\r\n      </div>\r\n    </div>\r\n  </ng-template>\r\n  <ng-template #stackedProgress>\r\n    @if (span.stackedProgressBars?.length > 0) {\r\n      <div [attr.data-ident]=\"span.ident\" (click)=\"spanClicked(span,$event)\">\r\n        @if (span.showProgressPercent !== false) {\r\n          <span class=\"stat-percent\" [title]=\"spanTitle(span)\">{{ spanNumber(span) | percent: \"1.0-0\" }}</span>\r\n        }\r\n        <div class=\"progress progress-mini\" [title]=\"spanTitle(span)\">\r\n          @for (progressBar of span.stackedProgressBars; track progressBar) {\r\n            <div\r\n              [ngClass]=\"['progress-bar', spanClassProgressBar(progressBar)]\"\r\n            [style.width.%]=\"spanNumberProgressBar(progressBar) * 100\"></div>\r\n          }\r\n        </div>\r\n      </div>\r\n    }\r\n  </ng-template>\r\n}\r\n","import { AfterViewInit, Component, computed, DestroyRef, inject, input, signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { NgOption } from '@ng-select/ng-select';\r\nimport { SelectItem } from '@sowatech/shared/@types';\r\nimport { DatasourceComponent, FilterItem, FilterOperator } from '@sowatech/shared/ds-datasource';\r\n\r\nimport { GridLookup } from './swt-grid-configuration';\r\n\r\n@Component({\r\n    selector: 'multi-select-filter',\r\n    template: `<ng-select class=\"custom-form-control\" inspinia-class=\"inspinia\" sneat-class=\"sneat\"\r\n                        (change)=\"setFilter($event)\" [ngModel]=\"value()\" bindValue=\"value\"\r\n                        [multiple]=\"true\" [items]=\"lookups()\" [addTag]=\"false\"\r\n                        [clearOnBackspace]=\"true\" appendTo=\"body\"\r\n                        placeholder=\"(alle)\" i18n-placeholder=\"@@Grid.All.dsp.Label\"\r\n                        notFoundText=\"Nicht gefunden\" i18n-notFoundText=\"@@Grid.SelectSearchNotFound.dsp.Label\">\r\n                </ng-select>`,\r\n    styleUrl: './scss/multi-select-filter.component.scss',\r\n    standalone: false\r\n})\r\nexport class MultiSelectFilterComponent implements AfterViewInit {\r\n    public readonly lookups = input.required<NgOption[], GridLookup>({ transform: (value: GridLookup) => this.transformGridLookup(value) });\r\n    public readonly fieldNames = input.required<string | string[]>();\r\n    public readonly datasource = input.required<DatasourceComponent>();\r\n\r\n    private readonly datasourceFilterItems = signal<FilterItem[]>([]);\r\n    protected value = computed(() => {\r\n        const filterItem = this.datasourceFilterItems().find((item) => item.fieldnamesAreEqual(this.fieldNames() as string) && item.filterOperator === this.filterOperator);\r\n        return filterItem?.fieldvalues ?? [];\r\n    });\r\n\r\n    private readonly filterOperator = FilterOperator.IsEqual;\r\n    private readonly destryRef = inject(DestroyRef);\r\n\r\n    public ngAfterViewInit(): void {\r\n        this.datasource().onFilterItems.pipe(\r\n            takeUntilDestroyed(this.destryRef),\r\n        ).subscribe((filterItems) => this.datasourceFilterItems.set(filterItems));\r\n        this.datasourceFilterItems.set(this.datasource().getFilterItems());\r\n    }\r\n\r\n    private transformGridLookup(lookups: GridLookup): NgOption[] {\r\n        if (lookups.length === 0) return [];\r\n\r\n        const isSelectItemArray = 'value' in (lookups[0] as SelectItem);\r\n        if (isSelectItemArray)\r\n            return lookups.map(item => ({ label: item.text, value: item.value.toString().toLocaleLowerCase() }));\r\n\r\n        const isStringArray = typeof lookups[0] === 'string';\r\n        if (isStringArray)\r\n            return lookups.map(item => ({ label: item, value: item.toLocaleLowerCase() }));\r\n\r\n        return [];\r\n    }\r\n\r\n    protected setFilter(selection: NgOption[]) {\r\n        const filterValues = selection.map(item => item.value);\r\n        const fieldNames = this.fieldNames();\r\n        const fieldNamesArray = Array.isArray(fieldNames) ? fieldNames : [fieldNames];\r\n        const filterItem = new FilterItem(fieldNamesArray, filterValues, this.filterOperator);\r\n        this.datasource().addFilter([filterItem]);\r\n    }\r\n}\r\n","import { Directive, ElementRef, Input, OnDestroy, OnInit } from '@angular/core';\r\nimport { Subscription, fromEvent } from 'rxjs';\r\n\r\n@Directive({\r\n    selector: '[disable-click]',\r\n    standalone: false\r\n})\r\nexport class DisableClickDirective implements OnInit, OnDestroy {\r\n    constructor(private readonly el: ElementRef<HTMLElement>) {\r\n        this.setDisabled = () => el.nativeElement.classList.add('click-disabled');\r\n        this.removeDisabled = () => el.nativeElement.classList.remove('click-disabled');\r\n    }\r\n\r\n    private subscription = new Subscription();\r\n    private _disableClick = false;\r\n    @Input('disable-click') public set disableClick(value: boolean) {\r\n        if (value !== this._disableClick) {\r\n            this._disableClick = value;\r\n            if (this._disableClick) this.setDisabled();\r\n            else this.removeDisabled();\r\n        }\r\n    }\r\n\r\n    private setDisabled: () => void;\r\n    private removeDisabled: () => void;\r\n\r\n    ngOnInit() {\r\n        const el = this.el.nativeElement;\r\n        this.subscription = fromEvent(el.parentNode, 'click', { capture: true })\r\n            .subscribe((e: PointerEvent) => {\r\n                if (e.target === el || el.contains(e.target as Node) && this._disableClick) e.stopPropagation();\r\n            });\r\n    }\r\n\r\n    ngOnDestroy() {\r\n        this.subscription.unsubscribe();\r\n    }\r\n}\r\n","import { Directive, ElementRef, Input, OnDestroy, OnInit, inject } from '@angular/core';\r\nimport { SharedConfigService } from '@sowatech/shared/shared-config';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { ColVisibilityService } from './col-visibility.service';\r\n\r\n@Directive({\r\n    selector: '[col-hide]',\r\n    standalone: false\r\n})\r\nexport class ColHideDirective implements OnInit, OnDestroy {\r\n    constructor(\r\n        el: ElementRef,\r\n    ) {\r\n        this.columnElement = el.nativeElement;\r\n    }\r\n\r\n    private readonly colVisibilityService = inject(ColVisibilityService);\r\n    private readonly sharedConfig = inject(SharedConfigService);\r\n    private readonly hiddenClass = this.sharedConfig.templateKey === 'sneat' ? 'd-none' : 'hidden';\r\n\r\n    private subscriptions = new Array<Subscription>();\r\n    ngOnInit() {\r\n        this.subscriptions.push(\r\n            this.colVisibilityService.hiddenColumnsChanged.subscribe(\r\n                () => this.refreshColumnVisibility())\r\n        );\r\n        this.refreshColumnVisibility();\r\n    }\r\n\r\n    ngOnDestroy() {\r\n        this.subscriptions.forEach(s => s.unsubscribe());\r\n    }\r\n\r\n    @Input('col-hide')\r\n    public set dsColHideName(name: string) {\r\n        this.colHideName = name;\r\n    }\r\n    @Input('hidden-by-default')\r\n    public hiddenByDefault = false;\r\n\r\n    private columnElement: HTMLElement;\r\n    private colHideName = '';\r\n\r\n    public refreshColumnVisibility() {\r\n        const isVisible = this.colVisibilityService.isColumnVisible(this.colHideName, this.hiddenByDefault);\r\n        this.setColumnHidden(!isVisible);\r\n    }\r\n\r\n    private setColumnHidden(value: boolean) {\r\n        if (value)\r\n            this.columnElement.classList.add(this.hiddenClass);\r\n        else\r\n            this.columnElement.classList.remove(this.hiddenClass);\r\n    }\r\n}\r\n","/* eslint-disable @angular-eslint/no-output-on-prefix */\r\n/* eslint-disable @angular-eslint/no-input-rename */\r\nimport { CurrencyPipe, DatePipe, DecimalPipe } from '@angular/common';\r\nimport { AfterViewInit, Component, computed, DestroyRef, effect, ElementRef, EventEmitter, Inject, inject, input, Input, LOCALE_ID, OnDestroy, OnInit, Output, signal, untracked, viewChild, ViewChild } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { SelectItem } from '@sowatech/shared/@types';\r\nimport { AggregateFunctionConfig, aggregateFunctionImplementations, AggregateFunctionOperator, CSVColumn, CSVConfig, DatasourceComponent, digitsInfo, FilterOperator } from '@sowatech/shared/ds-datasource';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\nimport { ScrollEvent } from '@sowatech/shared/scheduler';\r\nimport { IconAlignType, PaginationInfoVariant, ShowDetailMethod, SwtGridDefaultConfig } from '@sowatech/shared/shared-config';\r\nimport { LoadingIndicatorComponent } from '@sowatech/shared/swt-controls';\r\nimport { DragulaOptions, DragulaService } from '@sowatech/shared/swt-dragula';\r\nimport { I18nService, PrintService } from '@sowatech/shared/utilities';\r\nimport { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';\r\nimport { NgScrollbar } from 'ngx-scrollbar';\r\nimport { fromEvent, Subscription } from 'rxjs';\r\n\r\nimport { ColSelectDialogComponent } from '../col/col-select-dialog.component';\r\nimport { ColVisibilityService } from '../col/col-visibility.service';\r\n\r\nimport { AggregateFunctionGridConfig, GridColumn, GridColumnButton, GridColumnSpan, GridColumnType, GridConfiguration, GridTitleSpan, HeaderTitleGroups, IHeaderTitleGroup } from './swt-grid-configuration';\r\nimport { GridColumnButtonEvent, GridDropEvent, GridDropRemoveEvent, Html5DragDropEvent, RowClickEvent, SpanClickEvent } from './swt-grid-events';\r\n\r\ntype OnlyStringKeys = Record<string, any>;\r\ntype Id = any;\r\n\r\n@Component({\r\n    selector: 'swt-grid',\r\n    templateUrl: './swt-grid.component.html',\r\n    styleUrls: [\r\n        './scss/swt-grid.component.scss',\r\n        './scss/datatables.scss',\r\n        './scss/swt-grid.sneat.component.scss',\r\n        './scss/swt-grid-print.scss'\r\n    ],\r\n    standalone: false,\r\n    host: {\r\n        '[attr.cy-total-refresh-counter]': 'cyTotalRefreshCounter()',\r\n        '[attr.cy-current-refresh-counter]': 'cyCurrentRefreshCounter()',\r\n    },\r\n})\r\nexport class GridComponent<ListItem extends OnlyStringKeys = any> implements OnInit, OnDestroy, AfterViewInit {\r\n    constructor(\r\n        private logger: LoggerService,\r\n        private dragulaService: DragulaService,\r\n        @Inject(LOCALE_ID) public locale: string,\r\n        private config: SwtGridDefaultConfig,\r\n        private colVisibilityService: ColVisibilityService,\r\n        private currencyPipe: CurrencyPipe,\r\n        private modalService: BsModalService,\r\n        private i18n: I18nService,\r\n    ) {\r\n        this.datePipe = new DatePipe(locale);\r\n        this.decimalPipe = new DecimalPipe(locale);\r\n        this.setDefaultConfigurations();\r\n        effect(() => this.setDragulaOptions());\r\n        effect(() => this.setDragulaSubscriptions());\r\n        effect(() => this.setDatasourceFixedSortItems());\r\n    }\r\n\r\n    private bsModalRef?: BsModalRef;\r\n\r\n    private readonly destroyRef = inject(DestroyRef);\r\n\r\n    private printService = inject(PrintService);\r\n    public readonly selectAllRowsLabel = $localize`:@@Grid.SelectAllRows.act.Label:Alle Reihen auswählen`;\r\n    public readonly selectRowLabel = $localize`:@@Grid.SelectRow.act.Label:Reihe auswählen`;\r\n    private datePipe: DatePipe;\r\n    private decimalPipe: DecimalPipe;\r\n    private subscriptions = new Array<Subscription>();\r\n\r\n    ngOnInit() {\r\n        this.subscriptions.push(\r\n            this.listDatasource.onFocus.subscribe(id => this.onFocus(id)),\r\n            this.colVisibilityService.hiddenColumnsChanged.subscribe(() => this.onColVisibilityChanged()),\r\n            this.listDatasource.onBeforeRefresh.subscribe(() => this.onBeforeDatasourceRefresh()),\r\n            this.listDatasource.onAfterRefresh.subscribe(() => this.onAfterDatasourceRefresh()),\r\n        );\r\n    }\r\n\r\n    ngAfterViewInit() {\r\n        this.subscriptions.push(\r\n            fromEvent(this.scrollbar().adapter.viewportElement, 'scroll').subscribe(event => this.scroll(event)),\r\n        );\r\n    }\r\n\r\n    ngOnDestroy() {\r\n        this.subscriptions.forEach(s => s.unsubscribe());\r\n    }\r\n\r\n    private onColVisibilityChanged() {\r\n        this.listDatasource.aggregateFunctions.recalc();\r\n        if (this.listDatasource.isExternalRefresh())\r\n            this.listDatasource.refreshAggregateFunctionsExternal();\r\n        this.prepareHeaderGroupColumns();\r\n        this.updateShowFooter();\r\n    }\r\n\r\n    public onKeydownHandler(event: KeyboardEvent) {\r\n        if (this.allowKeyboardShortCuts) {\r\n            if (event.key === 'ArrowUp') {\r\n                event.preventDefault();\r\n                event.stopPropagation();\r\n                this.onKeyUp();\r\n            }\r\n            if (event.key === 'ArrowDown') {\r\n                event.preventDefault();\r\n                event.stopPropagation();\r\n                this.onKeyDown();\r\n            }\r\n            if (event.key === 'Enter') {\r\n                event.preventDefault();\r\n                event.stopPropagation();\r\n                this.onEnterPressed();\r\n            }\r\n        }\r\n    }\r\n\r\n    public onEnterPressed() {\r\n        this.clickOnFocusedRow();\r\n    }\r\n\r\n    /**\r\n     * @deprecated clickOnFocusedRow() benutzen\r\n     */\r\n    public clickOnFocuedRow() {\r\n        this.clickOnFocusedRow();\r\n    }\r\n\r\n    public clickOnFocusedRow() {\r\n        if (this.gridId && this.gridId != '') {\r\n            const rowElement = document.querySelector(`#${this.gridId}`).querySelector(`[data-id=\"${this.listDatasource.focusedId}\"]`) as HTMLTableRowElement;\r\n            if (rowElement)\r\n                rowElement.click();\r\n        }\r\n        else {\r\n            const rowElement = document.querySelector(`[data-id=\"${this.listDatasource.focusedId}\"]`) as HTMLTableRowElement;\r\n            if (rowElement)\r\n                rowElement.click();\r\n        }\r\n    }\r\n\r\n    public onKeyUp() {\r\n        this.listDatasource.focusPreviousRow();\r\n    }\r\n\r\n    public onKeyDown() {\r\n        this.listDatasource.focusNextOrFirstRow();\r\n    }\r\n\r\n    public get datasourceHasExternalRefresh() {\r\n        return this.listDatasource?.isExternalRefresh() ?? false;\r\n    }\r\n\r\n    public gridId = '';\r\n    public gridIdPrefix = '';\r\n    @Input()\r\n    public idfield = '';\r\n    @Input('id')\r\n    public set setGridId(value: string) {\r\n        if (this.gridId != value) {\r\n            this.gridId = value;\r\n            this.gridIdPrefix = this.gridId ? this.gridId + '-' : '';\r\n        }\r\n    }\r\n\r\n    public cyTotalRefreshCounter = signal(0);\r\n    public cyCurrentRefreshCounter = signal(0);\r\n\r\n    @Input('datasource')\r\n    public set setListDatasource(value: DatasourceComponent) {\r\n        this.listDatasource = value;\r\n        this.listDatasource.aggregateFunctions.getConfigs = () => this.getColumnsByColVisibility();\r\n        if (this.grouped)\r\n            this.listDatasource.setFixedSort(this.groupByColumns.map(col => col.fieldname));\r\n    }\r\n\r\n    @Input()\r\n    public stickyHeader = false;\r\n    @Input()\r\n    public name = '';\r\n    @Input()\r\n    public small: boolean;\r\n    @Input()\r\n    public allowKeyboardShortCuts: boolean;\r\n    @Input()\r\n    public minHeight: string;\r\n    /**\r\n     * Max-Height of table excluding pagination.\r\n    */\r\n    @Input()\r\n    public maxHeightTable: string;\r\n    /**\r\n    * Obsolete. Max-Height of entire component including pagination, filter info etc. Use maxHeightTable instead.\r\n    */\r\n    @Input()\r\n    public maxHeight: string;\r\n    @Input()\r\n    public rowHeight: number;\r\n    @Input()\r\n    public filterRowHeight: number;\r\n    @Input()\r\n    public headerRowHeight: number;\r\n    @Input()\r\n    public headerTitleGroups: HeaderTitleGroups;\r\n    @Input('store-key')\r\n    public gridStoreKey: string;\r\n    @Input()\r\n    public hideColSelectBtn: boolean;\r\n    @Input()\r\n    public gridClass: string; //additional css classes\r\n    @Input()\r\n    public allowCSVDownload: boolean;\r\n    @Input()\r\n    public csvFileName: string;\r\n    @Input()\r\n    public csvConfig: CSVConfig;\r\n    @Input()\r\n    public allowFilter: boolean;\r\n    @Input()\r\n    public allowSort: boolean;\r\n    @Input()\r\n    public allowPaging: boolean;\r\n    @Input()\r\n    public showSelectedIdsNotFoundWarning: boolean;\r\n    @Input()\r\n    public showRowDetail: boolean;\r\n    @Input()\r\n    public showDetailMethod: ShowDetailMethod;\r\n    @Input()\r\n    public paginationInfoVariant: PaginationInfoVariant;\r\n    @Input()\r\n    public allowPrintDownload = false;\r\n    @Input()\r\n    public printTitle: string;\r\n    @Input()\r\n    public rowClassFieldName?: keyof ListItem;\r\n    @Input()\r\n    public rowDetailClassFieldName?: keyof ListItem;\r\n\r\n    @Input()\r\n    public allowSelectPageSize: boolean;\r\n    @Input('pageSizes')\r\n    public set _pageSizes(values: number[]) {\r\n        this.pageSizes = values;\r\n    }\r\n    public pageSizes: number[];\r\n\r\n    @Input()\r\n    public allowMultiSelect: boolean;\r\n    /** Bool-Fieldname des Models der angibt ob Select für Zeile disabled wird*/\r\n    @Input()\r\n    public disableSelectFieldName: Extract<keyof ListItem, string>;\r\n    @Input()\r\n    public showEmptyGrid: boolean;\r\n    @Input()\r\n    public emptyGridText: string;\r\n    @Input()\r\n    public filterFieldsVisible: boolean;\r\n    @Input()\r\n    public sortItemAlign: IconAlignType;\r\n    @Input()\r\n    public html5Draggable: string = null; //if!=null: shows an Icon with draggable=true, the given text will be shown as title\r\n    @Output()\r\n    public onHtml5DragStart = new EventEmitter<Html5DragDropEvent>();\r\n\r\n    public dragulaBag = input<string>();\r\n    public dragulaShowIcon = input<boolean>(false);\r\n    public dragulaOnlyIconDrag = input<boolean>(false);\r\n    protected readonly dragulaDragHandleClass = computed(() => this.dragulaBag() ? `dragula-drag-handle-${this.dragulaBag()}` : 'dragula-drag-handle');\r\n\r\n    private setDragulaOptions() {\r\n        const dragulaBag = this.dragulaBag();\r\n        const dragulaOnlyIconDrag = this.dragulaOnlyIconDrag();\r\n        if (!dragulaBag)\r\n            return;\r\n        const options =  this.getDragulaOptions(dragulaOnlyIconDrag);\r\n        const dragulaGroup = this.dragulaService.find(dragulaBag) ?? this.dragulaService.createGroup(dragulaBag, options);\r\n        dragulaGroup.options.moves = options.moves;\r\n    }\r\n\r\n    private getDragulaOptions(dragulaOnlyIconDrag: boolean): DragulaOptions {\r\n        if (dragulaOnlyIconDrag)\r\n            return { moves: (_el, _container, handle) => handle.classList.contains(this.dragulaDragHandleClass())};\r\n        return { moves: () => true };\r\n    }\r\n\r\n    private dragulaSubscriptions: Subscription[] = [];\r\n    private setDragulaSubscriptions() {\r\n        const dragulaBag = this.dragulaBag();\r\n        if (!dragulaBag)\r\n            return;\r\n        this.dragulaSubscriptions.forEach(s => s.unsubscribe());\r\n        this.dragulaSubscriptions = [\r\n            this.dragulaService.drop(dragulaBag).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(val => this.onRowDrop(val)),\r\n            this.dragulaService.remove(dragulaBag).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(val => this.onRowRemove(val))\r\n        ];\r\n    }\r\n\r\n    private setDatasourceFixedSortItems() {\r\n        if (!this.datasource()) return;\r\n        const groupBy = this.groupByColumnsSignal().map(col => col.fieldname);\r\n        this.datasource()!.setFixedSort(groupBy);\r\n    }\r\n\r\n    @Input()\r\n    public showSelectCheckBoxes: boolean;\r\n    @Input('table-hover')\r\n    public tableHover: boolean;\r\n    @Input('config')\r\n    public set setConfig(value: GridConfiguration<ListItem>) {\r\n        this.configureGrid(value);\r\n    }\r\n\r\n    @Output()\r\n    public onButtonClicked = new EventEmitter<GridColumnButtonEvent>();\r\n    @Output()\r\n    public onRowClicked = new EventEmitter<RowClickEvent>();\r\n    @Output()\r\n    public onDrop = new EventEmitter<GridDropEvent>();\r\n    @Output()\r\n    public onDragulaRemove = new EventEmitter<GridDropRemoveEvent>();\r\n    /** nur für showDetailMethod = 'dropdown' */\r\n    @Output()\r\n    public detailOpened = new EventEmitter<Id>();\r\n\r\n    @ViewChild('loadingIndicator', { static: true })\r\n    public loadingIndicator: LoadingIndicatorComponent;\r\n    @ViewChild('filterItems')\r\n    public filterItems: ElementRef<HTMLElement>;\r\n    @ViewChild('table')\r\n    public table: ElementRef;\r\n    @ViewChild('swtGrid')\r\n    public swtGridDiv: ElementRef;\r\n\r\n    public headerTitleGroupColumns?: HeaderTitleGroupCol[];\r\n    public showFooter = false;\r\n    private readonly firstItemsOfGroupSignal = computed(() => this.calcFirstItemsOfGroups());\r\n    public get firstItemsOfGroup(): Id[] {\r\n        return untracked(this.firstItemsOfGroupSignal);\r\n    }\r\n\r\n    public focusGrid() {\r\n        this.table.nativeElement.focus();\r\n    }\r\n\r\n    private readonly datasource = signal<DatasourceComponent<ListItem> | null>(null);\r\n    public get listDatasource(): DatasourceComponent<ListItem> {\r\n        return untracked(() => this.datasource());\r\n    }\r\n    public set listDatasource(ds: DatasourceComponent<ListItem>) {\r\n        untracked(() => this.datasource.set(ds));\r\n    }\r\n\r\n    private allColumns = signal<GridColumn<ListItem>[]>([]);\r\n    public set columns(allColumns: GridColumn<ListItem>[]) {\r\n        this.prepareColumns(allColumns);\r\n        this.allColumns.set(allColumns);\r\n        this.prepareHeaderGroupColumns();\r\n        this.updateShowFooter();\r\n        this.listDatasource?.aggregateFunctions?.recalc();\r\n    }\r\n\r\n    public setFocusedFilter(fieldName: string) {\r\n        const element = this.filterItems.nativeElement.querySelector(`#${this.gridIdPrefix + fieldName}`);\r\n        if (element) (element as HTMLElement).focus();\r\n    }\r\n\r\n    private readonly visibleColumnsSignal = computed(() => this.allColumns().filter(col => !col.groupBy));\r\n    public get visibleColumns(): GridColumn<ListItem>[] {\r\n        return untracked(this.visibleColumnsSignal);\r\n    }\r\n\r\n    public get numOfVisibleColumns(): number {\r\n        return this.visibleColumns.length + this.extraColumnCount;\r\n    }\r\n\r\n    private get extraColumnCount(): number {\r\n        let extraColumns = 0;\r\n        if (this.showSelectCheckBoxes) extraColumns += 1;\r\n        if (this.html5Draggable) extraColumns += 1;\r\n        if (this.dragulaShowIcon()) extraColumns += 1;\r\n        if (this.showRowDetail) extraColumns += 1;\r\n        return extraColumns;\r\n    }\r\n\r\n    public get rowCursorClass(): string {\r\n        const internalObservers = 0;\r\n        if (this.onRowClicked.observers.length > internalObservers)\r\n            return 'pointer';\r\n        else\r\n            return 'default';\r\n\r\n    }\r\n    private readonly groupByColumnsSignal = computed(() => this.allColumns().filter(col => col.groupBy));\r\n    public get groupByColumns(): GridColumn<ListItem>[] {\r\n        return untracked(this.groupByColumnsSignal);\r\n    }\r\n    //Implementation erstmal nur auf eine Column ausgelegt\r\n    public get groupByColumn(): GridColumn<ListItem> {\r\n        return this.groupByColumns?.length > 0 ? this.groupByColumns[0] : null;\r\n    }\r\n\r\n    public get grouped(): boolean {\r\n        return this.groupByColumns?.length > 0;\r\n    }\r\n    private prepareHeaderGroupColumns() {\r\n        if (!this.headerTitleGroups) return;\r\n        this.headerTitleGroupColumns = [];\r\n        let lastGroupCol = HeaderTitleGroupCol.empty;\r\n        for (const col of this.getColumnsByColVisibility()) {\r\n            const headerGroupData = this.headerTitleGroups ? this.headerTitleGroups[col.headerTitleGroup] : undefined;\r\n            if (headerGroupData === undefined) {\r\n                this.headerTitleGroupColumns.push(HeaderTitleGroupCol.empty);\r\n                continue;\r\n            }\r\n            if (!lastGroupCol.isEmpty && lastGroupCol.key === col.headerTitleGroup) {\r\n                lastGroupCol.span++;\r\n                continue;\r\n            }\r\n            lastGroupCol = new HeaderTitleGroupCol(col.headerTitleGroup, 1, headerGroupData);\r\n            this.headerTitleGroupColumns.push(lastGroupCol);\r\n        }\r\n    }\r\n\r\n    private prepareColumns(allColumns: GridColumn<ListItem>[]) {\r\n        for (const col of allColumns) {\r\n            if (col.type === 'boolean') {\r\n                if (!col.trueValueText) col.trueValueText = 'true';\r\n                if (!col.falseValueText) col.falseValueText = 'false';\r\n            }\r\n            if (col.lookups && col.lookups.length > 0) {\r\n                if (typeof col.lookups[0] === 'string') {\r\n                    const selectItemLookUps: SelectItem[] = (col.lookups as string[])\r\n                        .map(lookup => ({ value: lookup, text: lookup }));\r\n                    col.lookups = selectItemLookUps;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //alternative configuration by GridConfiguration-object instead of setting inputs and columns\r\n    public configureGrid(config: GridConfiguration<ListItem>) {\r\n        const ignoreFields = ['columns', 'datasource'];\r\n        for (const prop in config) {\r\n            if (!ignoreFields.includes(prop))\r\n                if (config[prop] !== undefined) this[prop] = config[prop];\r\n        }\r\n        this.columns = config.columns;\r\n    }\r\n\r\n    public getData(): object[] {\r\n        if (!this.listDatasource) return [];\r\n        const result = [];\r\n        for (const listItem of this.listDatasource.dataBackup) {\r\n            const resultItem = {};\r\n            result.push(resultItem);\r\n            for (const column of this.visibleColumns) {\r\n                if (column.fieldname)\r\n                    resultItem[column.text] = this.displayText(listItem, column);\r\n\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n\r\n    public downloadCSV(): void {\r\n        let csvConfig = this.csvConfig;\r\n        if (!csvConfig?.columns) {\r\n            const columns = this.getColumnsByColVisibility()\r\n                .filter(col => col?.fieldname)\r\n                .map(col => this.getCSVColumn(col));\r\n            csvConfig = { ... this.csvConfig, columns };\r\n        }\r\n        this.listDatasource.downloadDataAsCSV(this.csvFileName, csvConfig);\r\n    }\r\n\r\n    public downloadCsvWithData(data: ListItem[]): void {\r\n        const csvConfig = this.csvConfig ? { ...this.csvConfig } : {};\r\n        csvConfig.columns ??= this.getColumnsByColVisibility()\r\n            .filter(col => col?.fieldname)\r\n            .map(col => this.getCSVColumn(col));\r\n        this.listDatasource.downloadDataAsCSV(this.csvFileName, csvConfig, data);\r\n    }\r\n\r\n    private getCSVColumn(col: GridColumn<ListItem>): CSVColumn<ListItem> {\r\n        return {\r\n            fieldname: col.fieldname,\r\n            text: col.headerTitleGroup ? `${this.headerTitleGroups[col.headerTitleGroup].text} ${col.text}` : col.text,\r\n            digitsInfo: col.digitInfo as digitsInfo,\r\n            dateformat: col.dateFormat,\r\n            type: col.type,\r\n            lookups: col.lookups,\r\n            trueValueText: col.trueValueText,\r\n            falseValueText: col.falseValueText,\r\n        };\r\n    }\r\n\r\n    public displayText(listItem: any, column: GridColumn<ListItem>): string {\r\n        let value = listItem[column.fieldname];\r\n        const dateFormat = column.dateFormat ? column.dateFormat : 'mediumDate';\r\n        switch (column.type) {\r\n            case 'boolean':\r\n                if (value === true && column.trueValueText != undefined)\r\n                    value = column.trueValueText;\r\n                if (value === false && column.falseValueText != undefined)\r\n                    value = column.falseValueText;\r\n                break;\r\n            case 'lookup':\r\n                value = this.getLookupTextColumn(listItem, column);\r\n                break;\r\n            case 'date':\r\n                if (value)\r\n                    value = this.datePipe.transform(value as Date, dateFormat);\r\n                break;\r\n            case 'datetime':\r\n                if (value)\r\n                    value = this.datePipe.transform(value as Date, dateFormat) + ' ' + this.datePipe.transform(value as Date, 'mediumTime');\r\n                break;\r\n            case 'number':\r\n                if (value != undefined)\r\n                    value = this.decimalPipe.transform(value as number, column.digitInfo ? column.digitInfo : '1.0-2');\r\n                break;\r\n            case 'money':\r\n                if (value != undefined)\r\n                    value = this.currencyPipe.transform(value as number, undefined, undefined, column.digitInfo);\r\n                break;\r\n            default:\r\n                break;\r\n        }\r\n        if (column.unit)\r\n            value = `${value ?? ''} ${column.unit}`;\r\n        return value as string;\r\n    }\r\n\r\n    public getLookupTextColumn(listItem: any, column: GridColumn<ListItem>): string {\r\n        const value = listItem[column.fieldname];\r\n        const lookupItems = (column.lookups as SelectItem[]).filter((lookup: SelectItem) => lookup.value == value);\r\n        return lookupItems.length > 0 ? lookupItems[0].text : '';\r\n    }\r\n\r\n    public allowSortColumn(column: GridColumn<ListItem>): boolean {\r\n        return this.allowSort && (column.allowSort == undefined || column.allowSort);\r\n    }\r\n\r\n    public allowFilterColumn(column: GridColumn<ListItem>): boolean {\r\n        return this.allowFilter && (column.allowFilter == undefined || column.allowFilter);\r\n    }\r\n\r\n    public getFilterOperator(column: GridColumn<ListItem>): string {\r\n        if (column.filterOperator >= 0)\r\n            return FilterOperator[column.filterOperator];\r\n        else if (column.lookups)\r\n            return FilterOperator[FilterOperator.IsEqual];\r\n\r\n        let result: FilterOperator = null;\r\n        switch (column.type ?? 'text') {\r\n            case 'boolean':\r\n            case 'number':\r\n            case 'money':\r\n                result = FilterOperator.IsEqual;\r\n                break;\r\n            case 'url':\r\n            case 'tel':\r\n            case 'text':\r\n            case 'email':\r\n                result = FilterOperator[this.config.defaultStringFilterOperator];\r\n                break;\r\n            default:\r\n                result = FilterOperator.Contains;\r\n                break;\r\n        }\r\n        return FilterOperator[result];\r\n    }\r\n\r\n    private autoDetectIdFieldname(listItem: any) {\r\n        if (!this.idfield && listItem.id !== undefined)\r\n            this.idfield = 'id';\r\n\r\n        if (!this.idfield && listItem.Id !== undefined)\r\n            this.idfield = 'Id';\r\n\r\n        if (!this.idfield && listItem.ID !== undefined)\r\n            this.idfield = 'ID';\r\n\r\n        if (!this.idfield)\r\n            this.logger.warn('GridComponent: unknown idfield ');\r\n\r\n    }\r\n\r\n    private getListItemId(listItem: ListItem): Id {\r\n        this.autoDetectIdFieldname(listItem);\r\n        return listItem[this.idfield];\r\n    }\r\n\r\n    public buttonClicked(event: MouseEvent, ident: string, listItem: any) {\r\n        event.stopPropagation(); //prevents bubble of click-event to tr\r\n        const itemId = this.getListItemId(listItem);\r\n        this.onButtonClicked.emit({ buttonIdent: ident, itemId, event });\r\n        this.visibleColumns.flatMap(c => c.buttons ?? []).find(btn => btn.ident === ident)?.onClick?.(itemId);\r\n    }\r\n\r\n    public spanClicked(event: SpanClickEvent) {\r\n        const itemId = event.listItem ? this.getListItemId(event.listItem) : null;\r\n        this.onButtonClicked.emit({ buttonIdent: event.ident, itemId, event: event.event });\r\n\r\n        const spans = this.visibleColumns.flatMap(c => c.spans ?? []);\r\n        const titleSpans = this.visibleColumns.flatMap(c => c.titleSpans ?? []);\r\n        const spansWithIdent = [...spans, ...titleSpans].filter(span => span.ident === event.ident);\r\n        for (const span of spansWithIdent)\r\n            span.onClick?.(itemId);\r\n    }\r\n\r\n    public rowClick(event: MouseEvent, listItem: any) {\r\n        const listItemId = this.getListItemId(listItem);\r\n\r\n        if (this.disableSelectFieldName && listItem[this.disableSelectFieldName])\r\n            return;\r\n        if (this.allowMultiSelect && event.ctrlKey)\r\n            this.listDatasource.toggleSelection(listItemId);\r\n        else {\r\n            if (this.detailId !== listItem[this.idfield])\r\n                this.closeDetail();\r\n            this.listDatasource.focus(listItemId);\r\n        }\r\n\r\n        this.onRowClicked.emit({ itemId: listItemId, $event: event });\r\n    }\r\n\r\n    private onBeforeDatasourceRefresh() {\r\n        this.cyTotalRefreshCounter.update(x => x + 1);\r\n        this.cyCurrentRefreshCounter.update(x => x + 1);\r\n    }\r\n\r\n    private onAfterDatasourceRefresh() {\r\n        this.cyCurrentRefreshCounter.update(x => Math.max(0, x - 1));\r\n    }\r\n\r\n    private onFocus(listItemId: Id) {\r\n        if (this.showDetailMethod === 'focus')\r\n            this.toggleGridDetail(listItemId);\r\n    }\r\n\r\n    public toggleGridDetail(listItemId: Id) {\r\n        if (this.isRowDetailIdOpen(listItemId))\r\n            this.closeDetail();\r\n        else\r\n            this.setRowDetailId(listItemId);\r\n    }\r\n\r\n    public setRowDetailId(listItemId: Id) {\r\n        this.detailId = listItemId;\r\n        this.detailOpened.emit(listItemId);\r\n    }\r\n\r\n    public html5DragStart(event: DragEvent, listItem: ListItem) {\r\n        const listItemId = this.getListItemId(listItem);\r\n        this.onHtml5DragStart.emit({ itemId: listItemId, $event: event });\r\n    }\r\n\r\n    public isSelected(listItem: ListItem): boolean {\r\n        return this.listDatasource.isSelected(this.getListItemId(listItem));\r\n    }\r\n\r\n    public isFocused(listItem: ListItem): boolean {\r\n        return this.listDatasource.focusedId == this.getListItemId(listItem);\r\n    }\r\n\r\n    /** Die ID des geöffneten Grid Details */\r\n    public detailId?: Id = undefined;\r\n\r\n    public closeDetail() {\r\n        this.detailId = undefined;\r\n    }\r\n\r\n    public closeDetailByDropDown(event?: Event) {\r\n        if (this.showDetailMethod !== 'dropdown') return;\r\n        this.closeDetail();\r\n        event?.stopPropagation();\r\n    }\r\n\r\n    public isRowDetailIdOpen(listItemId: Id) {\r\n        return this.showRowDetail && this.detailId === listItemId;\r\n    }\r\n\r\n    public isRowDetailOpen(listItem: ListItem) {\r\n        const listItemId = this.getListItemId(listItem);\r\n        return this.isRowDetailIdOpen(listItemId);\r\n    }\r\n\r\n    public openDetail(event: Event, listItem: ListItem) {\r\n        if (this.showDetailMethod !== 'dropdown') return;\r\n        const id = this.getListItemId(listItem);\r\n        this.setRowDetailId(id);\r\n        event?.stopPropagation();\r\n    }\r\n\r\n    //--- column visbility handling\r\n\r\n    public visibilityKey(gridColumn: GridColumn): string {\r\n        if (gridColumn.fieldname && this.gridStoreKey)\r\n            return this.gridStoreKey + '.' + gridColumn.fieldname;\r\n        return null;\r\n    }\r\n\r\n    public colSelectDialog: ColSelectDialogComponent;\r\n    public showColSelectDialog() {\r\n        const dialogFields = this.visibleColumns\r\n            .filter((gridColumn: GridColumn<ListItem>) => gridColumn.fieldname)\r\n            .map((gridColumn: GridColumn<ListItem>) => ({\r\n                key: this.visibilityKey(gridColumn),\r\n                text: gridColumn.headerTitleGroup ? `${this.headerTitleGroups[gridColumn.headerTitleGroup].text} ${gridColumn.text}` : gridColumn.text,\r\n                hiddenByDefault: gridColumn.hiddenByDefault ?? false,\r\n                columnKey: this.visibilityKey(gridColumn),\r\n                type: 'boolean',\r\n            }));\r\n        this.bsModalRef = this.modalService.show(ColSelectDialogComponent, { initialState: { dialogFields } });\r\n        this.bsModalRef.content.closeBtnName = 'Close';\r\n    }\r\n\r\n    public columnClass(column: GridColumn<ListItem>, listItem: ListItem): string {\r\n        const base = column.bodyClass ? column.bodyClass : '';\r\n        const postfix = column.bodyClassFieldname ? listItem[column.bodyClassFieldname] : '';\r\n        return base + ' ' + postfix;\r\n    }\r\n\r\n    public getDefaultColumnTextAlignment(type?: GridColumnType) {\r\n        if (this.config.columnTypeTextAlignment && this.config.columnTypeTextAlignment[type] !== undefined)\r\n            return this.config.columnTypeTextAlignment[type];\r\n\r\n        const typesWithDefaultAlignRight: GridColumnType[] = ['number', 'money'];\r\n        return typesWithDefaultAlignRight.includes(type) ? 'right' : undefined;\r\n    }\r\n\r\n    //--- Buttns and Spans\r\n\r\n    public spansBefore(spans: GridColumnSpan[] | GridTitleSpan[]): Array<GridColumnSpan<ListItem>> {\r\n        return spans?.filter(span => span.positionBefore == undefined || span.positionBefore) ?? [];\r\n    }\r\n\r\n    public spansAfter(spans: GridColumnSpan[] | GridTitleSpan[]): Array<GridColumnSpan<ListItem>> {\r\n        return spans?.filter(span => span.positionBefore != undefined && !span.positionBefore) ?? [];\r\n    }\r\n\r\n    public getButtonClass(listItem: ListItem, btn: GridColumnButton<ListItem>): string {\r\n        const size = this.small ? 'btn-xs' : 'btn-sm';\r\n        const base = btn.buttonClass ? btn.buttonClass : '';\r\n        const postfix = btn.buttonClassFieldname ? listItem[btn.buttonClassFieldname] : '';\r\n        return size + ' ' + base + ' ' + postfix;\r\n    }\r\n\r\n    public getButtonIconClass(listItem: ListItem, btn: GridColumnButton<ListItem>): string {\r\n        let result = btn.iconClass ?? '';\r\n        if (btn.iconClassFieldname) result = [result, listItem[btn.iconClassFieldname]].join(' ');\r\n        return result;\r\n    }\r\n\r\n    //-- DragDrop\r\n    private onRowDrop(dropEvent: any) {\r\n        if (!(this.dragulaBag() && this.dragulaBag() === dropEvent.name))\r\n            return;\r\n\r\n        const gridDropEvent: GridDropEvent = new GridDropEvent();\r\n        const id = dropEvent.el.attributes['data-id'].value;\r\n        gridDropEvent.editItem = this.listDatasource.getDataItem(id);\r\n        gridDropEvent.sourceContainer = dropEvent.source;\r\n        gridDropEvent.destinationContainer = dropEvent.target;\r\n        gridDropEvent.dropElement = dropEvent.el;\r\n\r\n        gridDropEvent.nextElement = dropEvent.sibling;\r\n        const nextId = dropEvent.sibling && dropEvent.sibling.attributes['data-id'] ? dropEvent.sibling.attributes['data-id'].value : null;\r\n        if (nextId)\r\n            gridDropEvent.nextItem = this.listDatasource.getDataItem(nextId);\r\n\r\n        const bag = this.dragulaService.find(dropEvent.name);\r\n        if (bag) (bag.drake as any).cancel(true); //prevents changes of HTML DOM\r\n        if (gridDropEvent.editItem) this.onDrop.emit(gridDropEvent);\r\n    }\r\n\r\n    private onRowRemove(event: any) {\r\n        if (!(this.dragulaBag() && this.dragulaBag() === event.name))\r\n            return;\r\n\r\n        const gridDropRemoveEvent: GridDropRemoveEvent = new GridDropRemoveEvent();\r\n        const id = event.el.attributes['data-id'].value;\r\n        gridDropRemoveEvent.editItem = this.listDatasource.data.find(ld => ld[this.idfield] == id);\r\n        gridDropRemoveEvent.sourceContainer = event.source;\r\n        this.onDragulaRemove.emit(gridDropRemoveEvent);\r\n    }\r\n\r\n    public fieldValueModelChange(event, gridColumn: GridColumn<ListItem>, listItem: ListItem) {\r\n        //console.log(JSON.stringify(gridColumn));\r\n        //console.log(JSON.stringify(listItem));\r\n    }\r\n\r\n    public getSelectOptionValue(lookup: unknown) {\r\n        if (typeof lookup === 'string') return lookup.toLocaleLowerCase();\r\n        return lookup;\r\n    }\r\n\r\n    private getColumnsByColVisibility() {\r\n        const columnVisibilities = this.visibleColumns.map(c => this.colVisibilityService.isColumnVisible(this.visibilityKey(c), c.hiddenByDefault));\r\n        return this.visibleColumns.filter((_, i) => columnVisibilities[i]);\r\n    }\r\n\r\n    private formatAggregate(col: GridColumn<ListItem>, agg: AggregateFunctionGridConfig) {\r\n        const value = this.listDatasource.aggregateFunctions.getValue(col.fieldname, agg.operator);\r\n        return new AggregateFunctionFormatter(agg, col, value).getText(this.decimalPipe, this.currencyPipe);\r\n    }\r\n\r\n    public getAggregateFooterText(col: GridColumn<ListItem>) {\r\n        return (col.aggregateFunctions ?? []).filter(agg => agg.showInFooterRow ?? false)\r\n            .map(agg => this.formatAggregate(col, agg))\r\n            .join(' | ');\r\n    }\r\n\r\n    public getAggregateTitleText(col: GridColumn<ListItem>) {\r\n        return (col.aggregateFunctions ?? []).filter(agg => agg.showInTooltip ?? true)\r\n            .map(agg => this.formatAggregate(col, agg))\r\n            .join(' | ');\r\n    }\r\n\r\n    public getEditColLabel(col: GridColumn<ListItem>) {\r\n        return this.i18n.replace($localize`:@@Grid.Edit.Col.act.Label:Bearbeite $0`, [col.text]);\r\n    }\r\n\r\n    private updateShowFooter() {\r\n        const columns = this.getColumnsByColVisibility();\r\n        this.showFooter = columns.flatMap(col => col.aggregateFunctions ?? []).some(agg => agg.showInFooterRow);\r\n    }\r\n\r\n    private setDefaultConfigurations() {\r\n        this.small = this.config.columnSize === 'small';\r\n        this.allowKeyboardShortCuts = this.config.allowKeyboardShortCuts;\r\n        this.minHeight = this.config.minHeight;\r\n        this.maxHeight = this.config.maxHeight;\r\n        this.gridClass = this.config.gridClass;\r\n        this.allowCSVDownload = this.config.allowCSVDownload;\r\n        this.allowFilter = this.config.allowFilter;\r\n        this.allowSort = this.config.allowSort;\r\n        this.allowPaging = this.config.allowPaging;\r\n        this.showRowDetail = this.config.showRowDetail;\r\n        this.showDetailMethod = this.config.showDetailMethod;\r\n        this.paginationInfoVariant = this.config.paginationInfoVariant;\r\n        this.allowSelectPageSize = this.config.allowSelectPageSize;\r\n        this.pageSizes = this.config.pageSizes;\r\n        this.allowMultiSelect = this.config.allowMultiSelect;\r\n        this.showEmptyGrid = this.config.showEmptyGrid;\r\n        this.emptyGridText = this.config.emptyGridText;\r\n        this.filterFieldsVisible = this.config.filterFieldsVisible;\r\n        this.sortItemAlign = this.config.sortItemAlign;\r\n        this.showSelectCheckBoxes = this.config.showSelectCheckBoxes;\r\n        this.tableHover = this.config.tableHover;\r\n        this.idfield = this.config.idfield;\r\n        this.hideColSelectBtn = this.config.hideColSelectBtn;\r\n        this.allowPrintDownload = this.config.allowPrintDownload;\r\n        this.showSelectedIdsNotFoundWarning = this.config.showSelectedIdsNotFoundWarning;\r\n    }\r\n\r\n    public printGrid() {\r\n        this.printService.printNode(this.getNode(), false, this.printTitle);\r\n    }\r\n\r\n    private getNode() {\r\n        const newDiv = document.createElement('div');\r\n        newDiv.classList.add('print-grid-container');\r\n        if (this.printTitle) {\r\n            const h1 = document.createElement('h1');\r\n            h1.innerText = this.printTitle;\r\n            h1.classList.add('print');\r\n            newDiv.appendChild(h1);\r\n        }\r\n        newDiv.appendChild(this.swtGridDiv.nativeElement.cloneNode(true));\r\n        return newDiv;\r\n    }\r\n\r\n    public readonly scrollbar = viewChild(NgScrollbar);\r\n\r\n    private scrollEventBlocked = false;\r\n    public scrollToPosition(posX: number, posY: number) {\r\n        this.scrollEventBlocked = true;\r\n        this.scrollbar().scrollTo({\r\n            left: posX,\r\n            top: posY,\r\n            duration: 0\r\n        });\r\n    }\r\n\r\n    @Output() public scrolledToPosition: EventEmitter<ScrollEvent> = new EventEmitter<ScrollEvent>();\r\n    public scroll(event: any) {\r\n        if (!this.scrollEventBlocked)\r\n            this.scrolledToPosition.emit({ posX: event.srcElement.scrollLeft, posY: event.srcElement.scrollTop } as ScrollEvent);\r\n\r\n        this.scrollEventBlocked = false;\r\n    }\r\n\r\n    private calcFirstItemsOfGroups() {\r\n        const firstItemIds = [];\r\n        let lastGroupValues: ListItem[Extract<keyof ListItem, string>][] = null;\r\n        for (const item of this.datasource().dataSignal()) {\r\n            const values = this.groupByColumnsSignal().map(col => item[col.fieldname]);\r\n            const isSameGroup = lastGroupValues !== null && values.every((v, i) => v === lastGroupValues[i]);\r\n            if (!isSameGroup) {\r\n                firstItemIds.push(this.getListItemId(item));\r\n                lastGroupValues = values;\r\n            }\r\n        }\r\n        return firstItemIds;\r\n    }\r\n\r\n    public isFirstItemOfGroup(item: ListItem) {\r\n        return this.firstItemsOfGroup?.includes(this.getListItemId(item));\r\n    }\r\n\r\n    //Benötigt für typedTemplateDirective\r\n    public columnTemplateParam: { listItem: ListItem; column: GridColumn<ListItem>; };\r\n\r\n    public getInputType(type: GridColumnType) {\r\n        switch (type) {\r\n            case 'money': return 'number';\r\n            case 'datetime': return 'datetime-local';\r\n            case 'boolean': return 'checkbox';\r\n            default: return type;\r\n        }\r\n    }\r\n}\r\n\r\nclass AggregateFunctionFormatter<T> implements AggregateFunctionConfig {\r\n    constructor(config: AggregateFunctionConfig, col: GridColumn<T>, private value: number) {\r\n        this.type = col.type;\r\n        this.operator = config.operator;\r\n        this.unit = config.unit ?? (this.useFallbackColumnUnit ? col.unit : undefined) ?? '';\r\n        this.format = config.format ?? col.digitInfo ?? this.formatAsMoney ? '1.2' : '1.0-2';\r\n        this.prefix = config.prefix ?? aggregateFunctionImplementations[config.operator].defaultPrefix;\r\n    }\r\n\r\n    public operator: AggregateFunctionOperator;\r\n    public unit: string;\r\n    public format: string;\r\n    public prefix: string;\r\n    public type: string;\r\n\r\n    public getText(decimalPipe: DecimalPipe, currencyPipe: CurrencyPipe): string {\r\n        const unitStr = this.unit ? ` ${this.unit}` : '';\r\n\r\n        if (this.value === undefined)\r\n            return `${this.prefix}-`;\r\n\r\n        const valueString = this.formatAsMoney\r\n            ? currencyPipe.transform(this.value, undefined, undefined, this.format) + unitStr\r\n            : decimalPipe.transform(this.value, this.format) + unitStr;\r\n        return `${this.prefix}${valueString}`;\r\n    }\r\n\r\n    private get formatAsMoney() {\r\n        return this.type === 'money' && this.useFallbackColumnUnit;\r\n    }\r\n\r\n    /**\r\n     * 'count' soll nicht die Einheit der Spalte anzeigen\r\n     */\r\n    private get useFallbackColumnUnit() {\r\n        return ['sum', 'min', 'max'].includes(this.operator);\r\n    }\r\n}\r\n\r\nclass HeaderTitleGroupCol implements IHeaderTitleGroup {\r\n\r\n    constructor(public key: string | null, public span = 1, data?: IHeaderTitleGroup) {\r\n        this.text = data?.text;\r\n        this.title = data?.title;\r\n    }\r\n\r\n    public text: string;\r\n    public title: string;\r\n\r\n    public get isEmpty() { return !this.key || this.span === 0; }\r\n\r\n    public static get empty() { return new HeaderTitleGroupCol(null, 0); }\r\n}\r\n","<loading-indicator #loadingIndicator>\r\n\r\n    <div #swtGrid class=\"dataTables_wrapper dt-bootstrap table-responsive\" sneat-class=\"sneat-table\"\r\n        [style.min-height]=\"listDatasource.hasData || showEmptyGrid ? minHeight:''\" [style.max-height]=\"maxHeight\"\r\n        style=\"position:relative;overflow-y:visible\">\r\n        <div class=\"table-wrapper\" [ngClass]=\"stickyHeader ? 'sticky': ''\" [style.max-height]=\"maxHeightTable\">\r\n            <ng-scrollbar [style.max-height]=\"maxHeightTable\">\r\n                @if (listDatasource.hasData || showEmptyGrid) {\r\n                    <table #table tabindex=\"0\" (keydown)=\"onKeydownHandler($event)\" [id]=\"gridId\"\r\n                        class=\"table table-striped no-margins dataTable {{gridClass}}\"\r\n                        [ngClass]=\"{'small table-sm':small, 'table-condensed':small,'table-hover':tableHover,'table-fixed':rowHeight>0, 'table-grouped': !!grouped}\">\r\n                        <thead>\r\n                            @if (headerTitleGroupColumns) {\r\n                                <tr class=\"header-groups\">\r\n                                    @if (showSelectCheckBoxes) {\r\n                                        <td class=\"empty-th\"></td>\r\n                                    }\r\n                                    @if (html5Draggable) {\r\n                                        <td class=\"empty-th\"></td>\r\n                                    }\r\n                                    @if (dragulaShowIcon()) {\r\n                                        <td class=\"empty-th\"></td>\r\n                                    }\r\n                                    @if (showRowDetail) {\r\n                                        <td class=\"empty-th\"></td>\r\n                                    }\r\n                                    @for (titleGroup of headerTitleGroupColumns; track titleGroup) {\r\n                                        @if (!titleGroup.isEmpty) {\r\n                                            <th class=\"header-group\"\r\n                                                [colSpan]=\"titleGroup.span\" [title]=\"titleGroup.title ?? ''\">\r\n                                                {{ titleGroup.text }}\r\n                                            </th>\r\n                                        } @else {\r\n                                            <td class=\"empty-th\"></td>\r\n                                        }\r\n                                    }\r\n                                </tr>\r\n                            }\r\n                        <tr [style.height.px]=\"headerRowHeight\">\r\n                            <!-- Keine leeren th's aufgrund von Barrierefreiheit erlaubt: https://webaim.org/standards/wcag/checklist#sc1.3.1 -->\r\n                            @if (showSelectCheckBoxes) {\r\n                                <td class=\"min-column empty-th\"></td>\r\n                            }\r\n                            @if (html5Draggable) {\r\n                                <td class=\"min-column empty-th\"></td>\r\n                            }\r\n                            @if (dragulaShowIcon()) {\r\n                                <td class=\"min-column empty-th\"></td>\r\n                            }\r\n                            @if (showRowDetail) {\r\n                                <td class=\"min-column empty-th\"></td>\r\n                            }\r\n                            @for (column of visibleColumns; track $index) {\r\n                                <th [title]=\"column.title ?? ''\" [col-hide]=\"visibilityKey(column)\"\r\n                                    [hidden-by-default]=\"column.hiddenByDefault\"\r\n                                    [ds-sort]=\"allowSortColumn(column) ? column.fieldname : ''\"\r\n                                    [datasource]=\"listDatasource\" [style.minWidth]=\"column.minWidth\"\r\n                                    [style.width]=\"column.width\"\r\n                                    [ngClass]=\"[column.headerClass ?? '', column.headerTitleGroup ? 'header-tab' : '']\"\r\n                                    [ds-sort-icon-align]=\"sortItemAlign\"\r\n                                    [attr.aria-label]=\"column.type === 'buttons' ? 'Buttons' : column.text\">\r\n                                    <grid-cell-span [spans]=\"spansBefore(column.titleSpans)\"\r\n                                        (spanClick)=\"spanClicked($event)\"></grid-cell-span>\r\n                                    {{ column.text }}\r\n                                    <grid-cell-span [spans]=\"spansAfter(column.titleSpans)\"\r\n                                        (spanClick)=\"spanClicked($event)\"></grid-cell-span>\r\n                                </th>\r\n                            }\r\n                        </tr>\r\n                            @if (allowFilter) {\r\n                                <tr class=\"no-print\" #filterItems [style.height.px]=\"filterRowHeight\">\r\n                                    @if (showSelectCheckBoxes) {\r\n                                        <td class=\"min-column\">\r\n                                            @if (allowMultiSelect) {\r\n                                                <ds-selection-checkbox [aria-label]=\"selectAllRowsLabel\"\r\n                                                    [datasource]=\"listDatasource\">\r\n                                                </ds-selection-checkbox>\r\n                                            }\r\n                                        </td>\r\n                                    }\r\n                                    @if (html5Draggable) {\r\n                                        <td class=\"min-column\"></td>\r\n                                    }\r\n                                    @if (dragulaShowIcon()) {\r\n                                        <td class=\"min-column\"></td>\r\n                                    }\r\n                                    @if (showRowDetail) {\r\n                                        <td class=\"min-column\"></td>\r\n                                    }\r\n                                    @for (column of visibleColumns; track $index) {\r\n                                        <td [col-hide]=\"visibilityKey(column)\"\r\n                                            [hidden-by-default]=\"column.hiddenByDefault\"\r\n                                            [ngClass]=\"column.headerClass\">\r\n                                            @if (allowFilterColumn(column)) {\r\n                                                @switch (column.type) {\r\n                                                    @default {\r\n                                                        @if (!column.lookups) {\r\n                                                            <input from [id]=\"gridIdPrefix+column.fieldname\"\r\n                                                                class=\"form-control no-spinners\" type=\"{{column.type}}\"\r\n                                                                [ds-filter]=\"column.fieldname\"\r\n                                                                [datasource]=\"listDatasource\"\r\n                                                                [ds-filter-operator]=\"getFilterOperator(column)\"\r\n                                                                [attr.aria-label]=\"column.text\"/>\r\n                                                        }\r\n                                                        @if (column.lookups) {\r\n                                                            @switch (column.filterSelectOption) {\r\n                                                                @default {\r\n                                                                    <select [id]=\"gridIdPrefix+column.fieldname\"\r\n                                                                        class=\"form-control\"\r\n                                                                        [ds-filter]=\"column.fieldname\"\r\n                                                                        [attr.aria-label]=\"column.text\"\r\n                                                                        ds-filter-operator=\"IsEqual\"\r\n                                                                        [datasource]=\"listDatasource\">\r\n                                                                        <option value=\"\"\r\n                                                                            i18n=\"@@Grid.All.dsp.Label\">(alle)\r\n                                                                        </option>\r\n                                                                        @for (\r\n                                                                            lookUp of $any(column.lookups); track lookUp) {\r\n                                                                            <option\r\n                                                                                [value]=\"getSelectOptionValue(lookUp.value)\">\r\n                                                                                {{ lookUp.text }}\r\n                                                                            </option>\r\n                                                                        }\r\n                                                                    </select>\r\n                                                                }\r\n                                                                @case ('multi') {\r\n                                                                    <multi-select-filter [datasource]=\"listDatasource\"\r\n                                                                        [fieldNames]=\"column.fieldname\"\r\n                                                                        [lookups]=\"column.lookups\"></multi-select-filter>\r\n                                                                }\r\n                                                            }\r\n                                                        }\r\n                                                    }\r\n                                                    @case ('boolean') {\r\n                                                        <select [id]=\"gridIdPrefix+column.fieldname\"\r\n                                                            class=\"form-control\"\r\n                                                            [ds-filter]=\"column.fieldname\"\r\n                                                            [ds-filter-operator]=\"'IsEqual'\"\r\n                                                            [datasource]=\"listDatasource\"\r\n                                                            [attr.aria-label]=\"column.text\">\r\n                                                            <option value=\"\" i18n=\"@@Grid.All.dsp.Label\">(alle)</option>\r\n                                                            <option value=\"true\">{{ column.trueValueText }}</option>\r\n                                                            <option value=\"false\">{{ column.falseValueText }}</option>\r\n                                                        </select>\r\n                                                    }\r\n                                                    @case ('buttons') {\r\n                                                    }\r\n                                                    @case ('empty') {\r\n                                                    }\r\n                                                }\r\n                                            }\r\n                                        </td>\r\n                                    }\r\n                                </tr>\r\n                            }\r\n                        </thead>\r\n                        <tbody [id]=\"name\" [dragula]=\"dragulaBag()\">\r\n                            @for (listItem of listDatasource.data; track listItem[idfield]) {\r\n                                @if (grouped && isFirstItemOfGroup(listItem)) {\r\n                                    <tr class=\"group-tr\">\r\n                                        <td [title]=\"groupByColumn.title ?? ''\"\r\n                                            [ds-sort]=\"allowSortColumn(groupByColumn) ? groupByColumn.fieldname : ''\"\r\n                                            [datasource]=\"listDatasource\" [ngClass]=\"[groupByColumn.headerClass ?? '']\"\r\n                                            [ds-sort-icon-align]=\"sortItemAlign\" [attr.colspan]=\"numOfVisibleColumns\">\r\n                                            @for (column of groupByColumns; track column) {\r\n                                                @if (column.text) {\r\n                                                    <span>{{ column.text }}: </span>\r\n                                                }\r\n                                                <ng-container [ngTemplateOutlet]=\"columnTemplate\"\r\n                                                    [ngTemplateOutletContext]=\"{ column, listItem }\"></ng-container>\r\n                                            }\r\n                                        </td>\r\n                                    </tr>\r\n                                }\r\n                                <tr class=\"dragula-handle grid-row grid-row-item {{listItem[rowClassFieldName] ?? ''}}\"\r\n                                    [style.height.px]=\"rowHeight\" [attr.data-id]=\"listItem[idfield]\"\r\n                                    (click)=\"rowClick($event,listItem)\" [ngClass]=\"{active:isSelected(listItem)}\"\r\n                                    [style.cursor]=\"rowCursorClass\" [attr.role]=\"'button'\">\r\n                                    @if (showSelectCheckBoxes) {\r\n                                        <td class=\"min-column\">\r\n                                            <ds-selection-checkbox [aria-label]=\"selectRowLabel\"\r\n                                                [ds-select]=\"listItem[idfield]\"\r\n                                                [allowMultiSelect]=\"allowMultiSelect\" [datasource]=\"listDatasource\"\r\n                                                [disable]=\"listItem[disableSelectFieldName]\">\r\n                                            </ds-selection-checkbox>\r\n                                        </td>\r\n                                    }\r\n                                    @if (html5Draggable) {\r\n                                        <td class=\"min-column\">\r\n                                            <i class=\"ui-draggable fa fa-arrows\"\r\n                                                (dragstart)=\"html5DragStart($event,listItem)\"\r\n                                                [draggable]=\"true\" [title]=\"html5Draggable\"></i>\r\n                                        </td>\r\n                                    }\r\n                                    @if (dragulaShowIcon()) {\r\n                                        <td class=\"min-column\">\r\n                                            <i class=\"ui-draggable fa fa-arrows\" [ngClass]=\"dragulaDragHandleClass()\"></i>\r\n                                        </td>\r\n                                    }\r\n                                    @if (showRowDetail) {\r\n                                        <ng-container [style.height.px]=\"rowHeight\">\r\n                                            @if (!isRowDetailOpen(listItem)) {\r\n                                                <td class=\"min-column\"\r\n                                                    (click)=\"openDetail($event, listItem)\">\r\n                                                    <i class=\"far fa-chevron-square-right grid-detail-toggle-icon\"></i>\r\n                                                </td>\r\n                                            }\r\n                                            @if (isRowDetailOpen(listItem)) {\r\n                                                <td class=\"min-column\"\r\n                                                    (click)=\"closeDetailByDropDown($event)\">\r\n                                                    <i class=\"far fa-chevron-square-down grid-detail-toggle-icon\"></i>\r\n                                                </td>\r\n                                            }\r\n                                        </ng-container>\r\n                                    }\r\n                                    @for (column of visibleColumns; track $index) {\r\n                                        <td [col-hide]=\"visibilityKey(column)\"\r\n                                            [hidden-by-default]=\"column.hiddenByDefault\"\r\n                                            [ngClass]=\"columnClass(column,listItem)\"\r\n                                            [style.text-align]=\"column.textAlign ?? getDefaultColumnTextAlignment(column.type)\"\r\n                                            [title]=\"getAggregateTitleText(column)\">\r\n                                            <ng-container [ngTemplateOutlet]=\"columnTemplate\"\r\n                                                [ngTemplateOutletContext]=\"{ column, listItem }\"></ng-container>\r\n                                        </td>\r\n                                    }\r\n                                </tr>\r\n                                @if (isRowDetailOpen(listItem)) {\r\n                                    <tr\r\n                                        class=\"grid-row grid-row-detail {{listItem[rowDetailClassFieldName] ?? ''}}\"\r\n                                        [ngClass]=\"{active:isSelected(listItem)}\">\r\n                                        <td [attr.colspan]=\"numOfVisibleColumns\">\r\n                                            <ng-content></ng-content>\r\n                                        </td>\r\n                                    </tr>\r\n                                }\r\n                            }\r\n                            @if (listDatasource.hasData && showFooter) {\r\n                                <tr class=\"grid-row grid-aggregate-row\">\r\n                                    @if (showSelectCheckBoxes) {\r\n                                        <td class=\"min-column\"></td>\r\n                                    }\r\n                                    @if (html5Draggable) {\r\n                                        <td class=\"min-column\"></td>\r\n                                    }\r\n                                    @if (dragulaShowIcon()) {\r\n                                        <td class=\"min-column\"></td>\r\n                                    }\r\n                                    @if (showRowDetail) {\r\n                                        <td class=\"min-column\"></td>\r\n                                    }\r\n                                    @for (column of visibleColumns; track column) {\r\n                                        <td\r\n                                            [style.text-align]=\"column.textAlign ?? getDefaultColumnTextAlignment(column.type)\"\r\n                                            [col-hide]=\"visibilityKey(column)\"\r\n                                            [hidden-by-default]=\"column.hiddenByDefault\">\r\n                      <span class=\"m-r-xs\">\r\n                        {{ getAggregateFooterText(column) }}\r\n                      </span>\r\n                                        </td>\r\n                                    }\r\n                                </tr>\r\n                            }\r\n                            @if (!listDatasource.hasData && showEmptyGrid) {\r\n                                <tr class=\"grid-row grid-row-empty\">\r\n                                    <td [attr.colspan]=\"numOfVisibleColumns\">\r\n                                        <small>{{ emptyGridText }}</small>\r\n                                    </td>\r\n                                </tr>\r\n                            }\r\n                        </tbody>\r\n                    </table>\r\n                }\r\n            </ng-scrollbar>\r\n        </div>\r\n        @if (showSelectedIdsNotFoundWarning && listDatasource.notFoundSelectedIds().length > 0 && !datasourceHasExternalRefresh) {\r\n            <p\r\n                class=\"alert alert-warning\" sneat-class=\"alert-dismissible mt-2\"\r\n                i18n-title=\"@@Grid.ItemIdNotFound.msg.Tooltip\"\r\n                title=\"Möglicherweise verhindert eine aktuelle Filtereinstellung das Laden\">\r\n        <span i18n=\"@@Grid.ItemIdNotFound.msg.Text\">\r\n                Es sind Datensätze als selektiert markiert, welche nicht geladen werden konnten\r\n            </span>\r\n                <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"\r\n                    inspinia-class=\"hidden\">\r\n                </button>\r\n            </p>\r\n        }\r\n        <ds-filterdisplay [datasource]=\"listDatasource\" [filterFieldsVisible]=\"filterFieldsVisible\"></ds-filterdisplay>\r\n        @if ((gridStoreKey && !hideColSelectBtn) || allowCSVDownload || allowPaging) {\r\n            <div\r\n                class=\"clearfix grid-footer\">\r\n                @if (gridStoreKey && !hideColSelectBtn) {\r\n                    <div class=\"dataTables_info\" inspinia-class=\"pull-left\"\r\n                        sneat-class=\"float-start\">\r\n                        <button class=\"btn btn-xs btn-link ignore-no-edit\" (click)=\"showColSelectDialog()\"\r\n                            title=\"Sichtbare Spalten auswählen\" i18n-title=\"@@Grid.SelectVisibleCol.act.Tooltip\">\r\n                            <a><i class=\"fa fal fa-table\"></i></a>\r\n                        </button>\r\n                    </div>\r\n                }\r\n                @if (allowCSVDownload) {\r\n                    <div class=\"dataTables_info m-l-xs m-r-xs\" inspinia-class=\"pull-left\"\r\n                        sneat-class=\"float-start\">\r\n                        <button class=\"btn btn-xs btn-link ignore-no-edit\" (click)=\"downloadCSV()\"\r\n                            title=\"Daten als CSV-Datei speichern\" i18n-title=\"@@Grid.DownloadCSV.act.Label\">\r\n                            <i class=\"fa fal fa-arrow-to-bottom\"></i>\r\n                        </button>\r\n                    </div>\r\n                }\r\n                @if (allowPrintDownload) {\r\n                    <div class=\"dataTables_info m-l-xs m-r-xs\" inspinia-class=\"pull-left\"\r\n                        sneat-class=\"float-start\">\r\n                        <button class=\"btn btn-xs btn-link ignore-no-edit\" (click)=\"printGrid()\" title=\"Daten drucken\"\r\n                            i18n-title=\"@@Grid.DownloadPrint.act.Label\">\r\n                            <i class=\"fa fal fa-print\"></i>\r\n                        </button>\r\n                    </div>\r\n                }\r\n                @if (allowPaging) {\r\n                    @if (paginationInfoVariant !== 'pageOnly') {\r\n                        <div class=\"no-padding m-l-xs\" inspinia-class=\"pull-left\"\r\n                            sneat-class=\"float-start\">\r\n                            <ds-pagination-info [datasource]=\"listDatasource\" [variant]=\"paginationInfoVariant\">\r\n                            </ds-pagination-info>\r\n                        </div>\r\n                    }\r\n                    <div class=\"no-margin no-padding\" inspinia-class=\"pull-right\" sneat-class=\"float-end\">\r\n                        <ds-pagination [datasource]=\"listDatasource\" [variant]=\"paginationInfoVariant\"></ds-pagination>\r\n                    </div>\r\n                    @if (allowSelectPageSize) {\r\n                        <div class=\"no-padding\" inspinia-class=\"pull-right m-r-md\"\r\n                            sneat-class=\"float-end me-4\">\r\n                            <ds-pagination-size-selector [datasource]=\"listDatasource\" [pageSizes]=\"pageSizes\">\r\n                            </ds-pagination-size-selector>\r\n                        </div>\r\n                    }\r\n                }\r\n            </div>\r\n        }\r\n    </div>\r\n    @if (!listDatasource.hasData && !showEmptyGrid) {\r\n        <div [dragula]=\"dragulaBag()\" class=\"dataTables_wrapper dt-bootstrap table-responsive\"\r\n        >\r\n            <small>{{ emptyGridText }}</small>\r\n        </div>\r\n    }\r\n</loading-indicator>\r\n\r\n<ng-template #columnTemplate [typedTemplate]=\"columnTemplateParam\" let-column=\"column\" let-listItem=\"listItem\">\r\n    @switch (column.type) {\r\n        @default {\r\n            @if (column.edit) {\r\n                @if (column.type === 'lookup') {\r\n                    <select [attr.aria-label]=\"getEditColLabel(listItem)\" class=\"form-control\"\r\n                        [(ngModel)]=\"listItem[column.fieldname]\">\r\n                        @for (lookupItem of $any(column.lookups); track lookupItem.value) {\r\n                            <option [value]=\"lookupItem.value\">\r\n                                {{ lookupItem.text }}\r\n                            </option>\r\n                        }\r\n                    </select>\r\n                } @else {\r\n                    <input [attr.aria-label]=\"getEditColLabel(listItem)\" [type]=\"getInputType(column.type)\"\r\n                        class=\"form-control no-spinners\" [(ngModel)]=\"listItem[column.fieldname]\"\r\n                        (ngModelChange)=\"fieldValueModelChange($event,column,listItem)\"/>\r\n                }\r\n            }\r\n            @if (!column.edit) {\r\n                <grid-cell-span [spans]=\"spansBefore(column.spans)\" [listItem]=\"listItem\"\r\n                    (spanClick)=\"spanClicked($event)\"></grid-cell-span>\r\n                @if (!column.hideFieldValue) {\r\n                    <span class=\"m-r-xs\">{{ displayText(listItem, column) }}</span>\r\n                }\r\n                <grid-cell-span [spans]=\"spansAfter(column.spans)\" [listItem]=\"listItem\"\r\n                    (spanClick)=\"spanClicked($event)\"></grid-cell-span>\r\n            }\r\n        }\r\n        @case ('url') {\r\n            <a href=\"{{displayText(listItem,column)}}\">\r\n                <grid-cell-span [spans]=\"spansBefore(column.spans)\" [listItem]=\"listItem\"\r\n                    (spanClick)=\"spanClicked($event)\"></grid-cell-span>\r\n                @if (!column.hideFieldValue) {\r\n                    <span class=\"m-r-xs\">{{ displayText(listItem, column) }}</span>\r\n                }\r\n                <grid-cell-span [spans]=\"spansAfter(column.spans)\" [listItem]=\"listItem\"\r\n                    (spanClick)=\"spanClicked($event)\"></grid-cell-span>\r\n            </a>\r\n        }\r\n        @case ('email') {\r\n            <a href=\"mailto:{{displayText(listItem,column)}}\">\r\n                <grid-cell-span [spans]=\"spansBefore(column.spans)\" [listItem]=\"listItem\"\r\n                    (spanClick)=\"spanClicked($event)\"></grid-cell-span>\r\n                @if (!column.hideFieldValue) {\r\n                    <span class=\"m-r-xs\">{{ displayText(listItem, column) }}</span>\r\n                }\r\n                <grid-cell-span [spans]=\"spansAfter(column.spans)\" [listItem]=\"listItem\"\r\n                    (spanClick)=\"spanClicked($event)\"></grid-cell-span>\r\n            </a>\r\n        }\r\n        @case ('tel') {\r\n            <a href=\"tel:{{displayText(listItem,column)}}\">\r\n                <grid-cell-span [spans]=\"spansBefore(column.spans)\" [listItem]=\"listItem\"\r\n                    (spanClick)=\"spanClicked($event)\"></grid-cell-span>\r\n                @if (!column.hideFieldValue) {\r\n                    <span class=\"m-r-xs\">{{ displayText(listItem, column) }}</span>\r\n                }\r\n                <grid-cell-span [spans]=\"spansAfter(column.spans)\" [listItem]=\"listItem\"\r\n                    (spanClick)=\"spanClicked($event)\"></grid-cell-span>\r\n            </a>\r\n        }\r\n        @case ('buttons') {\r\n            @if (!column.buttonsAsDropdown) {\r\n                <div>\r\n                    @for (btn of column.buttons; track btn) {\r\n                        <button type=\"button\" class=\"btn m-r-xs {{btn.buttonClass}}\"\r\n                            inspinia-class=\"m-r-xs\" sneat-class=\"me-1\" [attr.data-ident]=\"btn.ident\"\r\n                            [disabled]=\"btn.disabledFieldname && listItem[btn.disabledFieldname]\"\r\n                            [ngClass]=\"getButtonClass(listItem,btn)\" [title]=\"btn.tooltip\"\r\n                            (click)=\"buttonClicked($event,btn.ident,listItem)\">\r\n                            @if (btn.iconClass || btn.iconClassFieldname) {\r\n                                <i class=\"fa\" sneat-class=\"me-1\"\r\n                                    [ngClass]=\"getButtonIconClass(listItem, btn)\"></i>\r\n                            }\r\n                            {{ btn.text }}\r\n                        </button>\r\n                    }\r\n                </div>\r\n            }\r\n            @if (column.buttonsAsDropdown) {\r\n                <div>\r\n                    <div class=\"btn-group\" dropdown container=\"body\" placement=\"bottom right\">\r\n                        <a id=\"single-button\" dropdownToggle (click)=\"$event.stopPropagation()\"\r\n                            [class]=\"column.buttonsAsDropdownClass\">\r\n                <span class=\"clear\">\r\n                  <span class=\"text-muted text-xs block dropdown-toggle\">\r\n                    {{ column.buttonsAsDropdown }}\r\n                      <b class=\"caret\"></b>\r\n                  </span>\r\n                </span>\r\n                        </a>\r\n                        <ul class=\"dropdown-menu dropdown-menu-right\" *dropdownMenu role=\"menu\"\r\n                            aria-labelledby=\"single-button\">\r\n                            @for (btn of column.buttons; track btn) {\r\n                                <li [disable-click]=\"btn.disabledFieldname && listItem[btn.disabledFieldname]\"\r\n                                    (click)=\"buttonClicked($event,btn.ident,listItem)\">\r\n                                    <a class=\"dropdown-item {{btn.buttonClass}}\"\r\n                                        [ngClass]=\"getButtonClass(listItem,btn)\"\r\n                                        [title]=\"btn.tooltip\">\r\n                                        @if (btn.iconClass) {\r\n                                            <i class=\"fa {{btn.iconClass}}\"></i>\r\n                                        }\r\n                                        {{ btn.text }}\r\n                                    </a>\r\n                                </li>\r\n                            }\r\n                        </ul>\r\n                    </div>\r\n                </div>\r\n            }\r\n        }\r\n        @case ('empty') {\r\n        }\r\n    }\r\n</ng-template>\r\n","import { SelectItem } from '@sowatech/shared/@types';\r\nimport { AggregateFunctionConfig, AggregateFunctionFieldConfig, FilterOperator } from '@sowatech/shared/ds-datasource';\r\nimport { ColumnType, PaginationInfoVariant, TextAlignType } from '@sowatech/shared/shared-config';\r\n\r\nexport type HeaderTitleGroups = Record<string, IHeaderTitleGroup>;\r\nexport type GridLookup = Array<SelectItem> | Array<string>;\r\nexport type GridSpanVariant = 'label' | 'icon' | 'progress' | 'stackedProgress';\r\nexport type GridColumnType = ColumnType | 'buttons' | 'empty' | 'lookup';\r\n//export type ColorUsageType = \"none\" | \"icon\" | \"text\" | \"all\";\r\n/**\r\n * das zugewiesene Feld kann nur ein Feldname von T sein, wobei der zugewiesene Typ für dieses Feld V ist\r\n */\r\ntype KeyWithType<T, V> = { [K in keyof T]-?: T[K] extends V ? K : never }[keyof T];\r\n/**\r\n * das zugewiesene Feld kann nur ein Feldname von T mit string value sein\r\n */\r\ntype FieldnameWithStringValue<T> = KeyWithType<T, string>;\r\ntype FieldnameWithBooleanValue<T> = KeyWithType<T, boolean>;\r\ntype FieldnameWithRecordValue<T> = KeyWithType<T, Record<string, unknown>>;\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype ItemId = any;\r\n\r\nexport class GridColumn<ListItem = any> implements AggregateFunctionFieldConfig<ListItem> {\r\n    public text?: string;\r\n    public title?: string;//tooltip für header\r\n    public fieldname?: Extract<keyof ListItem, string>;\r\n    public headerTitleGroup?: string;\r\n    public hideFieldValue?: boolean;\r\n    public type?: GridColumnType;\r\n    public lookups?: GridLookup;\r\n    public trueValueText?: string; //nur fuer type=boolean\r\n    public falseValueText?: string; //nur fuer type=boolean\r\n    public unit?: string;\r\n    public digitInfo?: string; //{minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}; defaults to \"1.0-2\"\r\n    public dateFormat?: string; // for type date|dateTime only. defaults to 'shortDate';\r\n\r\n    public buttons?: Array<GridColumnButton<ListItem>>;\r\n    public buttonsAsDropdown?: string; //shows buttons as a dropdown menu. string is used as dropdown-text\r\n    public buttonsAsDropdownClass?: string; //class set for dropdown toggle if buttonsAsDropdown has value\r\n    public spans?: Array<GridColumnSpan<ListItem>>;\r\n    public titleSpans?: Array<GridTitleSpan<ListItem>>;\r\n    public minWidth?: string;\r\n    public width?: string;\r\n    public textAlign?: TextAlignType;\r\n\r\n    public bodyClass?: string;\r\n    public bodyClassFieldname?: FieldnameWithStringValue<ListItem>;\r\n\r\n    public headerClass?: string;\r\n\r\n    public allowFilter?: boolean; //default true\r\n    public allowSort?: boolean; //default true\r\n    public filterOperator?: FilterOperator;\r\n    /**\r\n     * Filtervariante bei Lookups\r\n     * @default 'single'\r\n     */\r\n    public filterSelectOption?: 'single' | 'multi';\r\n\r\n\r\n    public edit?: boolean; //edit Modus aktiv\r\n    /** Aggregatfunktionen über Items (siehe includedAggregateData). Ergebnis im Tooltip oder Footer. Klappt nur mit Zahlen */\r\n    public aggregateFunctions?: AggregateFunctionGridConfig[];\r\n    /** Wenn true: Spalte ist hidden und muss über den visibility-Dialog explizit eingeblendet werden */\r\n    public hiddenByDefault?: boolean;\r\n    /**\r\n     * welche Daten sollen für aggregateFunctions verwendet werden?\r\n     *\r\n     * @default 'all'\r\n     */\r\n    public includedAggregateData?: 'all' | 'selected';\r\n    public groupBy?: boolean;\r\n}\r\n\r\nexport class GridColumnButton<ListItem = any> {\r\n    public ident?: string;\r\n    public text?: string;\r\n    public tooltip?: string;\r\n    public buttonClass?: string;\r\n    public iconClass?: string;\r\n    public disabledFieldname?: FieldnameWithBooleanValue<ListItem>;\r\n    public buttonClassFieldname?: FieldnameWithStringValue<ListItem>;\r\n    public iconClassFieldname?: FieldnameWithStringValue<ListItem>;\r\n    /**\r\n     * Beispiel:\r\n     * `spans: [{ text: 'Löschen', ident: 'DELETE', onClick: id => this.delete(id) }]`\r\n     */\r\n    public onClick?: (itemId: ItemId | null) => void;\r\n}\r\n\r\nexport class GridTitleSpan<ListItem = any> {\r\n    public class?: string; //static css class\r\n    public text?: string;\r\n    public title?: string; //html.title attribute\r\n    public positionBefore?: boolean; //render position beforeor after main value of column\r\n\r\n    public color?: string;\r\n    public color2?: string;\r\n    public backgroundColor?: string;\r\n\r\n    public isIcon?: boolean; //obsolete, user variant instead\r\n    public variant?: GridSpanVariant = 'label';\r\n    public routerLink?: string;\r\n    /** Zusätzliche QueryParams für den RouterLink*/\r\n    public queryParams?: Record<string, unknown>;\r\n    /** soll bei variant = 'progress' der Wert in % angezeigt werden? default: true */\r\n    public showProgressPercent?: boolean;\r\n    public stackedProgressBars?: IStackedProgressBar<ListItem>[];\r\n\r\n    public ident?: string; //if != null: span.click() raises an onButtonClicked Event with this ident\r\n    public onClick?: () => void;\r\n}\r\n\r\nexport class GridColumnSpan<ListItem = any> {\r\n    public class?: string; //static css class\r\n    public classFieldname?: FieldnameWithStringValue<ListItem>; //fieldname which provides the css class of the icon/span\r\n    public text?: string;\r\n    public textFieldname?: Extract<keyof ListItem, string>; //fieldname which provides the the visible text\r\n    public title?: string; //html.title attribute\r\n    public titleFieldname?: Extract<keyof ListItem, string>; //fieldname which provides the the html.title attribute\r\n    public positionBefore?: boolean; //render position beforeor after main value of column\r\n\r\n    public color?: string;\r\n    public colorFieldname?: FieldnameWithStringValue<ListItem>;\r\n    public color2?: string;\r\n    public color2Fieldname?: FieldnameWithStringValue<ListItem>;\r\n    public backgroundColor?: string;\r\n    public backgroundColorFieldname?: FieldnameWithStringValue<ListItem>;\r\n\r\n    public isIcon?: boolean; //obsolete, user variant instead\r\n    public variant?: GridSpanVariant = 'label';\r\n    public routerLink?: string;\r\n    /** Feldname mit Routerlink (als string); if!=null wird in <a> tag mit Routerlink gerendert */\r\n    public routerLinkFieldname?: FieldnameWithStringValue<ListItem>;\r\n    /** Zusätzliche QueryParams für den RouterLink*/\r\n    public queryParams?: Record<string, unknown>;\r\n    /** Feldname mit zusätzlichen QueryParams für den RouterLink*/\r\n    public queryParamsFieldname?: FieldnameWithRecordValue<ListItem>;\r\n\r\n    /** soll bei variant = 'progress' der Wert in % angezeigt werden? default: true */\r\n    public showProgressPercent?: boolean;\r\n    public stackedProgressBars?: IStackedProgressBar<ListItem>[];\r\n\r\n    public ident?: string; //if != null: span.click() raises an onButtonClicked Event with this ident\r\n    /**\r\n     * Beispiel:\r\n     * `buttons: [{ text: 'Löschen', ident: 'DELETE', onClick: id => this.delete(id) }]`\r\n     */\r\n    public onClick?: (itemId: ItemId | null) => void;\r\n}\r\n\r\nexport class GridConfiguration<ListItem = any> {\r\n    public columns: Array<GridColumn<ListItem>> = [];\r\n\r\n    public idfield?: Extract<keyof ListItem, string>;\r\n    public small?: boolean = true;\r\n    public gridStoreKey?: string;\r\n    public gridClass?: string; //additional css classes\r\n    public allowFilter?: boolean = true;\r\n    public allowSort?: boolean = true;\r\n    public allowPaging?: boolean = true;\r\n    public pageSizes?: number[];\r\n    public paginationInfoVariant?: PaginationInfoVariant;\r\n    public allowPrintDownload? = false;\r\n    public printTitle?: string;\r\n    public rowClassFieldName?: keyof ListItem;\r\n    public rowDetailClassFieldName?: keyof ListItem;\r\n    public allowSelectPageSize?: boolean;\r\n    public allowMultiSelect?: boolean = false;\r\n    public disableFieldName?: Extract<keyof ListItem, string> = undefined;\r\n    public tableHover?: boolean = false;\r\n    public showSelectCheckBoxes?: boolean = false;\r\n    public showEmptyGrid?: boolean = false;\r\n    public emptyGridText?: string = $localize`:@@Grid.NoData.dsp.Label:(Keine Datensätze)`;\r\n    public dragulaBag?: string = null;\r\n    public filterFieldsVisible?: boolean = true;\r\n    public hideColSelectBtn?: boolean = false;\r\n    public headerTitleGroups?: HeaderTitleGroups = undefined;\r\n}\r\n\r\nexport type AggregateFunctionGridConfig = AggregateFunctionConfig & {\r\n    /** @default true */\r\n    showInTooltip?: boolean;\r\n    /** @default false */\r\n    showInFooterRow?: boolean;\r\n};\r\n\r\nexport interface IHeaderTitleGroup {\r\n    text: string;\r\n    title?: string;\r\n}\r\n\r\nexport interface IStackedProgressBar<ListItem = any> {\r\n    value?: string;\r\n    valueFieldname?: Extract<keyof ListItem, string>;\r\n    class?: string;\r\n    classFieldName?: string;\r\n}\r\n","import { GroupedSelectItem, SelectColor, SelectItem } from '@sowatech/shared/@types';\r\nimport { DatasourceComponent } from '@sowatech/shared/ds-datasource';\r\nimport { ColorPickerConfiguration, IQuillConfiguration, IQuillToolbarConfiguration, QuillToolbarDefaultType } from '@sowatech/shared/swt-controls';\r\nimport { QuillModules } from 'ngx-quill';\r\n\r\nimport { GridConfiguration } from '../swt-grid/swt-grid-configuration';\r\n\r\n\r\n//---------------------------------------------------------------------------------------------------------------------------\r\n// General classes, interfaces, types ..\r\n//---------------------------------------------------------------------------------------------------------------------------\r\n\r\n/**key for dynamic lookups, which are provided during dialog.show as a dictionary[lookupsKey,Array<SelectItem>]*/\r\nexport type lookupsKey = string;\r\n\r\nexport type Lookups = Array<SelectItem | GroupedSelectItem> | Array<SelectColor>;\r\n\r\nexport type FieldType = 'text' | 'number' | 'date' | 'dateInterval' | 'boolean' | 'textarea' | 'password' | 'password-with-confirm' | 'email' | 'tel' | 'divider' | 'buttons' | 'info-text' | 'time' | 'lru' | 'hidden' | 'color-select' | 'money';\r\n\r\n/**the type of control. in most cases this is equal to type of field but can differ (e.g. controltype \"select\")*/\r\nexport type ControlType = 'text' | 'number' | 'date' | 'dateInterval' | 'dateInput' | 'checkbox' | 'textarea' | 'password' | 'password-with-confirm' | 'email' | 'tel' | 'select' | 'divider' | 'buttons' | 'grid' | 'info-text' | 'time' | 'dropdown-grid' | 'hidden' | 'rich-text' | 'color-picker' | 'money';\r\n\r\n/**this class is used to configure the dialog*/\r\nexport class DialogField<DTO = any> {\r\n    fieldname?: Extract<keyof DTO, string>;\r\n\r\n    type?: FieldType;\r\n\r\n    /** Nicht manuell setzen!\r\n     * wird intern aus type, controlTypeVariant, und vorhandenen lookups ermittelt. Im Regelfall identisch zu type\r\n     * */\r\n    controlType?: ControlType;\r\n    /** wenn abweichend vom standard zb bei datePicker / dateInput */\r\n    controlTypeVariant?: 'input';\r\n    text?: string;\r\n    unit?: string;\r\n    placeholder?: string;\r\n    help?: string;\r\n    required?: boolean;\r\n\r\n    /** Zweiter Feldname bei mehrteiligen Inputs wie z.B. dateInterval*/\r\n    fieldname2?: Extract<keyof DTO, string>;\r\n    /** Zweiter Text bei mehrteiligen Inputs wie z.B. dateInterval*/\r\n    text2?: string;\r\n    /** Zweiter Hilfetext bei mehrteiligen Inputs wie z.B. dateInterval*/\r\n    help2?: string;\r\n    /** Zweites Required bei mehrteiligen Inputs wie z.B. dateInterval*/\r\n    required2?: boolean;\r\n\r\n    maxLength?: number;\r\n    default?: any;\r\n    trueValueText?: string;//nur fuer type=checkbox\r\n    falseValueText?: string;//nur fuer type=checkbox\r\n    min?: number;\r\n    max?: number;\r\n    showSpinnerButtons?: boolean;//shows touch friendly spinner buttons in in input typ=number; default=false\r\n    calendarWeekVisible?: boolean = false;//nur fuer type=date\r\n\r\n    lookUps?: Lookups | Array<string> | lookupsKey;\r\n    onLookUp?: (lookupItems: Array<SelectItem>, editItem: DTO) => Array<SelectItem>;//allows the change of shown lookupitems depending on current editItem (e.g. filter of sub-selectItems)\r\n    onChange?: (editItem: any, previousValue: any) => void;//allows to implement dialog-internal logic e.g. drt field2 because of changes to field1\r\n    multiSelectLookups?: boolean;\r\n    radioLookups?: boolean;\r\n\r\n    /** multi-lru async SelectItem loading */\r\n    lookUpSearchFn?: (term: string) => Promise<SelectItem[]>;\r\n\r\n    /** text for empty lookup */\r\n    addEmptyLookup?: string;\r\n\r\n    /** Felder mit  abhängigen selects => leert Value und cached lookUps des fieldnames beim change */\r\n    dependentSelectFieldnames?: Array<Extract<keyof DTO, string>>;\r\n\r\n    fieldnamePasswordConfirm?: Extract<keyof DTO, string>;\r\n    autofocus?: boolean;\r\n    hideIf?: (editItem: any) => boolean;//achtung: das edititem hat nicht identische felder zum dto, zb. werden dto.unterobjekte als felder \"inline\" ins edititem kopiert, auch können felder string sein (durch html selectbox), die eigenltich number sind etc\r\n\r\n    buttons?: Array<DialogFieldButton>;\r\n    grid?: DialogGridConfiguration;\r\n\r\n    textMask?: TextMaskConfig; //uses textmask see https://www.npmjs.com/package/ngx-mask\r\n\r\n    richText?: RichTextConfiguration;\r\n\r\n    colorPicker?: ColorPickerConfiguration;\r\n    zIndex?: number;\r\n\r\n    /**optional: direktes setzen eines style im Eingabe-Control */\r\n    controlStyle?: string;\r\n\r\n    /** internal*/\r\n    hasError?: boolean;\r\n    cssClass?: string;\r\n}\r\n\r\ntype FuncRegExp = (text: string) => Array<RegExp | string>;\r\n\r\n//Documentation: https://www.npmjs.com/package/ngx-mask\r\nexport class TextMaskConfig {\r\n    mask?: string; // defines the layout of the text\r\n    // suffix?: string;\r\n    // prefix?: string;\r\n    // thousandSeparator?: string;\r\n    // decimalMarker?: \".\" | \",\";\r\n    // clearIfNotMatch?: boolean;\r\n    // showTemplate?: boolean;\r\n    showMaskTyped?: boolean; // shows placeholder\r\n    // placeHolderCharacter?: string;\r\n    // shownMaskExpression?: string;\r\n    // dropSpecialCharacters?: boolean | string[];\r\n    // specialCharacters?: string[];\r\n    // hiddenInput?: boolean;\r\n    // validation?: boolean;\r\n    // separatorLimit?: string;\r\n    // allowNegativeNumbers?: boolean;\r\n    patterns?: { [character: string]: { pattern: RegExp; optional?: boolean; symbol?: string; }; }; // if you dont deliver a pattern its using the default pattern see: https://www.npmjs.com/package/ngx-mask\r\n\r\n}\r\n\r\nexport class DialogFieldCategory<DTO = any> {\r\n    name: string;\r\n    dialogFields: DialogField<DTO>[];\r\n    hideIf?: (editItem: any) => boolean;//achtung: das edititem hat nicht identische felder zum dto, zb. werden dto.unterobjekte als felder \"inline\" ins edititem kopiert, auch können felder string sein (durch html selectbox), die eigenltich number sind etc\r\n    active?: boolean;\r\n}\r\n\r\nexport class DialogDynamicList {\r\n    key: string;\r\n    lookupItems?: Lookups;\r\n    datasource?: DatasourceComponent;\r\n}\r\n\r\nexport class DialogFieldButton {\r\n    onButtonClicked?: (editItem: any) => void;\r\n    text?: string;\r\n    tooltip?: string;\r\n    buttonClass?: string;\r\n    iconClass?: string;\r\n    position?: 'form' | 'footer-before' | 'footer-after';\r\n    submitDialog?: boolean;\r\n    submitResult?: string;\r\n    width?: `${number}px` | `${number}em` | `${number}%` | 'auto';\r\n}\r\n\r\n//export class DialogFieldButtonEvent {\r\n//  buttonIdent: string;\r\n//  itemId: any;\r\n//}\r\n\r\n\r\nexport class DialogGridConfiguration extends GridConfiguration {\r\n    datasource: DatasourceComponent | lookupsKey;\r\n\r\n    /**\r\n     * wenn gesetzt wird, wird das Grid als DropDown dargestellt\r\n     */\r\n    showAsDropDownFieldName?: string;\r\n    onDropdownGridShown?: (editItem: any, fieldname: string, datasource: DatasourceComponent) => void;\r\n    displayFieldValue?: string;\r\n    pageSize?: number;\r\n}\r\n\r\nexport class RichTextConfiguration implements IQuillConfiguration {\r\n    /**\r\n        default: 'html'\r\n     */\r\n    format?: 'object' | 'html' | 'text' | 'json';\r\n    /**\r\n        default: 'snow'\r\n     */\r\n    theme?: 'snow' | 'bubble';\r\n    readOnly?: boolean;\r\n    toolbar?: QuillToolbarDefaultType | IQuillToolbarConfiguration;\r\n\r\n    /**\r\n     *wird nur benötigt, falls standard modules/toolbar nicht ausreicht\r\n     */\r\n    modules?: QuillModules;\r\n}\r\n\r\nexport const DIALOG_FIELD_NULLVALUE = '$NULL';\r\n\r\n//-------------------------------------------------------------------------\r\n\r\nexport interface IDialogConfiguration<DTO = any> {\r\n    fieldsOrCategoriesOfFields: DialogField<DTO>[] | DialogFieldCategory<DTO>[];\r\n    title: string;\r\n    enterKeyAsTabKey?: boolean;\r\n    categoriesAsTabs?: boolean;\r\n    size?: DialogSize;\r\n    inputSize?: DialogInputSize;\r\n    hideOkButton?: boolean;\r\n    hideCancelButton?: boolean;\r\n}\r\n\r\n\r\n\r\nexport type DialogSize = 'small' | 'medium' | 'large';\r\nexport type DialogInputSize = 'small' | 'medium' | 'large';\r\n\r\n//DATATYPE: the type of the data object to be edited by the dialog\r\n//MODETYPE: optional \"mode\"-type of multi-purpose dialogs, e.g. \"'CREATE'|'UPDATE'\"\r\n//submitResult: \"OK\",\"CANCEL\" or CustomResult if using custom buttons\r\nexport class GenericEditDialogResult<DATATYPE, MODETYPE> {\r\n    key: string;\r\n    dto: DATATYPE;\r\n    mode: MODETYPE;\r\n    submitResult: string;\r\n}\r\n","/* eslint-disable @angular-eslint/no-output-on-prefix */\r\nimport { Directive, EventEmitter, HostListener, inject, Input, KeyValueChangeRecord, KeyValueDiffer, KeyValueDiffers, Output, signal, untracked } from '@angular/core';\r\nimport { GroupedSelectItem, SelectColor, SelectItem, SelectItemGroup } from '@sowatech/shared/@types';\r\nimport { DatasourceComponent } from '@sowatech/shared/ds-datasource';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\nimport { SharedConfigService } from '@sowatech/shared/shared-config';\r\nimport moment from 'moment';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { ControlType, DIALOG_FIELD_NULLVALUE, DialogDynamicList, DialogField, DialogFieldButton, DialogFieldCategory, DialogInputSize, DialogSize } from './swt-generic-edit-dialog.types';\r\n\r\nconst CLASS = 'GenericEditDialogBaseComponent';\r\n\r\n@Directive() // https://angular.io/guide/migration-undecorated-classes#why-is-this-migration-necessary\r\nexport abstract class GenericEditDialogBaseComponent<T> {\r\n    constructor(\r\n        protected logger: LoggerService,\r\n        private differs: KeyValueDiffers,\r\n    ) {}\r\n\r\n    private sharedConfig = inject(SharedConfigService);\r\n\r\n    @Input() public inputSizeDefault: DialogInputSize = 'medium';\r\n    @Input() public categoriesAsTabs = false;\r\n    @Output() public onHidden = new EventEmitter<void>();\r\n    @Output() public onCancel = new EventEmitter<void>();\r\n    @Output() public onSubmit = new EventEmitter<T>();\r\n    @Output() public onBeforeSubmit = new EventEmitter<T>();\r\n    // @Output() public onFormChanged = new EventEmitter<boolean>();\r\n    @Output() public onChangeDetected = new EventEmitter<void>();\r\n\r\n    protected differ: KeyValueDiffer<any, any>;\r\n    protected subscriptions: Array<Subscription> = [];\r\n\r\n    protected dtoItem: T;//original item\r\n    public editItem: any = {};//dialog \"copy\" of dtoItem. this is similiar but not identical, e.g. it contains no lookups and no sub-objects\r\n\r\n    public mode: any;\r\n    public errorText: string;\r\n    public dynamicLists?: DialogDynamicList[];\r\n\r\n    public submitResult: 'CANCEL' | 'OK' | string;\r\n\r\n    protected onInit() {\r\n        this.subscriptions.push(\r\n        );\r\n    }\r\n\r\n    protected doCheck() {\r\n        if (this.categories.length === 0) return;\r\n\r\n        if (this.differ) {\r\n            const changeDetected = this.differ.diff(this.editItem);\r\n            if (changeDetected) {\r\n                let numOfChanges = 0;\r\n                changeDetected.forEachChangedItem(\r\n                    (keyValueChange) => {\r\n                        numOfChanges++;\r\n                        this.doOnChange(keyValueChange);\r\n                    }\r\n                );\r\n                if (numOfChanges > 0)\r\n                    this.setDirty();\r\n\r\n                this.onChangeDetected.emit();\r\n            }\r\n        }\r\n        else\r\n            this.logger.error(CLASS + '.doCheck: No KeyValueDiffer found!\\r\\nCheck if initData() has been called');\r\n    }\r\n\r\n    protected onDestroy() {\r\n        this.logger.log(CLASS + 'onDestroy');\r\n        for (const s of this.subscriptions)\r\n            s.unsubscribe();\r\n\r\n        this.unSubscribeDatasources();\r\n    }\r\n\r\n    public hide() {\r\n        this.unSubscribeDatasources();\r\n    }\r\n\r\n    //------ region Input SIZE -------------------------\r\n    private _inputSizeClass = '';\r\n    public get inputSizeClass(): string {\r\n        return this._inputSizeClass ? this._inputSizeClass : this.getInputSizeClassForInputSize(this.inputSizeDefault);\r\n    }\r\n\r\n    public set inputSizeClass(value: 'input-sm' | 'input-lg' | string) {\r\n        this._inputSizeClass = value;\r\n    }\r\n\r\n    private _inputSize: DialogInputSize;\r\n    public get inputSize(): DialogInputSize {\r\n        return this._inputSize;\r\n    }\r\n\r\n    public set inputSize(newSize: DialogInputSize) {\r\n        this.inputSizeClass = this.getInputSizeClassForInputSize(newSize);\r\n        this._inputSize = newSize;\r\n    }\r\n\r\n    private getInputSizeClassForInputSize(size: DialogSize) {\r\n        if (!size) return;\r\n        let result: string;\r\n        if (this.sharedConfig.templateKey === 'sneat') {\r\n            switch (size) {\r\n                case 'small':\r\n                    result = 'form-control-sm';\r\n                    break;\r\n                case 'medium':\r\n                    break;\r\n                case 'large':\r\n                    result = 'form-control-lg';\r\n                    break;\r\n                default:\r\n                    this.logger.warn(CLASS + '.getInputSizeClassForInputSize / invalid size: ' + size);\r\n            }\r\n        }\r\n        else {\r\n            switch (size) {\r\n                case 'small':\r\n                    result = 'input-sm';\r\n                    break;\r\n                case 'medium':\r\n                    break;\r\n                case 'large':\r\n                    result = 'input-lg';\r\n                    break;\r\n                default:\r\n                    this.logger.warn(CLASS + '.getInputSizeClassForInputSize / invalid size: ' + size);\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n\r\n    //------ end region Input SIZE -------------------------\r\n\r\n    private readonly dirty = signal(false);\r\n    public readonly isDirty = this.dirty.asReadonly();\r\n\r\n    public resetDirty() {\r\n        untracked(() => this.dirty.set(false));\r\n    }\r\n\r\n    public setDirty() {\r\n        untracked(() => this.dirty.set(true));\r\n    }\r\n\r\n    public abstract isShown(): boolean;\r\n\r\n    protected initData(\r\n        dto?: T,\r\n        mode?: any,                 //user-defined 'mode' without any logic in dialog. can e.g. be used to store meta-info like \"INSERT|EDIT|DUPLICATE\" in multi-role dialogs\r\n        dynamicLists?: DialogDynamicList[]    //dynamic lookups (in contrary to static) which are loaded before dialog.show. they are refernced by a lookupKey in the configuration (lookups of type string)\r\n    ) {\r\n        this.mode = mode;\r\n        this.dynamicLists = dynamicLists;\r\n        this.errorText = '';\r\n        this.dtoItem = dto;\r\n        this.logger.log(CLASS + '.initData');\r\n        if (dto)\r\n            this.copyToEditItem(dto);\r\n\r\n        else\r\n            this.initNewEditItem();\r\n\r\n        this.prepareItem();\r\n        this.prepareGrid();\r\n        this.bindGridSelectionToEditItem();\r\n\r\n        this.differ = this.differs.find(this.editItem).create();\r\n        this.resetDirty();\r\n\r\n        this.setFirstCatActive();\r\n    }\r\n\r\n    protected resetData() {\r\n        this.initData(this.dtoItem, this.mode, this.dynamicLists);\r\n    }\r\n\r\n    public cancelDialog() {\r\n        this.submitResult = 'CANCEL';\r\n        this.onCancel.emit();\r\n        this.unSubscribeDatasources();\r\n\r\n        //this.resetData();?\r\n        //this.hasChanges = false;?\r\n    }\r\n\r\n    /**\r\n     * Abschluss der Bearbeitung:\r\n     * Konvertiert die Form-Eingabewerte in den korrekten Typ soweit erforderlich (z.B. string nach number).\r\n     * Kopiert die Form-Eingabewerte in das Datenobjekt zurück.\r\n     * Löst Submit Events aus\r\n     *\r\n     * @param submitResult\r\n     */\r\n    protected submitDialog(submitResult: 'OK' | string = 'OK') {\r\n        if (this.isSubmitDisabled) return;\r\n        this.submitResult = submitResult;\r\n        this.convertEditItemValuesToCorrectTypes();\r\n        this.writeAllEditItemFieldToDtoItemFields();\r\n\r\n        this.differ = this.differs.find(this.editItem).create();\r\n        this.resetDirty();\r\n\r\n        this.onBeforeSubmit.emit(this.dtoItem);\r\n        this.onSubmit.emit(this.dtoItem);\r\n    }\r\n\r\n    public get isSubmitDisabled(): boolean {\r\n        let disabled = false;\r\n        for (const field of this.getAllDialogFields) {\r\n            disabled =\r\n                (field.required && this.fieldIsEmpty(field.fieldname)) ||\r\n                (field.required2 && this.fieldIsEmpty(field.fieldname2)) ||\r\n                (field.type === 'password-with-confirm' && this.passwordConfirmInvalid(field)) ||\r\n                (field.min !== null && field.min !== undefined && field.min > this.editItem[field.fieldname]) ||\r\n                (field.max !== null && field.max !== undefined && field.max < this.editItem[field.fieldname]) ||\r\n                field.hasError\r\n                ;\r\n            if (disabled) break;\r\n        }\r\n        return disabled;\r\n    }\r\n\r\n    public showErrors(errors: string[]) {\r\n        this.errorText = errors.join(', ');\r\n    }\r\n\r\n    @HostListener('document:keypress', ['$event'])\r\n    public handleKeyboardEvent(event: KeyboardEvent) {\r\n        if (!this.isShown()) return;\r\n\r\n        if (event.code && event.ctrlKey === true && (event.code === 'Enter' || event.code === 'NumpadEnter')) {\r\n            this.submitDialog();\r\n            event.preventDefault();\r\n            return;\r\n        }\r\n        if (this.enterKeyAsTabKey && event.ctrlKey === false && (event.code === 'Enter' || event.code === 'NumpadEnter')) {\r\n            const form: HTMLElement = (event.target as HTMLFormElement)['form'];\r\n            if (!form) return;\r\n            const focusable = form.querySelectorAll('input,a,select,button,textarea');\r\n            let next: HTMLElement = null;\r\n            let currentIndex: number = null;\r\n            focusable.forEach((element: HTMLElement, index: number) => {\r\n                if (event.target === element)\r\n                    currentIndex = index;\r\n\r\n                if ((currentIndex || currentIndex === 0) && (currentIndex + 1) === index)\r\n                    next = element;\r\n\r\n            });\r\n            if (next)\r\n                next.focus();\r\n\r\n            else\r\n                this.submitDialog();\r\n\r\n            event.preventDefault();\r\n            return;\r\n        }\r\n    }\r\n    public enterKeyAsTabKey: boolean;\r\n\r\n    public configureDialogFields(fieldsOrCategoriesOfFields: DialogField<T>[] | DialogFieldCategory<T>[]) {\r\n        this.categories = [];\r\n        if (fieldsOrCategoriesOfFields && fieldsOrCategoriesOfFields.length > 0) {\r\n            const firstFieldOrCategory = fieldsOrCategoriesOfFields[0];\r\n            //@ts-ignore\r\n            const argIsCategoryArray = firstFieldOrCategory.dialogFields as boolean;\r\n            if (argIsCategoryArray) {\r\n                this.categories = fieldsOrCategoriesOfFields as DialogFieldCategory<T>[];\r\n                for (const cat of this.categories)\r\n                    cat.dialogFields = this.prepareDialogFields(cat.dialogFields);\r\n\r\n            }\r\n            else {\r\n                const dialogFields = fieldsOrCategoriesOfFields as DialogField<T>[];\r\n                const dummyCategory: DialogFieldCategory<T> = { name: '', dialogFields: [] };\r\n                this.categories.push(dummyCategory);\r\n                dummyCategory.dialogFields = this.prepareDialogFields(dialogFields);\r\n            }\r\n        }\r\n\r\n        const notSupportedForMask = this.getAllDialogFields.filter(f => f.textMask != null && (f.type === 'number' || f.type === 'email'));\r\n        if (notSupportedForMask && notSupportedForMask.length > 0)\r\n            this.logger.error('dialog field textMask not supported for type=number or type=email');\r\n    }\r\n\r\n    public get getAllDialogFields(): DialogField<T>[] {\r\n        const allDialogFields = [];\r\n        for (const cat of this.categories) {\r\n            for (const fields of cat.dialogFields)\r\n                allDialogFields.push(fields);\r\n\r\n        }\r\n        return allDialogFields;\r\n    }\r\n\r\n    protected getDialogField(fieldname: string): DialogField<T> {\r\n        return this.getAllDialogFields.find((df) => df.fieldname === fieldname);\r\n    }\r\n\r\n    public categories: DialogFieldCategory[] = [];\r\n    public get visibleCategories(): DialogFieldCategory[] {\r\n        return this.categories.filter((cat) => cat.hideIf === undefined || !cat.hideIf(this.editItem));\r\n    }\r\n\r\n    protected copyToEditItem(dto: T) {\r\n        this.editItem = {};\r\n        for (const field of this.getAllDialogFields.filter(f => f.fieldname)) {\r\n            this.editItem[field.fieldname] = this.getValueOfDtoItem(field.fieldname);\r\n\r\n            if (!field.multiSelectLookups && field.lookUps) {\r\n                if (this.editItem[field.fieldname] === null)\r\n                    this.editItem[field.fieldname] = DIALOG_FIELD_NULLVALUE;\r\n\r\n                else if (field.type === 'number') {\r\n                    //dirty hack: fuer edit in string umwandeln\r\n                    this.numberToStringEditItem(field);\r\n                }\r\n            }\r\n\r\n            if (field.type === 'password-with-confirm')\r\n                this.editItem[field.fieldnamePasswordConfirm] = this.editItem[field.fieldname];\r\n\r\n\r\n            if (field.type === 'date' && this.useBrowserDateInput(field)) {\r\n                // der browser date input will einen string\r\n                this.editItem[field.fieldname] = this.convertToIsoDate(this.editItem[field.fieldname]);\r\n            }\r\n\r\n            if (field.type === 'dateInterval') {\r\n                this.editItem[field.fieldname] = this.convertToIsoDate(this.getValueOfDtoItem(field.fieldname));\r\n                this.editItem[field.fieldname2] = this.convertToIsoDate(this.getValueOfDtoItem(field.fieldname2));\r\n            }\r\n\r\n            if (field.multiSelectLookups && this.editItem[field.fieldname] === null)\r\n                this.editItem[field.fieldname] = [];\r\n\r\n        }\r\n    }\r\n\r\n    private convertToIsoDate(value: string | Date): string {\r\n        return value ? moment(value).format('YYYY-MM-DD') : null;\r\n    }\r\n\r\n    protected numberToStringEditItem(field: DialogField<T>) {\r\n        if (Array.isArray(this.editItem[field.fieldname]))\r\n            this.editItem[field.fieldname] = this.editItem[field.fieldname].map(numberValue => '' + numberValue);\r\n\r\n        else\r\n            this.editItem[field.fieldname] = '' + this.editItem[field.fieldname];\r\n\r\n    }\r\n\r\n    protected stringToNumberEditItem(field: DialogField<T>) {\r\n        const value = this.editItem[field.fieldname];\r\n        if (value === undefined || value === null || value === DIALOG_FIELD_NULLVALUE)\r\n            return null;\r\n\r\n        if (Array.isArray(value))\r\n            this.editItem[field.fieldname] = value.map(stringValue => parseFloat(stringValue));\r\n\r\n        else\r\n            this.editItem[field.fieldname] = parseFloat(value);\r\n    }\r\n\r\n    protected getValueOfDtoItem(fieldname: string): any {\r\n        let value = null;\r\n        if (fieldname) {\r\n            const fieldParts = fieldname.split('.');\r\n            value = this.dtoItem[fieldParts[0]];\r\n            for (let i = 1; i < fieldParts.length; i++) {\r\n                try {\r\n                    value = value[fieldParts[i]];\r\n                }\r\n                catch (e) {\r\n                    this.logger.error(CLASS + ': error in accessing part ' + fieldParts[i] + ' of fieldname: ' + fieldname);\r\n                }\r\n            }\r\n        }\r\n        return value;\r\n    }\r\n\r\n    protected initNewEditItem() {\r\n        this.editItem = {};\r\n        for (const field of this.getAllDialogFields.filter(f => f.fieldname)) {\r\n            if (field.default !== undefined)\r\n                this.editItem[field.fieldname] = field.default;\r\n\r\n            else if (this.getLookups(field.fieldname).length > 0 && field.required)\r\n                this.editItem[field.fieldname] = this.getLookups(field.fieldname)[0].value;\r\n\r\n            else if (field.controlType === 'grid' || field.controlType === 'dropdown-grid')\r\n                this.editItem[field.fieldname] = [];\r\n\r\n            else {\r\n                switch (field.type) {\r\n                    case 'number':\r\n                        this.editItem[field.fieldname] = field.multiSelectLookups ? [] : 0;\r\n                        break;\r\n                    case 'boolean':\r\n                        this.editItem[field.fieldname] = false;\r\n                        break;\r\n                    case 'date':\r\n                        const todayIso = moment().format('YYYY-MM-DD');\r\n                        this.editItem[field.fieldname] = todayIso;\r\n                        break;\r\n                    case 'password-with-confirm':\r\n                        this.editItem[field.fieldname] = '';\r\n                        this.editItem[field.fieldnamePasswordConfirm] = '';\r\n                        break;\r\n                    case 'time':\r\n                        this.editItem[field.fieldname] = '00:00';\r\n                        break;\r\n                    default:\r\n                        this.editItem[field.fieldname] = field.multiSelectLookups ? [] : '';\r\n                        break;\r\n                }\r\n            }\r\n\r\n            if (field.type === 'number') {\r\n                //dirty hack: fuer edit in string umwandeln\r\n                this.numberToStringEditItem(field);\r\n            }\r\n        }\r\n    }\r\n\r\n    protected prepareItem() {\r\n        //-- getSelectItem methode zufügen\r\n        if (this.editItem.getSelectItem === undefined)\r\n            this.editItem.getSelectItem = (fieldname: string) => this.getSelectItem(fieldname);\r\n\r\n    }\r\n\r\n    private convertEditItemValuesToCorrectTypes() {\r\n        for (const field of this.getAllDialogFields.filter(f => f.fieldname)) {\r\n            switch (field.type) {\r\n                case 'number':\r\n                case 'money':\r\n                    //fix von ggf durch HTML Inputs auf string geaenderte numbers => zurueck auf number\r\n                    if (typeof (this.editItem[field.fieldname]) !== 'number')\r\n                        this.stringToNumberEditItem(field);\r\n                    break;\r\n                case 'password-with-confirm':\r\n                    if (this.passwordConfirmInvalid(field))\r\n                        this.editItem[field.fieldname] = null;//auf null zurücksetzen => keien aenderung\r\n                    break;\r\n                case 'boolean':\r\n                    if (typeof (this.editItem[field.fieldname]) !== 'boolean')\r\n                        this.editItem[field.fieldname] = this.stringToNullOrBool(this.editItem[field.fieldname]);\r\n                    break;\r\n            }\r\n\r\n            if (this.editItem[field.fieldname] === DIALOG_FIELD_NULLVALUE)\r\n                this.editItem[field.fieldname] = null;\r\n        }\r\n    }\r\n\r\n    protected stringToNullOrBool(value: any): boolean {\r\n        if (value === undefined || value === null || value === DIALOG_FIELD_NULLVALUE)\r\n            return null;\r\n\r\n        else if (typeof value === 'string' && value === 'false')\r\n            return false;\r\n\r\n        else\r\n            return true;\r\n    }\r\n\r\n    private writeAllEditItemFieldToDtoItemFields() {\r\n        for (const field of this.getAllDialogFields.filter(f => f.fieldname)) {\r\n            this.writeEditItemFieldToDtoItemField(field.fieldname, this.editItem[field.fieldname]);\r\n            this.writeEditItemFieldToDtoItemField(field.fieldname2, this.editItem[field.fieldname2]);\r\n        }\r\n    }\r\n\r\n    private writeEditItemFieldToDtoItemField(fieldname: string, value: any) {\r\n        if (fieldname) {\r\n            const fieldParts = fieldname.split('.');\r\n            if (!this.dtoItem) this.dtoItem = {} as T;\r\n            let cascObj = this.dtoItem;\r\n            for (let i = 0; i < fieldParts.length; i++) {\r\n                const isLast = i === fieldParts.length - 1;\r\n                if (!isLast) {\r\n                    //unterobjekte instantiieren, wenn noetig\r\n                    if (cascObj[fieldParts[i]] === undefined)\r\n                        cascObj[fieldParts[i]] = {};\r\n\r\n                    cascObj = cascObj[fieldParts[i]];\r\n                }\r\n                else\r\n                    cascObj[fieldParts[i]] = value;\r\n\r\n            }\r\n        }\r\n    }\r\n\r\n    private fieldIsEmpty(fieldname: string) {\r\n        const value = this.editItem[fieldname];\r\n        return value === undefined\r\n            || value === null\r\n            || value === ''\r\n            || value === DIALOG_FIELD_NULLVALUE\r\n            || (Array.isArray(value) && value.length === 0);\r\n    }\r\n\r\n    //extends the dialogFields to dialogFieldConfiguration instances (adds the controlType property and does other initialization or default handling)\r\n    private prepareDialogFields(dialogFields: DialogField<T>[]): DialogField<T>[] {\r\n        const configFields = dialogFields;\r\n        for (const configField of configFields) {\r\n            //auto-configure the control type\r\n            if (!configField.type) configField.type = 'text';\r\n            configField.controlType = this.getControlType(configField);\r\n\r\n            //handle lookup initialization\r\n            if (configField.lookUps && Array.isArray(configField.lookUps) && configField.lookUps.length > 0) {\r\n                const isArrayOfString = (typeof (configField.lookUps[0]) === 'string');\r\n                if (isArrayOfString) {\r\n                    const stringLookups = configField.lookUps as string[];\r\n                    const selectItemLookUps = stringLookups.map((stringLookup: string) => ({ text: stringLookup, value: stringLookup } as SelectItem));\r\n                    configField.lookUps = selectItemLookUps;\r\n                }\r\n            }\r\n\r\n            //--handle password confirmation\r\n            if (configField.type === 'password-with-confirm') {\r\n                if (configField.fieldnamePasswordConfirm === undefined)\r\n                    configField.fieldnamePasswordConfirm = (configField.fieldname + 'PasswordConfirm') as Extract<keyof T, string>;\r\n\r\n            }\r\n\r\n            //-- handle multiSelectLookups\r\n            if (configField.multiSelectLookups === undefined) configField.multiSelectLookups = false;\r\n        }\r\n        return configFields;\r\n    }\r\n\r\n    private getControlType(field: DialogField<T>): ControlType {\r\n        let result: ControlType;\r\n\r\n        let fieldType = field.type;\r\n        if (!fieldType) fieldType = 'text';\r\n\r\n        let variant: 'OTHER' | 'SELECT' | 'GRID' | 'RICH_TEXT' = 'OTHER';\r\n        if (field.lookUps)\r\n            variant = 'SELECT';\r\n\r\n        else if (field.grid)\r\n            variant = 'GRID';\r\n\r\n        else if (field.richText)\r\n            variant = 'RICH_TEXT';\r\n\r\n\r\n        switch (variant) {\r\n            case 'SELECT':\r\n                if (field.type === 'color-select') result = 'color-picker';\r\n                else result = 'select';\r\n                break;\r\n            case 'GRID':\r\n                if (field.grid !== null && field.grid.showAsDropDownFieldName)\r\n                    result = 'dropdown-grid';\r\n                else\r\n                    result = 'grid';\r\n                break;\r\n            case 'RICH_TEXT':\r\n                result = 'rich-text';\r\n                break;\r\n            default:\r\n                switch (fieldType) {\r\n                    case 'boolean':\r\n                        result = 'checkbox';\r\n                        break;\r\n                    case 'date':\r\n                        result = (field.controlTypeVariant === 'input') ? 'dateInput' : fieldType as ControlType;\r\n                        break;\r\n                    default:\r\n                        result = fieldType as ControlType;\r\n                        break;\r\n                }\r\n                break;\r\n        }\r\n        return result;\r\n    }\r\n\r\n    private passwordConfirmInvalid(field: DialogField<T>): boolean {\r\n        return this.editItem[field.fieldname] !== this.editItem[field.fieldnamePasswordConfirm];\r\n    }\r\n\r\n    public hasLookups(fieldname: string | DialogField<T>): boolean;\r\n    public hasLookups(arg1: any): boolean {\r\n        const field: DialogField<T> = typeof (arg1) === 'string' ? this.getDialogField(arg1 as string) : arg1 as DialogField<T>;\r\n        const lookups = this.getLookups(field);\r\n        const emptyCount = field.addEmptyLookup ? 1 : 0;\r\n        return lookups && lookups.length > emptyCount;\r\n    }\r\n\r\n    public getGroupableLookups(field: string | DialogField<T>) {\r\n        return this.mapGroupedLookups(this.getLookups(field));\r\n    }\r\n    public getLookups(fieldname: string | DialogField<T>): Array<SelectItem | SelectColor>;\r\n    public getLookups(arg1: any): Array<SelectItem | SelectColor> {\r\n        const field: DialogField<T> = typeof (arg1) === 'string' ? this.getDialogField(arg1 as string) : arg1 as DialogField<T>;\r\n        let lookUpItems: Array<SelectItem | SelectColor | GroupedSelectItem> = [];\r\n        if (field.lookUps) {\r\n            if (Array.isArray(field.lookUps))\r\n                lookUpItems = field.lookUps as Array<SelectItem | SelectColor | GroupedSelectItem>;\r\n            if (typeof (field.lookUps) === 'string')\r\n                lookUpItems = this.getDynamicLookupItems(field);\r\n        }\r\n\r\n        if (field.addEmptyLookup && !lookUpItems.find((item: SelectItem | SelectColor) => item.value === DIALOG_FIELD_NULLVALUE && item.text === field.addEmptyLookup))\r\n            lookUpItems.unshift({ value: DIALOG_FIELD_NULLVALUE, text: field.addEmptyLookup });\r\n\r\n        if (field.onLookUp)\r\n            lookUpItems = field.onLookUp(lookUpItems, this.editItem);\r\n\r\n        return this.lookupTypeCheck(field, lookUpItems);\r\n    }\r\n\r\n    private lookupTypeCheck(field: DialogField<T>, lookUpItems: Array<SelectItem | SelectColor>): Array<SelectItem | SelectColor> {\r\n        if (lookUpItems && lookUpItems.length > 0) {\r\n            if (field.type === 'number') {\r\n                lookUpItems.forEach(i => i.value = i.value !== DIALOG_FIELD_NULLVALUE ? +i.value : i.value);\r\n                return lookUpItems;\r\n            }\r\n        }\r\n        return lookUpItems;\r\n    }\r\n\r\n    private mapGroupedLookups(items: Array<SelectItem | GroupedSelectItem>): SelectItemGroup[] {\r\n        const result: SelectItemGroup[] = [];\r\n        const titleIndexDic = {};\r\n        for (const item of items) {\r\n            const title = this.isGroupedSelectItem(item) ? item.title : undefined;\r\n            if (!titleIndexDic[title]) {\r\n                const index = result.push({ title, items: [] }) - 1;\r\n                titleIndexDic[title] = index;\r\n            }\r\n            result[titleIndexDic[title]].items.push(item);\r\n        }\r\n        return result;\r\n    }\r\n\r\n    private isGroupedSelectItem(item: SelectItem | GroupedSelectItem): item is GroupedSelectItem {\r\n        return 'title' in item && !!item.title;\r\n    }\r\n\r\n    public doOnChange(keyValueChange: KeyValueChangeRecord<string, any>) {\r\n        const currentValue = keyValueChange.currentValue !== undefined && keyValueChange.currentValue !== null ? keyValueChange.currentValue.toString() : null;\r\n        const previousValue = keyValueChange.previousValue !== undefined && keyValueChange.previousValue !== null ? keyValueChange.previousValue.toString() : null;\r\n        if (currentValue !== previousValue) {\r\n            const field: DialogField<T> = this.getDialogField(keyValueChange.key);\r\n            if (field && field.onChange)\r\n                field.onChange(this.editItem, keyValueChange.previousValue);\r\n\r\n        }\r\n    }\r\n\r\n    public getSelectItem(fieldname: string): SelectItem {\r\n        const selectItems = this.getLookups(fieldname);\r\n        return selectItems.find((s) => s.value === this.editItem[fieldname]);\r\n    }\r\n\r\n    public setCatActive(activeCat: DialogFieldCategory) {\r\n        for (const cat of this.categories)\r\n            cat.active = false;\r\n\r\n        activeCat.active = true;\r\n    }\r\n\r\n    private setFirstCatActive() {\r\n        const firstCat = this.categories.length > 0 ? this.categories[0] : null;\r\n        if (firstCat) this.setCatActive(firstCat);\r\n    }\r\n\r\n    private getDynamicLookupItems(field: DialogField<T>): Array<SelectItem | SelectColor> {\r\n        let lookUpItems: Array<SelectItem | SelectColor> = [];\r\n        let dynamicList = this.getDynamicList(field, field.lookUps);\r\n        if (dynamicList && !dynamicList.lookupItems) {\r\n            this.logger.error('dynamicList with key=' + field.lookUps + ' misses the property \\'lookupItems\\'');\r\n            dynamicList = null;\r\n        }\r\n        lookUpItems = dynamicList ? dynamicList.lookupItems as Array<SelectItem | SelectColor> : [];\r\n        return lookUpItems;\r\n    }\r\n\r\n    //private dataSource: DatasourceComponent;\r\n    public getDynamicDatasource(field: DialogField<T>): DatasourceComponent {\r\n        let dataSource: DatasourceComponent = null;\r\n        let dynamicList = this.getDynamicList(field, field.grid.datasource);\r\n        if (dynamicList && !dynamicList.datasource) {\r\n            this.logger.error('dynamicList with key=' + field.grid.datasource + ' has no datasource');\r\n            dynamicList = null;\r\n        }\r\n        dataSource = dynamicList ? dynamicList.datasource as DatasourceComponent : null;\r\n        return dataSource;\r\n    }\r\n\r\n    private getDynamicList(field: DialogField<T>, key: any): DialogDynamicList {\r\n        let dynamicList = null;\r\n        if (!this.dynamicLists)\r\n            this.logger.error('unexpected: dynamicLists Array is undefined');\r\n\r\n        else {\r\n            dynamicList = this.dynamicLists.find((dl) => dl.key === key);\r\n            if (!dynamicList)\r\n                this.logger.warn('dynamicLists with key=' + key + ' not found');\r\n\r\n        }\r\n        return dynamicList;\r\n    }\r\n\r\n    public onButtonClicked(btn: DialogFieldButton, editItem: any) {\r\n        if (btn.onButtonClicked)\r\n            btn.onButtonClicked(editItem);\r\n\r\n        if (btn.submitDialog)\r\n            this.submitDialog(btn.submitResult);\r\n\r\n    }\r\n\r\n    public doOnDropdownGridShown(fieldname: string) {\r\n        const field: DialogField<T> = this.getDialogField(fieldname);\r\n        if (field && field.grid && field.grid.onDropdownGridShown) {\r\n            const datasource = this.getDynamicDatasource(field);\r\n            field.grid.onDropdownGridShown(this.editItem, fieldname, datasource);\r\n        }\r\n    }\r\n\r\n    private prepareGrid() {\r\n        for (const field of this.getAllDialogFields) {\r\n            if (field.controlType === 'grid' || field.controlType === 'dropdown-grid') {\r\n                const datasource = this.getDynamicDatasource(field);\r\n                if (datasource) {\r\n                    datasource.setSelection(this.editItem[field.fieldname] ? this.editItem[field.fieldname] : []);\r\n                    if (field.grid.pageSize) {\r\n                        //Der Timeout wird dafür benötigt, da zu diesem Zeitpunkt die Pagination der DS noch nicht initialisiert sein kann.\r\n                        setTimeout(() => datasource.setPageSize(field.grid.pageSize));\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    private datasourceSubscriptions = new Array<Subscription>();\r\n    public bindGridSelectionToEditItem() {\r\n        for (const field of this.getAllDialogFields) {\r\n            if (field.controlType === 'grid' || field.controlType === 'dropdown-grid') {\r\n                const datasource = this.getDynamicDatasource(field);\r\n                if (datasource) {\r\n                    this.datasourceSubscriptions.push(\r\n                        datasource.onSelectedIdsChanges.subscribe((selectedIds: any[]) => {\r\n                            this.editItem[field.fieldname] = selectedIds;\r\n                        })\r\n                    );\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    private unSubscribeDatasources() {\r\n        for (const s of this.datasourceSubscriptions) s.unsubscribe();\r\n        this.datasourceSubscriptions = new Array<Subscription>();\r\n    }\r\n\r\n    private hasDatePicker() {\r\n        const input = document.createElement('input');\r\n        input.setAttribute('type', 'date');\r\n        input.value = '2038-01-20';\r\n        return !!input.valueAsDate;\r\n    }\r\n\r\n    private useBrowserDateInput(field: DialogField<T>): boolean {\r\n        return this.hasDatePicker() && !field.calendarWeekVisible;\r\n    }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\nimport { Subject, Subscription, Observable } from 'rxjs';\r\nimport { map, tap } from 'rxjs/operators';\r\n\r\nimport { GenericEditDialogComponent } from './swt-generic-edit-dialog.component';\r\nimport { DialogFieldCategory, DialogField, DialogDynamicList, IDialogConfiguration, GenericEditDialogResult, DialogSize, DialogInputSize } from './swt-generic-edit-dialog.types';\r\n\r\nconst CLASS = 'GenericEditDialogService';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class GenericEditDialogService {\r\n    constructor(\r\n        private loggerService: LoggerService,\r\n    ) { }\r\n\r\n    private notify = new Subject<any>();\r\n    public raiseNotify(data: any) {\r\n        this.loggerService.log(CLASS + '.raiseNotify');\r\n        this.notify.next(data);\r\n    }\r\n\r\n    private notifySubscriptions = new Array<Subscription>();\r\n    public subscribeOnNotify(next: (value: any) => void) {\r\n        this.unsubscribeNotifies();\r\n        this.notifySubscriptions.push(\r\n            this.notify.subscribe(next)\r\n        );\r\n    }\r\n\r\n    public unsubscribeNotifies() {\r\n        for (const sub of this.notifySubscriptions)\r\n            sub.unsubscribe();\r\n\r\n    }\r\n\r\n    private registeredConfigurations = new Array<DialogConfiguration>();\r\n\r\n    private dialogComponent: GenericEditDialogComponent<any>;\r\n    public setDialogComponent(dialogComponent: GenericEditDialogComponent<any>) {\r\n        this.dialogComponent = dialogComponent;\r\n    }\r\n\r\n    public registerDialogConfiguration(key: string, dialogConfiguration: IDialogConfiguration);\r\n    public registerDialogConfiguration(key: string, fieldsOrCategoriesOfFields: DialogField[] | DialogFieldCategory[], title?: string, categoriesAsTabs?: boolean);\r\n    public registerDialogConfiguration(key: string, arg2: any, title?: string, categoriesAsTabs?: boolean) {\r\n        let dialogConfiguration: IDialogConfiguration;\r\n        if (arg2.fieldsOrCategoriesOfFields == undefined) {\r\n            const fieldsOrCategoriesOfFields = arg2;\r\n            const useTabs = categoriesAsTabs === true;\r\n            dialogConfiguration = new DialogConfiguration(fieldsOrCategoriesOfFields, title, useTabs);\r\n        }\r\n        else\r\n            dialogConfiguration = arg2;\r\n\r\n        this.registeredConfigurations[key] = dialogConfiguration;\r\n    }\r\n\r\n    private getDialogConfiguration(key: string): DialogConfiguration {\r\n        if (this.registeredConfigurations[key] == undefined) this.loggerService.error('the requested dialog configuration with key=' + key + ' is not registered');\r\n        return this.registeredConfigurations[key];\r\n    }\r\n\r\n    public show(configuration: IDialogConfiguration, dto?: any, mode?: any, lookups?: DialogDynamicList[]): Observable<GenericEditDialogResult<any, any>>;\r\n    public show<DATATYPE>(configuration: IDialogConfiguration, dto?: DATATYPE, mode?: any, lookups?: DialogDynamicList[]): Observable<GenericEditDialogResult<DATATYPE, any>>;\r\n    public show<DATATYPE, MODETYPE>(configuration: IDialogConfiguration, dto?: DATATYPE, mode?: MODETYPE, lookups?: DialogDynamicList[]): Observable<GenericEditDialogResult<DATATYPE, MODETYPE>>;\r\n    public show(key: string, dto?: any, mode?: any, lookups?: DialogDynamicList[]): Observable<GenericEditDialogResult<any, any>>;\r\n    public show<DATATYPE>(key: string, dto?: DATATYPE, mode?: any, lookups?: DialogDynamicList[]): Observable<GenericEditDialogResult<DATATYPE, any>>;\r\n    public show<DATATYPE, MODETYPE>(key: string, dto?: DATATYPE, mode?: MODETYPE, lookups?: DialogDynamicList[]): Observable<GenericEditDialogResult<DATATYPE, MODETYPE>>;\r\n    public show<DATATYPE, MODETYPE>(arg1: string | IDialogConfiguration, dto?: DATATYPE, mode?: MODETYPE, lookups?: DialogDynamicList[]): Observable<GenericEditDialogResult<DATATYPE, MODETYPE>> {\r\n        let key = '';\r\n        let configuration: IDialogConfiguration;\r\n        if (typeof (arg1) === 'string') {\r\n            key = arg1;\r\n            configuration = this.getDialogConfiguration(key);\r\n        }\r\n        else\r\n            configuration = arg1;\r\n\r\n\r\n        return this.showConfig(configuration, dto, lookups, mode, key);\r\n    }\r\n\r\n    private hiddenSubscription: Subscription;\r\n    private cancelSubscription: Subscription;\r\n\r\n    public showConfig<DATATYPE>(configuration: IDialogConfiguration, dto?: DATATYPE, lookups?: DialogDynamicList[], mode: any = null, key = ''): Observable<GenericEditDialogResult<DATATYPE, any>> {\r\n        if (!this.dialogComponent) this.loggerService.error('No GenericEditDialogComponent provided. Put a GenericEditDialogComponent to the main view and call the setDialogComponent-method ');\r\n        this.dialogComponent.onSubmit.observers = [];\r\n        this.dialogComponent.titleSingular = configuration.title;\r\n        this.dialogComponent.categoriesAsTabs = configuration.categoriesAsTabs;\r\n        this.dialogComponent.size = configuration.size;\r\n        this.dialogComponent.inputSize = configuration.inputSize;\r\n        this.dialogComponent.enterKeyAsTabKey = configuration.enterKeyAsTabKey;\r\n        this.dialogComponent.hideOkButton = configuration.hideOkButton;\r\n        this.dialogComponent.hideCancelButton = configuration.hideCancelButton;\r\n        this.dialogComponent.configureDialogFields(configuration.fieldsOrCategoriesOfFields);\r\n        this.hiddenSubscription = this.dialogComponent.onHidden.subscribe(() => { this.hiddenSubscription.unsubscribe(); this.onHidden.next(); });\r\n        this.cancelSubscription = this.dialogComponent.onCancel.subscribe(() => { this.cancelSubscription.unsubscribe(); this.onCancel.next(); });\r\n        this.dialogComponent.show(dto, mode, lookups);\r\n        return this.dialogComponent.onSubmit\r\n            .pipe(map((dto: DATATYPE) => ({\r\n                key,\r\n                dto,\r\n                mode,\r\n                submitResult: this.dialogComponent.submitResult\r\n            })))\r\n            .pipe(tap((result: GenericEditDialogResult<DATATYPE, any>) => {\r\n                this.dialogComponent.hide();\r\n                this.hiddenSubscription.unsubscribe();\r\n                this.cancelSubscription.unsubscribe();\r\n            }));\r\n    }\r\n\r\n    public onCancel: Subject<void> = new Subject<void>();\r\n    public onHidden: Subject<void> = new Subject<void>();\r\n\r\n    public hide() {\r\n        this.dialogComponent.hide();\r\n    }\r\n\r\n    public showErrors(errors: string[]) {\r\n        this.dialogComponent.showErrors(errors);\r\n\r\n        //resubscribe to Subscriptions\r\n        this.dialogComponent.bindGridSelectionToEditItem();\r\n        this.hiddenSubscription = this.dialogComponent.onHidden.subscribe(() => { this.hiddenSubscription.unsubscribe(); this.onHidden.next(); });\r\n        this.cancelSubscription = this.dialogComponent.onCancel.subscribe(() => { this.cancelSubscription.unsubscribe(); this.onCancel.next(); });\r\n    }\r\n\r\n    public focus(fieldname: string) {\r\n        this.dialogComponent.focus(fieldname);\r\n    }\r\n}\r\n\r\nclass DialogConfiguration implements IDialogConfiguration {\r\n    constructor(\r\n        public fieldsOrCategoriesOfFields: DialogField[] | DialogFieldCategory[],\r\n        public title: string = '',\r\n        public categoriesAsTabs?: boolean,\r\n        public size?: DialogSize,\r\n        public inputSize?: DialogInputSize,\r\n        public enterKeyAsTabKey: boolean = false\r\n    ) {\r\n        this.categoriesAsTabs = categoriesAsTabs == undefined ? true : false;\r\n    }\r\n}\r\n","import { Component, Directive, Input, ViewChild } from '@angular/core';\r\nimport { NgForm } from '@angular/forms';\r\n\r\nimport type { GenericEditDialogFormComponent } from '../swt-generic-edit-dialog-form.component';\r\nimport { DialogField } from '../swt-generic-edit-dialog.types';\r\n\r\n@Directive()\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport abstract class SwtGenericEditDialogFormComponentBase {\r\n\r\n    @Input()\r\n    public component: GenericEditDialogFormComponent;\r\n    @ViewChild('dialogForm', { static: true })\r\n    public dialogForm: NgForm;\r\n\r\n    protected fieldValidate(field: DialogField<unknown>, fieldValue?: unknown, fieldValue2?: unknown) {\r\n        this.component?.fieldValidate(field, fieldValue, fieldValue2);\r\n    }\r\n}\r\n\r\n@Component({\r\n    selector: 'swt-generic-edit-dialog-form-inspinia',\r\n    templateUrl: './swt-generic-edit-dialog-form.inspinia.component.html',\r\n    standalone: false\r\n})\r\nexport class SwtGenericEditDialogFormInspiniaComponent extends SwtGenericEditDialogFormComponentBase { }\r\n\r\n@Component({\r\n    selector: 'swt-generic-edit-dialog-form-sneat',\r\n    templateUrl: './swt-generic-edit-dialog-form.sneat.component.html',\r\n    standalone: false\r\n})\r\nexport class SwtGenericEditDialogFormSneatComponent extends SwtGenericEditDialogFormComponentBase { }\r\n","<form class=\"form form-horizontal\" #dialogForm=\"ngForm\" autocomplete=\"off\">\r\n  @for (field of component.cat.dialogFields; track field) {\r\n    <div\r\n      [ngClass]=\"[field.required ? 'required' : '', field.cssClass ?? '']\"\r\n      [hidden]=\"!component.fieldVisible(field)\">\r\n      @switch (field.controlType) {\r\n        @default {\r\n          <div class=\"form-group\" [ngClass]=\"component.formErrors[field.fieldname]?'has-error':''\">\r\n            <label class=\"control-label col-sm-4\" [for]=\"field.fieldname\">\r\n              {{field.text}} @if (field.unit) {\r\n              <span>({{field.unit}})</span>\r\n            }\r\n          </label>\r\n          <div class=\"col-sm-8\">\r\n            @if (field.textMask) {\r\n              <input type=\"{{field.controlType}}\" [mask]=\"field.textMask.mask\"\r\n                [patterns]=\"field.textMask.patterns\" [showMaskTyped]=\"field.textMask.showMaskTyped\"\r\n                [dropSpecialCharacters]=\"false\" class=\"form-control no-spinners\" [attr.name]=\"field.fieldname\"\r\n                name=\"{{field.fieldname}}\" [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                [required]=\"field.required\" [autofocus]=\"field.autofocus\" [ngClass]=\"component.inputClass\"\r\n                [style]=\"field.controlStyle\" [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\"/>\r\n              } @else if (field.controlType === 'number' && field.showSpinnerButtons !== false) {\r\n                <div class=\"input-group\">\r\n                  <span class=\"input-group-addon btn btn-default\"\r\n                  (click)=\"component.clickSpinnerDown($event,field)\">-</span>\r\n                  <input type=\"number\" class=\"form-control no-spinners\" [attr.name]=\"field.fieldname\"\r\n                    name=\"{{field.fieldname}}\" [placeholder]=\"field.placeholder?field.placeholder:''\"\r\n                    [(ngModel)]=\"component.editItem[field.fieldname]\" [min]=\"field.min\" [max]=\"field.max\"\r\n                    [maxlength]=\"field.maxLength\" [required]=\"field.required\" [autofocus]=\"field.autofocus\"\r\n                    [style]=\"field.controlStyle\" [ngClass]=\"component.inputClass\" [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\"/>\r\n                    <span class=\"input-group-addon btn btn-default\"\r\n                    (click)=\"component.clickSpinnerUp($event,field)\">+</span>\r\n                  </div>\r\n                } @else {\r\n                  <input type=\"{{field.controlType}}\" class=\"form-control no-spinners\" [attr.name]=\"field.fieldname\"\r\n                    name=\"{{field.fieldname}}\" [placeholder]=\"field.placeholder?field.placeholder:''\"\r\n                    [(ngModel)]=\"component.editItem[field.fieldname]\" [min]=\"field.min\" [max]=\"field.max\"\r\n                    [maxlength]=\"field.maxLength\" [required]=\"field.required\" [autofocus]=\"field.autofocus\"\r\n                    [style]=\"field.controlStyle\" [ngClass]=\"component.inputClass\"\r\n                    [autocomplete]=\"field.controlType === 'password' ? 'new-password':'off'\"\r\n                    pattern=\"{{field.controlType==='time'?'^[0-9]{2}:[0-9]{2}(:[0-9]{2})?$':''}}\"  [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\"/>\r\n                  }\r\n                  @if (field.help) {\r\n                    <span class=\"help-block m-b-none\">{{field.help}}</span>\r\n                  }\r\n                  @if (component.formErrors[field.fieldname]) {\r\n                    <div class=\"m-t-xs alert alert-danger\">\r\n                      {{ component.formErrors[field.fieldname] }}\r\n                    </div>\r\n                  }\r\n                </div>\r\n              </div>\r\n            }\r\n            @case ('money') {\r\n              <div class=\"form-group\">\r\n                <label class=\"control-label col-sm-4\" [for]=\"field.fieldname\">{{ component.formatMoneyText(field) }}</label>\r\n                <div class=\"col-sm-8\">\r\n                  <input type=\"number\" class=\"form-control no-spinners\" [ngClass]=\"component.inputClass\"\r\n                    [name]=\"field.fieldname\" [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                    [required]=\"field.required\" [autofocus]=\"field.autofocus\" [attr.name]=\"field.fieldname\" [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\">\r\n                    @if (field.help) {\r\n                      <span class=\"help-block m-b-none\">{{field.help}}</span>\r\n                    }\r\n                    @if (component.formErrors[field.fieldname]) {\r\n                      <div class=\"m-t-xs alert alert-danger\">\r\n                        {{ component.formErrors[field.fieldname] }}\r\n                      </div>\r\n                    }\r\n                  </div>\r\n                </div>\r\n              }\r\n              @case ('password-with-confirm') {\r\n                <div class=\"form-group\">\r\n                  <label class=\"control-label col-sm-4\" [for]=\"field.fieldname\">{{field.text}}</label>\r\n                  <div class=\"col-sm-8\">\r\n                    <input type=\"password\" class=\"form-control\" [attr.name]=\"field.fieldname\" name=\"{{field.fieldname}}\"\r\n                      [(ngModel)]=\"component.editItem[field.fieldname]\" [maxlength]=\"field.maxLength\"\r\n                      [required]=\"field.required\" [autofocus]=\"field.autofocus\" [style]=\"field.controlStyle\"\r\n                      [ngClass]=\"component.inputClass\" autocomplete=\"new-password\" [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\"/>\r\n                      @if (field.help) {\r\n                        <span class=\"help-block m-b-none\">{{field.help}}</span>\r\n                      }\r\n                      @if (component.formErrors[field.fieldname]) {\r\n                        <div class=\"m-t-xs alert alert-danger\">\r\n                          {{ component.formErrors[field.fieldname] }}\r\n                        </div>\r\n                      }\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"form-group\">\r\n                    <label class=\"control-label col-sm-4\" i18n=\"@@SwtGenericEditDialog.Repeat.dsp.Label\" [for]=\"'confirm--' + field.fieldname\">\r\n                    {{field.text}} Wiederholung\r\n                </label>\r\n                    <div class=\"col-sm-8\">\r\n                      <input type=\"password\" class=\"form-control\" [attr.name]=\"'PasswordPasswordConfirm'\"\r\n                        name=\"PasswordPasswordConfirm\" [(ngModel)]=\"component.editItem[field.fieldnamePasswordConfirm]\"\r\n                        [maxlength]=\"field.maxLength\" [style]=\"field.controlStyle\" [ngClass]=\"component.inputClass\"\r\n                        autocomplete=\"new-password\" [id]=\"'confirm--' + field.fieldname\" (blur)=\"fieldValidate(field)\"/>\r\n                        @if (component.passwordConfirmInvalid(field)) {\r\n                          <div class=\"text-danger\"\r\n                            i18n=\"@@SwtGenericEditDialog.PasswordMismatch.dsp.Label\">\r\n                        Die Passwörter stimmen nicht überein\r\n                    </div>\r\n                        }\r\n                      </div>\r\n                    </div>\r\n                  }\r\n                  @case ('checkbox') {\r\n                    <div class=\"form-group\">\r\n                      <label class=\"col-sm-4\" [ngClass]=\"{'control-label': field.text}\" [for]=\"field.fieldname\">{{field.text}}</label>\r\n                      <div class=\"col-sm-8 form-control-static\">\r\n                        <swt-checkbox [activeChangeDetectionHack]=\"true\" [name]=\"field.fieldname\"\r\n                        [(ngModel)]=\"component.editItem[field.fieldname]\" [id]=\"field.fieldname\"></swt-checkbox>\r\n                        @if (field.unit) {\r\n                          <label class=\"m-l-xs m-b-none\" style=\"vertical-align: middle;\">{{field.unit}}</label>\r\n                        }\r\n                        <br>\r\n                          @if (field.help) {\r\n                            <span class=\"help-block m-b-none m-t-sm\">{{field.help}}</span>\r\n                          }\r\n                          @if (component.formErrors[field.fieldname]) {\r\n                            <div class=\"m-t-xs alert alert-danger\">\r\n                              {{ component.formErrors[field.fieldname] }}\r\n                            </div>\r\n                          }\r\n                        </div>\r\n                      </div>\r\n                    }\r\n                    @case ('date') {\r\n                      <div class=\"form-group\">\r\n                        <label class=\"control-label col-sm-4\" [for]=\"field.fieldname\">{{field.text}}</label>\r\n                        <div class=\"col-sm-8\">\r\n                          @if (component.useBrowserDateInput(field)) {\r\n                            <input type=\"date\" class=\"form-control no-spinners\"\r\n                              [ngClass]=\"component.inputClass\" [name]=\"field.fieldname\" [attr.data-cy-name]=\"field.fieldname\"\r\n                              [(ngModel)]=\"component.editItem[field.fieldname]\" [required]=\"field.required\"\r\n                              [autofocus]=\"field.autofocus\" [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\">\r\n                            } @else {\r\n                              <swt-dropdown-container  [closeWhenClickOutside]=\"true\"  [container]=\"component.swtDropdownContainerContainer\" #datedropdown\r\n                                [id]=\"field.fieldname\" [allowClear]=\"!field.required\"\r\n                                (onClear)=\"component.dropDownClearClicked(field.fieldname)\" [width]=\"'100%'\">\r\n                                <swt-date-input dropdown-input [name]=\"field.fieldname\"\r\n                                  [(ngModel)]=\"component.editItem[field.fieldname]\" [required]=\"field.required\"\r\n                                  [autofocus]=\"field.autofocus\" [class]=\"component.inputClass\" [id]=\"field.fieldname\" (focusLost)=\"fieldValidate(field)\">\r\n                                </swt-date-input>\r\n                                <swt-date-picker #swtDatePicker [calendarWeekVisible]=\"field.calendarWeekVisible\"\r\n                                  name=\"{{field.fieldname}}\" week [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                                (change)=\"datedropdown.collapse()\"></swt-date-picker>\r\n                              </swt-dropdown-container>\r\n                            }\r\n                            @if (field.help) {\r\n                              <span class=\"help-block m-b-none\">{{field.help}}</span>\r\n                            }\r\n                            @if (component.formErrors[field.fieldname]) {\r\n                              <div class=\"m-t-xs alert alert-danger\">\r\n                                {{ component.formErrors[field.fieldname] }}\r\n                              </div>\r\n                            }\r\n                          </div>\r\n                        </div>\r\n                      }\r\n                      @case ('dateInterval') {\r\n                        <div class=\"form-group\">\r\n                          <div class=\"col-sm-12\">\r\n                            <div class=\"row\">\r\n                              <label class=\"control-label col-sm-4\" [for]=\"field.fieldname\">{{field.text}}</label>\r\n                              <div class=\"col-sm-8\">\r\n                                @if (component.useBrowserDateInput(field)) {\r\n                                  <input type=\"date\" class=\"form-control no-spinners\"\r\n                                    [ngClass]=\"component.inputClass\" [name]=\"field.fieldname\" [attr.data-cy-name]=\"field.fieldname\"\r\n                                    [(ngModel)]=\"component.editItem[field.fieldname]\" [required]=\"field.required\"\r\n                                    [autofocus]=\"field.autofocus\" [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\">\r\n                                  } @else {\r\n                                    <swt-dropdown-container [closeWhenClickOutside]=\"true\" [container]=\"component.swtDropdownContainerContainer\" #datedropdown [id]=\"field.fieldname\" [allowClear]=\"!field.required\"\r\n                                      (onClear)=\"component.dropDownClearClicked(field.fieldname)\" [width]=\"'100%'\">\r\n                                      <swt-date-input dropdown-input [name]=\"field.fieldname\"\r\n                                        [(ngModel)]=\"component.editItem[field.fieldname]\" [required]=\"field.required\"\r\n                                        [autofocus]=\"field.autofocus\" [class]=\"component.inputClass\" [id]=\"field.fieldname\" (focusLost)=\"fieldValidate(field)\">\r\n                                      </swt-date-input>\r\n                                      <swt-date-picker #swtDatePicker [calendarWeekVisible]=\"field.calendarWeekVisible\"\r\n                                        name=\"{{field.fieldname}}\" week [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                                      (change)=\"datedropdown.collapse()\"></swt-date-picker>\r\n                                    </swt-dropdown-container>\r\n                                  }\r\n                                  @if (field.help) {\r\n                                    <div class=\"help-block m-b-sm\">{{field.help}}</div>\r\n                                  }\r\n                                  @if (component.formErrors[field.fieldname]) {\r\n                                    <div class=\"m-t-xs alert alert-danger\">\r\n                                      {{ component.formErrors[field.fieldname] }}\r\n                                    </div>\r\n                                  }\r\n                                </div>\r\n                              </div>\r\n                              <div class=\"row\">\r\n                                <label class=\"control-label col-sm-4\" [for]=\"field.fieldname2\">{{field.text2}}</label>\r\n                                <div class=\"col-sm-8\">\r\n                                  @if (component.useBrowserDateInput(field)) {\r\n                                    <input type=\"date\" class=\"form-control no-spinners\"\r\n                                      [ngClass]=\"component.inputClass\" [name]=\"field.fieldname2\" [attr.data-cy-name]=\"field.fieldname2\" [required]=\"field.required2\"\r\n                                      [(ngModel)]=\"component.editItem[field.fieldname2]\" [autofocus]=\"field.autofocus\" [id]=\"field.fieldname2\" (blur)=\"fieldValidate(field)\">\r\n                                    } @else if (!component.useBrowserDateInput(field)) {\r\n                                      <swt-dropdown-container  [closeWhenClickOutside]=\"true\" [container]=\"component.swtDropdownContainerContainer\" #datedropdown2\r\n                                        [id]=\"field.fieldname2\" [allowClear]=\"!field.required2\"\r\n                                        (onClear)=\"component.dropDownClearClicked(field.fieldname2)\" [width]=\"'100%'\">\r\n                                        <swt-date-input dropdown-input [name]=\"field.fieldname2\"\r\n                                          [(ngModel)]=\"component.editItem[field.fieldname2]\" [required]=\"field.required2\"\r\n                                          [class]=\"component.inputClass\" [id]=\"field.fieldname2\" (focusLost)=\"fieldValidate(field)\">\r\n                                        </swt-date-input>\r\n                                        <swt-date-picker #swtDatePicker2 [calendarWeekVisible]=\"field.calendarWeekVisible\"\r\n                                          name=\"{{field.fieldname2}}\" week [(ngModel)]=\"component.editItem[field.fieldname2]\"\r\n                                        (change)=\"datedropdown2.collapse()\"></swt-date-picker>\r\n                                      </swt-dropdown-container>\r\n                                    }\r\n                                    @if (field.help2) {\r\n                                      <span class=\"help-block m-b-none\">{{field.help2}}</span>\r\n                                    }\r\n                                    @if (component.formErrors[field.fieldname2]) {\r\n                                      <div class=\"m-t-xs alert alert-danger\">\r\n                                        {{ component.formErrors[field.fieldname2] }}\r\n                                      </div>\r\n                                    }\r\n                                  </div>\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                          }\r\n                          @case ('dateInput') {\r\n                            <div class=\"form-group\">\r\n                              <label class=\"control-label col-sm-4\" [for]=\"field.fieldname\">{{field.text}}</label>\r\n                              <input class=\"form-control no-spinners\" [ngClass]=\"component.inputClass\" [name]=\"field.fieldname\" [attr.data-cy-name]=\"field.fieldname\"\r\n                                [(ngModel)]=\"component.editItem[field.fieldname]\" [required]=\"field.required\"\r\n                                [autofocus]=\"field.autofocus\" type=\"date\" [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\">\r\n                              </div>\r\n                            }\r\n                            @case ('textarea') {\r\n                              <div class=\"form-group\">\r\n                                <label class=\"control-label col-sm-4\" [for]=\"field.fieldname\">\r\n                                  {{field.text}}\r\n                                  @if (field.unit) {\r\n                                    <span>({{field.unit}})</span>\r\n                                  }\r\n                                </label>\r\n                                <div class=\"col-sm-8\">\r\n                                  <textarea class=\"form-control\" [attr.name]=\"field.fieldname\" name=\"{{field.fieldname}}\"\r\n                                    [(ngModel)]=\"component.editItem[field.fieldname]\" [maxlength]=\"field.maxLength\"\r\n                                    [required]=\"field.required\" [autofocus]=\"field.autofocus\"\r\n                                    [style]=\"field.controlStyle ? field.controlStyle : 'height: 5em;'\"\r\n                                  [ngClass]=\"component.inputClass\" [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\"></textarea>\r\n                                  @if (field.help) {\r\n                                    <span class=\"help-block m-b-none\">{{field.help}}</span>\r\n                                  }\r\n                                  @if (component.formErrors[field.fieldname]) {\r\n                                    <div class=\"m-t-xs alert alert-danger\">\r\n                                      {{ component.formErrors[field.fieldname] }}\r\n                                    </div>\r\n                                  }\r\n                                </div>\r\n                              </div>\r\n                            }\r\n                            @case ('info-text') {\r\n                              <div class=\"form-group\">\r\n                                @if (field.text) {\r\n                                  <label class=\"control-label col-sm-4\" [for]=\"field.fieldname\">\r\n                                    {{field.text}}\r\n                                    @if (field.unit) {\r\n                                      <span>({{field.unit}})</span>\r\n                                    }\r\n                                  </label>\r\n                                }\r\n                                <div [ngClass]=\"field.text ? 'col-sm-8' :'col-sm-12'\" class=\"form-control-static\">\r\n                                  @if (field.fieldname) {\r\n                                    <p class=\"text-wrap\" [style]=\"field.controlStyle\"\r\n                                    [innerHTML]=\"component.editItem[field.fieldname]\" [id]=\"field.fieldname\"></p>\r\n                                  }\r\n                                  @if (field.help) {\r\n                                    <span class=\"help-block m-b-none\">{{field.help}}</span>\r\n                                  }\r\n                                </div>\r\n                              </div>\r\n                            }\r\n                            @case ('select') {\r\n                              <div class=\"form-group\">\r\n                                <label class=\"control-label col-sm-4\" [for]=\"field.fieldname\">\r\n                                  {{field.text}}\r\n                                  @if (field.unit) {\r\n                                    <span>({{field.unit}})</span>\r\n                                  }\r\n                                </label>\r\n                                <div class=\"col-sm-8\">\r\n                                  @if (field.type === 'lru') {\r\n                                    @if (field.multiSelectLookups) {\r\n                                      <multi-lru [name]=\"field.fieldname\" [inputMaxLength]=\"field.maxLength\"\r\n                                        [inputSelectItems]=\"component.getLookups(field)\" [inputSelectItemsFn]=\"field.lookUpSearchFn\"\r\n                                        [value]=\"component.editItem[field.fieldname]\"\r\n                                        (selectedTexts)=\"component.editItem[field.fieldname]=$event\"\r\n                                      [cssClass]=\"component.inputClass\" [id]=\"field.fieldname\" (focusLost)=\"fieldValidate(field)\"></multi-lru>\r\n                                    } @else {\r\n                                      <swt-lru #swtlru [key]=\"field.fieldname\" [inputMaxLength]=\"field.maxLength\"\r\n                                        [inputSelectItems]=\"component.getLookups(field)\"\r\n                                        [preSetText]=\"component.editItem[field.fieldname]\"\r\n                                        (valueChange)=\"component.editItem[field.fieldname]=$event\"\r\n                                      [cssClass]=\"component.inputClass\" [id]=\"field.fieldname\" (focusLost)=\"fieldValidate(field)\"></swt-lru>\r\n                                    }\r\n                                  } @else if (!component.hasLookups(field)) {\r\n                                    <div class=\"form-control-static\" i18n=\"@@SwtGenericEditDialog.NotChangeable.msg.Text\">(nicht änderbar)</div>\r\n                                  } @else if (field.multiSelectLookups) {\r\n                                    <div class=\"position-relative\">\r\n                                      <ng-select [ngStyle]=\"{'z-index':field.zIndex ? field.zIndex : 3}\" class=\"form-control\"\r\n                                        placeholder=\"(Auswählen)\" i18n-placeholder=\"@@SwtGenericEditDialog.Choose.dsp.Label\"\r\n                                        [multiple]=\"true\" [items]=\"component.getLookupsWithLabel(field)\"\r\n                                        [attr.name]=\"field.fieldname\" (change)=\"component.onSelectChanged(field.fieldname)\"\r\n                                        name=\"{{field.fieldname}}\" [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                                        [clearOnBackspace]=\"true\" [bindValue]=\"'value'\" [ngClass]=\"component.inputClass\"\r\n                                        [addTag]=\"true\" [id]=\"field.fieldname\" [required]=\"field.required\" (blur)=\"fieldValidate(field)\">\r\n                                      </ng-select>\r\n                                    </div>\r\n                                    @if (field.help) {\r\n                                      <span class=\"help-block m-b-none\">{{field.help}}</span>\r\n                                    }\r\n                                    @if (component.formErrors[field.fieldname]) {\r\n                                      <div class=\"m-t-xs alert alert-danger\">\r\n                                        {{ component.formErrors[field.fieldname] }}\r\n                                      </div>\r\n                                    }\r\n                                  } @else if (field.radioLookups) {\r\n                                    @for (lookUp of component.getLookups(field); track lookUp) {\r\n                                      <div class=\"radio\">\r\n                                        <label (click)=\"component.editItem[field.fieldname] = lookUp.value\"\r\n                                          for=\"{{field.fieldname}}-{{lookUp.value}}\">\r\n                                          <input [attr.name]=\"field.fieldname\" type=\"radio\"\r\n                                            (change)=\"component.onSelectChanged(field.fieldname)\"\r\n                                            id=\"{{field.fieldname}}-{{lookUp.value}}\"\r\n                                            name=\"{{field.fieldname}}-{{lookUp.value}}\" value=\"{{lookUp.value}}\"\r\n                                            [style]=\"field.controlStyle\" [(ngModel)]=\"component.editItem[field.fieldname]\">\r\n                                            {{lookUp.text}}\r\n                                          </label>\r\n                                        </div>\r\n                                      }\r\n                                      @if (field.help) {\r\n                                        <span class=\"help-block m-b-none\">{{field.help}}</span>\r\n                                      }\r\n                                      @if (component.formErrors[field.fieldname]) {\r\n                                        <div class=\"m-t-xs alert alert-danger\">\r\n                                          {{ component.formErrors[field.fieldname] }}\r\n                                        </div>\r\n                                      }\r\n                                    } @else {\r\n                                      <select class=\"form-control\" [attr.name]=\"field.fieldname\" name=\"{{field.fieldname}}\"\r\n                                        [autofocus]=\"field.autofocus\" [style]=\"field.controlStyle\"\r\n                                        [ngClass]=\"component.inputClass\" [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                                        (change)=\"component.onSelectChanged(field.fieldname)\" [id]=\"field.fieldname\" [required]=\"field.required\" (blur)=\"fieldValidate(field)\">\r\n                                        @for (group of component.getGroupableLookups(field); track component.idenitifyGroupableLookupsChanged($index, group)) {\r\n                                          @if (group.title) {\r\n                                            <optgroup [label]=\"group.title\">\r\n                                              @for (lookup of group.items; track lookup) {\r\n                                                <option value=\"{{lookup.value}}\">\r\n                                                  {{lookup.text}}\r\n                                                </option>\r\n                                              }\r\n                                            </optgroup>\r\n                                          }\r\n                                          @if (!group.title) {\r\n                                            @for (lookup of group.items; track lookup) {\r\n                                              <option value=\"{{lookup.value}}\">\r\n                                                {{lookup.text}}\r\n                                              </option>\r\n                                            }\r\n                                          }\r\n                                        }\r\n                                      </select>\r\n                                      @if (field.help) {\r\n                                        <span class=\"help-block m-b-none\">{{field.help}}</span>\r\n                                      }\r\n                                      @if (component.formErrors[field.fieldname]) {\r\n                                        <div class=\"m-t-xs alert alert-danger\">\r\n                                          {{ component.formErrors[field.fieldname] }}\r\n                                        </div>\r\n                                      }\r\n                                    }\r\n                                  </div>\r\n                                </div>\r\n                              }\r\n                              @case ('dropdown-grid') {\r\n                                <div class=\"form-group\">\r\n                                  <label class=\"control-label col-sm-4\" [for]=\"field.fieldname\">{{field.text}}</label>\r\n                                  <div class=\"col-sm-8\">\r\n                                    <!-- fix für onChange -->\r\n                                    <input type=\"{{field.controlType}}\" hidden [attr.name]=\"field.fieldname\" name=\"{{field.fieldname}}\"\r\n                                      [ngModel]=\"component.editItem[field.fieldname]\" [id]=\"field.fieldname\" />\r\n                                      <swt-dropdown-container [container]=\"component.swtDropdownContainerContainer\" [attr.name]=\"field.fieldname\" #gridDropDownContainer\r\n                                        [displayValue]=\"component.getDisplayValueOrDefault(field,' ')\" [width]=\"'100%'\"\r\n                                        (onShow)=\"component.doOnDropdownGridShown(field.fieldname)\">\r\n                                        <div class=\"p-sm drop-down-grid\">\r\n                                          <swt-grid [minHeight]=\"'0'\" [attr.id]=\"field.fieldname\" [config]=\"field.grid\"\r\n                                            [datasource]=\"component.getDynamicDatasource(field)\"\r\n                                            [paginationInfoVariant]=\"field.grid.paginationInfoVariant ?? 'compact'\"\r\n                                            [pageSizes]=\"field.grid.pageSizes ?? [10,20,30]\">\r\n                                          </swt-grid>\r\n                                          <div class=\"pull-right m-t-sm\">\r\n                                            <button [attr.name]=\"field.fieldname+'_btn_ok'\" class=\"btn btn-primary\"\r\n                                            (click)=\"gridDropDownContainer.collapse()\" i18n=\"@@Button.Ok.act.Label\">OK</button>\r\n                                          </div>\r\n                                        </div>\r\n                                      </swt-dropdown-container>\r\n                                      @if (field.help) {\r\n                                        <span class=\"help-block m-b-none\">{{field.help}}</span>\r\n                                      }\r\n                                      @if (component.formErrors[field.fieldname]) {\r\n                                        <div class=\"m-t-xs alert alert-danger\">\r\n                                          {{ component.formErrors[field.fieldname] }}\r\n                                        </div>\r\n                                      }\r\n                                    </div>\r\n                                  </div>\r\n                                }\r\n                                @case ('grid') {\r\n                                  @if (field.text) {\r\n                                    <ly-title context=\"swt-generic-edit-dialog-form\" sizeClass=\"title-size-4\">{{field.text}}</ly-title>\r\n                                  }\r\n                                  @if (field.help) {\r\n                                    <span class=\"help-block m-b-none\">{{field.help}}</span>\r\n                                  }\r\n                                  @if (component.formErrors[field.fieldname]) {\r\n                                    <div class=\"m-t-xs alert alert-danger\">\r\n                                      {{ component.formErrors[field.fieldname] }}\r\n                                    </div>\r\n                                  }\r\n                                  <swt-grid [attr.id]=\"field.fieldname\" [config]=\"field.grid\"\r\n                                    [datasource]=\"component.getDynamicDatasource(field)\" [minHeight]=\"\"\r\n                                    [paginationInfoVariant]=\"field.grid.paginationInfoVariant ?? 'compact'\"\r\n                                  [pageSizes]=\"field.grid.pageSizes ?? []\"></swt-grid>\r\n                                  <!-- fix für onChange -->\r\n                                  <input type=\"{{field.controlType}}\" hidden [attr.name]=\"field.fieldname\" name=\"{{field.fieldname}}\"\r\n                                    [style]=\"field.controlStyle\" [ngModel]=\"component.editItem[field.fieldname]\" />\r\n                                  }\r\n                                  @case ('divider') {\r\n                                    <div class=\"form-group\">\r\n                                      <div class=\"hr-line-dashed m-t-xs m-b-xs\"></div>\r\n                                      @if (field.text) {\r\n                                        <ly-title context=\"swt-generic-edit-dialog-form\" sizeClass=\"title-size-4\">{{field.text}}</ly-title>\r\n                                      }\r\n                                      @if (field.help) {\r\n                                        <p class=\"help-block m-b-none\">{{field.help}}</p>\r\n                                      }\r\n                                    </div>\r\n                                  }\r\n                                  @case ('buttons') {\r\n                                    @if (component.containsFormButtons(field)) {\r\n                                      <div class=\"form-group\">\r\n                                        <label class=\"control-label col-sm-4\">{{field.text}}</label>\r\n                                        <div class=\"col-sm-8 form-control-static\">\r\n                                          @for (btn of component.formButtons(field); track btn) {\r\n                                            <button type=\"button\"\r\n                                              class=\"btn m-r-xs {{btn.buttonClass}}\"\r\n                                              [ngClass]=\"{'btn-xs':component.small,'btn-sm':!component.small}\" [title]=\"btn.tooltip\"\r\n                                              [style]=\"field.controlStyle\" (click)=\"component.onButtonClicked(btn,component.editItem)\"\r\n                                              [ngStyle]=\"{ 'width': btn.width ?? 'auto' }\">\r\n                                              @if (btn.iconClass) {\r\n                                                <i class=\"fa {{btn.iconClass}}\"></i>\r\n                                              }\r\n                                              {{btn.text}}\r\n                                            </button>\r\n                                          }\r\n                                          @if (field.help) {\r\n                                            <span class=\"help-block m-b-none\">{{field.help}}</span>\r\n                                          }\r\n                                        </div>\r\n                                      </div>\r\n                                    }\r\n                                  }\r\n                                  @case ('hidden') {\r\n                                    <input type=\"{{field.controlType}}\" [attr.name]=\"field.fieldname\" name=\"{{field.fieldname}}\"\r\n                                      [(ngModel)]=\"component.editItem[field.fieldname]\" [min]=\"field.min\" [max]=\"field.max\"\r\n                                      [style]=\"field.controlStyle\" [maxlength]=\"field.maxLength\" [required]=\"field.required\"\r\n                                      [autofocus]=\"field.autofocus\" />\r\n                                    }\r\n                                    @case ('rich-text') {\r\n                                      @if (field.text) {\r\n                                        <ly-title context=\"swt-generic-edit-dialog-form\" sizeClass=\"title-size-4\">{{field.text}}</ly-title>\r\n                                      }\r\n                                      @if (field.help) {\r\n                                        <span class=\"help-block m-b-none\">{{field.help}}</span>\r\n                                      }\r\n                                      @if (component.formErrors[field.fieldname]) {\r\n                                        <div class=\"m-t-xs alert alert-danger\">\r\n                                          {{ component.formErrors[field.fieldname] }}\r\n                                        </div>\r\n                                      }\r\n                                      <div class=\"form-group\">\r\n                                        <swt-quill-editor [name]=\"field.fieldname\" [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                                          [config]=\"field.richText\" [maxlength]=\"field.maxLength\" [required]=\"field.required\"\r\n                                        [placeholder]=\"field.placeholder?field.placeholder:''\"> </swt-quill-editor>\r\n                                      </div>\r\n                                    }\r\n                                    @case ('color-picker') {\r\n                                      <div class=\"form-group\">\r\n                                        <label class=\"control-label col-sm-4\" [for]=\"field.fieldname\">\r\n                                          {{field.text}}\r\n                                          @if (field.unit) {\r\n                                            <span>({{field.unit}})</span>\r\n                                          }\r\n                                        </label>\r\n                                        <div class=\"col-sm-8\">\r\n                                          @if (component.hasLookups(field)) {\r\n                                            <swt-color-picker [name]=\"field.fieldname\" [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                                              [selectColors]=\"$any(component.getLookups(field))\" [required]=\"field.required\"\r\n                                              [config]=\"field.colorPicker\" [id]=\"field.fieldname\">\r\n                                            </swt-color-picker>\r\n                                            @if (field.help) {\r\n                                              <span class=\"help-block m-b-none\">{{field.help}}</span>\r\n                                            }\r\n                                            @if (component.formErrors[field.fieldname]) {\r\n                                              <div class=\"m-t-xs alert alert-danger\">\r\n                                                {{ component.formErrors[field.fieldname] }}\r\n                                              </div>\r\n                                            }\r\n                                          } @else {\r\n                                            <div class=\"col-sm-8\">\r\n                                              <div class=\"form-control-static\" i18n=\"@@SwtGenericEditDialog.NotChangeable.msg.Text\">(nicht änderbar)</div>\r\n                                            </div>\r\n                                          }\r\n                                        </div>\r\n                                      </div>\r\n                                    }\r\n                                  }\r\n                                </div>\r\n                              }\r\n                            </form>\r\n","<form class=\"form form-horizontal\" #dialogForm=\"ngForm\" autocomplete=\"off\">\r\n  @for (field of component.cat.dialogFields; track field) {\r\n    <div\r\n      [ngClass]=\"[field.required ? 'required' : '', field.cssClass ?? '']\"\r\n      [hidden]=\"!component.fieldVisible(field)\">\r\n      @switch (field.controlType) {\r\n        @default {\r\n          <div class=\"form-group mt-2\" [ngClass]=\"component.formErrors[field.fieldname]?'has-error':''\">\r\n            <label class=\"form-label\" [for]=\"field.fieldname\">\r\n              {{field.text}} @if (field.unit) {\r\n              <span>({{field.unit}})</span>\r\n            }\r\n          </label>\r\n          <div>\r\n            @if (field.textMask) {\r\n              <input type=\"{{field.controlType}}\" [mask]=\"field.textMask.mask\"\r\n                [patterns]=\"field.textMask.patterns\" [showMaskTyped]=\"field.textMask.showMaskTyped\"\r\n                [dropSpecialCharacters]=\"false\" class=\"form-control no-spinners\" [attr.name]=\"field.fieldname\"\r\n                name=\"{{field.fieldname}}\" [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                [required]=\"field.required\" [autofocus]=\"field.autofocus\" [ngClass]=\"component.inputClass\"\r\n                [style]=\"field.controlStyle\" [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\"/>\r\n              } @else if (field.controlType === 'number' && field.showSpinnerButtons !== false) {\r\n                <div class=\"input-group\">\r\n                  <span class=\"input-group-text\" role=\"button\"\r\n                  (click)=\"component.clickSpinnerDown($event,field)\">-</span>\r\n                  <input type=\"number\" class=\"form-control no-spinners\" [attr.name]=\"field.fieldname\"\r\n                    name=\"{{field.fieldname}}\" [placeholder]=\"field.placeholder?field.placeholder:''\"\r\n                    [(ngModel)]=\"component.editItem[field.fieldname]\" [min]=\"field.min\" [max]=\"field.max\"\r\n                    [maxlength]=\"field.maxLength\" [required]=\"field.required\" [autofocus]=\"field.autofocus\"\r\n                    [style]=\"field.controlStyle\" [ngClass]=\"component.inputClass\" [id]=\"field.fieldname\"  (blur)=\"fieldValidate(field)\"/>\r\n                    <span class=\"input-group-text\" role=\"button\"\r\n                    (click)=\"component.clickSpinnerUp($event,field)\">+</span>\r\n                  </div>\r\n                } @else {\r\n                  <input type=\"{{field.controlType}}\" class=\"form-control no-spinners\" [attr.name]=\"field.fieldname\"\r\n                    name=\"{{field.fieldname}}\" [placeholder]=\"field.placeholder?field.placeholder:''\"\r\n                    [(ngModel)]=\"component.editItem[field.fieldname]\" [min]=\"field.min\" [max]=\"field.max\"\r\n                    [maxlength]=\"field.maxLength\" [required]=\"field.required\" [autofocus]=\"field.autofocus\"\r\n                    [style]=\"field.controlStyle\" [ngClass]=\"component.inputClass\"\r\n                    [autocomplete]=\"field.controlType === 'password' ? 'new-password':'off'\"\r\n                    pattern=\"{{field.controlType==='time'?'^[0-9]{2}:[0-9]{2}(:[0-9]{2})?$':''}}\" [id]=\"field.fieldname\"  (blur)=\"fieldValidate(field)\"/>\r\n                  }\r\n                  @if (field.help) {\r\n                    <span class=\"help-block mb-0\">{{field.help}}</span>\r\n                  }\r\n                  @if (component.formErrors[field.fieldname]) {\r\n                    <div class=\"mt-1 alert alert-danger\">\r\n                      {{ component.formErrors[field.fieldname] }}\r\n                    </div>\r\n                  }\r\n                </div>\r\n              </div>\r\n            }\r\n            @case ('money') {\r\n              <div class=\"form-group mt-2\">\r\n                <label class=\"form-label\" [for]=\"field.fieldname\">{{ component.formatMoneyText(field) }}</label>\r\n                <div>\r\n                  <input type=\"number\" class=\"form-control no-spinners\" [ngClass]=\"component.inputClass\"\r\n                    [name]=\"field.fieldname\" [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                    [required]=\"field.required\" [autofocus]=\"field.autofocus\" [id]=\"field.fieldname\"  (blur)=\"fieldValidate(field)\">\r\n                    @if (field.help) {\r\n                      <span class=\"help-block mb-0\">{{field.help}}</span>\r\n                    }\r\n                    @if (component.formErrors[field.fieldname]) {\r\n                      <div class=\"mt-1 alert alert-danger\">\r\n                        {{ component.formErrors[field.fieldname] }}\r\n                      </div>\r\n                    }\r\n                  </div>\r\n                </div>\r\n              }\r\n              @case ('password-with-confirm') {\r\n                <div class=\"form-group  mt-2\">\r\n                  <label class=\"form-label\" [for]=\"field.fieldname\">{{field.text}}</label>\r\n                  <div>\r\n                    <input type=\"password\" class=\"form-control\" [attr.name]=\"field.fieldname\" name=\"{{field.fieldname}}\"\r\n                      [(ngModel)]=\"component.editItem[field.fieldname]\" [maxlength]=\"field.maxLength\"\r\n                      [required]=\"field.required\" [autofocus]=\"field.autofocus\" [style]=\"field.controlStyle\"\r\n                      [ngClass]=\"component.inputClass\" autocomplete=\"new-password\" [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\"/>\r\n                      @if (field.help) {\r\n                        <span class=\"help-block mb-0\">{{field.help}}</span>\r\n                      }\r\n                      @if (component.formErrors[field.fieldname]) {\r\n                        <div class=\"mt-1 alert alert-danger\">\r\n                          {{ component.formErrors[field.fieldname] }}\r\n                        </div>\r\n                      }\r\n                    </div>\r\n                  </div>\r\n                  <div class=\"form-group  mt-2\">\r\n                    <label class=\"form-label\" i18n=\"@@SwtGenericEditDialog.Repeat.dsp.Label\" [for]=\"'confirm--' + field.fieldname\" (blur)=\"fieldValidate(field)\">\r\n                    {{field.text}} Wiederholung\r\n                </label>\r\n                    <div>\r\n                      <input type=\"password\" class=\"form-control\" [attr.name]=\"'PasswordPasswordConfirm'\"\r\n                        name=\"PasswordPasswordConfirm\" [(ngModel)]=\"component.editItem[field.fieldnamePasswordConfirm]\"\r\n                        [maxlength]=\"field.maxLength\" [style]=\"field.controlStyle\" [ngClass]=\"component.inputClass\"\r\n                        autocomplete=\"new-password\" [id]=\"'confirm--' + field.fieldname\" />\r\n                        @if (component.passwordConfirmInvalid(field)) {\r\n                          <div class=\"text-danger\"\r\n                            i18n=\"@@SwtGenericEditDialog.PasswordMismatch.dsp.Label\">\r\n                        Die Passwörter stimmen nicht überein\r\n                    </div>\r\n                        }\r\n                      </div>\r\n                    </div>\r\n                  }\r\n                  @case ('checkbox') {\r\n                    <div class=\"form-group  mt-2 row\">\r\n                      <div class=\"col-12\">\r\n                        <label [ngClass]=\"{'form-label': field.text}\" [for]=\"field.fieldname\">{{field.text}}</label>\r\n                        <div>\r\n                          <swt-checkbox [activeChangeDetectionHack]=\"true\" [name]=\"field.fieldname\"\r\n                          [(ngModel)]=\"component.editItem[field.fieldname]\" [id]=\"field.fieldname\"></swt-checkbox>\r\n                          @if(field.unit){\r\n                            <label class=\"ms-1 mb-0\" style=\"vertical-align: middle;\">{{field.unit}}</label>\r\n                          }\r\n                        </div>\r\n                      </div>\r\n                      @if (field.help) {\r\n                        <span class=\"help-block mt-2 mb-0\">{{field.help}}</span>\r\n                      }\r\n                    </div>\r\n                  }\r\n                  @case ('date') {\r\n                    <div class=\"form-group row  mt-2\">\r\n                      <div class=\"col-12\">\r\n                        <label class=\"form-label\" [for]=\"field.fieldname\">{{field.text}}</label>\r\n                        <div>\r\n                          @if (component.useBrowserDateInput(field)) {\r\n                            <input type=\"date\" class=\"form-control no-spinners\"\r\n                              [ngClass]=\"component.inputClass\" [name]=\"field.fieldname\" [attr.data-cy-name]=\"field.fieldname\"\r\n                              [(ngModel)]=\"component.editItem[field.fieldname]\" [required]=\"field.required\"\r\n                              [autofocus]=\"field.autofocus\" [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\">\r\n                            } @else {\r\n                              <swt-dropdown-container [container]=\"component.swtDropdownContainerContainer\" #datedropdown (onShow)=\"swtDatePicker.refresh()\" [id]=\"field.fieldname\" [allowClear]=\"!field.required\"\r\n                                (onClear)=\"component.dropDownClearClicked(field.fieldname)\" [width]=\"'100%'\">\r\n                                <swt-date-input dropdown-input [name]=\"field.fieldname\"\r\n                                  [(ngModel)]=\"component.editItem[field.fieldname]\" [required]=\"field.required\"\r\n                                  [autofocus]=\"field.autofocus\" [class]=\"component.inputClass\" [id]=\"field.fieldname\" (focusLost)=\"fieldValidate(field)\">\r\n                                </swt-date-input>\r\n                                <swt-date-picker #swtDatePicker [calendarWeekVisible]=\"field.calendarWeekVisible\"\r\n                                  name=\"{{field.fieldname}}\" week [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                                (change)=\"datedropdown.collapse()\"></swt-date-picker>\r\n                              </swt-dropdown-container>\r\n                            }\r\n                            @if (field.help) {\r\n                              <span class=\"help-block mb-0\">{{field.help}}</span>\r\n                            }\r\n                            @if (component.formErrors[field.fieldname]) {\r\n                              <div class=\"mt-1 alert alert-danger\">\r\n                                {{ component.formErrors[field.fieldname] }}\r\n                              </div>\r\n                            }\r\n                          </div>\r\n                        </div>\r\n                      </div>\r\n                    }\r\n                    @case ('dateInterval') {\r\n                      <div class=\"form-group row  mt-2\">\r\n                        <div class=\"col-sm-12\">\r\n                          <label class=\"form-label\" [for]=\"field.fieldname\">{{field.text}}</label>\r\n                          <div>\r\n                            @if (component.useBrowserDateInput(field)) {\r\n                              <input type=\"date\" class=\"form-control no-spinners\"\r\n                                [ngClass]=\"component.inputClass\" [name]=\"field.fieldname\" [attr.data-cy-name]=\"field.fieldname\"\r\n                                [(ngModel)]=\"component.editItem[field.fieldname]\" [required]=\"field.required\"\r\n                                [autofocus]=\"field.autofocus\" [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\">\r\n                              } @else {\r\n                                <swt-dropdown-container [container]=\"component.swtDropdownContainerContainer\" #datedropdown (onShow)=\"swtDatePicker.refresh()\" [id]=\"field.fieldname\" [allowClear]=\"!field.required\"\r\n                                  (onClear)=\"component.dropDownClearClicked(field.fieldname)\" [width]=\"'100%'\">\r\n                                  <swt-date-input dropdown-input [name]=\"field.fieldname\"\r\n                                    [(ngModel)]=\"component.editItem[field.fieldname]\" [required]=\"field.required\"\r\n                                    [autofocus]=\"field.autofocus\" [class]=\"component.inputClass\" [id]=\"field.fieldname\"  (focusLost)=\"fieldValidate(field)\">\r\n                                  </swt-date-input>\r\n                                  <swt-date-picker #swtDatePicker [calendarWeekVisible]=\"field.calendarWeekVisible\"\r\n                                    name=\"{{field.fieldname}}\" week [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                                  (change)=\"datedropdown.collapse()\"></swt-date-picker>\r\n                                </swt-dropdown-container>\r\n                              }\r\n                              @if (field.help) {\r\n                                <div class=\"help-block mb-2\">{{field.help}}</div>\r\n                              }\r\n                              @if (component.formErrors[field.fieldname]) {\r\n                                <div class=\"mt-1 alert alert-danger\">\r\n                                  {{ component.formErrors[field.fieldname] }}\r\n                                </div>\r\n                              }\r\n                            </div>\r\n                            <div class=\"row\">\r\n                              <div class=\"col-12\">\r\n                                <label class=\"form-label\" [for]=\"field.fieldname2\">{{field.text2}}</label>\r\n                                <div>\r\n                                  @if (component.useBrowserDateInput(field)) {\r\n                                    <input type=\"date\" class=\"form-control no-spinners\" [ngClass]=\"component.inputClass\"\r\n                                      [name]=\"field.fieldname2\" [attr.data-cy-name]=\"field.fieldname2\" [(ngModel)]=\"component.editItem[field.fieldname2]\"\r\n                                      [autofocus]=\"field.autofocus\" [id]=\"field.fieldname2\" (blur)=\"fieldValidate(field)\">\r\n                                    } @else {\r\n                                      <swt-dropdown-container [container]=\"component.swtDropdownContainerContainer\" #datedropdown2 (onShow)=\"swtDatePicker2.refresh()\" [id]=\"field.fieldname2\"\r\n                                        [allowClear]=\"!field.required2\"\r\n                                        (onClear)=\"component.dropDownClearClicked(field.fieldname2)\" [width]=\"'100%'\">\r\n                                        <swt-date-input dropdown-input [name]=\"field.fieldname2\"\r\n                                          [(ngModel)]=\"component.editItem[field.fieldname2]\" [required]=\"field.required2\"\r\n                                          [class]=\"component.inputClass\" [id]=\"field.fieldname2\"  (focusLost)=\"fieldValidate(field)\">\r\n                                        </swt-date-input>\r\n                                        <swt-date-picker #swtDatePicker2 [calendarWeekVisible]=\"field.calendarWeekVisible\"\r\n                                          name=\"{{field.fieldname2}}\" week [(ngModel)]=\"component.editItem[field.fieldname2]\"\r\n                                        (change)=\"datedropdown2.collapse()\"></swt-date-picker>\r\n                                      </swt-dropdown-container>\r\n                                    }\r\n                                    @if (field.help2) {\r\n                                      <span class=\"help-block mb-0\">{{field.help2}}</span>\r\n                                    }\r\n                                    @if (component.formErrors[field.fieldname2]) {\r\n                                      <div class=\"mt-1 alert alert-danger\">\r\n                                        {{ component.formErrors[field.fieldname2] }}\r\n                                      </div>\r\n                                    }\r\n                                  </div>\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                          </div>\r\n                        }\r\n                        @case ('dateInput') {\r\n                          <div class=\"form-group row  mt-2\">\r\n                            <div class=\"col-12\">\r\n                              <label class=\"form-label\" [for]=\"field.fieldname\">{{field.text}}</label>\r\n                              <input class=\"form-control no-spinners\" [ngClass]=\"component.inputClass\" [name]=\"field.fieldname\" [attr.data-cy-name]=\"field.fieldname\"\r\n                                [(ngModel)]=\"component.editItem[field.fieldname]\" [required]=\"field.required\"\r\n                                [autofocus]=\"field.autofocus\" type=\"date\" [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\">\r\n                              </div>\r\n                            </div>\r\n                          }\r\n                          @case ('textarea') {\r\n                            <div class=\"form-group row  mt-2\">\r\n                              <div class=\"col-12\">\r\n                                <label class=\"form-label\" [for]=\"field.fieldname\">\r\n                                  {{field.text}}\r\n                                  @if (field.unit) {\r\n                                    <span>({{field.unit}})</span>\r\n                                  }\r\n                                </label>\r\n                                <div>\r\n                                  <textarea class=\"form-control\" [attr.name]=\"field.fieldname\" name=\"{{field.fieldname}}\"\r\n                                    [(ngModel)]=\"component.editItem[field.fieldname]\" [maxlength]=\"field.maxLength\"\r\n                                    [required]=\"field.required\" [autofocus]=\"field.autofocus\"\r\n                                    [style]=\"field.controlStyle ? field.controlStyle : 'height: 5em;'\"\r\n                                  [ngClass]=\"component.inputClass\" [id]=\"field.fieldname\" (blur)=\"fieldValidate(field)\"></textarea>\r\n                                  @if (field.help) {\r\n                                    <span class=\"help-block mb-0\">{{field.help}}</span>\r\n                                  }\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                          }\r\n                          @case ('info-text') {\r\n                            <div class=\"form-group row  mt-2\">\r\n                              <div class=\"col-12\">\r\n                                @if (field.text) {\r\n                                  <label class=\"form-label no-uppercase\" [for]=\"field.fieldname\">\r\n                                    {{field.text}}\r\n                                    @if (field.unit) {\r\n                                      <span>({{field.unit}})</span>\r\n                                    }\r\n                                  </label>\r\n                                }\r\n                                <div [ngClass]=\"field.text ? '' :'col-sm-12'\" class=\"form-control-static\">\r\n                                  @if (field.fieldname) {\r\n                                    <p class=\"text-wrap\" [style]=\"field.controlStyle\"\r\n                                    [innerHTML]=\"component.editItem[field.fieldname]\" [id]=\"field.fieldname\"></p>\r\n                                  }\r\n                                  @if (field.help) {\r\n                                    <span class=\"help-block mb-0\">{{field.help}}</span>\r\n                                  }\r\n                                </div>\r\n                              </div>\r\n                            </div>\r\n                          }\r\n                          @case ('select') {\r\n                            <div class=\"form-group row  mt-2\">\r\n                              <div class=\"col-12\">\r\n                                @if(!field.radioLookups){\r\n                                  <label class=\"form-label\" [for]=\"field.fieldname\">\r\n                                    {{field.text}}\r\n                                    @if (field.unit) {\r\n                                      <span>({{field.unit}})</span>\r\n                                    }\r\n                                  </label>\r\n                                }\r\n                                @if (field.type === 'lru') {\r\n                                  @if (!field.multiSelectLookups) {\r\n                                    <swt-lru #swtlru [key]=\"field.fieldname\" [inputMaxLength]=\"field.maxLength\"\r\n                                      [inputSelectItems]=\"component.getLookups(field)\"\r\n                                      [preSetText]=\"component.editItem[field.fieldname]\"\r\n                                      (valueChange)=\"component.editItem[field.fieldname]=$event\"\r\n                                    [cssClass]=\"component.inputClass\" [ngClass]=\"field.text ? '' :'col-sm-12'\" [id]=\"field.fieldname\" (focusLost)=\"fieldValidate(field)\"></swt-lru>\r\n                                  } @else {\r\n                                    <multi-lru [name]=\"field.fieldname\" [inputMaxLength]=\"field.maxLength\"\r\n                                      [inputSelectItems]=\"component.getLookups(field)\"\r\n                                      [value]=\"component.editItem[field.fieldname]\"\r\n                                      (selectedTexts)=\"component.editItem[field.fieldname]=$event\" [fieldText]=\"field.text\"\r\n                                    [cssClass]=\"component.inputClass\" [ngClass]=\"field.text ? '' :'col-sm-12'\" [id]=\"field.fieldname\" (focusLost)=\"fieldValidate(field)\"></multi-lru>\r\n                                  }\r\n                                } @else if (!component.hasLookups(field)) {\r\n                                  <div>\r\n                                    <div class=\"form-control-static\" i18n=\"@@SwtGenericEditDialog.NotChangeable.msg.Text\">(nicht änderbar)</div>\r\n                                  </div>\r\n                                } @else if (field.multiSelectLookups) {\r\n                                  <div class=\"form-control-static\">\r\n                                    <div class=\"position-relative\">\r\n                                      <ng-select [ngStyle]=\"{'z-index':field.zIndex ? field.zIndex : 3}\"\r\n                                        class=\"form-control\" placeholder=\"(Auswählen)\"\r\n                                        i18n-placeholder=\"@@SwtGenericEditDialog.Choose.dsp.Label\" [multiple]=\"true\"\r\n                                        [items]=\"component.getLookupsWithLabel(field)\" [attr.name]=\"field.fieldname\"\r\n                                        (change)=\"component.onSelectChanged(field.fieldname)\" name=\"{{field.fieldname}}\"\r\n                                        [(ngModel)]=\"component.editItem[field.fieldname]\" [clearOnBackspace]=\"true\" appNgSelectAriaLabel [ariaLabel]=\"field.text\"\r\n                                        [bindValue]=\"'value'\" [ngClass]=\"component.inputClass\" [id]=\"field.fieldname\" [required]=\"field.required\" (blur)=\"fieldValidate(field)\">\r\n                                      </ng-select>\r\n                                    </div>\r\n                                    @if (field.help) {\r\n                                      <span class=\"help-block mb-0\">{{field.help}}</span>\r\n                                    }\r\n                                    @if (component.formErrors[field.fieldname]) {\r\n                                      <div class=\"mt-1 alert alert-danger\">\r\n                                        {{ component.formErrors[field.fieldname] }}\r\n                                      </div>\r\n                                    }\r\n                                  </div>\r\n                                } @else if (field.radioLookups) {\r\n                                  <div>\r\n                                    <fieldset>\r\n                                      <legend class=\"form-label\">\r\n                                        {{field.text}}\r\n                                        @if (field.unit) {\r\n                                          <span>({{field.unit}})</span>\r\n                                        }\r\n                                      </legend>\r\n                                      @for (lookUp of component.getLookups(field); track lookUp) {\r\n                                        <div class=\"radio\">\r\n                                          <label (click)=\"component.editItem[field.fieldname] = lookUp.value\"\r\n                                            for=\"{{field.fieldname}}-{{lookUp.value}}\" class=\"form-check-label\">\r\n                                            <input class=\"form-check-input\" [attr.name]=\"field.fieldname\" type=\"radio\"\r\n                                              (change)=\"component.onSelectChanged(field.fieldname)\"\r\n                                              id=\"{{field.fieldname}}-{{lookUp.value}}\"\r\n                                              name=\"{{field.fieldname}}-{{lookUp.value}}\" value=\"{{lookUp.value}}\"\r\n                                              [style]=\"field.controlStyle\"\r\n                                              [(ngModel)]=\"component.editItem[field.fieldname]\">\r\n                                              {{lookUp.text}}\r\n                                            </label>\r\n                                          </div>\r\n                                        }\r\n                                      </fieldset>\r\n                                      @if (field.help) {\r\n                                        <span class=\"help-block mb-0\">{{field.help}}</span>\r\n                                      }\r\n                                      @if (component.formErrors[field.fieldname]) {\r\n                                        <div class=\"mt-1 alert alert-danger\">\r\n                                          {{ component.formErrors[field.fieldname] }}\r\n                                        </div>\r\n                                      }\r\n                                    </div>\r\n                                  } @else {\r\n                                    <div>\r\n                                      <select class=\"form-control\" [attr.name]=\"field.fieldname\" name=\"{{field.fieldname}}\"\r\n                                        [autofocus]=\"field.autofocus\" [style]=\"field.controlStyle\"\r\n                                        [ngClass]=\"component.inputClass\" [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                                        (change)=\"component.onSelectChanged(field.fieldname)\" [id]=\"field.fieldname\" [required]=\"field.required\" (blur)=\"fieldValidate(field)\">\r\n                                        @for (group of component.getGroupableLookups(field); track component.idenitifyGroupableLookupsChanged($index, group)) {\r\n                                          @if (group.title) {\r\n                                            <optgroup [label]=\"group.title\">\r\n                                              @for (lookup of group.items; track lookup) {\r\n                                                <option value=\"{{lookup.value}}\">\r\n                                                  {{lookup.text}}\r\n                                                </option>\r\n                                              }\r\n                                            </optgroup>\r\n                                          }\r\n                                          @if (!group.title) {\r\n                                            @for (lookup of group.items; track lookup) {\r\n                                              <option value=\"{{lookup.value}}\">\r\n                                                {{lookup.text}}\r\n                                              </option>\r\n                                            }\r\n                                          }\r\n                                        }\r\n                                      </select>\r\n                                      @if (field.help) {\r\n                                        <span class=\"help-block mb-0\">{{field.help}}</span>\r\n                                      }\r\n                                      @if (component.formErrors[field.fieldname]) {\r\n                                        <div class=\"mt-1 alert alert-danger\">\r\n                                          {{ component.formErrors[field.fieldname] }}\r\n                                        </div>\r\n                                      }\r\n                                    </div>\r\n                                  }\r\n                                </div>\r\n                              </div>\r\n                            }\r\n                            @case ('dropdown-grid') {\r\n                              <div class=\"form-group row  mt-2\">\r\n                                <div class=\"col-12\">\r\n                                  <label class=\"form-label\" [for]=\"field.fieldname\">{{field.text}}</label>\r\n                                  <div>\r\n                                    <!-- fix für onChange -->\r\n                                    <input type=\"{{field.controlType}}\" hidden [attr.name]=\"field.fieldname\"\r\n                                      name=\"{{field.fieldname}}\" [ngModel]=\"component.editItem[field.fieldname]\" [id]=\"field.fieldname\" />\r\n                                      <swt-dropdown-container [container]=\"component.swtDropdownContainerContainer\"\r\n                                        [attr.name]=\"field.fieldname\" #gridDropDownContainer\r\n                                        [displayValue]=\"component.getDisplayValueOrDefault(field,' ')\" [width]=\"'100%'\"\r\n                                        [tabindex]=\"0\"\r\n                                        (onShow)=\"component.doOnDropdownGridShown(field.fieldname); component.focusDropdownGrid(dropdownGrid)\">\r\n                                        <div class=\"p-2 drop-down-grid\"\r\n                                          (keydown.escape)=\"gridDropDownContainer.collapse()\"\r\n                                          (focusout)=\"component.onDropdownGridFocusOut($event, gridDropDownContainer)\">\r\n                                          <swt-grid #dropdownGrid [minHeight]=\"'0'\" [attr.id]=\"field.fieldname + '_grid'\"\r\n                                            [config]=\"field.grid\"\r\n                                            [datasource]=\"component.getDynamicDatasource(field)\"\r\n                                            [allowKeyboardShortCuts]=\"true\"\r\n                                            [paginationInfoVariant]=\"field.grid.paginationInfoVariant ?? 'compact'\"\r\n                                            [pageSizes]=\"field.grid.pageSizes ?? [10,20,30]\">\r\n                                          </swt-grid>\r\n                                          <div class=\"float-end mt-2\">\r\n                                            <button [attr.name]=\"field.fieldname+'_btn_ok'\" class=\"btn btn-primary\"\r\n                                            (click)=\"gridDropDownContainer.collapse()\" i18n=\"@@Button.Ok.act.Label\">OK</button>\r\n                                          </div>\r\n                                        </div>\r\n                                      </swt-dropdown-container>\r\n                                      @if (field.help) {\r\n                                        <span class=\"help-block mb-0\">{{field.help}}</span>\r\n                                      }\r\n                                    </div>\r\n                                  </div>\r\n                                </div>\r\n                              }\r\n                              @case ('grid') {\r\n                                @if (field.text) {\r\n                                  <ly-title context=\"swt-generic-edit-dialog-form\" sizeClass=\"title-size-4\">{{field.text}}</ly-title>\r\n                                }\r\n                                @if (field.help) {\r\n                                  <span class=\"help-block mb-0\">{{field.help}}</span>\r\n                                }\r\n                                <swt-grid [attr.id]=\"field.fieldname\" [config]=\"field.grid\"\r\n                                  [datasource]=\"component.getDynamicDatasource(field)\" [minHeight]=\"\"\r\n                                  [paginationInfoVariant]=\"field.grid.paginationInfoVariant ?? 'compact'\"\r\n                                [pageSizes]=\"field.grid.pageSizes ?? []\"></swt-grid>\r\n                                <!-- fix für onChange -->\r\n                                <input type=\"{{field.controlType}}\" hidden [attr.name]=\"field.fieldname\" name=\"{{field.fieldname}}\"\r\n                                  [style]=\"field.controlStyle\" [ngModel]=\"component.editItem[field.fieldname]\" [attr.aria-label]=\"field.text\"/>\r\n                                }\r\n                                @case ('divider') {\r\n                                  <div class=\"form-group\">\r\n                                    @if (field.text) {\r\n                                      <div class=\"divider\">\r\n                                        <div class=\"divider-text\">{{field.text}}</div>\r\n                                      </div>\r\n                                    }\r\n                                    @if (!field.text) {\r\n                                      <hr>\r\n                                      }\r\n                                      @if (field.help) {\r\n                                        <p class=\"help-block mb-0\">{{field.help}}</p>\r\n                                      }\r\n                                    </div>\r\n                                  }\r\n                                  @case ('buttons') {\r\n                                    @if (component.containsFormButtons(field)) {\r\n                                      <div class=\"form-group\">\r\n                                        <div class=\"form-label\">{{field.text}}</div>\r\n                                        <div class=\"form-control-static\">\r\n                                          @for (btn of component.formButtons(field); track btn) {\r\n                                            <button type=\"button\"\r\n                                              class=\"btn me-1 {{btn.buttonClass}}\"\r\n                                              [ngClass]=\"{'btn-xs':component.small,'btn-sm':!component.small}\" [title]=\"btn.tooltip\"\r\n                                              [style]=\"field.controlStyle\" (click)=\"component.onButtonClicked(btn,component.editItem)\"\r\n                                              [ngStyle]=\"{ 'width': btn.width ?? 'auto' }\">\r\n                                              @if (btn.iconClass) {\r\n                                                <i class=\"fa {{btn.iconClass}}\"></i>\r\n                                              }\r\n                                              {{btn.text}}\r\n                                            </button>\r\n                                          }\r\n                                          @if (field.help) {\r\n                                            <span class=\"help-block mb-0\">{{field.help}}</span>\r\n                                          }\r\n                                        </div>\r\n                                      </div>\r\n                                    }\r\n                                  }\r\n                                  @case ('hidden') {\r\n                                    <input type=\"{{field.controlType}}\" [attr.name]=\"field.fieldname\" name=\"{{field.fieldname}}\"\r\n                                      [(ngModel)]=\"component.editItem[field.fieldname]\" [min]=\"field.min\" [max]=\"field.max\"\r\n                                      [style]=\"field.controlStyle\" [maxlength]=\"field.maxLength\" [required]=\"field.required\"\r\n                                      [autofocus]=\"field.autofocus\" />\r\n                                    }\r\n                                    @case ('rich-text') {\r\n                                      @if (field.text) {\r\n                                        <ly-title context=\"swt-generic-edit-dialog-form\" sizeClass=\"title-size-4\">{{field.text}}</ly-title>\r\n                                      }\r\n                                      @if (field.help) {\r\n                                        <span class=\"help-block mb-0\">{{field.help}}</span>\r\n                                      }\r\n                                      <div class=\"form-group  mt-2\">\r\n                                        <swt-quill-editor [name]=\"field.fieldname\" [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                                          [config]=\"field.richText\" [maxlength]=\"field.maxLength\" [required]=\"field.required\"\r\n                                        [placeholder]=\"field.placeholder?field.placeholder:''\"> </swt-quill-editor>\r\n                                      </div>\r\n                                    }\r\n                                    @case ('color-picker') {\r\n                                      <div class=\"form-group row  mt-2\">\r\n                                        <div class=\"col-12\">\r\n                                          <div class=\"form-label\">\r\n                                            {{field.text}}\r\n                                            @if (field.unit) {\r\n                                              <span>({{field.unit}})</span>\r\n                                            }\r\n                                          </div>\r\n                                          <div>\r\n                                            @if (component.hasLookups(field)) {\r\n                                              <swt-color-picker [name]=\"field.fieldname\" [(ngModel)]=\"component.editItem[field.fieldname]\"\r\n                                                [selectColors]=\"$any(component.getLookups(field))\" [required]=\"field.required\"\r\n                                                [config]=\"field.colorPicker\" [id]=\"field.fieldname\">\r\n                                              </swt-color-picker>\r\n                                              @if (field.help) {\r\n                                                <span class=\"help-block mb-0\">{{field.help}}</span>\r\n                                              }\r\n                                            } @else {\r\n                                              <div>\r\n                                                <div class=\"form-control-static\" i18n=\"@@SwtGenericEditDialog.NotChangeable.msg.Text\">(nicht änderbar)</div>\r\n                                              </div>\r\n                                            }\r\n                                          </div>\r\n                                        </div>\r\n                                      </div>\r\n                                    }\r\n                                  }\r\n                                </div>\r\n                              }\r\n                            </form>\r\n","import { getCurrencySymbol } from '@angular/common';\r\nimport { AfterViewInit, ChangeDetectorRef, Component, DEFAULT_CURRENCY_CODE, EventEmitter, Inject, Input, LOCALE_ID, OnDestroy, OnInit, Output, QueryList, signal, ViewChildren, ViewEncapsulation } from '@angular/core';\r\nimport { AbstractControl, NgForm } from '@angular/forms';\r\nimport { NgOption } from '@ng-select/ng-select';\r\nimport { SelectColor, SelectItem, SelectItemGroup } from '@sowatech/shared/@types';\r\nimport { DatasourceComponent } from '@sowatech/shared/ds-datasource';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\nimport moment from 'moment';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { GridComponent } from '../swt-grid/swt-grid.component';\r\n\r\nimport { GenericEditDialogBaseComponent } from './swt-generic-edit-dialog-base.component';\r\nimport { DIALOG_FIELD_NULLVALUE, DialogDynamicList, DialogField, DialogFieldButton, DialogFieldCategory } from './swt-generic-edit-dialog.types';\r\nimport { SwtGenericEditDialogFormComponentBase } from './templates/swt-generic-edit-dialog-form.templates';\r\n\r\n\r\nconst CLASS = 'GenericEditDialogFormComponent';\r\n\r\n@Component({\r\n    selector: 'swt-generic-edit-dialog-form',\r\n    templateUrl: './swt-generic-edit-dialog-form.component.html',\r\n    styleUrls: ['./swt-generic-edit-dialog-form.scss'],\r\n    encapsulation: ViewEncapsulation.None,\r\n    standalone: false\r\n})\r\nexport class GenericEditDialogFormComponent implements OnInit, OnDestroy, AfterViewInit {\r\n    constructor(\r\n        private logger: LoggerService,\r\n        public changeDetectorRef: ChangeDetectorRef,\r\n        @Inject(LOCALE_ID) private readonly locale: string,\r\n        @Inject(DEFAULT_CURRENCY_CODE) private readonly currencyCode: string,\r\n    ) { }\r\n\r\n    public ngOnInit() {\r\n        this.logger.log(CLASS + '.ngOnInit');\r\n    }\r\n\r\n    public ngAfterViewInit() {\r\n        this.logger.log(CLASS + '.ngAfterViewInit');\r\n        //-- PK: ersatz für set Timeout (s.u.); erster Test keine probleme\r\n        this.formValidate();\r\n\r\n        this.subscriptions.push(\r\n            this.dialogForm.valueChanges.subscribe(data => this.onFormValueChanged(data))\r\n        );\r\n        //setTimeout(() => { this.refreshDialog() }, 300);//workaround: ohne diesen timeout/refresh werden die formErrors tlw. erst nach neuem digest zyklus angezeigt\r\n    }\r\n\r\n    ngOnDestroy() {\r\n        this.logger.log(CLASS + '.ngOnDestroy');\r\n        this.ngSelectOptionsDictionary = {};\r\n        this.subscriptions.forEach(s => s.unsubscribe());\r\n    }\r\n\r\n    public small: boolean;\r\n    @Input()\r\n    public master: GenericEditDialogBaseComponent<any>;\r\n    @Input()\r\n    public cat: DialogFieldCategory;\r\n    @Input()\r\n    public editItem: any = {};//dialog copy of edited item\r\n    @Input()\r\n    public dynamicLookups: DialogDynamicList[];\r\n    @Input()\r\n    public inputClass: string;//will be added to every input\r\n    private subscriptions: Subscription[] = [];\r\n    @ViewChildren('template')\r\n    public template: QueryList<SwtGenericEditDialogFormComponentBase>;\r\n    public get dialogForm(): NgForm {\r\n        return this.template.first.dialogForm;\r\n    }\r\n    @Input()\r\n    public swtDropdownContainerContainer: string = 'body';\r\n\r\n    @Output()\r\n    // eslint-disable-next-line @angular-eslint/no-output-on-prefix\r\n    public onDropdownGridShown = new EventEmitter<string>();\r\n\r\n    public passwordConfirmInvalid(field: DialogField): boolean {\r\n        return this.editItem[field.fieldname] != this.editItem[field.fieldnamePasswordConfirm];\r\n    }\r\n\r\n    public fieldVisible(field: DialogField): boolean {\r\n        const isHidden = (field.hideIf != undefined && field.hideIf(this.editItem)) as boolean;\r\n        return !isHidden;\r\n    }\r\n\r\n    public getLookups(field: DialogField): Array<SelectItem | SelectColor> {\r\n        return this.master.getLookups(field);\r\n    }\r\n\r\n    public getGroupableLookups(field: DialogField) {\r\n        return this.master.getGroupableLookups(field);\r\n    }\r\n\r\n    /**\r\n     * Used for trackBy in NgFor.\r\n     * Prevents the unnecessary Destroy/Create of the Elements, what breaks ChangeDetection in Firefox\r\n     */\r\n    public idenitifyGroupableLookupsChanged(index, item: SelectItemGroup) {\r\n        return item.title ?? index.toString();\r\n    }\r\n\r\n    private ngSelectOptionsDictionary: any = {};\r\n    public getLookupsWithLabel(field: DialogField): Array<NgOption> {\r\n        if (!this.ngSelectOptionsDictionary[field.fieldname]) {\r\n            this.ngSelectOptionsDictionary[field.fieldname] =\r\n                this.master.getLookups(field)\r\n                    .map((item) => ({\r\n                        value: item.value,\r\n                        label: item.text\r\n                    }));\r\n        }\r\n        return this.ngSelectOptionsDictionary[field.fieldname];\r\n    }\r\n\r\n    public hasLookups(field: DialogField): boolean {\r\n        return this.master.hasLookups(field);\r\n    }\r\n\r\n    public dropDownClearClicked(fieldname: string) {\r\n        this.editItem[fieldname] = null;\r\n    }\r\n\r\n    public getDynamicDatasource(field: DialogField): DatasourceComponent {\r\n        return this.master.getDynamicDatasource(field);\r\n    }\r\n\r\n    public getDisplayValue(field: DialogField): string[] {\r\n        if (field.grid && field.grid.displayFieldValue && (this.editItem[field.grid.displayFieldValue] != undefined))\r\n            return this.editItem[field.grid.displayFieldValue];\r\n\r\n        else if (field.grid && field.grid.showAsDropDownFieldName) {\r\n            const ds = this.getDynamicDatasource(field);\r\n            const selectedData = ds.dataBackup.filter(d => ds.selectedIds.includes(d[ds.idfield]));\r\n            const rawIds = ds.selectedIds.filter(id => !selectedData.some(sd => sd[ds.idfield] == id));\r\n            const displayValues = selectedData.map(d => d[field.grid.showAsDropDownFieldName]).concat(rawIds);\r\n            return displayValues;\r\n        }\r\n        else\r\n            return [this.editItem[field.fieldname]];\r\n\r\n    }\r\n\r\n    public getDisplayValueOrDefault(field: DialogField, defaultValue: string): string[] {\r\n        const result = this.getDisplayValue(field);\r\n        return result ? result : [defaultValue];\r\n    }\r\n\r\n    public refreshDialog() {\r\n        this.changeDetectorRef.markForCheck();\r\n    }\r\n\r\n    @Output()\r\n    public formValueChanged = new EventEmitter<GenericEditDialogFormComponent>();\r\n    //only public for template\r\n    public onFormValueChanged(data?: any) {\r\n        this.formValidate(data);\r\n        this.formValueChanged.emit(this);\r\n    }\r\n\r\n    public onSelectChanged(fieldname: string) {\r\n        const field = this.cat.dialogFields.find(f => f.fieldname == fieldname);\r\n        const dependentFieldnames = field.dependentSelectFieldnames;\r\n        if (dependentFieldnames) {\r\n            for (const dependentFieldname of dependentFieldnames)\r\n                this.clearDependentSelect(dependentFieldname);\r\n        }\r\n    }\r\n\r\n    private clearDependentSelect(fieldname: string) {\r\n        this.editItem[fieldname] = DIALOG_FIELD_NULLVALUE;\r\n        this.ngSelectOptionsDictionary[fieldname] = null;\r\n    }\r\n\r\n    public formErrors = {};\r\n\r\n    public formValidate(data?: any) {\r\n        //if (!this.master.dialog.isShown) return;\r\n        if (!this.master.isShown) return;\r\n        if (!data) data = this.editItem;\r\n        for (const field of this.cat.dialogFields.filter(f => f.fieldname))\r\n            this.fieldValidate(field, data[field.fieldname], field.fieldname2 ? data[field.fieldname2] : null);\r\n    }\r\n\r\n    public fieldValidate(field: DialogField<unknown>, fieldValue?: unknown, fieldValue2?: unknown) {\r\n        const control = this.dialogForm.form.get(field.fieldname);\r\n        const control2 = this.dialogForm.form.get(field.fieldname2);\r\n        fieldValue ??= this.editItem[field.fieldname];\r\n        fieldValue2 ??= field.fieldname2 ? this.editItem[field.fieldname2] : null;\r\n        if (control) {\r\n            //custom validation\r\n            switch (field.type) {\r\n                case 'number':\r\n                    if (field.min != null && (control.dirty && fieldValue == null || fieldValue as number < field.min))\r\n                        control.setErrors({ minInvalid: true });\r\n                    if (field.max != null && (control.dirty && fieldValue == null || fieldValue as number > field.max))\r\n                        control.setErrors({ maxInvalid: true });\r\n                    break;\r\n                case 'date': {\r\n                    if (field.controlTypeVariant == 'input' && field.required && fieldValue) {\r\n                        const aMoment = moment(fieldValue);\r\n                        if (!aMoment.isValid())\r\n                            control.setErrors({ dateInvalid: true });\r\n                    }\r\n                    break;\r\n                }\r\n                case 'dateInterval': {\r\n                    if (field.controlTypeVariant == 'input') {\r\n                        if (field.required && fieldValue) {\r\n                            const aMoment = moment(fieldValue);\r\n                            if (!aMoment.isValid())\r\n                                control.setErrors({ dateInvalid: true });\r\n                        }\r\n                        if (field.required2 && fieldValue2) {\r\n                            const aMoment2 = moment(fieldValue2);\r\n                            if (!aMoment2.isValid())\r\n                                control2.setErrors({ dateInvalid: true });\r\n                        }\r\n                        if (fieldValue > fieldValue2) {\r\n                            control.setErrors({ dateIntervalInvalid: true });\r\n                            control2.setErrors({ dateIntervalInvalid: true });\r\n                        }\r\n                    }\r\n                    break;\r\n                }\r\n            }\r\n            field.hasError = false;\r\n            const hasError1 = this.setFormErrors(control, field, field.fieldname);\r\n            const hasError2 = this.setFormErrors(control2, field, field.fieldname2);\r\n            field.hasError = hasError1 || hasError2;\r\n        }\r\n    }\r\n\r\n    public formatMoneyText(field: DialogField) {\r\n        const currencySymbol = getCurrencySymbol(this.currencyCode, 'narrow', this.locale);\r\n        return `${field.text} (${currencySymbol}${field.unit ?? ''})`;\r\n    }\r\n\r\n    private setFormErrors(control: AbstractControl, field: DialogField, fieldname: string): boolean {\r\n        if (!control) return null;\r\n\r\n        this.formErrors[fieldname] = '';\r\n        //--alte version controlHasErrors\r\n        //let editItemHasValue = data[fieldname] != null && data[fieldname] != \"\";\r\n        //let controlHasErrors = control && (control.dirty || editItemHasValue) && !control.valid;\r\n        //--neue version controlHasErrors\r\n        const controlHasErrors = control.errors != null && control.touched;\r\n        if (!controlHasErrors) return false;\r\n\r\n        // eslint-disable-next-line guard-for-in\r\n        for (const key in control.errors)\r\n            this.formErrors[fieldname] += this.getErrorMessage(key, field);\r\n\r\n        return this.formErrors[fieldname] && this.formErrors[fieldname] != '';\r\n    }\r\n\r\n    private getErrorMessage(key: string, field: DialogField) {\r\n        switch (key) {\r\n            case 'maxInvalid': return `Wert ist größer als das Maximum ${field.max} `;\r\n            case 'minInvalid': return `Wert ist kleiner als das Minimum ${field.min} `;\r\n            case 'required': return 'Eingabe ist erforderlich' + ' ';\r\n            case 'dateInvalid': return 'Kein gültiges Datum' + ' ';\r\n            case 'dateIntervalInvalid': return 'Kein gültiges Datumsinterval' + ' ';\r\n            case 'mask': return 'Die Eingabe entspricht nicht dem gewünschten Format' + ' ';\r\n            default: return key + ' ';\r\n        }\r\n    }\r\n\r\n    public containsFormButtons(field: DialogField): boolean {\r\n        const existingBtn = field.buttons && field.buttons.find(btn => !btn.position || btn.position == 'form');\r\n        return existingBtn ? true : false;\r\n    }\r\n\r\n    public formButtons(field: DialogField): DialogFieldButton[] {\r\n        return field.buttons ? field.buttons.filter(btn => !btn.position || btn.position == 'form') : [];\r\n    }\r\n\r\n    public onButtonClicked(btn: DialogFieldButton, editItem: any) {\r\n        this.master.onButtonClicked(btn, editItem);\r\n    }\r\n\r\n    public doOnDropdownGridShown(fieldname: string) {\r\n        this.onDropdownGridShown.emit(fieldname);\r\n    }\r\n\r\n    /**\r\n     * Fokussiert das Dropdown-Grid-Komponente.\r\n     *\r\n     * Diese Methode prüft, ob die übergebene Grid-Komponente existiert und eine focusGrid-Methode besitzt.\r\n     * Falls ja, wird die Fokussierung über requestAnimationFrame asynchron ausgeführt, um eine saubere\r\n     * Ausführung im nächsten Browser-Render-Zyklus zu gewährleisten.\r\n     *\r\n     * @param gridComponent - Die Grid-Komponente, die fokussiert werden soll\r\n     * @returns void\r\n     */\r\n    public focusDropdownGrid(gridComponent: GridComponent) {\r\n        if (gridComponent && gridComponent.focusGrid) {\r\n            // Verwende requestAnimationFrame für saubere asynchrone Ausführung ohne setTimeout\r\n            requestAnimationFrame(() => {\r\n                gridComponent.focusGrid();\r\n            });\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Behandelt das FocusOut-Event des Dropdown-Grids.\r\n     *\r\n     * Schließt das Dropdown, wenn der Fokus den gesamten Dropdown-Grid-Container verlässt.\r\n     * Prüft, ob das neue Fokus-Ziel (relatedTarget) innerhalb des Containers liegt.\r\n     * Falls nicht, wird das Dropdown geschlossen und der Fokus zurück zum Dropdown-Container gesetzt,\r\n     * damit die Tab-Reihenfolge korrekt fortgesetzt wird.\r\n     *\r\n     * @param event - Das FocusEvent\r\n     * @param dropdownContainer - Die Dropdown-Container-Komponente\r\n     * @returns void\r\n     */\r\n    public onDropdownGridFocusOut(event: FocusEvent, dropdownContainer: any) {\r\n        // Prüfe, ob der neue Fokus außerhalb des Dropdown-Containers liegt\r\n        const relatedTarget = event.relatedTarget as HTMLElement;\r\n        const currentTarget = event.currentTarget as HTMLElement;\r\n\r\n        // Wenn relatedTarget null ist oder nicht innerhalb des Containers liegt\r\n        if (!relatedTarget || !currentTarget.contains(relatedTarget)) {\r\n            // Verwende requestAnimationFrame, um sicherzustellen, dass Click-Events auf Buttons\r\n            // noch verarbeitet werden können, bevor das Dropdown schließt\r\n            requestAnimationFrame(() => {\r\n                dropdownContainer.collapseAndFocus();\r\n            });\r\n        }\r\n    }\r\n\r\n    public clickSpinnerUp(eventData, field: DialogField) {\r\n        if (this.editItem[field.fieldname] >= field.max) return;\r\n        this.editItem[field.fieldname]++;\r\n    }\r\n\r\n    public clickSpinnerDown(eventData, field: DialogField) {\r\n        if (this.editItem[field.fieldname] <= field.min) return;\r\n        this.editItem[field.fieldname]--;\r\n    }\r\n\r\n    private getHasDatePicker() {\r\n        const input = document.createElement('input');\r\n        input.setAttribute('type', 'date');\r\n        input.value = '2038-01-20';\r\n        return !!input.valueAsDate;\r\n    }\r\n    private readonly hasDatePicker = signal(this.getHasDatePicker());\r\n\r\n    public useBrowserDateInput(field: DialogField): boolean {\r\n        return this.hasDatePicker() && !field.calendarWeekVisible;\r\n    }\r\n}\r\n","<switch-template [inspinia]=\"inspiniaTemplate\" [sneat]=\"sneatTemplate\"></switch-template>\r\n\r\n<ng-template #inspiniaTemplate>\r\n    <swt-generic-edit-dialog-form-inspinia [component]=\"this\" #template></swt-generic-edit-dialog-form-inspinia>\r\n</ng-template>\r\n\r\n<ng-template #sneatTemplate>\r\n    <swt-generic-edit-dialog-form-sneat [component]=\"this\" #template></swt-generic-edit-dialog-form-sneat>\r\n</ng-template>\r\n","import { Component, Directive, Input, ViewChild } from '@angular/core';\r\nimport { DialogInitDirective } from '@sowatech/shared/dialogs';\r\nimport { ModalDirective } from 'ngx-bootstrap/modal';\r\n\r\nimport type { GenericEditDialogComponent } from '../swt-generic-edit-dialog.component';\r\n\r\n@Directive()\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport abstract class SwtGenericEditDialogComponentBase<T = any> {\r\n    @Input()\r\n    public component: GenericEditDialogComponent<T>;\r\n\r\n    @ViewChild('dialog', { static: true })\r\n    public dialog: ModalDirective;\r\n\r\n    @ViewChild(DialogInitDirective, { static: true })\r\n    public dialogInitDirective: DialogInitDirective;\r\n}\r\n\r\n@Component({\r\n    selector: 'swt-generic-edit-dialog-inspinia',\r\n    templateUrl: './swt-generic-edit-dialog.inspinia.component.html',\r\n    standalone: false\r\n})\r\nexport class SwtGenericEditDialogInspiniaComponent extends SwtGenericEditDialogComponentBase { }\r\n\r\n@Component({\r\n    selector: 'swt-generic-edit-dialog-sneat',\r\n    templateUrl: './swt-generic-edit-dialog.sneat.component.html',\r\n    standalone: false\r\n})\r\nexport class SwtGenericEditDialogSneatComponent extends SwtGenericEditDialogComponentBase { }\r\n","<div bsModal #dialog=\"bs-modal\" class=\"modal\" [ngClass]=\"component.disableAnimation ? '' : 'fade'\" tabindex=\"-1\"\r\n  role=\"dialog\" [dialog-init]=\"dialog\">\r\n  <div class=\"modal-dialog\" style=\"max-height: calc(100vh - 83px)\" [ngClass]=\"component.sizeClass\">\r\n    <div class=\"modal-content\">\r\n      <div class=\"modal-header\">\r\n        <button type=\"button\" class=\"close\" (click)=\"component.cancelDialog()\" aria-label=\"Close\">\r\n          <span aria-hidden=\"true\">&times;</span>\r\n        </button>\r\n        <ly-title context=\"dialog\" customClass=\"modal-title\" sizeClass=\"title-size-4\">{{component.modalTitle}}</ly-title>\r\n      </div>\r\n      <div class=\"modal-body\">\r\n        @if (component.categoriesAsTabs) {\r\n          <div class=\"panel blank-panel\">\r\n            <div class=\"panel-heading\">\r\n              <div class=\"panel-options\">\r\n                <ul class=\"nav nav-tabs\">\r\n                  @for (cat of component.visibleCategories; track cat) {\r\n                    <li [ngClass]=\"cat.active?'active':''\"\r\n                      (click)=\"component.setCatActive(cat)\">\r\n                      <a>{{cat.name}}</a>\r\n                    </li>\r\n                  }\r\n                </ul>\r\n              </div>\r\n            </div>\r\n            <div class=\"panel-body\">\r\n              <div class=\"tab-content\">\r\n                @for (cat of component.visibleCategories; track cat) {\r\n                  <div class=\"tab-pane\" [ngClass]=\"cat.active?'active':''\"\r\n                    >\r\n                    <swt-generic-edit-dialog-form [cat]=\"cat\" [editItem]=\"component.editItem\"\r\n                      [dynamicLookups]=\"component.dynamicLists\" [master]=\"component\"\r\n                      [inputClass]=\"component.inputSizeClass\" [swtDropdownContainerContainer]=\"component.swtDropdownContainerContainer\"\r\n                      (onDropdownGridShown)=\"component.doOnDropdownGridShown($event)\">\r\n                    </swt-generic-edit-dialog-form>\r\n                  </div>\r\n                }\r\n              </div>\r\n            </div>\r\n          </div>\r\n        }\r\n        @if (!component.categoriesAsTabs) {\r\n          <div>\r\n            @for (cat of component.visibleCategories; track cat; let firstCat = $first) {\r\n              <div>\r\n                @if (cat.name && !firstCat) {\r\n                  <div class=\"hr-line-dashed\"></div>\r\n                }\r\n                @if (cat.name) {\r\n                  <ly-title context=\"swt-generic-edit-dialog-category\" customClass=\"m-t-none m-b\" sizeClass=\"title-size-4\">{{cat.name}}</ly-title>\r\n                }\r\n                <swt-generic-edit-dialog-form [cat]=\"cat\" [editItem]=\"component.editItem\"\r\n                  [dynamicLookups]=\"component.dynamicLists\" [master]=\"component\"\r\n                  [inputClass]=\"component.inputSizeClass\"\r\n                  [swtDropdownContainerContainer]=\"component.swtDropdownContainerContainer\"\r\n                  (onDropdownGridShown)=\"component.doOnDropdownGridShown($event)\">\r\n                </swt-generic-edit-dialog-form>\r\n              </div>\r\n            }\r\n          </div>\r\n        }\r\n      </div>\r\n      @if (component.errorText) {\r\n        <div class=\"hr-line-solid m-xs\"></div>\r\n      }\r\n      @if (component.errorText) {\r\n        <div class=\"alert alert-danger m-xs\">\r\n          <p>{{component.errorText}}</p>\r\n        </div>\r\n      }\r\n      <div class=\"modal-footer\">\r\n        @for (btn of component.customFormButtonsBefore; track btn) {\r\n          <button type=\"button\" class=\"btn\"\r\n            [disabled]=\"btn.submitDialog ? component.isSubmitDisabled : null\" [ngClass]=\"btn.buttonClass\"\r\n            [title]=\"btn.tooltip\" (click)=\"component.onButtonClicked(btn, component.editItem)\"\r\n            [ngStyle]=\"{ 'width': btn.width ?? 'auto' }\">\r\n            @if (btn.iconClass) {\r\n              <i class=\"fa {{btn.iconClass}}\"></i>\r\n            }\r\n            {{btn.text}}\r\n          </button>\r\n        }\r\n        @if (!component.hideCancelButton) {\r\n          <button id=\"btn-cancel\" type=\"button\" class=\"btn btn-default\"\r\n          (click)=\"component.cancelDialog()\" i18n=\"@@Button.Cancel.act.Label\">Abbrechen</button>\r\n        }\r\n        @if (!component.hideOkButton) {\r\n          <button id=\"btn-ok\" type=\"button\" class=\"btn btn-primary\"\r\n            (click)=\"component.submitDialog()\" [disabled]=\"component.isSubmitDisabled\"\r\n          i18n=\"@@Button.Ok.act.Label\">OK</button>\r\n        }\r\n        @for (btn of component.customFormButtonsAfter; track btn) {\r\n          <button type=\"button\" class=\"btn\"\r\n            [disabled]=\"btn.submitDialog ? component.isSubmitDisabled : null\" [ngClass]=\"btn.buttonClass\"\r\n            [title]=\"btn.tooltip\" (click)=\"component.onButtonClicked(btn,component.editItem)\"\r\n            [ngStyle]=\"{ 'width': btn.width ?? 'auto' }\">\r\n            @if (btn.iconClass) {\r\n              <i class=\"fa {{btn.iconClass}}\"></i>\r\n            }\r\n            {{btn.text}}\r\n          </button>\r\n        }\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n","<div bsModal #dialog=\"bs-modal\" class=\"modal\" [ngClass]=\"component.disableAnimation ? '' : 'fade'\" tabindex=\"-1\"\r\n  role=\"dialog\" [dialog-init]=\"dialog\">\r\n  <div class=\"modal-dialog\" style=\"max-height: calc(100vh - 83px)\" [ngClass]=\"component.sizeClass\">\r\n    <div class=\"modal-content\">\r\n      <div class=\"modal-header\">\r\n        <ly-title context=\"dialog\" customClass=\"modal-title\" sizeClass=\"title-size-4\">{{component.modalTitle}}</ly-title>\r\n        <button type=\"button\" class=\"btn-close\" (click)=\"component.cancelDialog()\" aria-label=\"Close\">\r\n        </button>\r\n      </div>\r\n      <div class=\"modal-body\">\r\n        @if (component.categoriesAsTabs) {\r\n          <div class=\"panel blank-panel\">\r\n            <div class=\"panel-heading\">\r\n              <div class=\"panel-options\">\r\n                <ul class=\"nav nav-tabs\">\r\n                  @for (cat of component.visibleCategories; track cat) {\r\n                    <li [ngClass]=\"cat.active?'active':''\"\r\n                      (click)=\"component.setCatActive(cat)\">\r\n                      <a>{{cat.name}}</a>\r\n                    </li>\r\n                  }\r\n                </ul>\r\n              </div>\r\n            </div>\r\n            <div class=\"panel-body\">\r\n              <div class=\"tab-content\">\r\n                @for (cat of component.visibleCategories; track cat) {\r\n                  <div class=\"tab-pane\" [ngClass]=\"cat.active?'active':''\"\r\n                    >\r\n                    <swt-generic-edit-dialog-form [cat]=\"cat\" [editItem]=\"component.editItem\"\r\n                      [dynamicLookups]=\"component.dynamicLists\" [master]=\"component\"\r\n                      [inputClass]=\"component.inputSizeClass\"\r\n                      [swtDropdownContainerContainer]=\"component.swtDropdownContainerContainer\"\r\n                      (onDropdownGridShown)=\"component.doOnDropdownGridShown($event)\">\r\n                    </swt-generic-edit-dialog-form>\r\n                  </div>\r\n                }\r\n              </div>\r\n            </div>\r\n          </div>\r\n        }\r\n        @if (!component.categoriesAsTabs) {\r\n          <div>\r\n            @for (cat of component.visibleCategories; track cat; let firstCat = $first) {\r\n              <div>\r\n                @if (cat.name && !firstCat) {\r\n                  <div class=\"hr-line-dashed\"></div>\r\n                }\r\n                @if (cat.name) {\r\n                  <ly-title context=\"swt-generic-edit-dialog-category\" customClass=\"m-t-none m-b\" sizeClass=\"title-size-4\">{{cat.name}}</ly-title>\r\n                }\r\n                <swt-generic-edit-dialog-form [cat]=\"cat\" [editItem]=\"component.editItem\"\r\n                  [dynamicLookups]=\"component.dynamicLists\" [master]=\"component\"\r\n                  [inputClass]=\"component.inputSizeClass\" [swtDropdownContainerContainer]=\"component.swtDropdownContainerContainer\"\r\n                  (onDropdownGridShown)=\"component.doOnDropdownGridShown($event)\">\r\n                </swt-generic-edit-dialog-form>\r\n              </div>\r\n            }\r\n          </div>\r\n        }\r\n        @if (component.errorText) {\r\n          <div class=\"alert alert-danger break-text m-xs mt-4\">\r\n            {{component.errorText}}\r\n          </div>\r\n        }\r\n      </div>\r\n      <div class=\"modal-footer\">\r\n        @for (btn of component.customFormButtonsBefore; track btn) {\r\n          <button type=\"button\" class=\"btn\"\r\n            [disabled]=\"btn.submitDialog ? component.isSubmitDisabled : null\" [ngClass]=\"btn.buttonClass\"\r\n            [title]=\"btn.tooltip\" (click)=\"component.onButtonClicked(btn, component.editItem)\"\r\n            [ngStyle]=\"{ 'width': btn.width ?? 'auto' }\">\r\n            @if (btn.iconClass) {\r\n              <i class=\"fa {{btn.iconClass}}\"></i>\r\n            }\r\n            {{btn.text}}\r\n          </button>\r\n        }\r\n        @if (!component.hideCancelButton) {\r\n          <button id=\"btn-cancel\" type=\"button\" class=\"btn btn-secondary\"\r\n          (click)=\"component.cancelDialog()\" i18n=\"@@Button.Cancel.act.Label\">Abbrechen</button>\r\n        }\r\n        @if (!component.hideOkButton) {\r\n          <button id=\"btn-ok\" type=\"button\" class=\"btn btn-primary\"\r\n            (click)=\"component.submitDialog()\" [disabled]=\"component.isSubmitDisabled\"\r\n          i18n=\"@@Button.Ok.act.Label\">OK</button>\r\n        }\r\n        @for (btn of component.customFormButtonsAfter; track btn) {\r\n          <button type=\"button\" class=\"btn\"\r\n            [disabled]=\"btn.submitDialog ? component.isSubmitDisabled : null\" [ngClass]=\"btn.buttonClass\"\r\n            [title]=\"btn.tooltip\" (click)=\"component.onButtonClicked(btn,component.editItem)\"\r\n            [ngStyle]=\"{ 'width': btn.width ?? 'auto' }\">\r\n            @if (btn.iconClass) {\r\n              <i class=\"fa {{btn.iconClass}}\"></i>\r\n            }\r\n            {{btn.text}}\r\n          </button>\r\n        }\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n","import { Component, DestroyRef, DoCheck, effect, Input, KeyValueDiffers, OnDestroy, OnInit, QueryList, signal, ViewChildren } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { DialogInitDirective } from '@sowatech/shared/dialogs';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\nimport { SharedConfigService } from '@sowatech/shared/shared-config';\r\nimport { ModalDirective } from 'ngx-bootstrap/modal';\r\nimport { Subscription, take } from 'rxjs';\r\n\r\nimport { GenericEditDialogBaseComponent } from './swt-generic-edit-dialog-base.component';\r\nimport { GenericEditDialogService } from './swt-generic-edit-dialog.service';\r\nimport { DialogDynamicList, DialogFieldButton, DialogSize } from './swt-generic-edit-dialog.types';\r\nimport { SwtGenericEditDialogComponentBase } from './templates/swt-generic-edit-dialog.templates';\r\n\r\n@Component({\r\n    selector: 'swt-generic-edit-dialog',\r\n    templateUrl: './swt-generic-edit-dialog.component.html',\r\n    styles: ['.modal-footer button { margin-left:3px;}'],\r\n    standalone: false\r\n})\r\n\r\nexport class GenericEditDialogComponent<T> extends GenericEditDialogBaseComponent<T> implements DoCheck, OnDestroy, OnInit {\r\n\r\n    constructor(\r\n        logger: LoggerService,\r\n        private genericEditDialogService: GenericEditDialogService,\r\n        differs: KeyValueDiffers,\r\n        sharedConfig: SharedConfigService,\r\n        private destroyRef: DestroyRef\r\n    ) {\r\n        super(logger, differs);\r\n        this.disableAnimation = sharedConfig.disableModalAnimation;\r\n\r\n        effect(() => {\r\n            if (!this.isDialogOpen()) return;\r\n\r\n            requestAnimationFrame(() => {\r\n                if (!this.dialog) return;\r\n                this.onHiddenSubscription?.unsubscribe(); // Um Mehrfach Subscription zu vermeiden, falls isDialogOpen in showErrors() wieder auf true gesetzt wird\r\n                this.onHiddenSubscription = this.dialog.onHidden.pipe(take(1), takeUntilDestroyed(this.destroyRef)).subscribe(() => {\r\n                    this.isDialogOpen.set(false);\r\n                    this.closeModalFix();\r\n                    this.onHidden.emit();\r\n                });\r\n            });\r\n        });\r\n    }\r\n\r\n    @ViewChildren('template')\r\n    public template: QueryList<SwtGenericEditDialogComponentBase>;\r\n\r\n    public get dialog(): ModalDirective {\r\n        return this.template.first?.dialog;\r\n    }\r\n\r\n    private get dialogInitDirective(): DialogInitDirective {\r\n        return this.template.first.dialogInitDirective;\r\n    }\r\n\r\n    public modalTitle = '';\r\n\r\n    @Input()\r\n    public titleSingular = '';\r\n    @Input('id')\r\n    public dialogId = '';\r\n\r\n    public hideOkButton = false;\r\n    public hideCancelButton = false;\r\n\r\n    public disableAnimation: boolean;\r\n\r\n    public swtDropdownContainerContainer = 'swt-generic-edit-dialog div.modal-dialog';\r\n\r\n    /** Verfolgt ob der Dialog initialisiert wurde, um das Rendern versteckter Dialoge im DOM zu vermeiden (WAVE Barrierefreiheit) */\r\n    public isDialogOpen = signal<boolean>(false);\r\n\r\n    private onHiddenSubscription: Subscription | undefined;\r\n\r\n    /** set this true, if this dialog component should be used as the \"global generic dialog\" */\r\n    @Input()\r\n    public set serviceDialog(value: boolean) {\r\n        if (value)\r\n            this.genericEditDialogService.setDialogComponent(this);\r\n    }\r\n\r\n    /** used internal */\r\n    public isShown(): boolean {\r\n        //overwrite in inherited\r\n        return this.dialog?.isShown ?? false;\r\n    }\r\n\r\n    ngOnInit() {\r\n        super.onInit();\r\n    }\r\n\r\n    /** fix weil modal-open nicht herausgenommen wird wenn ein 2ter Dialog geoeffnet wird */\r\n    private closeModalFix() {\r\n        document.body.classList.remove('modal-open');\r\n        document.body.style.paddingRight = '0px';\r\n        document.body.style.overflowY = '';\r\n    }\r\n\r\n    ngDoCheck() {\r\n        super.doCheck();\r\n    }\r\n\r\n    ngOnDestroy() {\r\n        super.onDestroy();\r\n    }\r\n\r\n    /**\r\n     * Fill Data and Show Dialog\r\n     *\r\n     * @param dto\r\n     * @param mode user-defined 'mode' without any logic in dialog. can e.g. be used to store meta-info like \"INSERT|EDIT|DUPLICATE\" in multi-role dialogs\r\n     * @param dynamicLists dynamic lookups (in contrary to static) which are loaded before dialog.show. they are refernced by a lookupKey in the configuration (lookups of type string)\r\n     */\r\n    public show(\r\n        dto?: T,\r\n        mode?: any,\r\n        dynamicLists?: DialogDynamicList[]\r\n    ) {\r\n        this.isDialogOpen.set(true);\r\n        super.initData(dto, mode, dynamicLists);\r\n        this.modalTitle = this.titleSingular;\r\n\r\n        requestAnimationFrame(() => {\r\n            this.dialog?.show();\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Re-Open the Dialog with errors shown\r\n     *\r\n     * @param errors\r\n     */\r\n    public override showErrors(errors: string[]) {\r\n        this.isDialogOpen.set(true);\r\n        super.showErrors(errors);\r\n        requestAnimationFrame(() => {\r\n            this.dialog?.show();\r\n        });\r\n    }\r\n\r\n    public override submitDialog(submitResult: 'OK' | string = 'OK') {\r\n        super.submitDialog(submitResult);\r\n    }\r\n\r\n    public override hide() {\r\n        super.hide();\r\n        this.dialog?.hide();\r\n    }\r\n\r\n    public override cancelDialog() {\r\n        super.cancelDialog();\r\n        this.dialog?.hide();\r\n    }\r\n\r\n    //------ region Custom Buttons -------------------------\r\n\r\n    public get customFormButtonsBefore(): Array<DialogFieldButton> {\r\n        return this.getCustomButtons('footer-before');\r\n    }\r\n\r\n    public get customFormButtonsAfter(): Array<DialogFieldButton> {\r\n        return this.getCustomButtons('footer-after');\r\n    }\r\n\r\n    private getCustomButtons(btnPosition: 'footer-before' | 'footer-after'): Array<DialogFieldButton> {\r\n        const resultBtns = new Array<DialogFieldButton>();\r\n        const dialogFieldsWithButtons = this.getAllDialogFields.filter(df => df.type == 'buttons');\r\n        for (const df of dialogFieldsWithButtons) {\r\n            for (const btn of df.buttons) {\r\n                if (btn.position == btnPosition)\r\n                    resultBtns.push(btn);\r\n            }\r\n        }\r\n        return resultBtns;\r\n    }\r\n    //------ end region Custom Buttons -------------------------\r\n\r\n    //------ region Dialog Size -------------------------\r\n    private _size: DialogSize;\r\n    public sizeClass = 'modal-md';\r\n\r\n    public get size(): DialogSize {\r\n        return this._size;\r\n    }\r\n\r\n    public set size(newSize: DialogSize) {\r\n        this.sizeClass = this.getSizeClass(newSize);\r\n        this._size = newSize;\r\n    }\r\n\r\n    private getSizeClass(size: DialogSize) {\r\n        switch (size) {\r\n            case 'small': return 'modal-sm';\r\n            case 'medium': return 'modal-md';\r\n            case 'large': return 'modal-lg';\r\n            default: return 'modal-md';\r\n        }\r\n    }\r\n    //------ end region Dialog Size -------------------------\r\n\r\n    public focus(fieldname: string) {\r\n        this.dialogInitDirective.focus(fieldname);\r\n    }\r\n}\r\n","@if(isDialogOpen()){\r\n    <switch-template [inspinia]=\"inspiniaTemplate\" [sneat]=\"sneatTemplate\"></switch-template>\r\n    <ng-template #inspiniaTemplate>\r\n        <swt-generic-edit-dialog-inspinia [component]=\"this\" #template></swt-generic-edit-dialog-inspinia>\r\n    </ng-template>\r\n\r\n    <ng-template #sneatTemplate>\r\n        <swt-generic-edit-dialog-sneat [component]=\"this\" #template></swt-generic-edit-dialog-sneat>\r\n    </ng-template>\r\n}\r\n","import { Component, DoCheck, Input, KeyValueDiffers, OnDestroy, OnInit } from '@angular/core';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\n\r\nimport { GenericEditDialogBaseComponent } from './swt-generic-edit-dialog-base.component';\r\nimport { DialogDynamicList, DialogField, DialogFieldCategory } from './swt-generic-edit-dialog.types';\r\n\r\n@Component({\r\n    selector: 'swt-generic-edit-dialog-inline',\r\n    templateUrl: './swt-generic-edit-dialog-inline.component.html',\r\n    standalone: false\r\n})\r\n\r\n/** Verwendung :\r\n * - in Template ientragen\r\n * - Aufruf von configureDialogFields() zum Rendern der Struktur\r\n * - Aufruf initData() zum Füllen mit Daten\r\n */\r\nexport class GenericEditDialogInlineComponent<T> extends GenericEditDialogBaseComponent<T> implements DoCheck, OnDestroy, OnInit {\r\n\r\n    constructor(\r\n        logger: LoggerService,\r\n        differs: KeyValueDiffers,\r\n    ) {\r\n        super(logger, differs);\r\n    }\r\n\r\n\r\n    public ngOnInit() {\r\n        super.onInit();\r\n    }\r\n\r\n    public ngOnDestroy() {\r\n        super.onDestroy();\r\n    }\r\n\r\n    public ngDoCheck() {\r\n        super.doCheck();\r\n    }\r\n\r\n    /**\r\n    Bestimmt in welchem container der bs-dropdown-container gerendert wird. Default ist 'body'.\r\n */\r\n    @Input()\r\n    public swtDropdownContainerContainer = 'body';\r\n\r\n    /**\r\n     * Konfiguriert den Aufbau des Formulars\r\n     *\r\n     * @param fieldsOrCategoriesOfFields\r\n     */\r\n    public override configureDialogFields(fieldsOrCategoriesOfFields: DialogField[] | DialogFieldCategory[]) {\r\n        super.configureDialogFields(fieldsOrCategoriesOfFields);\r\n    }\r\n\r\n    /**\r\n     * Übergibt die Bearbeitungsdaten\r\n     * Wenn nicht aufgerufen, dann funktioniert die Change-Detection nicht!\r\n     *\r\n     * @param dto\r\n     * @param dynamicLists\r\n     */\r\n    public override initData(\r\n        dto?: T,\r\n        dynamicLists?: DialogDynamicList[]\r\n    ) {\r\n        super.initData(dto, null, dynamicLists);\r\n    }\r\n\r\n    /**\r\n     * Abschluss der Bearbeitung.\r\n     * Kopiert die Form-Eingabewerte in das Datenobjekt zurück und liefert dieses als Ergebnis.\r\n     */\r\n    public submitEdit(): T {\r\n        if (this.isSubmitDisabled)\r\n            this.logger.warn('GenericEditDialogInlineComponent.submitEdit - Dialog kann nicht submittet werden, wenn `isSubmitDisabled` false ist. Es wird das alte DTO zurückgegeben.');\r\n        super.submitDialog('OK');\r\n        return this.dtoItem;\r\n    }\r\n\r\n    public cancelEdit() {\r\n        //super.cancelDialog();\r\n        super.resetData();\r\n    }\r\n\r\n    //hide() {\r\n    //    super.hide();\r\n    //}\r\n\r\n    /**\r\n     * wird intern benutzt\r\n     * */\r\n    public isShown(): boolean {\r\n        return true;\r\n    }\r\n\r\n}\r\n","@if (categoriesAsTabs) {\r\n  <ul-nav-tabs #tabs>\r\n    @for (cat of visibleCategories; track cat; let i = $index) {\r\n      <li [id]=\"cat.name\" [ngClass]=\"cat.active?'active':''\">\r\n        <a>{{cat.name}}</a>\r\n      </li>\r\n    }\r\n  </ul-nav-tabs>\r\n  @for (cat of visibleCategories; track cat) {\r\n    @if (tabs.isActive(cat.name)) {\r\n      <div class=\"tab-pane panel-body\">\r\n        <swt-generic-edit-dialog-form [cat]=\"cat\" [editItem]=\"editItem\"\r\n          [dynamicLookups]=\"dynamicLists\" [master]=\"this\"\r\n          [inputClass]=\"inputSizeClass\"\r\n          (onDropdownGridShown)=\"doOnDropdownGridShown($event)\"\r\n          [swtDropdownContainerContainer]=\"swtDropdownContainerContainer\"\r\n          >\r\n        </swt-generic-edit-dialog-form>\r\n      </div>\r\n    }\r\n  }\r\n}\r\n\r\n@if (!categoriesAsTabs) {\r\n  <div>\r\n    @for (cat of visibleCategories; track cat; let firstCat = $first) {\r\n      <div>\r\n        @if (cat.name && !firstCat) {\r\n          <div class=\"hr-line-dashed\"></div>\r\n        }\r\n        @if (cat.name) {\r\n          <ly-title context=\"swt-generic-edit-dialog-inline-category\" customClass=\"m-t-none m-b\" sizeClass=\"title-size-4\">{{cat.name}}</ly-title>\r\n        }\r\n        <swt-generic-edit-dialog-form [cat]=\"cat\" [editItem]=\"editItem\"\r\n          [dynamicLookups]=\"dynamicLists\" [master]=\"this\"\r\n          [inputClass]=\"inputSizeClass\"\r\n          (onDropdownGridShown)=\"doOnDropdownGridShown($event)\"\r\n          [swtDropdownContainerContainer]=\"swtDropdownContainerContainer\"\r\n          >\r\n        </swt-generic-edit-dialog-form>\r\n      </div>\r\n    }\r\n  </div>\r\n}\r\n@if (errorText) {\r\n  <div class=\"hr-line-solid m-xs\"></div>\r\n}\r\n@if (errorText) {\r\n  <div class=\"alert alert-danger m-xs\">\r\n    <p>{{errorText}}</p>\r\n  </div>\r\n}\r\n","import { Directive, effect, inject, input } from '@angular/core';\r\n\r\nimport { GridComponent } from './swt-grid.component';\r\n\r\n@Directive({\r\n    selector: 'swt-grid[loading]',\r\n    standalone: false\r\n})\r\nexport class SwtGridLoadingDirective {\r\n    private readonly grid = inject(GridComponent);\r\n\r\n    constructor() {\r\n        effect(() => {\r\n            const loadingIndicator = this.grid.loadingIndicator;\r\n            if (this.loading()) loadingIndicator.show();\r\n            else loadingIndicator.hide();\r\n        });\r\n    }\r\n\r\n    /** Wenn `true`, wird der `loading-indicator` angezeigt */\r\n    public readonly loading = input(false);\r\n}\r\n","import { Component, DestroyRef, EventEmitter, inject, Input, Output, ViewChild } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { DialogResult, MessageBoxService, MessageButtons, MessageType } from '@sowatech/shared/dialogs';\r\nimport { DatasourceComponent } from '@sowatech/shared/ds-datasource';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\nimport { I18nService } from '@sowatech/shared/utilities';\r\n\r\nimport { GenericEditDialogService } from '../swt-generic-edit-dialog/swt-generic-edit-dialog.service';\r\nimport { DialogField, FieldType, IDialogConfiguration, Lookups, lookupsKey } from '../swt-generic-edit-dialog/swt-generic-edit-dialog.types';\r\nimport { GridColumn, GridColumnType, GridLookup } from '../swt-grid/swt-grid-configuration';\r\nimport { GridColumnButtonEvent } from '../swt-grid/swt-grid-events';\r\nimport { GridComponent } from '../swt-grid/swt-grid.component';\r\n\r\nimport { ListEditorWebApiService } from './swt-list-editor-web-api.service';\r\n\r\ntype Id = any;\r\ntype FieldName<T> = Extract<keyof T, string>;\r\n\r\n@Component({\r\n    selector: 'swt-list-editor',\r\n    templateUrl: './swt-list-editor.component.html',\r\n    standalone: false\r\n})\r\nexport class ListEditorComponent<ListItem = any> {\r\n    private readonly destroyRef = inject(DestroyRef);\r\n    private readonly logger = inject(LoggerService);\r\n    private readonly messageBoxService = inject(MessageBoxService);\r\n    private readonly i18n = inject(I18nService);\r\n    private readonly editDialog = inject(GenericEditDialogService);\r\n\r\n    public listItems: Array<ListItem> = [];\r\n\r\n    @Input() public idFieldname: FieldName<ListItem>;\r\n    @Input() public titleSingular: string;\r\n    @Input() public titlePlural: string;\r\n    @Input() public small = true;\r\n    @Input() public gridButtonColumn: GridColumn = {\r\n        type: 'buttons', buttons: [\r\n            { ident: 'DELETE', text: $localize`:@@ListEditor.Delete.act.Label:Löschen`, buttonClass: 'btn-danger pull-right', iconClass: 'fa fa-trash', tooltip: $localize`:@@ListEditor.Delete.act.Tooltip:Löschen` },\r\n            { ident: 'EDIT', text: $localize`:@@ListEditor.Edit.act.Label:Bearbeiten`, buttonClass: 'btn-default pull-right', iconClass: 'fa fa-edit', tooltip: $localize`:@@ListEditor.Edit.act.Tooltip:Bearbeiten` }\r\n        ]\r\n    };\r\n    // eslint-disable-next-line @angular-eslint/no-input-rename\r\n    @Input('store-key') public explicitStoreKey?: string;\r\n\r\n    @Output() public onEdit = new EventEmitter<ListItem>();\r\n\r\n    @ViewChild('listDatasource', { static: true }) public listDatasource: DatasourceComponent;\r\n    @ViewChild('listGrid', { static: true }) public listGrid: GridComponent;\r\n\r\n    private dialogConfig: IDialogConfiguration;\r\n\r\n    public set columns(allColumns: ListColumn<ListItem>[]) {\r\n        this.setVisibleColumns(allColumns);\r\n        this.setEditableColumns(allColumns);\r\n        this.refresh();\r\n    }\r\n\r\n    private _webApiService: ListEditorWebApiService<ListItem>;\r\n    public set webApiService(value: ListEditorWebApiService<ListItem>) {\r\n        this._webApiService = value;\r\n        this.refresh();\r\n    }\r\n\r\n    public get storeKey(): string {\r\n        return this.explicitStoreKey ?? `ListEditor-${this.titleSingular}`;\r\n    }\r\n\r\n    public async refresh(focusId?: number) {\r\n        if (!this.dialogConfig || !this._webApiService) return;\r\n\r\n        this.listGrid.loadingIndicator.show();\r\n        try {\r\n            this.listItems = await this._webApiService.getList();\r\n            this.listGrid.loadingIndicator.hide();\r\n            this.logger.log('ListEditorComponent.getList/success');\r\n            if (focusId)\r\n                this.listDatasource.focus(focusId);\r\n        } catch (error) {\r\n            this.listGrid.loadingIndicator.hide();\r\n            this.logger.log('ListEditorComponent.getList/error');\r\n            this.logger.error(error);\r\n            this.messageBoxService.showDialog($localize`:@@ListEditor.Load.Error.msg.Text:Fehler Laden der Daten vom Server`, $localize`:@@ListEditor.Load.Error.msg.Title:Fehler`, MessageType.ERROR, MessageButtons.CLOSE);\r\n        }\r\n    }\r\n\r\n    private getListItemId(listItem: ListItem): Id {\r\n        return listItem[this.listDatasource.idfield];\r\n    }\r\n\r\n    public add() {\r\n        this.logger.log('ListEditorComponent.onSubmitEditDialog');\r\n        this.editDialog.show<ListItem>(this.dialogConfig)\r\n            .pipe(takeUntilDestroyed(this.destroyRef))\r\n            .subscribe((result) => {\r\n                this.insertItem(result.dto);\r\n            });\r\n    }\r\n\r\n    public gridButtonClicked(event: GridColumnButtonEvent) {\r\n        switch (event.buttonIdent) {\r\n            case 'DELETE':\r\n                this.delete(event.itemId);\r\n                break;\r\n            case 'EDIT':\r\n                this.edit(event.itemId);\r\n                break;\r\n            default:\r\n                throw new Error('Method not implemented.');\r\n        }\r\n    }\r\n\r\n    private delete(id: Id) {\r\n        this.logger.log('ListEditorComponent.delete');\r\n        const confirmationText = this.i18n.replace($localize`:@@ListEditor.Delete.Confirm.msg.Text:Ausgewählten Datensatz $0 löschen?`, [id]);\r\n        this.messageBoxService.showDialog(confirmationText, $localize`:@@ListEditor.Delete.Confirm.msg.Title:Löschen`)\r\n            .then((dlgResult: DialogResult) => {\r\n                if (dlgResult === DialogResult.OK)\r\n                    this.deleteItem(id);\r\n            });\r\n    }\r\n\r\n    private async deleteItem(id: Id) {\r\n        this.listGrid.loadingIndicator.show();\r\n\r\n        try {\r\n            await this._webApiService.delete(id);\r\n            this.logger.log('ListEditorComponent.delete/success');\r\n            this.refresh();\r\n        } catch (error) {\r\n            this.listGrid.loadingIndicator.hide();\r\n            this.logger.log('ListEditorComponent.delete/error');\r\n            this.logger.error(error);\r\n            this.messageBoxService.errorDialog($localize`:@@ListEditor.Delete.Error.msg.Text:Fehler beim Löschen`, $localize`:@@ListEditor.Delete.Error.msg.Title:Fehler`);\r\n        }\r\n    }\r\n\r\n    private edit(id: Id) {\r\n        this.logger.log('ListEditorComponent.edit');\r\n        const item = this.listDatasource.getDataItem(id);\r\n        this.onEdit.emit(item);\r\n        this.editDialog.show<ListItem>(this.dialogConfig, item)\r\n            .pipe(takeUntilDestroyed(this.destroyRef))\r\n            .subscribe((result) => {\r\n                this.updateItem(result.dto);\r\n            });\r\n    }\r\n\r\n    private async updateItem(editItem: ListItem) {\r\n        this.logger.log('ListEditorComponent.updateItem');\r\n\r\n        try {\r\n            await this._webApiService.update(editItem);\r\n            this.logger.log('ListEditorComponent.updateItem / success');\r\n            this.refresh(this.getListItemId(editItem));\r\n        } catch (error) {\r\n            this.logger.log('ListEditorComponent.updateItem / error');\r\n            this.logger.error(error);\r\n            this.messageBoxService.errorDialog($localize`:@@ListEditor.Edit.Error.msg.Text:Fehler beim Speichern der Daten`, $localize`:@@ListEditor.Edit.Error.msg.Title:Fehler`);\r\n        }\r\n    }\r\n\r\n    private async insertItem(editItem: ListItem) {\r\n        this.logger.log('ListEditorComponent.insertItem');\r\n        try {\r\n            const newItemId = await this._webApiService.insert(editItem);\r\n            this.logger.log('ListEditorComponent.insertItem / success');\r\n            this.refresh(newItemId);\r\n        } catch (error) {\r\n            this.logger.log('ListEditorComponent.insertItem / error');\r\n            this.logger.error(error);\r\n            this.messageBoxService.showDialog($localize`:@@ListEditor.Add.Error.msg.Text:Fehler beim Anlegen des Datensatzes`, $localize`:@@ListEditor.Add.Error.msg.Title:Fehler`, MessageType.ERROR, MessageButtons.CLOSE);\r\n        }\r\n    }\r\n\r\n    public focus(listItem: ListItem) {\r\n        const id = this.getListItemId(listItem);\r\n        this.listDatasource.focus(id);\r\n    }\r\n\r\n    public isSelected(listItem: ListItem): boolean {\r\n        const id = this.getListItemId(listItem);\r\n        return this.listDatasource.isSelected(id);\r\n    }\r\n\r\n    private setEditableColumns(columns: ListColumn<ListItem>[]) {\r\n        const editableColumns = columns.filter((col) => col.fieldname !== this.idFieldname && !col.hiddenInDialog);\r\n        this.dialogConfig = {\r\n            title: this.titleSingular,\r\n            fieldsOrCategoriesOfFields: editableColumns\r\n        };\r\n    }\r\n\r\n    private setVisibleColumns(columns: ListColumn<ListItem>[]) {\r\n        const gridColumns: GridColumn[] = columns.filter((col) => !col.hiddenInList).map(c => this.listColumnToGridColumn(c));\r\n        this.listGrid.columns = gridColumns.concat(this.gridButtonColumn);\r\n    }\r\n\r\n    private listColumnToGridColumn(listColumn: ListColumn<ListItem>): GridColumn<ListItem> {\r\n        const hasLookups = listColumn.lookUps && listColumn.lookUps.length > 0 && listColumn.type !== 'lru';\r\n        return {\r\n            ...listColumn,\r\n            type: hasLookups ? 'lookup' : this.fieldTypeToGridColumnType(listColumn.type),\r\n            lookups: hasLookups ? this.isValidLookup(listColumn.lookUps) ? listColumn.lookUps : undefined : undefined\r\n        };\r\n    }\r\n\r\n    /** Das Grid unsterstützt nicht die Implementation eines lookupsKey */\r\n    private isValidLookup(lookups: Lookups | Array<string> | lookupsKey): lookups is GridLookup {\r\n        return typeof lookups !== 'string';\r\n    }\r\n\r\n    private fieldTypeToGridColumnType(fieldType: FieldType): GridColumnType {\r\n        switch (fieldType) {\r\n            case undefined:\r\n            case 'text':\r\n            case 'number':\r\n            case 'date':\r\n            case 'boolean':\r\n            case 'email':\r\n            case 'tel':\r\n            case 'money':\r\n                return fieldType;\r\n            case 'textarea':\r\n            case 'password':\r\n            case 'info-text':\r\n            case 'lru':\r\n                return 'text';\r\n            case 'color-select':\r\n            case 'dateInterval':\r\n            case 'time':\r\n            case 'password-with-confirm':\r\n            case 'divider':\r\n            case 'buttons':\r\n            case 'hidden':\r\n            default:\r\n                throw new Error('Type not implemented: ' + fieldType);\r\n        }\r\n    }\r\n}\r\n\r\nexport type ListColumn<T = any> = DialogField<T> & Omit<GridColumn<T>, 'type' | 'lookups'> & ListColumnCustomFields;\r\n\r\nexport class ListColumnCustomFields {\r\n    public hiddenInList?: boolean;\r\n    public hiddenInDialog?: boolean;\r\n}\r\n","<ibox [heading]=\"titlePlural\" [collapsable]=\"false\">\r\n    <div ibox-tools>\r\n        <button button-add (click)=\"add()\" btn-class=\"primary\" class=\"pull-right\" icon=\"plus\" title=\"Hinzufügen\"\r\n            i18n-title=\"@@ListEditor.Add.act.Tooltip\">\r\n            {{titleSingular}}\r\n        </button>\r\n        <ng-content select=\"[custom-buttons]\"></ng-content>\r\n    </div>\r\n    <ds-datasource #listDatasource [pageSize]=\"15\" [src]=\"listItems\" [idfield]=\"idFieldname\"></ds-datasource>\r\n    <swt-grid #listGrid [datasource]=\"listDatasource\" (onButtonClicked)=\"gridButtonClicked($event)\"\r\n        [idfield]=\"idFieldname\" [small]=\"small\" [store-key]=\"storeKey\">\r\n        <ng-content select=\"[grid-detail]\"></ng-content>\r\n    </swt-grid>\r\n</ibox>\r\n","import { CommonModule, CurrencyPipe } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { RouterModule } from '@angular/router';\r\nimport { NgSelectModule } from '@ng-select/ng-select';\r\nimport { ButtonsModule } from '@sowatech/shared/buttons';\r\nimport { DialogsModule } from '@sowatech/shared/dialogs';\r\nimport { DatasourceModule } from '@sowatech/shared/ds-datasource';\r\nimport { LayoutModule } from '@sowatech/shared/layout';\r\nimport { NoDblClickModule } from '@sowatech/shared/no-double-click';\r\nimport { NoEditButtonModule } from '@sowatech/shared/no-edit-button';\r\nimport { SwtControlsModule } from '@sowatech/shared/swt-controls';\r\nimport { DragulaModule } from '@sowatech/shared/swt-dragula';\r\nimport { SwitchTemplateModule } from '@sowatech/shared/template';\r\nimport { TypedTemplateDirective } from '@sowatech/shared/typed-template';\r\nimport { NgSelectAriaLabelDirective } from '@sowatech/shared/utilities';\r\nimport { KeyboardShortcutsModule } from 'ng-keyboard-shortcuts';\r\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\r\nimport { PopoverModule } from 'ngx-bootstrap/popover';\r\nimport { TimepickerModule } from 'ngx-bootstrap/timepicker';\r\nimport { TypeaheadModule } from 'ngx-bootstrap/typeahead';\r\nimport { NgxMaskDirective, NgxMaskPipe, provideNgxMask } from 'ngx-mask';\r\nimport { NgScrollbarModule } from 'ngx-scrollbar';\r\n\r\nimport { ColHideDirective } from './col/col-hide.directive';\r\nimport { ColSelectDialogComponent } from './col/col-select-dialog.component';\r\nimport { ColVisibilityService } from './col/col-visibility.service';\r\nimport { ColSelectDialogInspiniaComponent, ColSelectDialogSneatComponent } from './col/templates/col-select-dialog.templates';\r\nimport { GenericEditDialogFormComponent } from './swt-generic-edit-dialog/swt-generic-edit-dialog-form.component';\r\nimport { GenericEditDialogInlineComponent } from './swt-generic-edit-dialog/swt-generic-edit-dialog-inline.component';\r\nimport { GenericEditDialogComponent } from './swt-generic-edit-dialog/swt-generic-edit-dialog.component';\r\nimport { SwtGenericEditDialogFormInspiniaComponent, SwtGenericEditDialogFormSneatComponent } from './swt-generic-edit-dialog/templates/swt-generic-edit-dialog-form.templates';\r\nimport { SwtGenericEditDialogInspiniaComponent, SwtGenericEditDialogSneatComponent } from './swt-generic-edit-dialog/templates/swt-generic-edit-dialog.templates';\r\nimport { DisableClickDirective } from './swt-grid/disable-click-button.directive';\r\nimport { GridCellSpanComponent, GridCellSpanRouterLinkComponent } from './swt-grid/grid-cell-span.component';\r\nimport { MultiSelectFilterComponent } from './swt-grid/multi-select-filter.component';\r\nimport { SwtGridLoadingDirective } from './swt-grid/swt-grid-loading.directive';\r\nimport { GridComponent } from './swt-grid/swt-grid.component';\r\nimport { ListEditorComponent } from './swt-list-editor/swt-list-editor.component';\r\n\r\nexport const BsDropdownModuleForRoot = BsDropdownModule.forRoot();\r\nexport const TypeaheadModuleForRoot = TypeaheadModule.forRoot();\r\nexport const PopoverModuleForRoot = PopoverModule.forRoot();\r\nexport const TimepickerModuleForRoot = TimepickerModule.forRoot();\r\nexport const DragulaModuleForRoot = DragulaModule.forRoot();\r\nexport const KeyboardShortcutsModuleForRoot = KeyboardShortcutsModule.forRoot();\r\n\r\n@NgModule({\r\n    imports: [\r\n        CommonModule,\r\n        NgSelectModule,\r\n        FormsModule,\r\n        RouterModule,\r\n        DialogsModule,\r\n        BsDropdownModuleForRoot,\r\n        TypeaheadModuleForRoot,\r\n        PopoverModuleForRoot,\r\n        TimepickerModuleForRoot,\r\n        TimepickerModule,\r\n        SwtControlsModule,\r\n        DatasourceModule,\r\n        DragulaModuleForRoot,\r\n        NgxMaskDirective,\r\n        NgxMaskPipe,\r\n        NoDblClickModule,\r\n        KeyboardShortcutsModuleForRoot,\r\n        NoEditButtonModule,\r\n        NgScrollbarModule,\r\n        SwitchTemplateModule,\r\n        ButtonsModule,\r\n        LayoutModule,\r\n        TypedTemplateDirective,\r\n        NgSelectAriaLabelDirective\r\n    ],\r\n    declarations: [\r\n        GridComponent,\r\n        GridCellSpanComponent,\r\n        GridCellSpanRouterLinkComponent,\r\n        ListEditorComponent,\r\n        MultiSelectFilterComponent,\r\n        SwtGridLoadingDirective,\r\n\r\n        DisableClickDirective,\r\n        ColHideDirective,\r\n        ColSelectDialogComponent,\r\n        ColSelectDialogInspiniaComponent,\r\n        ColSelectDialogSneatComponent,\r\n\r\n        GenericEditDialogComponent,\r\n        GenericEditDialogFormComponent,\r\n        GenericEditDialogInlineComponent,\r\n        SwtGenericEditDialogInspiniaComponent,\r\n        SwtGenericEditDialogFormInspiniaComponent,\r\n        SwtGenericEditDialogSneatComponent,\r\n        SwtGenericEditDialogFormSneatComponent,\r\n    ],\r\n    exports: [\r\n        GridComponent,\r\n        MultiSelectFilterComponent,\r\n        ListEditorComponent,\r\n        ColHideDirective,\r\n        ColSelectDialogComponent,\r\n        TimepickerModule,\r\n        GenericEditDialogComponent,\r\n        GenericEditDialogInlineComponent,\r\n        SwtGridLoadingDirective,\r\n    ],\r\n    providers: [\r\n        ColVisibilityService,\r\n        CurrencyPipe,\r\n        provideNgxMask(),\r\n    ]\r\n})\r\nexport class SwtGenericModule { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3","i4","i1.ColVisibilityService","i5.ColSelectDialogInspiniaComponent","i5.ColSelectDialogSneatComponent","i4.ColVisibilityService","i5","i6","i8","i10","i12","i13","i15","i17.GridCellSpanComponent","i18.MultiSelectFilterComponent","i19.DisableClickDirective","i20.ColHideDirective","CLASS","i7","i9.GridComponent","i3.SwtGenericEditDialogFormInspiniaComponent","i3.SwtGenericEditDialogFormSneatComponent","i7.GenericEditDialogFormComponent","i2.GenericEditDialogService","i5.SwtGenericEditDialogInspiniaComponent","i5.SwtGenericEditDialogSneatComponent","i5.GenericEditDialogFormComponent","i6.GridComponent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,MAAM,eAAe,GAAG,gBAAgB;AAEjC,MAAM,kBAAkB,GAAG,QAAQ;AACnC,MAAM,mBAAmB,GAAG,SAAS;MAG/B,oBAAoB,CAAA;AAE7B,IAAA,WAAA,CAAoB,qBAAmD,EAAA;QAAnD,IAAA,CAAA,qBAAqB,GAArB,qBAAqB;AA2BlC,QAAA,IAAA,CAAA,oBAAoB,GAA2B,IAAI,YAAY,EAAY;IA3BP;AAEnE,IAAA,UAAU,CAAC,SAAiB,EAAA;QAChC,OAAO,eAAe,GAAG,SAAS;IACtC;IAEO,eAAe,CAAC,SAAiB,EAAE,eAAoC,EAAA;QAC1E,MAAM,gBAAgB,GAAG,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI;QACvG,IAAI,gBAAgB,KAAK,kBAAkB;AAAE,YAAA,OAAO,KAAK;QACzD,IAAI,gBAAgB,KAAK,mBAAmB;AAAE,YAAA,OAAO,IAAI;QACzD,OAAO,CAAC,eAAe;IAC3B;IAEO,sBAAsB,CAAC,cAAwB,EAAE,aAAuB,EAAA;AAC3E,QAAA,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE;YAC9B,IAAI,CAAC,GAAG,CAAC,eAAe;AAAE,gBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;;AAC9C,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAC7B;AAEA,QAAA,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE;YAC7B,IAAI,GAAG,CAAC,eAAe;AAAE,gBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;;AAC7C,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QAC5B;AAEA,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3E;AAIQ,IAAA,eAAe,CAAC,GAAW,EAAA;AAC/B,QAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACrE;AAEQ,IAAA,SAAS,CAAC,GAAW,EAAA;AACzB,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC;IACvF;AAEQ,IAAA,UAAU,CAAC,GAAW,EAAA;AAC1B,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IACxF;8GAzCS,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAApB,oBAAoB,EAAA,CAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;;MCFqB,4BAA4B,CAAA;8GAA5B,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBADjD;;sBAEI;;sBAGA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;AASnC,MAAO,gCAAiC,SAAQ,4BAA4B,CAAA;8GAArE,gCAAgC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gCAAgC,8GCnB7C,gkCAsBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,2BAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iFAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FDHa,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAL5C,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,cAE1B,KAAK,EAAA,QAAA,EAAA,gkCAAA,EAAA;;AASf,MAAO,6BAA8B,SAAQ,4BAA4B,CAAA;8GAAlE,6BAA6B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,6BAA6B,2GE1B1C,+6BAmBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,2BAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iFAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FFOa,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBALzC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,cAEvB,KAAK,EAAA,QAAA,EAAA,+6BAAA,EAAA;;;AGxBrB;MAea,wBAAwB,CAAA;AACjC,IAAA,WAAA,CACY,oBAA0C,EAClD,YAAiC,EAC1B,UAAsB,EAAA;QAFrB,IAAA,CAAA,oBAAoB,GAApB,oBAAoB;QAErB,IAAA,CAAA,UAAU,GAAV,UAAU;QAUJ,IAAA,CAAA,aAAa,GAAmB,EAAE;AAY5C,QAAA,IAAA,CAAA,QAAQ,GAA2B,IAAI,YAAY,EAAY;QAQ/D,IAAA,CAAA,QAAQ,GAAqB,EAAE;AA5BlC,QAAA,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC,qBAAqB;IAC9D;IAEA,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA,0DAA0D;AACtF,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE;IACjD;IAGA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD;AAWA,IAAA,IAAW,YAAY,GAAA;QACnB,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;IAC5D;IAMQ,sBAAsB,GAAA;QAC1B,MAAM,mBAAmB,GAAqB,EAAE;AAChD,QAAA,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,YAAY,EAAE;AACzC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,eAAe,CAAC;AAClH,YAAA,mBAAmB,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,YAAY;QAC7D;AACA,QAAA,OAAO,mBAAmB;IAC9B;IAEO,YAAY,GAAA;AACf,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IAC1B;IACO,YAAY,GAAA;QACf,IAAI,CAAC,uBAAuB,EAAE;AAC9B,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IAC1B;IAEQ,uBAAuB,GAAA;QAC3B,MAAM,cAAc,GAAa,EAAE;QACnC,MAAM,aAAa,GAAa,EAAE;AAElC,QAAA,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,YAAY,EAAE;YACzC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC;YAC5D,MAAM,MAAM,GAAG,eAAe,GAAG,cAAc,GAAG,aAAa;AAC/D,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,SAAS,EAAE,eAAe,EAAE,WAAW,CAAC,eAAe,EAAE,CAAC;QACnG;QACA,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,cAAc,EAAE,aAAa,CAAC;AAC/E,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3D;8GAhES,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAH,IAAA,CAAA,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,0MCfrC,4YASA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,gCAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,6BAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FDMa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBANpC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cAEjB,KAAK,EAAA,QAAA,EAAA,4YAAA,EAAA;;sBAyBhB,YAAY;uBAAC,UAAU;;sBAGvB;;;MExCQ,aAAa,CAAA;AAOzB;MAEY,mBAAmB,CAAA;AAG/B;MAEY,aAAa,CAAA;AAGzB;MAEY,kBAAkB,CAAA;AAG9B;MAEY,qBAAqB,CAAA;AAIjC;MAEY,cAAc,CAAA;AAI1B;;MCvBY,qBAAqB,CAAA;AANlC,IAAA,WAAA,GAAA;AAWqB,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,YAAY,EAAkB;AAiElE,IAAA;AA/DW,IAAA,YAAY,CAAC,QAAgB,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC1E;IAEQ,YAAY,CAAC,GAAG,MAAqC,EAAA;AACzD,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C;AAEO,IAAA,QAAQ,CAAC,IAAoB,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9E;AAEO,IAAA,UAAU,CAAC,IAAoB,EAAA;AAClC,QAAA,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;IACrE;AAEO,IAAA,qBAAqB,CAAC,kBAAuC,EAAA;AAChE,QAAA,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,cAAc,CAAC,IAAI,kBAAkB,CAAC,KAAK,IAAI,CAAC,CAAC;IACnG;AAEO,IAAA,SAAS,CAAC,IAAoB,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAChF;AAEO,IAAA,SAAS,CAAC,IAAoB,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,gBAAgB,GAAG,EAAE,CAAC;IAChI;AAEO,IAAA,oBAAoB,CAAC,kBAAuC,EAAA;AAC/D,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;IAC5G;IAEO,UAAU,CAAC,IAAoB,EAAE,SAAiB,EAAA;QACrD,QAAQ,SAAS;AACb,YAAA,KAAK,OAAO;AACR,gBAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE;AACrE,YAAA,KAAK,QAAQ;AACT,gBAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE;AACvE,YAAA,KAAK,iBAAiB;AAClB,gBAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,IAAI,CAAC,eAAe,IAAI,EAAE;AACzF,YAAA;AACI,gBAAA,OAAO,EAAE;;IAErB;AAEO,IAAA,cAAc,CAAC,IAAoB,EAAA;AACtC,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI;IACjF;AAEO,IAAA,eAAe,CAAC,IAAoB,EAAA;AACvC,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;IACnF;AAEO,IAAA,WAAW,CAAC,IAAoB,EAAA;QACnC,OAAO,IAAI,CAAC,KAAK;IACrB;IAEO,WAAW,CAAC,IAAoB,EAAE,KAAiB,EAAA;AACtD,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;AACxB,YAAA,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9E;IACJ;8GArES,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAArB,qBAAqB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXlC,u6FA4DA,EAAA,MAAA,EAAA,CAAA,68EAAA,EAAA,mZAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAAAN,IAAA,CAAA,OAAA,CAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAAAA,IAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MDsCa,+BAA+B,CAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAAAA,IAAA,CAAA,WAAA,CAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAvF/B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,cAGd,KAAK,EAAA,QAAA,EAAA,u6FAAA,EAAA,MAAA,EAAA,CAAA,68EAAA,EAAA,mZAAA,CAAA,EAAA;;sBAIhB,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;sBAEA;;MAkFQ,+BAA+B,CAAA;AAf5C,IAAA,WAAA,GAAA;QAgBoB,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,YAAA,EAAA,GAAA,EAAA,CAAA,EAAqB,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,EAAA,CAAG;QAC/F,IAAA,CAAA,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA2B;AAKjE,IAAA;AAHa,IAAA,WAAW,CAAC,KAAiB,EAAA;QACnC,KAAK,CAAC,eAAe,EAAE;IAC3B;8GANS,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA/B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,+BAA+B,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAb9B,CAAA;;;;;;;;;;AAUL,QAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAGI,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAf3C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,4BAA4B;AACtC,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;AAUL,QAAA,CAAA;AACL,oBAAA,UAAU,EAAE;AACf,iBAAA;;;ME7EY,0BAA0B,CAAA;AAZvC,IAAA,WAAA,GAAA;AAaoB,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,SAAA,EAAA,GAAA,EAAA,CAAA,EAA2B,SAAS,EAAE,CAAC,KAAiB,KAAK,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG;AACvH,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,qDAAqB;AAChD,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,qDAAuB;AAEjD,QAAA,IAAA,CAAA,qBAAqB,GAAG,MAAM,CAAe,EAAE,iEAAC;AACvD,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;AAC5B,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAY,CAAC,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,cAAc,CAAC;AACnK,YAAA,OAAO,UAAU,EAAE,WAAW,IAAI,EAAE;AACxC,QAAA,CAAC,iDAAC;AAEe,QAAA,IAAA,CAAA,cAAc,GAAG,cAAc,CAAC,OAAO;AACvC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;AA8BlD,IAAA;IA5BU,eAAe,GAAA;AAClB,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,aAAa,CAAC,IAAI,CAChC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CACrC,CAAC,SAAS,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACzE,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,cAAc,EAAE,CAAC;IACtE;AAEQ,IAAA,mBAAmB,CAAC,OAAmB,EAAA;AAC3C,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;QAEnC,MAAM,iBAAiB,GAAG,OAAO,IAAK,OAAO,CAAC,CAAC,CAAgB;AAC/D,QAAA,IAAI,iBAAiB;AACjB,YAAA,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QAExG,MAAM,aAAa,GAAG,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ;AACpD,QAAA,IAAI,aAAa;YACb,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAElF,QAAA,OAAO,EAAE;IACb;AAEU,IAAA,SAAS,CAAC,SAAqB,EAAA;AACrC,QAAA,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC;AACtD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,CAAC,UAAU,CAAC;AAC7E,QAAA,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC;QACrF,IAAI,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,CAAC;IAC7C;8GAzCS,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA1B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,0BAA0B,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAVzB,CAAA;;;;;;AAMe,4BAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,2wEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,2BAAA,EAAA,YAAA,EAAA,aAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,EAAA,YAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,OAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAIhB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAZtC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,QAAA,EACrB,CAAA;;;;;;AAMe,4BAAA,CAAA,EAAA,UAAA,EAEb,KAAK,EAAA,MAAA,EAAA,CAAA,2wEAAA,CAAA,EAAA;;;MCXR,qBAAqB,CAAA;AAC9B,IAAA,WAAA,CAA6B,EAA2B,EAAA;QAA3B,IAAA,CAAA,EAAE,GAAF,EAAE;AAKvB,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAE;QACjC,IAAA,CAAA,aAAa,GAAG,KAAK;AALzB,QAAA,IAAI,CAAC,WAAW,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACzE,QAAA,IAAI,CAAC,cAAc,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC;IACnF;IAIA,IAAmC,YAAY,CAAC,KAAc,EAAA;AAC1D,QAAA,IAAI,KAAK,KAAK,IAAI,CAAC,aAAa,EAAE;AAC9B,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;YAC1B,IAAI,IAAI,CAAC,aAAa;gBAAE,IAAI,CAAC,WAAW,EAAE;;gBACrC,IAAI,CAAC,cAAc,EAAE;QAC9B;IACJ;IAKA,QAAQ,GAAA;AACJ,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;AAChC,QAAA,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AAClE,aAAA,SAAS,CAAC,CAAC,CAAe,KAAI;AAC3B,YAAA,IAAI,CAAC,CAAC,MAAM,KAAK,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC,IAAI,IAAI,CAAC,aAAa;gBAAE,CAAC,CAAC,eAAe,EAAE;AACnG,QAAA,CAAC,CAAC;IACV;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;IACnC;8GA7BS,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAArB,qBAAqB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,CAAA,eAAA,EAAA,cAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAJjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,UAAU,EAAE;AACf,iBAAA;;sBASI,KAAK;uBAAC,eAAe;;;MCLb,gBAAgB,CAAA;AACzB,IAAA,WAAA,CACI,EAAc,EAAA;AAKD,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACnD,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC1C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,KAAK,OAAO,GAAG,QAAQ,GAAG,QAAQ;AAEtF,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,KAAK,EAAgB;QAkB1C,IAAA,CAAA,eAAe,GAAG,KAAK;QAGtB,IAAA,CAAA,WAAW,GAAG,EAAE;AA5BpB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,aAAa;IACzC;IAOA,QAAQ,GAAA;QACJ,IAAI,CAAC,aAAa,CAAC,IAAI,CACnB,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,SAAS,CACpD,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAC5C;QACD,IAAI,CAAC,uBAAuB,EAAE;IAClC;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD;IAEA,IACW,aAAa,CAAC,IAAY,EAAA;AACjC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;IAC3B;IAOO,uBAAuB,GAAA;AAC1B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC;AACnG,QAAA,IAAI,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC;IACpC;AAEQ,IAAA,eAAe,CAAC,KAAc,EAAA;AAClC,QAAA,IAAI,KAAK;YACL,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;;YAElD,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;IAC7D;8GA5CS,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAhB,gBAAgB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,CAAA,UAAA,EAAA,eAAA,CAAA,EAAA,eAAA,EAAA,CAAA,mBAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAJ5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,UAAU,EAAE;AACf,iBAAA;;sBAyBI,KAAK;uBAAC,UAAU;;sBAIhB,KAAK;uBAAC,mBAAmB;;;ACtC9B;AACA;MAwCa,aAAa,CAAA;AACtB,IAAA,WAAA,CACY,MAAqB,EACrB,cAA8B,EACZ,MAAc,EAChC,MAA4B,EAC5B,oBAA0C,EAC1C,YAA0B,EAC1B,YAA4B,EAC5B,IAAiB,EAAA;QAPjB,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,cAAc,GAAd,cAAc;QACI,IAAA,CAAA,MAAM,GAAN,MAAM;QACxB,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,oBAAoB,GAApB,oBAAoB;QACpB,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,IAAI,GAAJ,IAAI;AAYC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAExC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AAC3B,QAAA,IAAA,CAAA,kBAAkB,GAAG,SAAS,CAAA,CAAA,qDAAA,CAAuD;AACrF,QAAA,IAAA,CAAA,cAAc,GAAG,SAAS,CAAA,CAAA,2CAAA,CAA6C;AAG/E,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,KAAK,EAAgB;QAqF1C,IAAA,CAAA,MAAM,GAAG,EAAE;QACX,IAAA,CAAA,YAAY,GAAG,EAAE;QAEjB,IAAA,CAAA,OAAO,GAAG,EAAE;AASZ,QAAA,IAAA,CAAA,qBAAqB,GAAG,MAAM,CAAC,CAAC,iEAAC;AACjC,QAAA,IAAA,CAAA,uBAAuB,GAAG,MAAM,CAAC,CAAC,mEAAC;QAWnC,IAAA,CAAA,YAAY,GAAG,KAAK;QAEpB,IAAA,CAAA,IAAI,GAAG,EAAE;QAoDT,IAAA,CAAA,kBAAkB,GAAG,KAAK;AA8B1B,QAAA,IAAA,CAAA,cAAc,GAAW,IAAI,CAAC;AAE9B,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,YAAY,EAAsB;QAEzD,IAAA,CAAA,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC5B,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAU,KAAK,2DAAC;AACvC,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAU,KAAK,+DAAC;QAC/B,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,GAAG,CAAA,oBAAA,EAAuB,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE,GAAG,qBAAqB,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,wBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;QAkB1I,IAAA,CAAA,oBAAoB,GAAmB,EAAE;AA4B1C,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAyB;AAE3D,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAiB;AAEhD,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAiB;AAE1C,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAuB;;AAGzD,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAM;QAYrC,IAAA,CAAA,UAAU,GAAG,KAAK;QACR,IAAA,CAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,sBAAsB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,yBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AASvE,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAuC,IAAI,sDAAC;AAQxE,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAyB,EAAE,sDAAC;QActC,IAAA,CAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;QA0BpF,IAAA,CAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;QAmR7F,IAAA,CAAA,QAAQ,GAAQ,SAAS;AA+MhB,QAAA,IAAA,CAAA,SAAS,GAAG,SAAS,CAAC,WAAW,qDAAC;QAE1C,IAAA,CAAA,kBAAkB,GAAG,KAAK;AAUjB,QAAA,IAAA,CAAA,kBAAkB,GAA8B,IAAI,YAAY,EAAe;QAp0B5F,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC;QAC1C,IAAI,CAAC,wBAAwB,EAAE;QAC/B,MAAM,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACtC,MAAM,CAAC,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC5C,MAAM,CAAC,MAAM,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACpD;IAaA,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CACnB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAC7D,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC,EAC7F,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC,EACrF,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC,CACtF;IACL;IAEA,eAAe,GAAA;AACX,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CACnB,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CACvG;IACL;IAEA,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD;IAEQ,sBAAsB,GAAA;AAC1B,QAAA,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,MAAM,EAAE;AAC/C,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE;AACvC,YAAA,IAAI,CAAC,cAAc,CAAC,iCAAiC,EAAE;QAC3D,IAAI,CAAC,yBAAyB,EAAE;QAChC,IAAI,CAAC,gBAAgB,EAAE;IAC3B;AAEO,IAAA,gBAAgB,CAAC,KAAoB,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE;AAC7B,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;gBACzB,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;gBACvB,IAAI,CAAC,OAAO,EAAE;YAClB;AACA,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;gBAC3B,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;gBACvB,IAAI,CAAC,SAAS,EAAE;YACpB;AACA,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;gBACvB,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;gBACvB,IAAI,CAAC,cAAc,EAAE;YACzB;QACJ;IACJ;IAEO,cAAc,GAAA;QACjB,IAAI,CAAC,iBAAiB,EAAE;IAC5B;AAEA;;AAEG;IACI,gBAAgB,GAAA;QACnB,IAAI,CAAC,iBAAiB,EAAE;IAC5B;IAEO,iBAAiB,GAAA;QACpB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE;YAClC,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,CAAA,CAAE,CAAC,CAAC,aAAa,CAAC,CAAA,UAAA,EAAa,IAAI,CAAC,cAAc,CAAC,SAAS,CAAA,EAAA,CAAI,CAAwB;AACjJ,YAAA,IAAI,UAAU;gBACV,UAAU,CAAC,KAAK,EAAE;QAC1B;aACK;AACD,YAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,UAAA,EAAa,IAAI,CAAC,cAAc,CAAC,SAAS,CAAA,EAAA,CAAI,CAAwB;AAChH,YAAA,IAAI,UAAU;gBACV,UAAU,CAAC,KAAK,EAAE;QAC1B;IACJ;IAEO,OAAO,GAAA;AACV,QAAA,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE;IAC1C;IAEO,SAAS,GAAA;AACZ,QAAA,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE;IAC7C;AAEA,IAAA,IAAW,4BAA4B,GAAA;QACnC,OAAO,IAAI,CAAC,cAAc,EAAE,iBAAiB,EAAE,IAAI,KAAK;IAC5D;IAMA,IACW,SAAS,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE;AACtB,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,EAAE;QAC5D;IACJ;IAKA,IACW,iBAAiB,CAAC,KAA0B,EAAA;AACnD,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,yBAAyB,EAAE;QAC1F,IAAI,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IACvF;IAmEA,IACW,UAAU,CAAC,MAAgB,EAAA;AAClC,QAAA,IAAI,CAAC,SAAS,GAAG,MAAM;IAC3B;IA0BQ,iBAAiB,GAAA;AACrB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,EAAE;AACtD,QAAA,IAAI,CAAC,UAAU;YACX;QACJ,MAAM,OAAO,GAAI,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC;QAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC;QACjH,YAAY,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK;IAC9C;AAEQ,IAAA,iBAAiB,CAAC,mBAA4B,EAAA;AAClD,QAAA,IAAI,mBAAmB;YACnB,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,EAAC;QAC1G,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE;IAChC;IAGQ,uBAAuB,GAAA;AAC3B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,IAAI,CAAC,UAAU;YACX;AACJ,QAAA,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACvD,IAAI,CAAC,oBAAoB,GAAG;AACxB,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACpH,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;SAC1H;IACL;IAEQ,2BAA2B,GAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAAE;AACxB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC;QACrE,IAAI,CAAC,UAAU,EAAG,CAAC,YAAY,CAAC,OAAO,CAAC;IAC5C;IAMA,IACW,SAAS,CAAC,KAAkC,EAAA;AACnD,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;IAC7B;AA0BA,IAAA,IAAW,iBAAiB,GAAA;AACxB,QAAA,OAAO,SAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC;IAClD;IAEO,SAAS,GAAA;AACZ,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE;IACpC;AAGA,IAAA,IAAW,cAAc,GAAA;QACrB,OAAO,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC7C;IACA,IAAW,cAAc,CAAC,EAAiC,EAAA;AACvD,QAAA,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5C;IAGA,IAAW,OAAO,CAAC,UAAkC,EAAA;AACjD,QAAA,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;QAC/B,IAAI,CAAC,yBAAyB,EAAE;QAChC,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,cAAc,EAAE,kBAAkB,EAAE,MAAM,EAAE;IACrD;AAEO,IAAA,gBAAgB,CAAC,SAAiB,EAAA;AACrC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,YAAY,GAAG,SAAS,CAAA,CAAE,CAAC;AACjG,QAAA,IAAI,OAAO;YAAG,OAAuB,CAAC,KAAK,EAAE;IACjD;AAGA,IAAA,IAAW,cAAc,GAAA;AACrB,QAAA,OAAO,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC;IAC/C;AAEA,IAAA,IAAW,mBAAmB,GAAA;QAC1B,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB;IAC7D;AAEA,IAAA,IAAY,gBAAgB,GAAA;QACxB,IAAI,YAAY,GAAG,CAAC;QACpB,IAAI,IAAI,CAAC,oBAAoB;YAAE,YAAY,IAAI,CAAC;QAChD,IAAI,IAAI,CAAC,cAAc;YAAE,YAAY,IAAI,CAAC;QAC1C,IAAI,IAAI,CAAC,eAAe,EAAE;YAAE,YAAY,IAAI,CAAC;QAC7C,IAAI,IAAI,CAAC,aAAa;YAAE,YAAY,IAAI,CAAC;AACzC,QAAA,OAAO,YAAY;IACvB;AAEA,IAAA,IAAW,cAAc,GAAA;QACrB,MAAM,iBAAiB,GAAG,CAAC;QAC3B,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,GAAG,iBAAiB;AACtD,YAAA,OAAO,SAAS;;AAEhB,YAAA,OAAO,SAAS;IAExB;AAEA,IAAA,IAAW,cAAc,GAAA;AACrB,QAAA,OAAO,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC;IAC/C;;AAEA,IAAA,IAAW,aAAa,GAAA;QACpB,OAAO,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAC1E;AAEA,IAAA,IAAW,OAAO,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,CAAC;IAC1C;IACQ,yBAAyB,GAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE;AAC7B,QAAA,IAAI,CAAC,uBAAuB,GAAG,EAAE;AACjC,QAAA,IAAI,YAAY,GAAG,mBAAmB,CAAC,KAAK;QAC5C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE;YAChD,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,SAAS;AACzG,YAAA,IAAI,eAAe,KAAK,SAAS,EAAE;gBAC/B,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;gBAC5D;YACJ;AACA,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,GAAG,KAAK,GAAG,CAAC,gBAAgB,EAAE;gBACpE,YAAY,CAAC,IAAI,EAAE;gBACnB;YACJ;AACA,YAAA,YAAY,GAAG,IAAI,mBAAmB,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,EAAE,eAAe,CAAC;AAChF,YAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,YAAY,CAAC;QACnD;IACJ;AAEQ,IAAA,cAAc,CAAC,UAAkC,EAAA;AACrD,QAAA,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE;AAC1B,YAAA,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE;gBACxB,IAAI,CAAC,GAAG,CAAC,aAAa;AAAE,oBAAA,GAAG,CAAC,aAAa,GAAG,MAAM;gBAClD,IAAI,CAAC,GAAG,CAAC,cAAc;AAAE,oBAAA,GAAG,CAAC,cAAc,GAAG,OAAO;YACzD;AACA,YAAA,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvC,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AACpC,oBAAA,MAAM,iBAAiB,GAAkB,GAAG,CAAC;AACxC,yBAAA,GAAG,CAAC,MAAM,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACrD,oBAAA,GAAG,CAAC,OAAO,GAAG,iBAAiB;gBACnC;YACJ;QACJ;IACJ;;AAGO,IAAA,aAAa,CAAC,MAAmC,EAAA;AACpD,QAAA,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC;AAC9C,QAAA,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;AACvB,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC5B,gBAAA,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS;oBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;QACjE;AACA,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;IACjC;IAEO,OAAO,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,cAAc;AAAE,YAAA,OAAO,EAAE;QACnC,MAAM,MAAM,GAAG,EAAE;QACjB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;YACnD,MAAM,UAAU,GAAG,EAAE;AACrB,YAAA,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;AACvB,YAAA,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE;gBACtC,IAAI,MAAM,CAAC,SAAS;AAChB,oBAAA,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC;YAEpE;QACJ;AACA,QAAA,OAAO,MAAM;IACjB;IAEO,WAAW,GAAA;AACd,QAAA,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS;AAC9B,QAAA,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE;AACrB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB;iBACzC,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE,SAAS;AAC5B,iBAAA,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACvC,SAAS,GAAG,EAAE,GAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE;QAC/C;QACA,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;IACtE;AAEO,IAAA,mBAAmB,CAAC,IAAgB,EAAA;AACvC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;AAC7D,QAAA,SAAS,CAAC,OAAO,KAAK,IAAI,CAAC,yBAAyB;aAC/C,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE,SAAS;AAC5B,aAAA,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AACvC,QAAA,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC;IAC5E;AAEQ,IAAA,YAAY,CAAC,GAAyB,EAAA;QAC1C,OAAO;YACH,SAAS,EAAE,GAAG,CAAC,SAAS;AACxB,YAAA,IAAI,EAAE,GAAG,CAAC,gBAAgB,GAAG,CAAA,EAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAA,CAAA,EAAI,GAAG,CAAC,IAAI,CAAA,CAAE,GAAG,GAAG,CAAC,IAAI;YAC1G,UAAU,EAAE,GAAG,CAAC,SAAuB;YACvC,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,cAAc,EAAE,GAAG,CAAC,cAAc;SACrC;IACL;IAEO,WAAW,CAAC,QAAa,EAAE,MAA4B,EAAA;QAC1D,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;AACtC,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,GAAG,YAAY;AACvE,QAAA,QAAQ,MAAM,CAAC,IAAI;AACf,YAAA,KAAK,SAAS;gBACV,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,aAAa,IAAI,SAAS;AACnD,oBAAA,KAAK,GAAG,MAAM,CAAC,aAAa;gBAChC,IAAI,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,cAAc,IAAI,SAAS;AACrD,oBAAA,KAAK,GAAG,MAAM,CAAC,cAAc;gBACjC;AACJ,YAAA,KAAK,QAAQ;gBACT,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAClD;AACJ,YAAA,KAAK,MAAM;AACP,gBAAA,IAAI,KAAK;oBACL,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAa,EAAE,UAAU,CAAC;gBAC9D;AACJ,YAAA,KAAK,UAAU;AACX,gBAAA,IAAI,KAAK;oBACL,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAa,EAAE,UAAU,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAa,EAAE,YAAY,CAAC;gBAC3H;AACJ,YAAA,KAAK,QAAQ;gBACT,IAAI,KAAK,IAAI,SAAS;oBAClB,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAAe,EAAE,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;gBACtG;AACJ,YAAA,KAAK,OAAO;gBACR,IAAI,KAAK,IAAI,SAAS;AAClB,oBAAA,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAe,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;gBAChG;AACJ,YAAA;gBACI;;QAER,IAAI,MAAM,CAAC,IAAI;YACX,KAAK,GAAG,CAAA,EAAG,KAAK,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAA,CAAE;AAC3C,QAAA,OAAO,KAAe;IAC1B;IAEO,mBAAmB,CAAC,QAAa,EAAE,MAA4B,EAAA;QAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;AACxC,QAAA,MAAM,WAAW,GAAI,MAAM,CAAC,OAAwB,CAAC,MAAM,CAAC,CAAC,MAAkB,KAAK,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;AAC1G,QAAA,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;IAC5D;AAEO,IAAA,eAAe,CAAC,MAA4B,EAAA;AAC/C,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;IAChF;AAEO,IAAA,iBAAiB,CAAC,MAA4B,EAAA;AACjD,QAAA,OAAO,IAAI,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,IAAI,SAAS,IAAI,MAAM,CAAC,WAAW,CAAC;IACtF;AAEO,IAAA,iBAAiB,CAAC,MAA4B,EAAA;AACjD,QAAA,IAAI,MAAM,CAAC,cAAc,IAAI,CAAC;AAC1B,YAAA,OAAO,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC;aAC3C,IAAI,MAAM,CAAC,OAAO;AACnB,YAAA,OAAO,cAAc,CAAC,cAAc,CAAC,OAAO,CAAC;QAEjD,IAAI,MAAM,GAAmB,IAAI;AACjC,QAAA,QAAQ,MAAM,CAAC,IAAI,IAAI,MAAM;AACzB,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,OAAO;AACR,gBAAA,MAAM,GAAG,cAAc,CAAC,OAAO;gBAC/B;AACJ,YAAA,KAAK,KAAK;AACV,YAAA,KAAK,KAAK;AACV,YAAA,KAAK,MAAM;AACX,YAAA,KAAK,OAAO;gBACR,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC;gBAChE;AACJ,YAAA;AACI,gBAAA,MAAM,GAAG,cAAc,CAAC,QAAQ;gBAChC;;AAER,QAAA,OAAO,cAAc,CAAC,MAAM,CAAC;IACjC;AAEQ,IAAA,qBAAqB,CAAC,QAAa,EAAA;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS;AAC1C,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QAEvB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS;AAC1C,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QAEvB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS;AAC1C,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QAEvB,IAAI,CAAC,IAAI,CAAC,OAAO;AACb,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC;IAE3D;AAEQ,IAAA,aAAa,CAAC,QAAkB,EAAA;AACpC,QAAA,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC;AACpC,QAAA,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IACjC;AAEO,IAAA,aAAa,CAAC,KAAiB,EAAE,KAAa,EAAE,QAAa,EAAA;AAChE,QAAA,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC3C,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAChE,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzG;AAEO,IAAA,WAAW,CAAC,KAAqB,EAAA;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI;QACzE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;AAEnF,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;AAC7D,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;QACvE,MAAM,cAAc,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;QAC3F,KAAK,MAAM,IAAI,IAAI,cAAc;AAC7B,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC9B;IAEO,QAAQ,CAAC,KAAiB,EAAE,QAAa,EAAA;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;QAE/C,IAAI,IAAI,CAAC,sBAAsB,IAAI,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC;YACpE;AACJ,QAAA,IAAI,IAAI,CAAC,gBAAgB,IAAI,KAAK,CAAC,OAAO;AACtC,YAAA,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC;aAC9C;YACD,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;gBACxC,IAAI,CAAC,WAAW,EAAE;AACtB,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC;QACzC;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACjE;IAEQ,yBAAyB,GAAA;AAC7B,QAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnD;IAEQ,wBAAwB,GAAA;QAC5B,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE;AAEQ,IAAA,OAAO,CAAC,UAAc,EAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,OAAO;AACjC,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;IACzC;AAEO,IAAA,gBAAgB,CAAC,UAAc,EAAA;AAClC,QAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;YAClC,IAAI,CAAC,WAAW,EAAE;;AAElB,YAAA,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;IACvC;AAEO,IAAA,cAAc,CAAC,UAAc,EAAA;AAChC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;IACtC;IAEO,cAAc,CAAC,KAAgB,EAAE,QAAkB,EAAA;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC/C,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACrE;AAEO,IAAA,UAAU,CAAC,QAAkB,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvE;AAEO,IAAA,SAAS,CAAC,QAAkB,EAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;IACxE;IAKO,WAAW,GAAA;AACd,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;IAC7B;AAEO,IAAA,qBAAqB,CAAC,KAAa,EAAA;AACtC,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,UAAU;YAAE;QAC1C,IAAI,CAAC,WAAW,EAAE;QAClB,KAAK,EAAE,eAAe,EAAE;IAC5B;AAEO,IAAA,iBAAiB,CAAC,UAAc,EAAA;QACnC,OAAO,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU;IAC7D;AAEO,IAAA,eAAe,CAAC,QAAkB,EAAA;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC/C,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;IAC7C;IAEO,UAAU,CAAC,KAAY,EAAE,QAAkB,EAAA;AAC9C,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,UAAU;YAAE;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;AACvC,QAAA,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACvB,KAAK,EAAE,eAAe,EAAE;IAC5B;;AAIO,IAAA,aAAa,CAAC,UAAsB,EAAA;AACvC,QAAA,IAAI,UAAU,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY;YACzC,OAAO,IAAI,CAAC,YAAY,GAAG,GAAG,GAAG,UAAU,CAAC,SAAS;AACzD,QAAA,OAAO,IAAI;IACf;IAGO,mBAAmB,GAAA;AACtB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC;aACrB,MAAM,CAAC,CAAC,UAAgC,KAAK,UAAU,CAAC,SAAS;AACjE,aAAA,GAAG,CAAC,CAAC,UAAgC,MAAM;AACxC,YAAA,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;AACnC,YAAA,IAAI,EAAE,UAAU,CAAC,gBAAgB,GAAG,CAAA,EAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAA,CAAA,EAAI,UAAU,CAAC,IAAI,CAAA,CAAE,GAAG,UAAU,CAAC,IAAI;AACtI,YAAA,eAAe,EAAE,UAAU,CAAC,eAAe,IAAI,KAAK;AACpD,YAAA,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;AACzC,YAAA,IAAI,EAAE,SAAS;AAClB,SAAA,CAAC,CAAC;AACP,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,YAAY,EAAE,EAAE,YAAY,EAAE,EAAE,CAAC;QACtG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,GAAG,OAAO;IAClD;IAEO,WAAW,CAAC,MAA4B,EAAE,QAAkB,EAAA;AAC/D,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,GAAG,EAAE;AACrD,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE;AACpF,QAAA,OAAO,IAAI,GAAG,GAAG,GAAG,OAAO;IAC/B;AAEO,IAAA,6BAA6B,CAAC,IAAqB,EAAA;AACtD,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,uBAAuB,IAAI,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,SAAS;YAC9F,OAAO,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC;AAEpD,QAAA,MAAM,0BAA0B,GAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC;AACxE,QAAA,OAAO,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,SAAS;IAC1E;;AAIO,IAAA,WAAW,CAAC,KAAyC,EAAA;QACxD,OAAO,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,IAAI,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;IAC/F;AAEO,IAAA,UAAU,CAAC,KAAyC,EAAA;QACvD,OAAO,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;IAChG;IAEO,cAAc,CAAC,QAAkB,EAAE,GAA+B,EAAA;AACrE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,QAAQ,GAAG,QAAQ;AAC7C,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,GAAG,EAAE;AACnD,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,GAAG,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,EAAE;QAClF,OAAO,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,OAAO;IAC5C;IAEO,kBAAkB,CAAC,QAAkB,EAAE,GAA+B,EAAA;AACzE,QAAA,IAAI,MAAM,GAAG,GAAG,CAAC,SAAS,IAAI,EAAE;QAChC,IAAI,GAAG,CAAC,kBAAkB;AAAE,YAAA,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACzF,QAAA,OAAO,MAAM;IACjB;;AAGQ,IAAA,SAAS,CAAC,SAAc,EAAA;AAC5B,QAAA,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,SAAS,CAAC,IAAI,CAAC;YAC5D;AAEJ,QAAA,MAAM,aAAa,GAAkB,IAAI,aAAa,EAAE;AACxD,QAAA,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK;QACnD,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;AAC5D,QAAA,aAAa,CAAC,eAAe,GAAG,SAAS,CAAC,MAAM;AAChD,QAAA,aAAa,CAAC,oBAAoB,GAAG,SAAS,CAAC,MAAM;AACrD,QAAA,aAAa,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE;AAExC,QAAA,aAAa,CAAC,WAAW,GAAG,SAAS,CAAC,OAAO;AAC7C,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,GAAG,IAAI;AAClI,QAAA,IAAI,MAAM;YACN,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,CAAC;AAEpE,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AACpD,QAAA,IAAI,GAAG;YAAG,GAAG,CAAC,KAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,aAAa,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;IAC/D;AAEQ,IAAA,WAAW,CAAC,KAAU,EAAA;AAC1B,QAAA,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC;YACxD;AAEJ,QAAA,MAAM,mBAAmB,GAAwB,IAAI,mBAAmB,EAAE;AAC1E,QAAA,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK;QAC/C,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC1F,QAAA,mBAAmB,CAAC,eAAe,GAAG,KAAK,CAAC,MAAM;AAClD,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,mBAAmB,CAAC;IAClD;AAEO,IAAA,qBAAqB,CAAC,KAAK,EAAE,UAAgC,EAAE,QAAkB,EAAA;;;IAGxF;AAEO,IAAA,oBAAoB,CAAC,MAAe,EAAA;QACvC,IAAI,OAAO,MAAM,KAAK,QAAQ;AAAE,YAAA,OAAO,MAAM,CAAC,iBAAiB,EAAE;AACjE,QAAA,OAAO,MAAM;IACjB;IAEQ,yBAAyB,GAAA;AAC7B,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;AAC5I,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,kBAAkB,CAAC,CAAC,CAAC,CAAC;IACtE;IAEQ,eAAe,CAAC,GAAyB,EAAE,GAAgC,EAAA;AAC/E,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC;QAC1F,OAAO,IAAI,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC;IACvG;AAEO,IAAA,sBAAsB,CAAC,GAAyB,EAAA;AACnD,QAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,eAAe,IAAI,KAAK;AAC3E,aAAA,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC;aACzC,IAAI,CAAC,KAAK,CAAC;IACpB;AAEO,IAAA,qBAAqB,CAAC,GAAyB,EAAA;AAClD,QAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,IAAI,IAAI;AACxE,aAAA,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC;aACzC,IAAI,CAAC,KAAK,CAAC;IACpB;AAEO,IAAA,eAAe,CAAC,GAAyB,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAA,CAAA,uCAAA,CAAyC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5F;IAEQ,gBAAgB,GAAA;AACpB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB,EAAE;AAChD,QAAA,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC;IAC3G;IAEQ,wBAAwB,GAAA;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,OAAO;QAC/C,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB;QAChE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;QACtC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;QACtC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;QACtC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB;QACpD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW;QAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa;QAC9C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB;QACpD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,MAAM,CAAC,qBAAqB;QAC9D,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB;QAC1D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;QACtC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB;QACpD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa;QAC9C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa;QAC9C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB;QAC1D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa;QAC9C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB;QAC5D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU;QACxC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;QAClC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB;QACpD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB;QACxD,IAAI,CAAC,8BAA8B,GAAG,IAAI,CAAC,MAAM,CAAC,8BAA8B;IACpF;IAEO,SAAS,GAAA;AACZ,QAAA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;IACvE;IAEQ,OAAO,GAAA;QACX,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC5C,QAAA,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,sBAAsB,CAAC;AAC5C,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC;AACvC,YAAA,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU;AAC9B,YAAA,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,YAAA,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1B;AACA,QAAA,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACjE,QAAA,OAAO,MAAM;IACjB;IAKO,gBAAgB,CAAC,IAAY,EAAE,IAAY,EAAA;AAC9C,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAC9B,QAAA,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;AACtB,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,GAAG,EAAE,IAAI;AACT,YAAA,QAAQ,EAAE;AACb,SAAA,CAAC;IACN;AAGO,IAAA,MAAM,CAAC,KAAU,EAAA;QACpB,IAAI,CAAC,IAAI,CAAC,kBAAkB;YACxB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,EAAiB,CAAC;AAExH,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;IACnC;IAEQ,sBAAsB,GAAA;QAC1B,MAAM,YAAY,GAAG,EAAE;QACvB,IAAI,eAAe,GAAgD,IAAI;QACvE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,EAAE;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC1E,MAAM,WAAW,GAAG,eAAe,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC;YAChG,IAAI,CAAC,WAAW,EAAE;gBACd,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC3C,eAAe,GAAG,MAAM;YAC5B;QACJ;AACA,QAAA,OAAO,YAAY;IACvB;AAEO,IAAA,kBAAkB,CAAC,IAAc,EAAA;AACpC,QAAA,OAAO,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACrE;AAKO,IAAA,YAAY,CAAC,IAAoB,EAAA;QACpC,QAAQ,IAAI;AACR,YAAA,KAAK,OAAO,EAAE,OAAO,QAAQ;AAC7B,YAAA,KAAK,UAAU,EAAE,OAAO,gBAAgB;AACxC,YAAA,KAAK,SAAS,EAAE,OAAO,UAAU;AACjC,YAAA,SAAS,OAAO,IAAI;;IAE5B;AAn3BS,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,iFAIV,SAAS,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAK,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAJZ,aAAa,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,8BAAA,EAAA,EAAA,iBAAA,EAAA,gCAAA,EAAA,UAAA,EAAA,gCAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,MAAA,EAAA,QAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,+BAAA,EAAA,yBAAA,EAAA,iCAAA,EAAA,2BAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAm0BgB,WAAW,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC52BrD,219BAgdA,EAAA,MAAA,EAAA,CAAA,68EAAA,EAAA,8xaAAA,EAAA,ksCAAA,EAAA,mZAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,aAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,gCAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,WAAA,EAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,6BAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,oCAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,yCAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAV,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAW,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iFAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,0BAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,qBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,gBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FDvaa,aAAa,EAAA,UAAA,EAAA,CAAA;kBAfzB,SAAS;+BACI,UAAU,EAAA,UAAA,EAQR,KAAK,EAAA,IAAA,EACX;AACF,wBAAA,iCAAiC,EAAE,yBAAyB;AAC5D,wBAAA,mCAAmC,EAAE,2BAA2B;AACnE,qBAAA,EAAA,QAAA,EAAA,219BAAA,EAAA,MAAA,EAAA,CAAA,68EAAA,EAAA,8xaAAA,EAAA,ksCAAA,EAAA,mZAAA,CAAA,EAAA;;0BAMI,MAAM;2BAAC,SAAS;;sBA+GpB;;sBAEA,KAAK;uBAAC,IAAI;;sBAWV,KAAK;uBAAC,YAAY;;sBAQlB;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAKA;;sBAKA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA,KAAK;uBAAC,WAAW;;sBAEjB;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAGA;;sBAEA,KAAK;uBAAC,WAAW;;sBAMjB;;sBAGA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBA0CA;;sBAEA,KAAK;uBAAC,aAAa;;sBAEnB,KAAK;uBAAC,QAAQ;;sBAKd;;sBAEA;;sBAEA;;sBAEA;;sBAGA;;sBAGA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,kBAAkB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;sBAE9C,SAAS;uBAAC,aAAa;;sBAEvB,SAAS;uBAAC,OAAO;;sBAEjB,SAAS;uBAAC,SAAS;6EAgiBkB,WAAW,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA;sBAYhD;;AAuCL,MAAM,0BAA0B,CAAA;AAC5B,IAAA,WAAA,CAAY,MAA+B,EAAE,GAAkB,EAAU,KAAa,EAAA;QAAb,IAAA,CAAA,KAAK,GAAL,KAAK;AAC1E,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;QAC/B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,qBAAqB,GAAG,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE;QACpF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,GAAG,KAAK,GAAG,OAAO;AACpF,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,gCAAgC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa;IAClG;IAQO,OAAO,CAAC,WAAwB,EAAE,YAA0B,EAAA;AAC/D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAA,CAAE,GAAG,EAAE;AAEhD,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;AACxB,YAAA,OAAO,CAAA,EAAG,IAAI,CAAC,MAAM,GAAG;AAE5B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC;AACrB,cAAE,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;AAC1E,cAAE,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,OAAO;AAC9D,QAAA,OAAO,GAAG,IAAI,CAAC,MAAM,CAAA,EAAG,WAAW,EAAE;IACzC;AAEA,IAAA,IAAY,aAAa,GAAA;QACrB,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,qBAAqB;IAC9D;AAEA;;AAEG;AACH,IAAA,IAAY,qBAAqB,GAAA;AAC7B,QAAA,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;IACxD;AACH;AAED,MAAM,mBAAmB,CAAA;AAErB,IAAA,WAAA,CAAmB,GAAkB,EAAS,IAAA,GAAO,CAAC,EAAE,IAAwB,EAAA;QAA7D,IAAA,CAAA,GAAG,GAAH,GAAG;QAAwB,IAAA,CAAA,IAAI,GAAJ,IAAI;AAC9C,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI;AACtB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK;IAC5B;AAKA,IAAA,IAAW,OAAO,GAAA,EAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;AAErD,IAAA,WAAW,KAAK,GAAA,EAAK,OAAO,IAAI,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACxE;;ME57BY,UAAU,CAAA;AAkDtB;MAEY,gBAAgB,CAAA;AAc5B;MAEY,aAAa,CAAA;AAA1B,IAAA,WAAA,GAAA;QAWW,IAAA,CAAA,OAAO,GAAqB,OAAO;IAU9C;AAAC;MAEY,cAAc,CAAA;AAA3B,IAAA,WAAA,GAAA;QAiBW,IAAA,CAAA,OAAO,GAAqB,OAAO;IAmB9C;AAAC;MAEY,iBAAiB,CAAA;AAA9B,IAAA,WAAA,GAAA;QACW,IAAA,CAAA,OAAO,GAAgC,EAAE;QAGzC,IAAA,CAAA,KAAK,GAAa,IAAI;QAGtB,IAAA,CAAA,WAAW,GAAa,IAAI;QAC5B,IAAA,CAAA,SAAS,GAAa,IAAI;QAC1B,IAAA,CAAA,WAAW,GAAa,IAAI;QAG5B,IAAA,CAAA,kBAAkB,GAAI,KAAK;QAK3B,IAAA,CAAA,gBAAgB,GAAa,KAAK;QAClC,IAAA,CAAA,gBAAgB,GAAqC,SAAS;QAC9D,IAAA,CAAA,UAAU,GAAa,KAAK;QAC5B,IAAA,CAAA,oBAAoB,GAAa,KAAK;QACtC,IAAA,CAAA,aAAa,GAAa,KAAK;AAC/B,QAAA,IAAA,CAAA,aAAa,GAAY,SAAS,CAAA,CAAA,2CAAA,CAA6C;QAC/E,IAAA,CAAA,UAAU,GAAY,IAAI;QAC1B,IAAA,CAAA,mBAAmB,GAAa,IAAI;QACpC,IAAA,CAAA,gBAAgB,GAAa,KAAK;QAClC,IAAA,CAAA,iBAAiB,GAAuB,SAAS;IAC5D;AAAC;;AC7JD;MACa,WAAW,CAAA;AAAxB,IAAA,WAAA,GAAA;AAiCI,QAAA,IAAA,CAAA,mBAAmB,GAAa,KAAK,CAAC;IAqC1C;AAAC;AAID;MACa,cAAc,CAAA;AAmB1B;MAEY,mBAAmB,CAAA;AAK/B;MAEY,iBAAiB,CAAA;AAI7B;MAEY,iBAAiB,CAAA;AAU7B;AAED;AACA;AACA;AACA;AAGM,MAAO,uBAAwB,SAAQ,iBAAiB,CAAA;AAU7D;MAEY,qBAAqB,CAAA;AAgBjC;AAEM,MAAM,sBAAsB,GAAG;AAoBtC;AACA;AACA;MACa,uBAAuB,CAAA;AAKnC;;AChND;AAWA,MAAMC,OAAK,GAAG,gCAAgC;MAGxB,8BAA8B,CAAA;IAChD,WAAA,CACc,MAAqB,EACvB,OAAwB,EAAA;QADtB,IAAA,CAAA,MAAM,GAAN,MAAM;QACR,IAAA,CAAA,OAAO,GAAP,OAAO;AAGX,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;QAElC,IAAA,CAAA,gBAAgB,GAAoB,QAAQ;QAC5C,IAAA,CAAA,gBAAgB,GAAG,KAAK;AACvB,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,YAAY,EAAQ;AACnC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,YAAY,EAAQ;AACnC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,YAAY,EAAK;AAChC,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,YAAY,EAAK;;AAEtC,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,YAAY,EAAQ;QAGlD,IAAA,CAAA,aAAa,GAAwB,EAAE;AAG1C,QAAA,IAAA,CAAA,QAAQ,GAAQ,EAAE,CAAC;;QAiDlB,IAAA,CAAA,eAAe,GAAG,EAAE;;AAuDX,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,iDAAC;AACtB,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QAsK1C,IAAA,CAAA,UAAU,GAA0B,EAAE;AA4brC,QAAA,IAAA,CAAA,uBAAuB,GAAG,IAAI,KAAK,EAAgB;IA5tBxD;IAyBO,MAAM,GAAA;AACZ,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EACtB;IACL;IAEU,OAAO,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE;AAElC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;YACtD,IAAI,cAAc,EAAE;gBAChB,IAAI,YAAY,GAAG,CAAC;AACpB,gBAAA,cAAc,CAAC,kBAAkB,CAC7B,CAAC,cAAc,KAAI;AACf,oBAAA,YAAY,EAAE;AACd,oBAAA,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;AACnC,gBAAA,CAAC,CACJ;gBACD,IAAI,YAAY,GAAG,CAAC;oBAChB,IAAI,CAAC,QAAQ,EAAE;AAEnB,gBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE;YAChC;QACJ;;YAEI,IAAI,CAAC,MAAM,CAAC,KAAK,CAACA,OAAK,GAAG,2EAA2E,CAAC;IAC9G;IAEU,SAAS,GAAA;QACf,IAAI,CAAC,MAAM,CAAC,GAAG,CAACA,OAAK,GAAG,WAAW,CAAC;AACpC,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa;YAC9B,CAAC,CAAC,WAAW,EAAE;QAEnB,IAAI,CAAC,sBAAsB,EAAE;IACjC;IAEO,IAAI,GAAA;QACP,IAAI,CAAC,sBAAsB,EAAE;IACjC;AAIA,IAAA,IAAW,cAAc,GAAA;QACrB,OAAO,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAClH;IAEA,IAAW,cAAc,CAAC,KAAuC,EAAA;AAC7D,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;IAChC;AAGA,IAAA,IAAW,SAAS,GAAA;QAChB,OAAO,IAAI,CAAC,UAAU;IAC1B;IAEA,IAAW,SAAS,CAAC,OAAwB,EAAA;QACzC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC;AACjE,QAAA,IAAI,CAAC,UAAU,GAAG,OAAO;IAC7B;AAEQ,IAAA,6BAA6B,CAAC,IAAgB,EAAA;AAClD,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,IAAI,MAAc;QAClB,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,KAAK,OAAO,EAAE;YAC3C,QAAQ,IAAI;AACR,gBAAA,KAAK,OAAO;oBACR,MAAM,GAAG,iBAAiB;oBAC1B;AACJ,gBAAA,KAAK,QAAQ;oBACT;AACJ,gBAAA,KAAK,OAAO;oBACR,MAAM,GAAG,iBAAiB;oBAC1B;AACJ,gBAAA;oBACI,IAAI,CAAC,MAAM,CAAC,IAAI,CAACA,OAAK,GAAG,iDAAiD,GAAG,IAAI,CAAC;;QAE9F;aACK;YACD,QAAQ,IAAI;AACR,gBAAA,KAAK,OAAO;oBACR,MAAM,GAAG,UAAU;oBACnB;AACJ,gBAAA,KAAK,QAAQ;oBACT;AACJ,gBAAA,KAAK,OAAO;oBACR,MAAM,GAAG,UAAU;oBACnB;AACJ,gBAAA;oBACI,IAAI,CAAC,MAAM,CAAC,IAAI,CAACA,OAAK,GAAG,iDAAiD,GAAG,IAAI,CAAC;;QAE9F;AACA,QAAA,OAAO,MAAM;IACjB;IAOO,UAAU,GAAA;AACb,QAAA,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1C;IAEO,QAAQ,GAAA;AACX,QAAA,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC;AAIU,IAAA,QAAQ,CACd,GAAO,EACP,IAAU;AACV,IAAA,YAAkC;;AAElC,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;AAChC,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,QAAA,IAAI,CAAC,OAAO,GAAG,GAAG;QAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAACA,OAAK,GAAG,WAAW,CAAC;AACpC,QAAA,IAAI,GAAG;AACH,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;;YAGxB,IAAI,CAAC,eAAe,EAAE;QAE1B,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,2BAA2B,EAAE;AAElC,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE;QACvD,IAAI,CAAC,UAAU,EAAE;QAEjB,IAAI,CAAC,iBAAiB,EAAE;IAC5B;IAEU,SAAS,GAAA;AACf,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC;IAC7D;IAEO,YAAY,GAAA;AACf,QAAA,IAAI,CAAC,YAAY,GAAG,QAAQ;AAC5B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QACpB,IAAI,CAAC,sBAAsB,EAAE;;;IAIjC;AAEA;;;;;;;AAOG;IACO,YAAY,CAAC,eAA8B,IAAI,EAAA;QACrD,IAAI,IAAI,CAAC,gBAAgB;YAAE;AAC3B,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;QAChC,IAAI,CAAC,mCAAmC,EAAE;QAC1C,IAAI,CAAC,oCAAoC,EAAE;AAE3C,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE;QACvD,IAAI,CAAC,UAAU,EAAE;QAEjB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IACpC;AAEA,IAAA,IAAW,gBAAgB,GAAA;QACvB,IAAI,QAAQ,GAAG,KAAK;AACpB,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,kBAAkB,EAAE;YACzC,QAAQ;AACJ,gBAAA,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC;AACrD,qBAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AACxD,qBAAC,KAAK,CAAC,IAAI,KAAK,uBAAuB,IAAI,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;qBAC7E,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;qBAC5F,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBAC7F,KAAK,CAAC,QAAQ;AAElB,YAAA,IAAI,QAAQ;gBAAE;QAClB;AACA,QAAA,OAAO,QAAQ;IACnB;AAEO,IAAA,UAAU,CAAC,MAAgB,EAAA;QAC9B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IACtC;AAGO,IAAA,mBAAmB,CAAC,KAAoB,EAAA;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;QAErB,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,EAAE;YAClG,IAAI,CAAC,YAAY,EAAE;YACnB,KAAK,CAAC,cAAc,EAAE;YACtB;QACJ;QACA,IAAI,IAAI,CAAC,gBAAgB,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,EAAE;YAC9G,MAAM,IAAI,GAAiB,KAAK,CAAC,MAA0B,CAAC,MAAM,CAAC;AACnE,YAAA,IAAI,CAAC,IAAI;gBAAE;YACX,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,gCAAgC,CAAC;YACzE,IAAI,IAAI,GAAgB,IAAI;YAC5B,IAAI,YAAY,GAAW,IAAI;YAC/B,SAAS,CAAC,OAAO,CAAC,CAAC,OAAoB,EAAE,KAAa,KAAI;AACtD,gBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO;oBACxB,YAAY,GAAG,KAAK;AAExB,gBAAA,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,MAAM,KAAK;oBACpE,IAAI,GAAG,OAAO;AAEtB,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,IAAI;gBACJ,IAAI,CAAC,KAAK,EAAE;;gBAGZ,IAAI,CAAC,YAAY,EAAE;YAEvB,KAAK,CAAC,cAAc,EAAE;YACtB;QACJ;IACJ;AAGO,IAAA,qBAAqB,CAAC,0BAAuE,EAAA;AAChG,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;QACpB,IAAI,0BAA0B,IAAI,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE;AACrE,YAAA,MAAM,oBAAoB,GAAG,0BAA0B,CAAC,CAAC,CAAC;;AAE1D,YAAA,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,YAAuB;YACvE,IAAI,kBAAkB,EAAE;AACpB,gBAAA,IAAI,CAAC,UAAU,GAAG,0BAAsD;AACxE,gBAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU;oBAC7B,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC;YAErE;iBACK;gBACD,MAAM,YAAY,GAAG,0BAA8C;gBACnE,MAAM,aAAa,GAA2B,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;AAC5E,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC;gBACnC,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC;YACvE;QACJ;AAEA,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;AAClI,QAAA,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC;AACrD,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mEAAmE,CAAC;IAC9F;AAEA,IAAA,IAAW,kBAAkB,GAAA;QACzB,MAAM,eAAe,GAAG,EAAE;AAC1B,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE;AAC/B,YAAA,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,YAAY;AACjC,gBAAA,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;QAEpC;AACA,QAAA,OAAO,eAAe;IAC1B;AAEU,IAAA,cAAc,CAAC,SAAiB,EAAA;AACtC,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC;IAC3E;AAGA,IAAA,IAAW,iBAAiB,GAAA;QACxB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClG;AAEU,IAAA,cAAc,CAAC,GAAM,EAAA;AAC3B,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;AAClB,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE;AAClE,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;YAExE,IAAI,CAAC,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,OAAO,EAAE;gBAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI;oBACvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,sBAAsB;AAEtD,qBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;;AAE9B,oBAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;gBACtC;YACJ;AAEA,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB;AACtC,gBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;AAGlF,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE;;gBAE1D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC1F;AAEA,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE;gBAC/B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC/F,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACrG;AAEA,YAAA,IAAI,KAAK,CAAC,kBAAkB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI;gBACnE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QAE3C;IACJ;AAEQ,IAAA,gBAAgB,CAAC,KAAoB,EAAA;AACzC,QAAA,OAAO,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI;IAC5D;AAEU,IAAA,sBAAsB,CAAC,KAAqB,EAAA;AAClD,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,GAAG,WAAW,CAAC;;AAGpG,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;IAE5E;AAEU,IAAA,sBAAsB,CAAC,KAAqB,EAAA;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;QAC5C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,sBAAsB;AACzE,YAAA,OAAO,IAAI;AAEf,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACpB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;;AAGlF,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;IAC1D;AAEU,IAAA,iBAAiB,CAAC,SAAiB,EAAA;QACzC,IAAI,KAAK,GAAG,IAAI;QAChB,IAAI,SAAS,EAAE;YACX,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;YACvC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACnC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,gBAAA,IAAI;oBACA,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAChC;gBACA,OAAO,CAAC,EAAE;AACN,oBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAACA,OAAK,GAAG,4BAA4B,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,iBAAiB,GAAG,SAAS,CAAC;gBAC3G;YACJ;QACJ;AACA,QAAA,OAAO,KAAK;IAChB;IAEU,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;AAClB,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE;AAClE,YAAA,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;gBAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,OAAO;AAE7C,iBAAA,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ;gBAClE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;iBAEzE,IAAI,KAAK,CAAC,WAAW,KAAK,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,eAAe;gBAC1E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;iBAElC;AACD,gBAAA,QAAQ,KAAK,CAAC,IAAI;AACd,oBAAA,KAAK,QAAQ;AACT,wBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,kBAAkB,GAAG,EAAE,GAAG,CAAC;wBAClE;AACJ,oBAAA,KAAK,SAAS;wBACV,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK;wBACtC;AACJ,oBAAA,KAAK,MAAM;wBACP,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;wBAC9C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,QAAQ;wBACzC;AACJ,oBAAA,KAAK,uBAAuB;wBACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;wBACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC,GAAG,EAAE;wBAClD;AACJ,oBAAA,KAAK,MAAM;wBACP,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,OAAO;wBACxC;AACJ,oBAAA;AACI,wBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,kBAAkB,GAAG,EAAE,GAAG,EAAE;wBACnE;;YAEZ;AAEA,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;;AAEzB,gBAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;YACtC;QACJ;IACJ;IAEU,WAAW,GAAA;;AAEjB,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,KAAK,SAAS;AACzC,YAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,CAAC,SAAiB,KAAK,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;IAE1F;IAEQ,mCAAmC,GAAA;AACvC,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE;AAClE,YAAA,QAAQ,KAAK,CAAC,IAAI;AACd,gBAAA,KAAK,QAAQ;AACb,gBAAA,KAAK,OAAO;;AAER,oBAAA,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,QAAQ;AACpD,wBAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;oBACtC;AACJ,gBAAA,KAAK,uBAAuB;AACxB,oBAAA,IAAI,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;wBAClC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;oBAC1C;AACJ,gBAAA,KAAK,SAAS;AACV,oBAAA,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,SAAS;wBACrD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBAC5F;;YAGR,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,sBAAsB;gBACzD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI;QAC7C;IACJ;AAEU,IAAA,kBAAkB,CAAC,KAAU,EAAA;QACnC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,sBAAsB;AACzE,YAAA,OAAO,IAAI;AAEV,aAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,OAAO;AACnD,YAAA,OAAO,KAAK;;AAGZ,YAAA,OAAO,IAAI;IACnB;IAEQ,oCAAoC,GAAA;AACxC,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE;AAClE,YAAA,IAAI,CAAC,gCAAgC,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AACtF,YAAA,IAAI,CAAC,gCAAgC,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5F;IACJ;IAEQ,gCAAgC,CAAC,SAAiB,EAAE,KAAU,EAAA;QAClE,IAAI,SAAS,EAAE;YACX,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,gBAAA,IAAI,CAAC,OAAO,GAAG,EAAO;AACzC,YAAA,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;AAC1B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACxC,MAAM,MAAM,GAAG,CAAC,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC;gBAC1C,IAAI,CAAC,MAAM,EAAE;;oBAET,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;wBACpC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;oBAE/B,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACpC;;oBAEI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;YAEtC;QACJ;IACJ;AAEQ,IAAA,YAAY,CAAC,SAAiB,EAAA;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QACtC,OAAO,KAAK,KAAK;AACV,eAAA,KAAK,KAAK;AACV,eAAA,KAAK,KAAK;AACV,eAAA,KAAK,KAAK;AACV,gBAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACvD;;AAGQ,IAAA,mBAAmB,CAAC,YAA8B,EAAA;QACtD,MAAM,YAAY,GAAG,YAAY;AACjC,QAAA,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;;YAEpC,IAAI,CAAC,WAAW,CAAC,IAAI;AAAE,gBAAA,WAAW,CAAC,IAAI,GAAG,MAAM;YAChD,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;;YAG1D,IAAI,WAAW,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7F,gBAAA,MAAM,eAAe,IAAI,QAAQ,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;gBACtE,IAAI,eAAe,EAAE;AACjB,oBAAA,MAAM,aAAa,GAAG,WAAW,CAAC,OAAmB;oBACrD,MAAM,iBAAiB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,YAAoB,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAiB,CAAA,CAAC;AAClI,oBAAA,WAAW,CAAC,OAAO,GAAG,iBAAiB;gBAC3C;YACJ;;AAGA,YAAA,IAAI,WAAW,CAAC,IAAI,KAAK,uBAAuB,EAAE;AAC9C,gBAAA,IAAI,WAAW,CAAC,wBAAwB,KAAK,SAAS;oBAClD,WAAW,CAAC,wBAAwB,IAAI,WAAW,CAAC,SAAS,GAAG,iBAAiB,CAA6B;YAEtH;;AAGA,YAAA,IAAI,WAAW,CAAC,kBAAkB,KAAK,SAAS;AAAE,gBAAA,WAAW,CAAC,kBAAkB,GAAG,KAAK;QAC5F;AACA,QAAA,OAAO,YAAY;IACvB;AAEQ,IAAA,cAAc,CAAC,KAAqB,EAAA;AACxC,QAAA,IAAI,MAAmB;AAEvB,QAAA,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI;AAC1B,QAAA,IAAI,CAAC,SAAS;YAAE,SAAS,GAAG,MAAM;QAElC,IAAI,OAAO,GAA8C,OAAO;QAChE,IAAI,KAAK,CAAC,OAAO;YACb,OAAO,GAAG,QAAQ;aAEjB,IAAI,KAAK,CAAC,IAAI;YACf,OAAO,GAAG,MAAM;aAEf,IAAI,KAAK,CAAC,QAAQ;YACnB,OAAO,GAAG,WAAW;QAGzB,QAAQ,OAAO;AACX,YAAA,KAAK,QAAQ;AACT,gBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;oBAAE,MAAM,GAAG,cAAc;;oBACrD,MAAM,GAAG,QAAQ;gBACtB;AACJ,YAAA,KAAK,MAAM;gBACP,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,uBAAuB;oBACzD,MAAM,GAAG,eAAe;;oBAExB,MAAM,GAAG,MAAM;gBACnB;AACJ,YAAA,KAAK,WAAW;gBACZ,MAAM,GAAG,WAAW;gBACpB;AACJ,YAAA;gBACI,QAAQ,SAAS;AACb,oBAAA,KAAK,SAAS;wBACV,MAAM,GAAG,UAAU;wBACnB;AACJ,oBAAA,KAAK,MAAM;AACP,wBAAA,MAAM,GAAG,CAAC,KAAK,CAAC,kBAAkB,KAAK,OAAO,IAAI,WAAW,GAAG,SAAwB;wBACxF;AACJ,oBAAA;wBACI,MAAM,GAAG,SAAwB;wBACjC;;gBAER;;AAER,QAAA,OAAO,MAAM;IACjB;AAEQ,IAAA,sBAAsB,CAAC,KAAqB,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC;IAC3F;AAGO,IAAA,UAAU,CAAC,IAAS,EAAA;QACvB,MAAM,KAAK,GAAmB,QAAQ,IAAI,CAAC,KAAK,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAc,CAAC,GAAG,IAAsB;QACvH,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACtC,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC;AAC/C,QAAA,OAAO,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,UAAU;IACjD;AAEO,IAAA,mBAAmB,CAAC,KAA8B,EAAA;QACrD,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACzD;AAEO,IAAA,UAAU,CAAC,IAAS,EAAA;QACvB,MAAM,KAAK,GAAmB,QAAQ,IAAI,CAAC,KAAK,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAc,CAAC,GAAG,IAAsB;QACvH,IAAI,WAAW,GAAwD,EAAE;AACzE,QAAA,IAAI,KAAK,CAAC,OAAO,EAAE;AACf,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;AAC5B,gBAAA,WAAW,GAAG,KAAK,CAAC,OAA8D;AACtF,YAAA,IAAI,QAAQ,KAAK,CAAC,OAAO,CAAC,KAAK,QAAQ;AACnC,gBAAA,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;QACvD;QAEA,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAA8B,KAAK,IAAI,CAAC,KAAK,KAAK,sBAAsB,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,cAAc,CAAC;AAC1J,YAAA,WAAW,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC;QAEtF,IAAI,KAAK,CAAC,QAAQ;YACd,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC;QAE5D,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC;IACnD;IAEQ,eAAe,CAAC,KAAqB,EAAE,WAA4C,EAAA;QACvF,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;AACvC,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;AACzB,gBAAA,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,KAAK,sBAAsB,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;AAC3F,gBAAA,OAAO,WAAW;YACtB;QACJ;AACA,QAAA,OAAO,WAAW;IACtB;AAEQ,IAAA,iBAAiB,CAAC,KAA4C,EAAA;QAClE,MAAM,MAAM,GAAsB,EAAE;QACpC,MAAM,aAAa,GAAG,EAAE;AACxB,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACtB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS;AACrE,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;AACvB,gBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;AACnD,gBAAA,aAAa,CAAC,KAAK,CAAC,GAAG,KAAK;YAChC;AACA,YAAA,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACjD;AACA,QAAA,OAAO,MAAM;IACjB;AAEQ,IAAA,mBAAmB,CAAC,IAAoC,EAAA;QAC5D,OAAO,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK;IAC1C;AAEO,IAAA,UAAU,CAAC,cAAiD,EAAA;QAC/D,MAAM,YAAY,GAAG,cAAc,CAAC,YAAY,KAAK,SAAS,IAAI,cAAc,CAAC,YAAY,KAAK,IAAI,GAAG,cAAc,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,IAAI;QACtJ,MAAM,aAAa,GAAG,cAAc,CAAC,aAAa,KAAK,SAAS,IAAI,cAAc,CAAC,aAAa,KAAK,IAAI,GAAG,cAAc,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI;AAC1J,QAAA,IAAI,YAAY,KAAK,aAAa,EAAE;YAChC,MAAM,KAAK,GAAmB,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC;AACrE,YAAA,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ;gBACvB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,aAAa,CAAC;QAEnE;IACJ;AAEO,IAAA,aAAa,CAAC,SAAiB,EAAA;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAC9C,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACxE;AAEO,IAAA,YAAY,CAAC,SAA8B,EAAA;AAC9C,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU;AAC7B,YAAA,GAAG,CAAC,MAAM,GAAG,KAAK;AAEtB,QAAA,SAAS,CAAC,MAAM,GAAG,IAAI;IAC3B;IAEQ,iBAAiB,GAAA;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;AACvE,QAAA,IAAI,QAAQ;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;IAC7C;AAEQ,IAAA,qBAAqB,CAAC,KAAqB,EAAA;QAC/C,IAAI,WAAW,GAAoC,EAAE;AACrD,QAAA,IAAI,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;AAC3D,QAAA,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;AACzC,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,GAAG,KAAK,CAAC,OAAO,GAAG,sCAAsC,CAAC;YACnG,WAAW,GAAG,IAAI;QACtB;AACA,QAAA,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC,WAA8C,GAAG,EAAE;AAC3F,QAAA,OAAO,WAAW;IACtB;;AAGO,IAAA,oBAAoB,CAAC,KAAqB,EAAA;QAC7C,IAAI,UAAU,GAAwB,IAAI;AAC1C,QAAA,IAAI,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;AACnE,QAAA,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;AACxC,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,oBAAoB,CAAC;YACzF,WAAW,GAAG,IAAI;QACtB;AACA,QAAA,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC,UAAiC,GAAG,IAAI;AAC/E,QAAA,OAAO,UAAU;IACrB;IAEQ,cAAc,CAAC,KAAqB,EAAE,GAAQ,EAAA;QAClD,IAAI,WAAW,GAAG,IAAI;QACtB,IAAI,CAAC,IAAI,CAAC,YAAY;AAClB,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC;aAE/D;AACD,YAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC;AAC5D,YAAA,IAAI,CAAC,WAAW;gBACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,GAAG,GAAG,GAAG,YAAY,CAAC;QAEvE;AACA,QAAA,OAAO,WAAW;IACtB;IAEO,eAAe,CAAC,GAAsB,EAAE,QAAa,EAAA;QACxD,IAAI,GAAG,CAAC,eAAe;AACnB,YAAA,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC;QAEjC,IAAI,GAAG,CAAC,YAAY;AAChB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;IAE3C;AAEO,IAAA,qBAAqB,CAAC,SAAiB,EAAA;QAC1C,MAAM,KAAK,GAAmB,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;AAC5D,QAAA,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,mBAAmB,EAAE;YACvD,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;AACnD,YAAA,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;QACxE;IACJ;IAEQ,WAAW,GAAA;AACf,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,kBAAkB,EAAE;AACzC,YAAA,IAAI,KAAK,CAAC,WAAW,KAAK,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,eAAe,EAAE;gBACvE,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;gBACnD,IAAI,UAAU,EAAE;oBACZ,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;AAC7F,oBAAA,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;;AAErB,wBAAA,UAAU,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACjE;gBACJ;YACJ;QACJ;IACJ;IAGO,2BAA2B,GAAA;AAC9B,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,kBAAkB,EAAE;AACzC,YAAA,IAAI,KAAK,CAAC,WAAW,KAAK,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,eAAe,EAAE;gBACvE,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;gBACnD,IAAI,UAAU,EAAE;AACZ,oBAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAC7B,UAAU,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,WAAkB,KAAI;wBAC7D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,WAAW;oBAChD,CAAC,CAAC,CACL;gBACL;YACJ;QACJ;IACJ;IAEQ,sBAAsB,GAAA;AAC1B,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,uBAAuB;YAAE,CAAC,CAAC,WAAW,EAAE;AAC7D,QAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,KAAK,EAAgB;IAC5D;IAEQ,aAAa,GAAA;QACjB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,QAAA,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;AAClC,QAAA,KAAK,CAAC,KAAK,GAAG,YAAY;AAC1B,QAAA,OAAO,CAAC,CAAC,KAAK,CAAC,WAAW;IAC9B;AAEQ,IAAA,mBAAmB,CAAC,KAAqB,EAAA;QAC7C,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB;IAC7D;8GA9vBkB,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAnB,IAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA9B,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,mBAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA9B,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBADnD;;sBASI;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBA2MA,YAAY;uBAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC;;;AChOjD,MAAMmB,OAAK,GAAG,0BAA0B;MAG3B,wBAAwB,CAAA;AACjC,IAAA,WAAA,CACY,aAA4B,EAAA;QAA5B,IAAA,CAAA,aAAa,GAAb,aAAa;AAGjB,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,OAAO,EAAO;AAM3B,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,KAAK,EAAgB;AAc/C,QAAA,IAAA,CAAA,wBAAwB,GAAG,IAAI,KAAK,EAAuB;AA8E5D,QAAA,IAAA,CAAA,QAAQ,GAAkB,IAAI,OAAO,EAAQ;AAC7C,QAAA,IAAA,CAAA,QAAQ,GAAkB,IAAI,OAAO,EAAQ;IArGhD;AAGG,IAAA,WAAW,CAAC,IAAS,EAAA;QACxB,IAAI,CAAC,aAAa,CAAC,GAAG,CAACA,OAAK,GAAG,cAAc,CAAC;AAC9C,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1B;AAGO,IAAA,iBAAiB,CAAC,IAA0B,EAAA;QAC/C,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CACzB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAC9B;IACL;IAEO,mBAAmB,GAAA;AACtB,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,mBAAmB;YACtC,GAAG,CAAC,WAAW,EAAE;IAEzB;AAKO,IAAA,kBAAkB,CAAC,eAAgD,EAAA;AACtE,QAAA,IAAI,CAAC,eAAe,GAAG,eAAe;IAC1C;AAIO,IAAA,2BAA2B,CAAC,GAAW,EAAE,IAAS,EAAE,KAAc,EAAE,gBAA0B,EAAA;AACjG,QAAA,IAAI,mBAAyC;AAC7C,QAAA,IAAI,IAAI,CAAC,0BAA0B,IAAI,SAAS,EAAE;YAC9C,MAAM,0BAA0B,GAAG,IAAI;AACvC,YAAA,MAAM,OAAO,GAAG,gBAAgB,KAAK,IAAI;YACzC,mBAAmB,GAAG,IAAI,mBAAmB,CAAC,0BAA0B,EAAE,KAAK,EAAE,OAAO,CAAC;QAC7F;;YAEI,mBAAmB,GAAG,IAAI;AAE9B,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,mBAAmB;IAC5D;AAEQ,IAAA,sBAAsB,CAAC,GAAW,EAAA;AACtC,QAAA,IAAI,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,SAAS;YAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,8CAA8C,GAAG,GAAG,GAAG,oBAAoB,CAAC;AAC1J,QAAA,OAAO,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC;IAC7C;AAQO,IAAA,IAAI,CAAqB,IAAmC,EAAE,GAAc,EAAE,IAAe,EAAE,OAA6B,EAAA;QAC/H,IAAI,GAAG,GAAG,EAAE;AACZ,QAAA,IAAI,aAAmC;AACvC,QAAA,IAAI,QAAQ,IAAI,CAAC,KAAK,QAAQ,EAAE;YAC5B,GAAG,GAAG,IAAI;AACV,YAAA,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC;QACpD;;YAEI,aAAa,GAAG,IAAI;AAGxB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC;IAClE;AAKO,IAAA,UAAU,CAAW,aAAmC,EAAE,GAAc,EAAE,OAA6B,EAAE,IAAA,GAAY,IAAI,EAAE,GAAG,GAAG,EAAE,EAAA;QACtI,IAAI,CAAC,IAAI,CAAC,eAAe;AAAE,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,mIAAmI,CAAC;QACxL,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,GAAG,EAAE;QAC5C,IAAI,CAAC,eAAe,CAAC,aAAa,GAAG,aAAa,CAAC,KAAK;QACxD,IAAI,CAAC,eAAe,CAAC,gBAAgB,GAAG,aAAa,CAAC,gBAAgB;QACtE,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI;QAC9C,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,aAAa,CAAC,SAAS;QACxD,IAAI,CAAC,eAAe,CAAC,gBAAgB,GAAG,aAAa,CAAC,gBAAgB;QACtE,IAAI,CAAC,eAAe,CAAC,YAAY,GAAG,aAAa,CAAC,YAAY;QAC9D,IAAI,CAAC,eAAe,CAAC,gBAAgB,GAAG,aAAa,CAAC,gBAAgB;QACtE,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAAC,aAAa,CAAC,0BAA0B,CAAC;AACpF,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACzI,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACzI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC;AAC7C,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC;aACvB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAa,MAAM;YAC1B,GAAG;YACH,GAAG;YACH,IAAI;AACJ,YAAA,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC;AACtC,SAAA,CAAC,CAAC;AACF,aAAA,IAAI,CAAC,GAAG,CAAC,CAAC,MAA8C,KAAI;AACzD,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;AAC3B,YAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE;AACrC,YAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE;QACzC,CAAC,CAAC,CAAC;IACX;IAKO,IAAI,GAAA;AACP,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;IAC/B;AAEO,IAAA,UAAU,CAAC,MAAgB,EAAA;AAC9B,QAAA,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC;;AAGvC,QAAA,IAAI,CAAC,eAAe,CAAC,2BAA2B,EAAE;AAClD,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACzI,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7I;AAEO,IAAA,KAAK,CAAC,SAAiB,EAAA;AAC1B,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC;IACzC;8GAzHS,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAnB,IAAA,CAAA,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA,CAAA;;2FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AA6HlC,MAAM,mBAAmB,CAAA;AACrB,IAAA,WAAA,CACW,0BAAiE,EACjE,KAAA,GAAgB,EAAE,EAClB,gBAA0B,EAC1B,IAAiB,EACjB,SAA2B,EAC3B,gBAAA,GAA4B,KAAK,EAAA;QALjC,IAAA,CAAA,0BAA0B,GAA1B,0BAA0B;QAC1B,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;AAEvB,QAAA,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,IAAI,SAAS,GAAG,IAAI,GAAG,KAAK;IACxE;AACH;;AC3ID;MACsB,qCAAqC,CAAA;AAO7C,IAAA,aAAa,CAAC,KAA2B,EAAE,UAAoB,EAAE,WAAqB,EAAA;QAC5F,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC;IACjE;8GATkB,qCAAqC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAArC,qCAAqC,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAArC,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBAF1D;;sBAII;;sBAEA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;AAavC,MAAO,yCAA0C,SAAQ,qCAAqC,CAAA;8GAAvF,yCAAyC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yCAAyC,yHCzBtD,+yvCAihBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,2BAAA,EAAA,YAAA,EAAA,aAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,EAAA,YAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,OAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,8FAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,iBAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,sEAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,yEAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,cAAA,EAAA,OAAA,EAAA,yBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,EAAA,MAAA,EAAA,WAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,IAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,2BAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,WAAA,EAAA,IAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,wBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAW,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iFAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAV,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAW,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,YAAA,EAAA,cAAA,EAAA,MAAA,EAAA,OAAA,EAAA,wBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,gCAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,uBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,aAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FDxfa,yCAAyC,EAAA,UAAA,EAAA,CAAA;kBALrD,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uCAAuC,cAErC,KAAK,EAAA,QAAA,EAAA,+yvCAAA,EAAA;;AASf,MAAO,sCAAuC,SAAQ,qCAAqC,CAAA;8GAApF,sCAAsC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sCAAsC,sHEhCnD,+7uCA4hBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAArB,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,2BAAA,EAAA,YAAA,EAAA,aAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,QAAA,EAAA,YAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,QAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,OAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,8FAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,iBAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,sEAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,yEAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,cAAA,EAAA,OAAA,EAAA,yBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,EAAA,MAAA,EAAA,WAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,IAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,2BAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,WAAA,EAAA,IAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,eAAA,EAAA,aAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAO,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,wBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAW,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iFAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAV,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAU,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,YAAA,EAAA,cAAA,EAAA,MAAA,EAAA,OAAA,EAAA,wBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,gCAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,uBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,aAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FF5fa,sCAAsC,EAAA,UAAA,EAAA,CAAA;kBALlD,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oCAAoC,cAElC,KAAK,EAAA,QAAA,EAAA,+7uCAAA,EAAA;;;AGbrB,MAAM,KAAK,GAAG,gCAAgC;MASjC,8BAA8B,CAAA;AACvC,IAAA,WAAA,CACY,MAAqB,EACtB,iBAAoC,EACP,MAAc,EACF,YAAoB,EAAA;QAH5D,IAAA,CAAA,MAAM,GAAN,MAAM;QACP,IAAA,CAAA,iBAAiB,GAAjB,iBAAiB;QACY,IAAA,CAAA,MAAM,GAAN,MAAM;QACM,IAAA,CAAA,YAAY,GAAZ,YAAY;AA8BzD,QAAA,IAAA,CAAA,QAAQ,GAAQ,EAAE,CAAC;QAKlB,IAAA,CAAA,aAAa,GAAmB,EAAE;QAOnC,IAAA,CAAA,6BAA6B,GAAW,MAAM;AAI9C,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,YAAY,EAAU;QA2B/C,IAAA,CAAA,yBAAyB,GAAQ,EAAE;AAmDpC,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,YAAY,EAAkC;QAqBrE,IAAA,CAAA,UAAU,GAAG,EAAE;QA6KL,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,yDAAC;IA7T5D;IAEG,QAAQ,GAAA;QACX,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC;IACxC;IAEO,eAAe,GAAA;QAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,kBAAkB,CAAC;;QAE3C,IAAI,CAAC,YAAY,EAAE;QAEnB,IAAI,CAAC,aAAa,CAAC,IAAI,CACnB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAChF;;IAEL;IAEA,WAAW,GAAA;QACP,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,cAAc,CAAC;AACvC,QAAA,IAAI,CAAC,yBAAyB,GAAG,EAAE;AACnC,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD;AAgBA,IAAA,IAAW,UAAU,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU;IACzC;AAQO,IAAA,sBAAsB,CAAC,KAAkB,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC;IAC1F;AAEO,IAAA,YAAY,CAAC,KAAkB,EAAA;AAClC,QAAA,MAAM,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAY;QACtF,OAAO,CAAC,QAAQ;IACpB;AAEO,IAAA,UAAU,CAAC,KAAkB,EAAA;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;IACxC;AAEO,IAAA,mBAAmB,CAAC,KAAkB,EAAA;QACzC,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC;IACjD;AAEA;;;AAGG;IACI,gCAAgC,CAAC,KAAK,EAAE,IAAqB,EAAA;QAChE,OAAO,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE;IACzC;AAGO,IAAA,mBAAmB,CAAC,KAAkB,EAAA;QACzC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;AAClD,YAAA,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,SAAS,CAAC;AAC3C,gBAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK;AACvB,qBAAA,GAAG,CAAC,CAAC,IAAI,MAAM;oBACZ,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,KAAK,EAAE,IAAI,CAAC;AACf,iBAAA,CAAC,CAAC;QACf;QACA,OAAO,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1D;AAEO,IAAA,UAAU,CAAC,KAAkB,EAAA;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;IACxC;AAEO,IAAA,oBAAoB,CAAC,SAAiB,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI;IACnC;AAEO,IAAA,oBAAoB,CAAC,KAAkB,EAAA;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC;IAClD;AAEO,IAAA,eAAe,CAAC,KAAkB,EAAA;QACrC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,SAAS,CAAC;YACxG,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC;aAEjD,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,uBAAuB,EAAE;YACvD,MAAM,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;YAC3C,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AACtF,YAAA,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1F,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AACjG,YAAA,OAAO,aAAa;QACxB;;YAEI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE/C;IAEO,wBAAwB,CAAC,KAAkB,EAAE,YAAoB,EAAA;QACpE,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QAC1C,OAAO,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC;IAC3C;IAEO,aAAa,GAAA;AAChB,QAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;IACzC;;AAKO,IAAA,kBAAkB,CAAC,IAAU,EAAA;AAChC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACpC;AAEO,IAAA,eAAe,CAAC,SAAiB,EAAA;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC;AACvE,QAAA,MAAM,mBAAmB,GAAG,KAAK,CAAC,yBAAyB;QAC3D,IAAI,mBAAmB,EAAE;YACrB,KAAK,MAAM,kBAAkB,IAAI,mBAAmB;AAChD,gBAAA,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC;QACrD;IACJ;AAEQ,IAAA,oBAAoB,CAAC,SAAiB,EAAA;AAC1C,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,sBAAsB;AACjD,QAAA,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,GAAG,IAAI;IACpD;AAIO,IAAA,YAAY,CAAC,IAAU,EAAA;;AAE1B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE;AAC1B,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,IAAI,GAAG,IAAI,CAAC,QAAQ;AAC/B,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;AAC9D,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IAC1G;AAEO,IAAA,aAAa,CAAC,KAA2B,EAAE,UAAoB,EAAE,WAAqB,EAAA;AACzF,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;AACzD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC;QAC3D,UAAU,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;AAC7C,QAAA,WAAW,KAAK,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI;QACzE,IAAI,OAAO,EAAE;;AAET,YAAA,QAAQ,KAAK,CAAC,IAAI;AACd,gBAAA,KAAK,QAAQ;oBACT,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,KAAK,OAAO,CAAC,KAAK,IAAI,UAAU,IAAI,IAAI,IAAI,UAAoB,GAAG,KAAK,CAAC,GAAG,CAAC;wBAC9F,OAAO,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;oBAC3C,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,KAAK,OAAO,CAAC,KAAK,IAAI,UAAU,IAAI,IAAI,IAAI,UAAoB,GAAG,KAAK,CAAC,GAAG,CAAC;wBAC9F,OAAO,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;oBAC3C;gBACJ,KAAK,MAAM,EAAE;AACT,oBAAA,IAAI,KAAK,CAAC,kBAAkB,IAAI,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,UAAU,EAAE;AACrE,wBAAA,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAClC,wBAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;4BAClB,OAAO,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;oBAChD;oBACA;gBACJ;gBACA,KAAK,cAAc,EAAE;AACjB,oBAAA,IAAI,KAAK,CAAC,kBAAkB,IAAI,OAAO,EAAE;AACrC,wBAAA,IAAI,KAAK,CAAC,QAAQ,IAAI,UAAU,EAAE;AAC9B,4BAAA,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAClC,4BAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;gCAClB,OAAO,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;wBAChD;AACA,wBAAA,IAAI,KAAK,CAAC,SAAS,IAAI,WAAW,EAAE;AAChC,4BAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;AACpC,4BAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;gCACnB,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;wBACjD;AACA,wBAAA,IAAI,UAAU,GAAG,WAAW,EAAE;4BAC1B,OAAO,CAAC,SAAS,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC;4BAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC;wBACrD;oBACJ;oBACA;gBACJ;;AAEJ,YAAA,KAAK,CAAC,QAAQ,GAAG,KAAK;AACtB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;AACrE,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC;AACvE,YAAA,KAAK,CAAC,QAAQ,GAAG,SAAS,IAAI,SAAS;QAC3C;IACJ;AAEO,IAAA,eAAe,CAAC,KAAkB,EAAA;AACrC,QAAA,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;AAClF,QAAA,OAAO,CAAA,EAAG,KAAK,CAAC,IAAI,CAAA,EAAA,EAAK,cAAc,CAAA,EAAG,KAAK,CAAC,IAAI,IAAI,EAAE,GAAG;IACjE;AAEQ,IAAA,aAAa,CAAC,OAAwB,EAAE,KAAkB,EAAE,SAAiB,EAAA;AACjF,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;AAEzB,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE;;;;;QAK/B,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,IAAI,OAAO,CAAC,OAAO;AAClE,QAAA,IAAI,CAAC,gBAAgB;AAAE,YAAA,OAAO,KAAK;;AAGnC,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM;AAC5B,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC;AAElE,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE;IACzE;IAEQ,eAAe,CAAC,GAAW,EAAE,KAAkB,EAAA;QACnD,QAAQ,GAAG;YACP,KAAK,YAAY,EAAE,OAAO,mCAAmC,KAAK,CAAC,GAAG,CAAA,CAAA,CAAG;YACzE,KAAK,YAAY,EAAE,OAAO,oCAAoC,KAAK,CAAC,GAAG,CAAA,CAAA,CAAG;AAC1E,YAAA,KAAK,UAAU,EAAE,OAAO,0BAA0B,GAAG,GAAG;AACxD,YAAA,KAAK,aAAa,EAAE,OAAO,qBAAqB,GAAG,GAAG;AACtD,YAAA,KAAK,qBAAqB,EAAE,OAAO,8BAA8B,GAAG,GAAG;AACvE,YAAA,KAAK,MAAM,EAAE,OAAO,qDAAqD,GAAG,GAAG;AAC/E,YAAA,SAAS,OAAO,GAAG,GAAG,GAAG;;IAEjC;AAEO,IAAA,mBAAmB,CAAC,KAAkB,EAAA;QACzC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC;QACvG,OAAO,WAAW,GAAG,IAAI,GAAG,KAAK;IACrC;AAEO,IAAA,WAAW,CAAC,KAAkB,EAAA;AACjC,QAAA,OAAO,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,GAAG,EAAE;IACpG;IAEO,eAAe,CAAC,GAAsB,EAAE,QAAa,EAAA;QACxD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC;IAC9C;AAEO,IAAA,qBAAqB,CAAC,SAAiB,EAAA;AAC1C,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC;IAC5C;AAEA;;;;;;;;;AASG;AACI,IAAA,iBAAiB,CAAC,aAA4B,EAAA;AACjD,QAAA,IAAI,aAAa,IAAI,aAAa,CAAC,SAAS,EAAE;;YAE1C,qBAAqB,CAAC,MAAK;gBACvB,aAAa,CAAC,SAAS,EAAE;AAC7B,YAAA,CAAC,CAAC;QACN;IACJ;AAEA;;;;;;;;;;;AAWG;IACI,sBAAsB,CAAC,KAAiB,EAAE,iBAAsB,EAAA;;AAEnE,QAAA,MAAM,aAAa,GAAG,KAAK,CAAC,aAA4B;AACxD,QAAA,MAAM,aAAa,GAAG,KAAK,CAAC,aAA4B;;QAGxD,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;;;YAG1D,qBAAqB,CAAC,MAAK;gBACvB,iBAAiB,CAAC,gBAAgB,EAAE;AACxC,YAAA,CAAC,CAAC;QACN;IACJ;IAEO,cAAc,CAAC,SAAS,EAAE,KAAkB,EAAA;QAC/C,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,GAAG;YAAE;QACjD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;IACpC;IAEO,gBAAgB,CAAC,SAAS,EAAE,KAAkB,EAAA;QACjD,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,GAAG;YAAE;QACjD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;IACpC;IAEQ,gBAAgB,GAAA;QACpB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,QAAA,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;AAClC,QAAA,KAAK,CAAC,KAAK,GAAG,YAAY;AAC1B,QAAA,OAAO,CAAC,CAAC,KAAK,CAAC,WAAW;IAC9B;AAGO,IAAA,mBAAmB,CAAC,KAAkB,EAAA;QACzC,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB;IAC7D;8GAvUS,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAArB,IAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAI3B,SAAS,EAAA,EAAA,EAAA,KAAA,EACT,qBAAqB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AALxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,6cC1B3C,wbASA,EAAA,MAAA,EAAA,CAAA,s0CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAqB,yCAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,sCAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FDiBa,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAP1C,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,8BAA8B,EAAA,aAAA,EAGzB,iBAAiB,CAAC,IAAI,cACzB,KAAK,EAAA,QAAA,EAAA,wbAAA,EAAA,MAAA,EAAA,CAAA,s0CAAA,CAAA,EAAA;;0BAMZ,MAAM;2BAAC,SAAS;;0BAChB,MAAM;2BAAC,qBAAqB;;sBAyBhC;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAGA,YAAY;uBAAC,UAAU;;sBAKvB;;sBAGA;;sBA+EA;;;AEnJL;MACsB,iCAAiC,CAAA;8GAAjC,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iCAAiC,wOAOxC,mBAAmB,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAPZ,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAFtD;;sBAGI;;sBAGA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;sBAGpC,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,mBAAmB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;AAS9C,MAAO,qCAAsC,SAAQ,iCAAiC,CAAA;8GAA/E,qCAAqC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qCAAqC,oHCxBlD,utKA0GA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAvB,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iFAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAe,8BAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,+BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FDlFa,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBALjD,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kCAAkC,cAEhC,KAAK,EAAA,QAAA,EAAA,utKAAA,EAAA;;AASf,MAAO,kCAAmC,SAAQ,iCAAiC,CAAA;8GAA5E,kCAAkC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kCAAkC,iHE/B/C,ylKAsGA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAxB,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iFAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAe,8BAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,+BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FFvEa,kCAAkC,EAAA,UAAA,EAAA,CAAA;kBAL9C,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,+BAA+B,cAE7B,KAAK,EAAA,QAAA,EAAA,ylKAAA,EAAA;;;AGTf,MAAO,0BAA8B,SAAQ,8BAAiC,CAAA;IAEhF,WAAA,CACI,MAAqB,EACb,wBAAkD,EAC1D,OAAwB,EACxB,YAAiC,EACzB,UAAsB,EAAA;AAE9B,QAAA,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;QALd,IAAA,CAAA,wBAAwB,GAAxB,wBAAwB;QAGxB,IAAA,CAAA,UAAU,GAAV,UAAU;QA+Bf,IAAA,CAAA,UAAU,GAAG,EAAE;QAGf,IAAA,CAAA,aAAa,GAAG,EAAE;QAElB,IAAA,CAAA,QAAQ,GAAG,EAAE;QAEb,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,gBAAgB,GAAG,KAAK;QAIxB,IAAA,CAAA,6BAA6B,GAAG,0CAA0C;;AAG1E,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAU,KAAK,wDAAC;QA6GrC,IAAA,CAAA,SAAS,GAAG,UAAU;AAxJzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC,qBAAqB;QAE1D,MAAM,CAAC,MAAK;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;gBAAE;YAE1B,qBAAqB,CAAC,MAAK;gBACvB,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE;AAClB,gBAAA,IAAI,CAAC,oBAAoB,EAAE,WAAW,EAAE,CAAC;gBACzC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;AAC/G,oBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;oBAC5B,IAAI,CAAC,aAAa,EAAE;AACpB,oBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACxB,gBAAA,CAAC,CAAC;AACN,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;IACN;AAKA,IAAA,IAAW,MAAM,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtC;AAEA,IAAA,IAAY,mBAAmB,GAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB;IAClD;;IAsBA,IACW,aAAa,CAAC,KAAc,EAAA;AACnC,QAAA,IAAI,KAAK;AACL,YAAA,IAAI,CAAC,wBAAwB,CAAC,kBAAkB,CAAC,IAAI,CAAC;IAC9D;;IAGO,OAAO,GAAA;;AAEV,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,KAAK;IACxC;IAEA,QAAQ,GAAA;QACJ,KAAK,CAAC,MAAM,EAAE;IAClB;;IAGQ,aAAa,GAAA;QACjB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC;QAC5C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK;QACxC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;IACtC;IAEA,SAAS,GAAA;QACL,KAAK,CAAC,OAAO,EAAE;IACnB;IAEA,WAAW,GAAA;QACP,KAAK,CAAC,SAAS,EAAE;IACrB;AAEA;;;;;;AAMG;AACI,IAAA,IAAI,CACP,GAAO,EACP,IAAU,EACV,YAAkC,EAAA;AAElC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAC3B,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC;AACvC,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa;QAEpC,qBAAqB,CAAC,MAAK;AACvB,YAAA,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;AACvB,QAAA,CAAC,CAAC;IACN;AAEA;;;;AAIG;AACa,IAAA,UAAU,CAAC,MAAgB,EAAA;AACvC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QACxB,qBAAqB,CAAC,MAAK;AACvB,YAAA,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;AACvB,QAAA,CAAC,CAAC;IACN;IAEgB,YAAY,CAAC,eAA8B,IAAI,EAAA;AAC3D,QAAA,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC;IACpC;IAEgB,IAAI,GAAA;QAChB,KAAK,CAAC,IAAI,EAAE;AACZ,QAAA,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;IACvB;IAEgB,YAAY,GAAA;QACxB,KAAK,CAAC,YAAY,EAAE;AACpB,QAAA,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;IACvB;;AAIA,IAAA,IAAW,uBAAuB,GAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC;IACjD;AAEA,IAAA,IAAW,sBAAsB,GAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC;IAChD;AAEQ,IAAA,gBAAgB,CAAC,WAA6C,EAAA;AAClE,QAAA,MAAM,UAAU,GAAG,IAAI,KAAK,EAAqB;AACjD,QAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,SAAS,CAAC;AAC1F,QAAA,KAAK,MAAM,EAAE,IAAI,uBAAuB,EAAE;AACtC,YAAA,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,OAAO,EAAE;AAC1B,gBAAA,IAAI,GAAG,CAAC,QAAQ,IAAI,WAAW;AAC3B,oBAAA,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5B;QACJ;AACA,QAAA,OAAO,UAAU;IACrB;AAOA,IAAA,IAAW,IAAI,GAAA;QACX,OAAO,IAAI,CAAC,KAAK;IACrB;IAEA,IAAW,IAAI,CAAC,OAAmB,EAAA;QAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAC3C,QAAA,IAAI,CAAC,KAAK,GAAG,OAAO;IACxB;AAEQ,IAAA,YAAY,CAAC,IAAgB,EAAA;QACjC,QAAQ,IAAI;AACR,YAAA,KAAK,OAAO,EAAE,OAAO,UAAU;AAC/B,YAAA,KAAK,QAAQ,EAAE,OAAO,UAAU;AAChC,YAAA,KAAK,OAAO,EAAE,OAAO,UAAU;AAC/B,YAAA,SAAS,OAAO,UAAU;;IAElC;;AAGO,IAAA,KAAK,CAAC,SAAiB,EAAA;AAC1B,QAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC;IAC7C;8GAzLS,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAxB,IAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAAyB,wBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAvB,IAAA,CAAA,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA1B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,0BAA0B,8SCpBvC,ydAUA,EAAA,MAAA,EAAA,CAAA,yCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAuB,qCAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,kCAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FDUa,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAPtC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,cAGvB,KAAK,EAAA,QAAA,EAAA,ydAAA,EAAA,MAAA,EAAA,CAAA,yCAAA,CAAA,EAAA;;sBA8BhB,YAAY;uBAAC,UAAU;;sBAavB;;sBAEA,KAAK;uBAAC,IAAI;;sBAgBV;;;AElEL;;;;AAIG;AACG,MAAO,gCAAoC,SAAQ,8BAAiC,CAAA;IAEtF,WAAA,CACI,MAAqB,EACrB,OAAwB,EAAA;AAExB,QAAA,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;AAgB1B;;AAED;QAEQ,IAAA,CAAA,6BAA6B,GAAG,MAAM;IAnB7C;IAGO,QAAQ,GAAA;QACX,KAAK,CAAC,MAAM,EAAE;IAClB;IAEO,WAAW,GAAA;QACd,KAAK,CAAC,SAAS,EAAE;IACrB;IAEO,SAAS,GAAA;QACZ,KAAK,CAAC,OAAO,EAAE;IACnB;AAQA;;;;AAIG;AACa,IAAA,qBAAqB,CAAC,0BAAiE,EAAA;AACnG,QAAA,KAAK,CAAC,qBAAqB,CAAC,0BAA0B,CAAC;IAC3D;AAEA;;;;;;AAMG;IACa,QAAQ,CACpB,GAAO,EACP,YAAkC,EAAA;QAElC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC;IAC3C;AAEA;;;AAGG;IACI,UAAU,GAAA;QACb,IAAI,IAAI,CAAC,gBAAgB;AACrB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0JAA0J,CAAC;AAChL,QAAA,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC;QACxB,OAAO,IAAI,CAAC,OAAO;IACvB;IAEO,UAAU,GAAA;;QAEb,KAAK,CAAC,SAAS,EAAE;IACrB;;;;AAMA;;AAEK;IACE,OAAO,GAAA;AACV,QAAA,OAAO,IAAI;IACf;8GA5ES,gCAAgC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA3B,IAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gCAAgC,8LCjB7C,+1DAoDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,aAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAyB,8BAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,+BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FDnCa,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAX5C,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gCAAgC,cAE9B,KAAK,EAAA,QAAA,EAAA,+1DAAA,EAAA;;sBAiChB;;;MElCQ,uBAAuB,CAAA;AAGhC,IAAA,WAAA,GAAA;AAFiB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC;;AAW7B,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,KAAK,mDAAC;QARlC,MAAM,CAAC,MAAK;AACR,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB;YACnD,IAAI,IAAI,CAAC,OAAO,EAAE;gBAAE,gBAAgB,CAAC,IAAI,EAAE;;gBACtC,gBAAgB,CAAC,IAAI,EAAE;AAChC,QAAA,CAAC,CAAC;IACN;8GATS,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAvB,uBAAuB,EAAA,YAAA,EAAA,KAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAJnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,UAAU,EAAE;AACf,iBAAA;;;MCgBY,mBAAmB,CAAA;AALhC,IAAA,WAAA,GAAA;AAMqB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AAC9B,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC7C,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;AAC1B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC;QAEvD,IAAA,CAAA,SAAS,GAAoB,EAAE;QAKtB,IAAA,CAAA,KAAK,GAAG,IAAI;AACZ,QAAA,IAAA,CAAA,gBAAgB,GAAe;AAC3C,YAAA,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE;gBACtB,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAA,CAAA,sCAAA,CAAwC,EAAE,WAAW,EAAE,uBAAuB,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,CAAA,CAAA,wCAAA,CAA0C,EAAE;gBAC1M,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAA,CAAA,uCAAA,CAAyC,EAAE,WAAW,EAAE,wBAAwB,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,CAAA,CAAA,yCAAA,CAA2C;AAC3M;SACJ;AAIgB,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAY;AAkMzD,IAAA;IA3LG,IAAW,OAAO,CAAC,UAAkC,EAAA;AACjD,QAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;AAClC,QAAA,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE;IAClB;IAGA,IAAW,aAAa,CAAC,KAAwC,EAAA;AAC7D,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;QAC3B,IAAI,CAAC,OAAO,EAAE;IAClB;AAEA,IAAA,IAAW,QAAQ,GAAA;QACf,OAAO,IAAI,CAAC,gBAAgB,IAAI,cAAc,IAAI,CAAC,aAAa,CAAA,CAAE;IACtE;IAEO,MAAM,OAAO,CAAC,OAAgB,EAAA;QACjC,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE;AAEhD,QAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE;AACrC,QAAA,IAAI;YACA,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;AACpD,YAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE;AACrC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qCAAqC,CAAC;AACtD,YAAA,IAAI,OAAO;AACP,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC;QAC1C;QAAE,OAAO,KAAK,EAAE;AACZ,YAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE;AACrC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC;AACpD,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAA,qEAAqE,EAAE,SAAS,CAAA,CAAA,yCAAA,CAA2C,EAAE,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC;QACpN;IACJ;AAEQ,IAAA,aAAa,CAAC,QAAkB,EAAA;QACpC,OAAO,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;IAChD;IAEO,GAAG,GAAA;AACN,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wCAAwC,CAAC;QACzD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAW,IAAI,CAAC,YAAY;AAC3C,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,MAAM,KAAI;AAClB,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC;AAC/B,QAAA,CAAC,CAAC;IACV;AAEO,IAAA,iBAAiB,CAAC,KAA4B,EAAA;AACjD,QAAA,QAAQ,KAAK,CAAC,WAAW;AACrB,YAAA,KAAK,QAAQ;AACT,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;gBACzB;AACJ,YAAA,KAAK,MAAM;AACP,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;gBACvB;AACJ,YAAA;AACI,gBAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;;IAEtD;AAEQ,IAAA,MAAM,CAAC,EAAM,EAAA;AACjB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC;AAC7C,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAA,0EAA0E,EAAE,CAAC,EAAE,CAAC,CAAC;QACrI,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,gBAAgB,EAAE,SAAS,CAAA,CAAA,8CAAA,CAAgD;AACxG,aAAA,IAAI,CAAC,CAAC,SAAuB,KAAI;AAC9B,YAAA,IAAI,SAAS,KAAK,YAAY,CAAC,EAAE;AAC7B,gBAAA,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;AAC3B,QAAA,CAAC,CAAC;IACV;IAEQ,MAAM,UAAU,CAAC,EAAM,EAAA;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE;AAErC,QAAA,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;AACpC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oCAAoC,CAAC;YACrD,IAAI,CAAC,OAAO,EAAE;QAClB;QAAE,OAAO,KAAK,EAAE;AACZ,YAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE;AACrC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kCAAkC,CAAC;AACnD,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;AACxB,YAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAA,CAAA,uDAAA,CAAyD,EAAE,SAAS,CAAA,CAAA,2CAAA,CAA6C,CAAC;QAClK;IACJ;AAEQ,IAAA,IAAI,CAAC,EAAM,EAAA;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;AAChD,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAW,IAAI,CAAC,YAAY,EAAE,IAAI;AACjD,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,MAAM,KAAI;AAClB,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC;AAC/B,QAAA,CAAC,CAAC;IACV;IAEQ,MAAM,UAAU,CAAC,QAAkB,EAAA;AACvC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC;AAEjD,QAAA,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC1C,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC;YAC3D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC9C;QAAE,OAAO,KAAK,EAAE;AACZ,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wCAAwC,CAAC;AACzD,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;AACxB,YAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,SAAS,CAAA,CAAA,iEAAA,CAAmE,EAAE,SAAS,CAAA,CAAA,yCAAA,CAA2C,CAAC;QAC1K;IACJ;IAEQ,MAAM,UAAU,CAAC,QAAkB,EAAA;AACvC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,CAAC;AACjD,QAAA,IAAI;YACA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC5D,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC;AAC3D,YAAA,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAC3B;QAAE,OAAO,KAAK,EAAE;AACZ,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wCAAwC,CAAC;AACzD,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAA,sEAAsE,EAAE,SAAS,CAAA,CAAA,wCAAA,CAA0C,EAAE,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC;QACpN;IACJ;AAEO,IAAA,KAAK,CAAC,QAAkB,EAAA;QAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;AACvC,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;IACjC;AAEO,IAAA,UAAU,CAAC,QAAkB,EAAA;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;QACvC,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;IAC7C;AAEQ,IAAA,kBAAkB,CAAC,OAA+B,EAAA;QACtD,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;QAC1G,IAAI,CAAC,YAAY,GAAG;YAChB,KAAK,EAAE,IAAI,CAAC,aAAa;AACzB,YAAA,0BAA0B,EAAE;SAC/B;IACL;AAEQ,IAAA,iBAAiB,CAAC,OAA+B,EAAA;AACrD,QAAA,MAAM,WAAW,GAAiB,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;AACrH,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACrE;AAEQ,IAAA,sBAAsB,CAAC,UAAgC,EAAA;AAC3D,QAAA,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK;QACnG,OAAO;AACH,YAAA,GAAG,UAAU;AACb,YAAA,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC,yBAAyB,CAAC,UAAU,CAAC,IAAI,CAAC;YAC7E,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,OAAO,GAAG,SAAS,GAAG;SACnG;IACL;;AAGQ,IAAA,aAAa,CAAC,OAA6C,EAAA;AAC/D,QAAA,OAAO,OAAO,OAAO,KAAK,QAAQ;IACtC;AAEQ,IAAA,yBAAyB,CAAC,SAAoB,EAAA;QAClD,QAAQ,SAAS;AACb,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,MAAM;AACX,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,MAAM;AACX,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,KAAK;AACV,YAAA,KAAK,OAAO;AACR,gBAAA,OAAO,SAAS;AACpB,YAAA,KAAK,UAAU;AACf,YAAA,KAAK,UAAU;AACf,YAAA,KAAK,WAAW;AAChB,YAAA,KAAK,KAAK;AACN,gBAAA,OAAO,MAAM;AACjB,YAAA,KAAK,cAAc;AACnB,YAAA,KAAK,cAAc;AACnB,YAAA,KAAK,MAAM;AACX,YAAA,KAAK,uBAAuB;AAC5B,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,QAAQ;AACb,YAAA;AACI,gBAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,SAAS,CAAC;;IAEjE;8GAvNS,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,+hBCvBhC,yyBAcA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA5B,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,eAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,GAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,aAAA,EAAA,uBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,wBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,iFAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAqB,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,YAAA,EAAA,cAAA,EAAA,MAAA,EAAA,OAAA,EAAA,wBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,gCAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,uBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,aAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FDSa,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAL/B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,cAEf,KAAK,EAAA,QAAA,EAAA,yyBAAA,EAAA;;sBAWhB;;sBACA;;sBACA;;sBACA;;sBACA;;sBAOA,KAAK;uBAAC,WAAW;;sBAEjB;;sBAEA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,gBAAgB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;sBAC5C,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;MAmM9B,sBAAsB,CAAA;AAGlC;;AE9MM,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,OAAO,EAAE;AAC1D,MAAM,sBAAsB,GAAG,eAAe,CAAC,OAAO,EAAE;AACxD,MAAM,oBAAoB,GAAG,aAAa,CAAC,OAAO,EAAE;AACpD,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,OAAO,EAAE;AAC1D,MAAM,oBAAoB,GAAG,aAAa,CAAC,OAAO,EAAE;AACpD,MAAM,8BAA8B,GAAG,uBAAuB,CAAC,OAAO,EAAE;MAoElE,gBAAgB,CAAA;8GAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,iBAtCrB,aAAa;YACb,qBAAqB;YACrB,+BAA+B;YAC/B,mBAAmB;YACnB,0BAA0B;YAC1B,uBAAuB;YAEvB,qBAAqB;YACrB,gBAAgB;YAChB,wBAAwB;YACxB,gCAAgC;YAChC,6BAA6B;YAE7B,0BAA0B;YAC1B,8BAA8B;YAC9B,gCAAgC;YAChC,qCAAqC;YACrC,yCAAyC;YACzC,kCAAkC;AAClC,YAAA,sCAAsC,aA7CtC,YAAY;YACZ,cAAc;YACd,WAAW;YACX,YAAY;AACZ,YAAA,aAAa,wFAKb,gBAAgB;YAChB,iBAAiB;AACjB,YAAA,gBAAgB,sBAEhB,gBAAgB;YAChB,WAAW;AACX,YAAA,gBAAgB,8BAEhB,kBAAkB;YAClB,iBAAiB;YACjB,oBAAoB;YACpB,aAAa;YACb,YAAY;YACZ,sBAAsB;AACtB,YAAA,0BAA0B,aAyB1B,aAAa;YACb,0BAA0B;YAC1B,mBAAmB;YACnB,gBAAgB;YAChB,wBAAwB;YACxB,gBAAgB;YAChB,0BAA0B;YAC1B,gCAAgC;YAChC,uBAAuB,CAAA,EAAA,CAAA,CAAA;AAQlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,SAAA,EANd;YACP,oBAAoB;YACpB,YAAY;AACZ,YAAA,cAAc,EAAE;AACnB,SAAA,EAAA,OAAA,EAAA,CA9DG,YAAY;YACZ,cAAc;YACd,WAAW;YACX,YAAY;YACZ,aAAa;YACb,uBAAuB;YACvB,sBAAsB;YACtB,oBAAoB;YACpB,uBAAuB;YACvB,gBAAgB;YAChB,iBAAiB;YACjB,gBAAgB;YAChB,oBAAoB;YAGpB,gBAAgB;YAChB,8BAA8B;YAC9B,kBAAkB;YAClB,iBAAiB;YACjB,oBAAoB;YACpB,aAAa;AACb,YAAA,YAAY,EAgCZ,gBAAgB,CAAA,EAAA,CAAA,CAAA;;2FAWX,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAlE5B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,OAAO,EAAE;wBACL,YAAY;wBACZ,cAAc;wBACd,WAAW;wBACX,YAAY;wBACZ,aAAa;wBACb,uBAAuB;wBACvB,sBAAsB;wBACtB,oBAAoB;wBACpB,uBAAuB;wBACvB,gBAAgB;wBAChB,iBAAiB;wBACjB,gBAAgB;wBAChB,oBAAoB;wBACpB,gBAAgB;wBAChB,WAAW;wBACX,gBAAgB;wBAChB,8BAA8B;wBAC9B,kBAAkB;wBAClB,iBAAiB;wBACjB,oBAAoB;wBACpB,aAAa;wBACb,YAAY;wBACZ,sBAAsB;wBACtB;AACH,qBAAA;AACD,oBAAA,YAAY,EAAE;wBACV,aAAa;wBACb,qBAAqB;wBACrB,+BAA+B;wBAC/B,mBAAmB;wBACnB,0BAA0B;wBAC1B,uBAAuB;wBAEvB,qBAAqB;wBACrB,gBAAgB;wBAChB,wBAAwB;wBACxB,gCAAgC;wBAChC,6BAA6B;wBAE7B,0BAA0B;wBAC1B,8BAA8B;wBAC9B,gCAAgC;wBAChC,qCAAqC;wBACrC,yCAAyC;wBACzC,kCAAkC;wBAClC,sCAAsC;AACzC,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACL,aAAa;wBACb,0BAA0B;wBAC1B,mBAAmB;wBACnB,gBAAgB;wBAChB,wBAAwB;wBACxB,gBAAgB;wBAChB,0BAA0B;wBAC1B,gCAAgC;wBAChC,uBAAuB;AAC1B,qBAAA;AACD,oBAAA,SAAS,EAAE;wBACP,oBAAoB;wBACpB,YAAY;AACZ,wBAAA,cAAc,EAAE;AACnB;AACJ,iBAAA;;;AChHD;;AAEG;;;;"}