{"version":3,"file":"yuuvis-client-framework-query-list.mjs","sources":["../../../../../libs/yuuvis/client-framework/query-list/src/lib/query-list.component.ts","../../../../../libs/yuuvis/client-framework/query-list/src/lib/query-list.component.html","../../../../../libs/yuuvis/client-framework/query-list/src/lib/query-list.module.ts","../../../../../libs/yuuvis/client-framework/query-list/src/yuuvis-client-framework-query-list.ts"],"sourcesContent":["import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  contentChild,\n  effect,\n  inject,\n  input,\n  output,\n  signal,\n  TemplateRef,\n  untracked,\n  viewChild\n} from '@angular/core';\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { SearchQuery, SearchResult, SearchResultItem, SearchService } from '@yuuvis/client-core';\nimport { ClickDoubleDirective, DragSelectDirective, DragSelectItemDirective } from '@yuuvis/client-framework/common';\nimport { ListComponent, YuvListModule } from '@yuuvis/client-framework/list';\nimport { Pagination } from '@yuuvis/client-framework/pagination';\nimport { DeviceService } from '@yuuvis/material';\n\n/**\n * Query-driven list component that executes a search query and renders the results\n * using a consumer-provided item template.\n *\n * The component is a thin orchestration layer on top of `yuv-list`: it handles the\n * full query lifecycle (executing, paginating, refreshing), exposes a typed result\n * set via the optional `transformer` input, and delegates all keyboard navigation,\n * selection, and accessibility concerns to the inner `ListComponent`.\n *\n * **Key Features:**\n * - Accepts a `SearchQuery` object or a raw CMIS query string\n * - Optional `transformer` function maps raw `SearchResultItem[]` to any custom type `T`\n * - Built-in server-side pagination via Angular Material `mat-paginator`\n * - Multi-selection with mouse drag (`DragSelectDirective`) and keyboard modifiers\n * - \"Drop-in\" items prepended to the result set for optimistic UI updates\n * - Busy state signal for loading indicators\n * - Exposes a slim imperative API (`select`, `clear`, `refresh`, `goToPage`, …)\n *   so parents can drive the list programmatically\n *\n * **Content Projection Slots:**\n * - `#yuvQueryListItem` — required; `ng-template` used to render each result item.\n *   Receives the (optionally transformed) item as `$implicit`.\n * - `#yuvQueryListEmpty` — optional; `ng-template` shown when the result set is empty.\n *\n * **Basic usage:**\n * ```html\n * <yuv-query-list [query]=\"query\" (itemSelect)=\"onSelect($event)\">\n *   <ng-template #yuvQueryListItem let-item>\n *     <span>{{ item.title }}</span>\n *   </ng-template>\n * </yuv-query-list>\n * ```\n *\n * **With transformer and empty state:**\n * ```html\n * <yuv-query-list [query]=\"query\" [transformer]=\"toViewModel\" (itemSelect)=\"onSelect($event)\">\n *   <ng-template #yuvQueryListItem let-item>\n *     <yuv-list-tile>\n *       <ng-template #titleSlot>{{ item.title }}</ng-template>\n *       <ng-template #descriptionSlot>{{ item.modified }}</ng-template>\n *     </yuv-list-tile>\n *   </ng-template>\n *   <ng-template #yuvQueryListEmpty>\n *     <p>No results found.</p>\n *   </ng-template>\n * </yuv-query-list>\n * ```\n *\n * ```ts\n * toViewModel = (items: SearchResultItem[]) =>\n *   items.map(item => ({\n *     title: item.fields.get(BaseObjectTypeField.OBJECT_ID),\n *     modified: item.fields.get(BaseObjectTypeField.MODIFICATION_DATE)\n *   }));\n * ```\n *\n * @typeParam T The shape of each item after the optional `transformer` is applied.\n *              Defaults to `any` when no transformer is provided.\n */\n@Component({\n  selector: 'yuv-query-list',\n  imports: [\n    CommonModule,\n    YuvListModule,\n    ClickDoubleDirective,\n    DragSelectDirective,\n    DragSelectItemDirective,\n    MatPaginatorModule\n  ],\n  templateUrl: './query-list.component.html',\n  styleUrl: './query-list.component.scss',\n  host: { '[class.pagination]': '!!pagination()' },\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class QueryListComponent<T = any> {\n  //#region Dependencies\n\n  #device = inject(DeviceService);\n  #searchService = inject(SearchService);\n\n  //#endregion\n\n  //#region Angular stuff\n\n  /**\n   * Current pagination state. Set to a `Pagination` object when the last query\n   * result contained multiple pages; `undefined` when all results fit on one page\n   * or no query has been executed yet.\n   *\n   * Drives the `[class.pagination]` host binding so the template can conditionally\n   * render the `mat-paginator` footer.\n   */\n  pagination = signal<Pagination | undefined>(undefined);\n\n  /**\n   * Reference to the inner `ListComponent` instance.\n   *\n   * Used internally to delegate imperative operations (select, clear, focus, …).\n   * Can also be accessed from the parent via a `@ViewChild` on `yuv-query-list` if\n   * fine-grained control over the inner list is needed, though the public API methods\n   * on this component are preferred.\n   */\n  list = viewChild.required<ListComponent>('list');\n\n  /**\n   * Reference to the `#yuvQueryListItem` `ng-template` projected by the consumer.\n   *\n   * This template is used to render each individual item in the list. The template\n   * receives the (optionally transformed) item as the `$implicit` context variable:\n   * ```html\n   * <ng-template #yuvQueryListItem let-item>{{ item.title }}</ng-template>\n   * ```\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  itemTemplate = contentChild<TemplateRef<any>>('yuvQueryListItem');\n\n  /**\n   * Reference to the optional `#yuvQueryListEmpty` `ng-template` projected by the consumer.\n   *\n   * When provided, this template is rendered in place of the list whenever the query\n   * returns zero items. If omitted, nothing is shown for the empty state.\n   * ```html\n   * <ng-template #yuvQueryListEmpty>\n   *   <p>No results found.</p>\n   * </ng-template>\n   * ```\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  emptyTemplate = contentChild<TemplateRef<any>>('yuvQueryListEmpty');\n\n  /**\n   * The search query to execute.\n   *\n   * Accepts either a structured `SearchQuery` object (field filters, sort orders, etc.)\n   * or a raw CMIS query string. The query is re-executed reactively every time this\n   * input changes. Set to `null` or `undefined` to clear the list without triggering\n   * a new request.\n   */\n  query = input<SearchQuery | string | null>();\n\n  /**\n   * Property name on the (transformed) item to use as a stable unique identifier.\n   *\n   * When provided, the template renderer uses this property for `@for` tracking instead\n   * of the item's position index, which preserves DOM nodes and component state when the\n   * list is refreshed with partially overlapping results.\n   *\n   * If omitted, the zero-based index is used as the tracking key.\n   *\n   * @default null\n   */\n  idProperty = input<string | null>(null);\n\n  /**\n   * Optional mapping function applied to the raw `SearchResultItem[]` returned by the\n   * search service before the results are rendered.\n   *\n   * Use this to project only the fields your template needs, compute derived properties,\n   * or convert dates/enums to display-friendly values. The generic type parameter `T`\n   * of the component is inferred from the return type of this function.\n   *\n   * If omitted, raw `SearchResultItem` objects are passed to the item template as-is.\n   *\n   * @example\n   * ```ts\n   * transformer = (items: SearchResultItem[]) =>\n   *   items.map(item => ({\n   *     id: item.fields.get(BaseObjectTypeField.OBJECT_ID) as string,\n   *     title: item.fields.get('cm:name') as string\n   *   }));\n   * ```\n   */\n  transformer = input<((items: SearchResultItem[]) => T[]) | null>();\n\n  /**\n   * Guard function that temporarily blocks all selection changes.\n   *\n   * Forwarded directly to the inner `ListComponent`. As long as the returned predicate\n   * evaluates to `true`, any attempt to change the selection — via click, keyboard, or\n   * the programmatic API — is silently ignored. Useful when the parent has unsaved\n   * changes tied to the current selection and needs to prevent the user from\n   * accidentally navigating away.\n   *\n   * @default () => false  (never prevents)\n   */\n  preventChangeUntil = input<() => boolean>(() => false);\n\n  /**\n   * Automatically selects an item when the list is first rendered.\n   *\n   * Forwarded to the inner `ListComponent`. The selection logic runs once after the\n   * initial query result is displayed and follows this priority:\n   * 1. The first non-disabled item that already carries the `selected` attribute.\n   * 2. If no such item exists and `autoSelect` is `true`, the item at index 0.\n   *\n   * Accepts any truthy string in addition to a real boolean so it can be set as a\n   * plain HTML attribute: `<yuv-query-list autoSelect>`.\n   *\n   * @default false\n   */\n  autoSelect = input<boolean, BooleanInput>(false, {\n    transform: (value: BooleanInput) => coerceBooleanProperty(value)\n  });\n\n  /**\n   * Emits the current selection as an array of zero-based item indices whenever\n   * the selection changes — via click, drag, keyboard, or programmatic API calls.\n   *\n   * An empty array signals that the selection has been cleared.\n   */\n  itemSelect = output<number[]>();\n\n  /**\n   * Emits the live selection indices while the user is actively dragging to select.\n   *\n   * Fires continuously during a drag operation (before the drag is released), allowing\n   * the parent to show a live preview of what will be selected. Once the drag ends,\n   * `itemSelect` fires with the final committed selection.\n   */\n  dragSelectChange = output<number[]>();\n\n  /**\n   * Emits the zero-based index of an item when it is double-clicked.\n   *\n   * The inner list operates with `selfHandleClick` mode when double-click is active,\n   * so single clicks do not immediately trigger `itemSelect`. The parent should listen\n   * to both `itemSelect` (for single-click selection) and this event (for double-click\n   * actions like opening a detail view).\n   */\n  itemDoubleClick = output<number>();\n\n  /**\n   * Emits once per query execution when the search result arrives, providing the total\n   * count of matching items and the raw result page.\n   *\n   * Use this to update external counters, breadcrumbs, or analytics — without having to\n   * execute a separate count query. Note that `totalCount` reflects the server-side total,\n   * not just the number of items on the current page.\n   */\n  queryResult = output<{ totalCount: number; items: SearchResultItem[] }>();\n\n  /**\n   * Number of items to request per page from the search service.\n   *\n   * Controls the `size` parameter of each search request. When the total result count\n   * exceeds this value, pagination controls are shown and the user can navigate between\n   * pages via `changePage()` / `goToPage()`.\n   *\n   * Resolution order (see `effectivePageSize`): explicit `pageSize` input takes precedence,\n   * otherwise `(query as SearchQuery).size` is used if set, otherwise\n   * `SearchService.DEFAULT_QUERY_SIZE` is used.\n   */\n  pageSize = input<number | undefined>(undefined);\n\n  /**\n   * Enables mouse drag-to-select on list items.\n   *\n   * When `true` and `multiselect` is also `true`, the user can click and drag across\n   * items to select a range without holding Shift. Powered by `DragSelectDirective`.\n   * Automatically disabled on touch devices regardless of this input value.\n   *\n   * @default true\n   */\n  enableDragSelect = input<boolean>(true);\n\n  /**\n   * Enables multi-selection mode.\n   *\n   * When `true`, the user can hold **Shift** or **Ctrl** to extend or toggle the\n   * selection, and drag-to-select becomes available (if `enableDragSelect` is also\n   * `true`). Forwarded to the inner `ListComponent`.\n   *\n   * @default false\n   */\n  multiselect = input<boolean>(false);\n\n  /**\n   * Delegates visual selection and focus state rendering to the parent component.\n   *\n   * When `false` (default), `yuv-list` applies CSS classes for selected and active\n   * states automatically. When `true`, those signals are still updated but the host\n   * receives the `self-handle-selection` CSS class, allowing the parent to apply\n   * its own visual treatment. Forwarded to the inner `ListComponent`.\n   *\n   * @default false\n   */\n  selfHandleSelection = input<boolean>(false);\n\n  /**\n   * Whether to include permission information in CMIS search results.\n   * When `true`, the third parameter of `searchCmis()` is set,\n   * causing the backend to return permission data alongside each item.\n   *\n   * @default false\n   */\n  includePermissions = input<boolean>(false);\n\n  //#endregion\n\n  //#region Properties\n\n  /**\n   * Whether the current device has touch input enabled.\n   *\n   * Sourced from `DeviceService`. Used in the template to conditionally disable\n   * drag-to-select, which is not suitable for touch interactions.\n   */\n  isTouchDevice = this.#device.isTouchEnabled;\n\n  /**\n   * Number of drop-in items currently prepended to the result list.\n   *\n   * Derived from the internal `#dropInItems` signal. Exposed publicly so the template\n   * and parent components can easily check whether any temporary items are present\n   * (e.g. to show a visual indicator or adjust layout) without accessing internal state.\n   */\n  dropInSize = computed(() => this.#dropInItems().length);\n\n  /**\n   * Resolved page size used by both the `mat-paginator` and every server request.\n   *\n   * Falls back through three sources, in order:\n   * 1. The explicit `pageSize` input, when the consumer has provided one.\n   * 2. `(query as SearchQuery).size`, when the query is a `SearchQuery` object that\n   *    already declares its own page size — keeps server response and paginator in\n   *    sync when the consumer only configures the query.\n   * 3. `SearchService.DEFAULT_QUERY_SIZE` as the final default.\n   *\n   * Used internally to avoid the bug where `mat-paginator` and the server pageination\n   * use different page sizes (paginator showing e.g. \"1-25 of 43\" while `getPage()`\n   * asks the server for skip=50 — landing on an empty page).\n   */\n  effectivePageSize = computed<number>(() => {\n    const inputSize = this.pageSize();\n    if (inputSize !== undefined) return inputSize;\n    const query = this.query();\n    if (query && typeof query !== 'string' && query.size) return query.size;\n    return SearchService.DEFAULT_QUERY_SIZE;\n  });\n\n  /**\n   * The final list of items rendered by the template.\n   *\n   * Computed from three sources, merged in this order:\n   * 1. **Drop-in items** (`#dropInItems`) — temporary items prepended to the list,\n   *    e.g. newly created objects that should appear before they match the query.\n   * 2. **Transformed query results** — raw `SearchResultItem[]` passed through the\n   *    optional `transformer` function (or cast directly to `T[]` if none is provided).\n   * 3. **Optimistic updates** (`#listItemUpdates`) — per-index overrides applied on top\n   *    of the merged list, allowing individual items to be patched without re-fetching.\n   *\n   * Re-evaluates automatically whenever any of the three sources change.\n   */\n  resultItems = computed<T[]>(() => {\n    const items = this.#items();\n    const updates = this.#listItemUpdates();\n    const transformer = this.transformer();\n    const transformedResult = transformer ? transformer(items) : (items as unknown as T[]);\n    const dropIns = this.#dropInItems();\n\n    let merged: T[];\n    const idProp = this.idProperty();\n\n    if (dropIns.length > 0 && idProp) {\n      // Deduplicate: filter out server results that already appear as drop-in items\n      const dropInIds = new Set(dropIns.map((item) => (item as Record<string, unknown>)[idProp]));\n      const filtered = transformedResult.filter((item) => !dropInIds.has((item as Record<string, unknown>)[idProp]));\n      merged = [...dropIns, ...filtered];\n    } else {\n      merged = [...dropIns, ...transformedResult];\n    }\n\n    // apply updates to transformed result\n    Object.keys(updates).forEach((index) => {\n      merged[Number(index)] = updates[Number(index)];\n    });\n    return merged;\n  });\n\n  /**\n   * Indicates whether a search request is currently in flight.\n   *\n   * Set to `true` immediately before a query or page request is dispatched to the\n   * search service, and back to `false` once the response (or error) arrives.\n   * Bind this to a loading indicator or `BusyOverlayDirective` in the parent template:\n   * ```html\n   * <yuv-query-list #qList ...>...</yuv-query-list>\n   * <yuv-busy-overlay [active]=\"qList.busy()\" />\n   * ```\n   */\n  busy = signal<boolean>(false);\n\n  #items = signal<SearchResultItem[]>([]);\n\n  #dropInItems = signal<T[]>([]);\n\n  #listItemUpdates = signal<Record<number, T>>({});\n\n  //#endregion\n\n  constructor() {\n    effect(this.#executeQueryEffect);\n  }\n\n  //#region UI Methods\n\n  /** Resolves the tracking key for a result item in the `@for` loop. */\n  trackItem(item: T, index: number): unknown {\n    const prop = this.idProperty();\n    return prop ? (item as Record<string, unknown>)[prop] : index;\n  }\n\n  /**\n   * Handles a single click on a list item.\n   *\n   * Forwards the click to the inner `ListComponent` with the correct Shift/Ctrl modifier\n   * flags so range- and toggle-selection work correctly. Also transfers DOM focus to the\n   * list host so subsequent keyboard navigation works without an additional Tab press.\n   *\n   * Called from the template via `(click)` on each item wrapper. Not intended for\n   * external callers — use `select()` instead.\n   *\n   * @param idx   Zero-based index of the clicked item.\n   * @param event The originating mouse event (provides `shiftKey` and `ctrlKey` flags).\n   */\n  onItemClick(idx: number, event: MouseEvent): void {\n    this.list().select(idx, event.shiftKey, event.ctrlKey);\n    this.list().focus();\n  }\n\n  /**\n   * Handles a double-click on a list item.\n   *\n   * Emits the `itemDoubleClick` output with the item's index. The parent can use this\n   * to trigger a secondary action (e.g. opening a detail panel or navigating to a route)\n   * that is distinct from the primary single-click selection.\n   *\n   * Called from the template via `ClickDoubleDirective`. Not intended for external callers.\n   *\n   * @param idx   Zero-based index of the double-clicked item.\n   * @param event The originating mouse event (unused, kept for directive compatibility).\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onItemDoubleClick(idx: number, event: MouseEvent): void {\n    this.itemDoubleClick.emit(idx);\n  }\n\n  /**\n   * Handles intermediate drag-selection changes from `DragSelectDirective`.\n   *\n   * Fires continuously while the user is dragging across items. Updates the inner list's\n   * multi-selection state in real time so items are highlighted as the drag progresses,\n   * and also emits `dragSelectChange` so the parent can show a live preview.\n   *\n   * Called from the template via `(dragSelectChange)` on the drag-select host.\n   * Not intended for external callers.\n   *\n   * @param sel Current array of zero-based indices covered by the drag gesture.\n   */\n  onDragSelectChange(sel: number[]): void {\n    this.list().multiSelect(sel);\n    this.dragSelectChange.emit(sel);\n  }\n\n  /**\n   * Handles the final committed drag-selection from `DragSelectDirective`.\n   *\n   * Called when the user releases the mouse after a drag-to-select gesture. Transfers\n   * DOM focus to the list (so keyboard navigation works immediately after) and emits\n   * the final selection via `itemSelect`.\n   *\n   * Called from the template via `(dragSelect)` on the drag-select host.\n   * Not intended for external callers.\n   *\n   * @param sel Final array of zero-based indices selected by the drag gesture.\n   */\n  onDragSelect(sel: number[]): void {\n    this.list().focus();\n    this.itemSelect.emit(sel);\n  }\n\n  //#endregion\n\n  //#region Public methods\n\n  /**\n   * Applies optimistic per-item overrides on top of the current query result.\n   *\n   * Each entry in the `updates` array patches the item at the given `index` with\n   * the provided `value`. The value type must match `T` — i.e. the shape produced\n   * by the `transformer` function, or `SearchResultItem` if no transformer is used.\n   *\n   * Overrides accumulate: calling this method multiple times merges the new entries\n   * with any previously applied ones. All overrides are automatically discarded when\n   * the user navigates to a different page (see `goToPage()`), since a fresh server\n   * response replaces the local data.\n   *\n   * **Use case:** apply instant visual feedback after a user action (rename, status\n   * change, etc.) without waiting for a full query refresh.\n   *\n   * @param updates Array of `{ index, value }` pairs describing which items to patch.\n   */\n  updateListItems(updates: { index: number; value: T }[]): void {\n    const updatesRecord = updates.reduce(\n      (acc, curr) => {\n        {\n          acc[curr.index] = curr.value;\n          return acc;\n        }\n      },\n      {} as Record<number, T>\n    );\n    this.#listItemUpdates.set({ ...this.#listItemUpdates(), ...updatesRecord });\n  }\n\n  /**\n   * Prepends a set of temporary items to the top of the result list.\n   *\n   * Drop-in items appear before all query results and are visually distinguished\n   * by the template (e.g. a highlighted background). They participate in selection\n   * and drag-to-select exactly like regular items.\n   *\n   * The existing selection indices are automatically shifted by `items.length` so that\n   * the currently selected query-result items remain selected after the prepend.\n   *\n   * **Typical use case:** when the user pastes or creates an object that does not yet\n   * appear in the current query (e.g. because the index has not been updated), drop it\n   * in temporarily so the user sees it immediately without a full refresh.\n   *\n   * Drop-in items are cleared automatically when the user navigates to a different page.\n   * Call `dropItems([])` to remove them programmatically.\n   *\n   * @param items    Items to prepend. Must be of type `T` (same as query result items).\n   * @param scrollTo Whether to smooth-scroll the list back to the top after prepending.\n   *                 Defaults to `true` so the newly dropped items are immediately visible.\n   */\n  dropItems(items: T[], scrollTo = true): void {\n    this.#dropInItems.set(items);\n    this.list().shiftSelectionBy(items.length);\n    if (scrollTo) {\n      this.list().scrollToTop();\n    }\n  }\n\n  /**\n   * Surgically removes specific items from the drop-in set by their stable IDs.\n   *\n   * Filters `#dropInItems` to drop any entry whose `idProperty` value is in `ids`,\n   * leaving the remaining drop-ins (and the rest of the result list) untouched.\n   * The structural shift is handled by the rendering pipeline — `resultItems`\n   * recomputes automatically, and the leading `drop-in` class follows the new\n   * (smaller) `dropInSize()`.\n   *\n   * This method intentionally does **not** mutate the inner list's selection\n   * state. The caller (typically `TileListComponent.removeDropItems`) is in a\n   * better position to decide whether to clear, shift, or preserve selection,\n   * because it tracks selection at a higher level by stable object identity.\n   *\n   * Requires `idProperty` to be set — without it items cannot be identified\n   * and the call is a no-op (returns 0).\n   *\n   * **Typical use case:** an upstream deletion (e.g. `DmsService.deleteDmsObject`)\n   * removed an object that is currently rendered as a drop-in. Without removing\n   * it from `#dropInItems`, the deleted tile would remain visible after `refresh()`\n   * because the framework treats drop-ins as authoritative and prepends them to\n   * every refreshed result set.\n   *\n   * @param ids   Array of ID values (as resolved via `idProperty`) to remove.\n   * @returns Number of items that were actually removed from the drop-in set.\n   */\n  removeDropItems(ids: string[]): number {\n    if (ids.length === 0) return 0;\n    const idProp = this.idProperty();\n    if (!idProp) return 0;\n    const removeSet = new Set<string>(ids);\n    const before = this.#dropInItems();\n    const after = before.filter((item) => !removeSet.has((item as Record<string, unknown>)[idProp] as string));\n    const removedCount = before.length - after.length;\n    if (removedCount === 0) return 0;\n    this.#dropInItems.set(after);\n    return removedCount;\n  }\n\n  /**\n   * Programmatically replaces the entire selection with the given indices.\n   *\n   * Only effective when `multiselect` is `true`. Out-of-range indices are silently\n   * discarded. The resulting selection is sorted ascending before being applied.\n   *\n   * Use this when the parent needs to restore a previously saved multi-selection\n   * state, e.g. after navigation or component re-initialization.\n   *\n   * @param index Array of zero-based item indices to select.\n   */\n  multiSelect(index: number[]): void {\n    this.list().multiSelect(index);\n  }\n\n  /**\n   * Selects the item at the given zero-based index.\n   *\n   * Delegates to the inner `ListComponent`. The `preventChangeUntil` guard and\n   * `disableSelection` state are respected. Clamps the index to the valid range.\n   *\n   * @param index Zero-based index of the item to select.\n   */\n  select(index: number): void {\n    this.list().select(index);\n  }\n\n  /**\n   * Moves keyboard focus to the item at the given index and selects it.\n   *\n   * Combines focus management and selection in one call, and transfers DOM focus\n   * to the list host. Use this when the parent wants to programmatically drive\n   * both the visual focus indicator and the selection simultaneously.\n   *\n   * @param index Zero-based index of the item to activate.\n   */\n  setActiveItem(index: number): void {\n    this.list().setActiveItem(index);\n  }\n\n  /**\n   * Clears the current selection and resets the active keyboard-focus index.\n   *\n   * If the selection is already empty, the method is a no-op. The `preventChangeUntil`\n   * guard is respected — if the guard returns `true`, the clear is blocked.\n   *\n   * @param silent When `true`, skips emitting `itemSelect` after clearing. Use this\n   *               when the parent needs to reset state programmatically without\n   *               triggering downstream reactions.\n   */\n  clear(silent = false): void {\n    this.list().clear(silent);\n  }\n\n  /**\n   * Re-executes the current query without changing the page or query parameters.\n   *\n   * If pagination is active, re-fetches the same page the user is currently on.\n   * If no pagination is active, re-runs the original query from scratch.\n   *\n   * Use this to reflect server-side changes (e.g. after a create/delete operation)\n   * without navigating away from the current view.\n   */\n  refresh(): void {\n    const query = this.query();\n    if (query) {\n      if (this.pagination()) {\n        this.goToPage(this.pagination()!.page);\n      } else this.#executeQuery(query || null);\n    }\n  }\n\n  /**\n   * Forces the `transformer` function to be re-applied to the current result set.\n   *\n   * Normally the transformer runs automatically whenever the underlying `#items`\n   * signal changes. Use this method when the transformer itself has external\n   * dependencies that changed (e.g. a locale or display-format setting) but the\n   * raw search result did not — triggering a re-evaluation by creating a new array\n   * reference for `#items` without fetching from the server again.\n   */\n  runTransformerAgain(): void {\n    this.#items.set([...this.#items()]);\n  }\n\n  /**\n   * Handles a page-change event emitted by the `mat-paginator`.\n   *\n   * Converts the zero-based `pageEvent.pageIndex` to the one-based page number\n   * expected by `goToPage()` and delegates the request.\n   *\n   * Bound to `(page)` on the `mat-paginator` in the template.\n   *\n   * @param pageEvent The pagination event emitted by `MatPaginatorModule`.\n   */\n  changePage(pageEvent: PageEvent): void {\n    this.#dropInItems.set([]);\n    this.goToPage(pageEvent.pageIndex + 1);\n  }\n\n  /**\n   * Fetches and displays the given page of the current query result.\n   *\n   * Sets `busy` to `true` for the duration of the request. On success, updates\n   * the pagination state, clears all optimistic overrides (they are page-scoped),\n   * and replaces `#items` with the new page's results.\n   *\n   * Also used internally by `refresh()` to reload the currently active page.\n   *\n   * @param page One-based page number to navigate to.\n   */\n  goToPage(page: number): void {\n    const query = this.query();\n    if (!query) return;\n    this.busy.set(true);\n    this.#searchService.getPage(query, page, this.effectivePageSize(), this.includePermissions()).subscribe({\n      next: (res: SearchResult) => {\n        this.#setupPagination(res);\n        this.#listItemUpdates.set({});\n        this.#items.set(res.items);\n        this.queryResult.emit({ totalCount: res.totalNumItems, items: res.items });\n        this.busy.set(false);\n      },\n      error: (err) => {\n        // TODO: how should errors be handles in case hat loading pages fail\n        this.busy.set(false);\n        console.error(err);\n      }\n    });\n  }\n\n  //#endregion\n\n  //#region Utilities\n\n  /**\n   * Executes a search query.\n   * @param query The search query to execute.\n   * This may be a SearchQuery object or a string. If it's a string, it is supposed to\n   * be a CMIS query statement.\n   */\n  #executeQuery(query: SearchQuery | string | null): void {\n    if (query && !this.busy()) {\n      this.busy.set(true);\n      const size = this.effectivePageSize();\n      (typeof query === 'string'\n        ? this.#searchService.searchCmis(query, size, this.includePermissions())\n        : this.#searchService.search({ ...query, size })\n      ).subscribe({\n        next: (res: SearchResult) => {\n          this.#setupPagination(res);\n          this.#listItemUpdates.set({});\n          this.#items.set(res.items);\n          this.queryResult.emit({ totalCount: res.totalNumItems, items: res.items });\n          this.busy.set(false);\n        },\n        error: (err) => {\n          this.busy.set(false);\n          console.error(err);\n        }\n      });\n    }\n  }\n\n  #setupPagination(searchResult: SearchResult): void {\n    this.pagination.set(\n      searchResult.paging\n        ? {\n            total: searchResult.totalNumItems,\n            pages: searchResult.paging.totalPages,\n            page: searchResult.paging.page\n          }\n        : undefined\n    );\n  }\n\n  //#endregion\n\n  //#region Effects\n\n  readonly #executeQueryEffect = (): void => {\n    // execute the query each time it changes\n    const query = this.query();\n    if (query)\n      untracked(() => {\n        this.#executeQuery(query || null);\n      });\n  };\n\n  //#endregion\n}\n","<yuv-list\n  #list\n  [multiselect]=\"multiselect()\"\n  [autoSelect]=\"autoSelect()\"\n  [preventChangeUntil]=\"preventChangeUntil()\"\n  [selfHandleClick]=\"true\"\n  [selfHandleSelection]=\"selfHandleSelection()\"\n  [yuvDragSelect]=\"{ disabled: !enableDragSelect() || !multiselect() || isTouchDevice }\"\n  (dragSelectChange)=\"onDragSelectChange($event)\"\n  (dragSelect)=\"onDragSelect($event)\"\n  (itemSelect)=\"itemSelect.emit($event)\"\n>\n  @for (resultItem of resultItems(); track trackItem(resultItem, $index)) {\n    <div\n      yuvListItem\n      yuvDragSelectItem\n      [class.drop-in]=\"$index < dropInSize()\"\n      (click.single)=\"onItemClick($index, $event)\"\n      (click.double)=\"onItemDoubleClick($index, $event)\"\n    >\n      <ng-container *ngTemplateOutlet=\"itemTemplate() || null; context: { $implicit: resultItem, index: $index }\" />\n    </div>\n  } @empty {\n    <ng-container *ngTemplateOutlet=\"emptyTemplate() || null\" />\n  }\n</yuv-list>\n@if (pagination(); as pag) {\n  <mat-paginator\n    class=\"paginator\"\n    [length]=\"pag.total\"\n    [pageSize]=\"effectivePageSize()\"\n    (page)=\"changePage($event)\"\n    hidePageSize\n  />\n}\n","import { NgModule } from '@angular/core';\nimport { QueryListComponent } from './query-list.component';\n\nconst cmp = [QueryListComponent];\n@NgModule({\n  imports: cmp,\n  exports: cmp\n})\nexport class YuvQueryListModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;AAuBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DG;AAgBH;MACa,kBAAkB,CAAA;;AAG7B,IAAA,OAAO;AACP,IAAA,cAAc;AA0Td,IAAA,MAAM;AAEN,IAAA,YAAY;AAEZ,IAAA,gBAAgB;;AAIhB,IAAA,WAAA,GAAA;;AAnUA,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC;AAC/B,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC;;;AAMtC;;;;;;;AAOG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAyB,SAAS,iFAAC;AAEtD;;;;;;;AAOG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAgB,MAAM,CAAC;AAEhD;;;;;;;;AAQG;;AAEH,QAAA,IAAA,CAAA,YAAY,GAAG,YAAY,CAAmB,kBAAkB,mFAAC;AAEjE;;;;;;;;;;AAUG;;AAEH,QAAA,IAAA,CAAA,aAAa,GAAG,YAAY,CAAmB,mBAAmB,oFAAC;AAEnE;;;;;;;AAOG;QACH,IAAA,CAAA,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA+B;AAE5C;;;;;;;;;;AAUG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAgB,IAAI,iFAAC;AAEvC;;;;;;;;;;;;;;;;;;AAkBG;QACH,IAAA,CAAA,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA+C;AAElE;;;;;;;;;;AAUG;QACH,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAAgB,MAAM,KAAK,yFAAC;AAEtD;;;;;;;;;;;;AAYG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAwB,KAAK,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,YAAA,EAAA,8BAAA,EAAA,CAAA,EAC7C,SAAS,EAAE,CAAC,KAAmB,KAAK,qBAAqB,CAAC,KAAK,CAAC,GAChE;AAEF;;;;;AAKG;QACH,IAAA,CAAA,UAAU,GAAG,MAAM,EAAY;AAE/B;;;;;;AAMG;QACH,IAAA,CAAA,gBAAgB,GAAG,MAAM,EAAY;AAErC;;;;;;;AAOG;QACH,IAAA,CAAA,eAAe,GAAG,MAAM,EAAU;AAElC;;;;;;;AAOG;QACH,IAAA,CAAA,WAAW,GAAG,MAAM,EAAqD;AAEzE;;;;;;;;;;AAUG;AACH,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAqB,SAAS,+EAAC;AAE/C;;;;;;;;AAQG;AACH,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAU,IAAI,uFAAC;AAEvC;;;;;;;;AAQG;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAU,KAAK,kFAAC;AAEnC;;;;;;;;;AASG;AACH,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAU,KAAK,0FAAC;AAE3C;;;;;;AAMG;AACH,QAAA,IAAA,CAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,yFAAC;;;AAM1C;;;;;AAKG;AACH,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc;AAE3C;;;;;;AAMG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,iFAAC;AAEvD;;;;;;;;;;;;;AAaG;AACH,QAAA,IAAA,CAAA,iBAAiB,GAAG,QAAQ,CAAS,MAAK;AACxC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE;YACjC,IAAI,SAAS,KAAK,SAAS;AAAE,gBAAA,OAAO,SAAS;AAC7C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;YAC1B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC,IAAI;YACvE,OAAO,aAAa,CAAC,kBAAkB;AACzC,QAAA,CAAC,wFAAC;AAEF;;;;;;;;;;;;AAYG;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAM,MAAK;AAC/B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;AAC3B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACvC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,YAAA,MAAM,iBAAiB,GAAG,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,GAAI,KAAwB;AACtF,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;AAEnC,YAAA,IAAI,MAAW;AACf,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;YAEhC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,EAAE;;gBAEhC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAM,IAAgC,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC3F,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,CAAE,IAAgC,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC9G,MAAM,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,QAAQ,CAAC;YACpC;iBAAO;gBACL,MAAM,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,iBAAiB,CAAC;YAC7C;;YAGA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AACrC,gBAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChD,YAAA,CAAC,CAAC;AACF,YAAA,OAAO,MAAM;AACf,QAAA,CAAC,kFAAC;AAEF;;;;;;;;;;AAUG;AACH,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAU,KAAK,2EAAC;AAE7B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAqB,EAAE,6EAAC;AAEvC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAM,EAAE,mFAAC;AAE9B,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAoB,EAAE,uFAAC;;;QA+WvC,IAAA,CAAA,mBAAmB,GAAG,MAAW;;AAExC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,YAAA,IAAI,KAAK;gBACP,SAAS,CAAC,MAAK;AACb,oBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,IAAI,CAAC;AACnC,gBAAA,CAAC,CAAC;AACN,QAAA,CAAC;AAjXC,QAAA,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC;IAClC;;;IAKA,SAAS,CAAC,IAAO,EAAE,KAAa,EAAA;AAC9B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,OAAO,IAAI,GAAI,IAAgC,CAAC,IAAI,CAAC,GAAG,KAAK;IAC/D;AAEA;;;;;;;;;;;;AAYG;IACH,WAAW,CAAC,GAAW,EAAE,KAAiB,EAAA;AACxC,QAAA,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC;AACtD,QAAA,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;IACrB;AAEA;;;;;;;;;;;AAWG;;IAEH,iBAAiB,CAAC,GAAW,EAAE,KAAiB,EAAA;AAC9C,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;IAChC;AAEA;;;;;;;;;;;AAWG;AACH,IAAA,kBAAkB,CAAC,GAAa,EAAA;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC;AAC5B,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;IACjC;AAEA;;;;;;;;;;;AAWG;AACH,IAAA,YAAY,CAAC,GAAa,EAAA;AACxB,QAAA,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;AACnB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;IAC3B;;;AAMA;;;;;;;;;;;;;;;;AAgBG;AACH,IAAA,eAAe,CAAC,OAAsC,EAAA;QACpD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,IAAI,KAAI;YACZ;gBACE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK;AAC5B,gBAAA,OAAO,GAAG;YACZ;QACF,CAAC,EACD,EAAuB,CACxB;AACD,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,GAAG,aAAa,EAAE,CAAC;IAC7E;AAEA;;;;;;;;;;;;;;;;;;;;AAoBG;AACH,IAAA,SAAS,CAAC,KAAU,EAAE,QAAQ,GAAG,IAAI,EAAA;AACnC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC;QAC1C,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;QAC3B;IACF;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;AACH,IAAA,eAAe,CAAC,GAAa,EAAA;AAC3B,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,CAAC;AACrB,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,CAAS,GAAG,CAAC;AACtC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,CAAE,IAAgC,CAAC,MAAM,CAAW,CAAC,CAAC;QAC1G,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QACjD,IAAI,YAAY,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;AAChC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,OAAO,YAAY;IACrB;AAEA;;;;;;;;;;AAUG;AACH,IAAA,WAAW,CAAC,KAAe,EAAA;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC;IAChC;AAEA;;;;;;;AAOG;AACH,IAAA,MAAM,CAAC,KAAa,EAAA;QAClB,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B;AAEA;;;;;;;;AAQG;AACH,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC;IAClC;AAEA;;;;;;;;;AASG;IACH,KAAK,CAAC,MAAM,GAAG,KAAK,EAAA;QAClB,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B;AAEA;;;;;;;;AAQG;IACH,OAAO,GAAA;AACL,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;QAC1B,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;gBACrB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAG,CAAC,IAAI,CAAC;YACxC;;AAAO,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,IAAI,CAAC;QAC1C;IACF;AAEA;;;;;;;;AAQG;IACH,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC;AAEA;;;;;;;;;AASG;AACH,IAAA,UAAU,CAAC,SAAoB,EAAA;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;IACxC;AAEA;;;;;;;;;;AAUG;AACH,IAAA,QAAQ,CAAC,IAAY,EAAA;AACnB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS,CAAC;AACtG,YAAA,IAAI,EAAE,CAAC,GAAiB,KAAI;AAC1B,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;AAC1B,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;AAC1E,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YACtB,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;;AAEb,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,gBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;YACpB;AACD,SAAA,CAAC;IACJ;;;AAMA;;;;;AAKG;AACH,IAAA,aAAa,CAAC,KAAkC,EAAA;QAC9C,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;AACzB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE;YACrC,CAAC,OAAO,KAAK,KAAK;AAChB,kBAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE;AACvE,kBAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,EAChD,SAAS,CAAC;AACV,gBAAA,IAAI,EAAE,CAAC,GAAiB,KAAI;AAC1B,oBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;AAC1B,oBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;AAC1E,oBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtB,CAAC;AACD,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,oBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,oBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;gBACpB;AACD,aAAA,CAAC;QACJ;IACF;AAEA,IAAA,gBAAgB,CAAC,YAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CACjB,YAAY,CAAC;AACX,cAAE;gBACE,KAAK,EAAE,YAAY,CAAC,aAAa;AACjC,gBAAA,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,UAAU;AACrC,gBAAA,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC;AAC3B;cACD,SAAS,CACd;IACH;;;AAMS,IAAA,mBAAmB;+GAjrBjB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,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,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClG/B,qqCAmCA,EAAA,MAAA,EAAA,CAAA,6gBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDkDI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,oBAAoB,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,uBAAuB,+DACvB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAQT,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAhB9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,OAAA,EACjB;wBACP,YAAY;wBACZ,aAAa;wBACb,oBAAoB;wBACpB,mBAAmB;wBACnB,uBAAuB;wBACvB;qBACD,EAAA,IAAA,EAGK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,EAAA,eAAA,EAC/B,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,qqCAAA,EAAA,MAAA,EAAA,CAAA,6gBAAA,CAAA,EAAA;4FA+BN,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAYD,kBAAkB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAcjB,mBAAmB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AErJpE,MAAM,GAAG,GAAG,CAAC,kBAAkB,CAAC;MAKnB,kBAAkB,CAAA;+GAAlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;gHAAlB,kBAAkB,EAAA,OAAA,EAAA,CALlB,kBAAkB,CAAA,EAAA,OAAA,EAAA,CAAlB,kBAAkB,CAAA,EAAA,CAAA,CAAA;AAKlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,YAHpB,GAAG,CAAA,EAAA,CAAA,CAAA;;4FAGD,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,GAAG;AACZ,oBAAA,OAAO,EAAE;AACV,iBAAA;;;ACPD;;AAEG;;;;"}