igniteui-angular 22.2.0-rc.1 → 22.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +1 -1
  2. package/button-group/README.md +42 -9
  3. package/calendar/README.md +30 -20
  4. package/card/README.md +1 -1
  5. package/fesm2022/igniteui-angular-accordion.mjs +7 -7
  6. package/fesm2022/igniteui-angular-action-strip.mjs +11 -22
  7. package/fesm2022/igniteui-angular-action-strip.mjs.map +1 -1
  8. package/fesm2022/igniteui-angular-avatar.mjs +7 -7
  9. package/fesm2022/igniteui-angular-badge.mjs +7 -7
  10. package/fesm2022/igniteui-angular-banner.mjs +10 -10
  11. package/fesm2022/igniteui-angular-bottom-nav.mjs +22 -22
  12. package/fesm2022/igniteui-angular-button-group.mjs +32 -35
  13. package/fesm2022/igniteui-angular-button-group.mjs.map +1 -1
  14. package/fesm2022/igniteui-angular-calendar.mjs +132 -180
  15. package/fesm2022/igniteui-angular-calendar.mjs.map +1 -1
  16. package/fesm2022/igniteui-angular-card.mjs +47 -58
  17. package/fesm2022/igniteui-angular-card.mjs.map +1 -1
  18. package/fesm2022/igniteui-angular-carousel.mjs +22 -22
  19. package/fesm2022/igniteui-angular-chat-extras.mjs +6 -6
  20. package/fesm2022/igniteui-angular-chat.mjs +12 -12
  21. package/fesm2022/igniteui-angular-checkbox.mjs +7 -7
  22. package/fesm2022/igniteui-angular-chips.mjs +10 -10
  23. package/fesm2022/igniteui-angular-combo.mjs +66 -60
  24. package/fesm2022/igniteui-angular-combo.mjs.map +1 -1
  25. package/fesm2022/igniteui-angular-core.mjs +107 -79
  26. package/fesm2022/igniteui-angular-core.mjs.map +1 -1
  27. package/fesm2022/igniteui-angular-date-picker.mjs +38 -38
  28. package/fesm2022/igniteui-angular-dialog.mjs +13 -13
  29. package/fesm2022/igniteui-angular-directives.mjs +194 -194
  30. package/fesm2022/igniteui-angular-drop-down.mjs +29 -29
  31. package/fesm2022/igniteui-angular-expansion-panel.mjs +28 -28
  32. package/fesm2022/igniteui-angular-grids-core.mjs +737 -661
  33. package/fesm2022/igniteui-angular-grids-core.mjs.map +1 -1
  34. package/fesm2022/igniteui-angular-grids-grid.mjs +69 -58
  35. package/fesm2022/igniteui-angular-grids-grid.mjs.map +1 -1
  36. package/fesm2022/igniteui-angular-grids-hierarchical-grid.mjs +37 -37
  37. package/fesm2022/igniteui-angular-grids-lite.mjs +25 -17
  38. package/fesm2022/igniteui-angular-grids-lite.mjs.map +1 -1
  39. package/fesm2022/igniteui-angular-grids-pivot-grid.mjs +92 -81
  40. package/fesm2022/igniteui-angular-grids-pivot-grid.mjs.map +1 -1
  41. package/fesm2022/igniteui-angular-grids-tree-grid.mjs +55 -55
  42. package/fesm2022/igniteui-angular-icon.mjs +10 -10
  43. package/fesm2022/igniteui-angular-input-group.mjs +25 -25
  44. package/fesm2022/igniteui-angular-list.mjs +40 -40
  45. package/fesm2022/igniteui-angular-navbar.mjs +13 -13
  46. package/fesm2022/igniteui-angular-navigation-drawer.mjs +43 -38
  47. package/fesm2022/igniteui-angular-navigation-drawer.mjs.map +1 -1
  48. package/fesm2022/igniteui-angular-paginator.mjs +19 -19
  49. package/fesm2022/igniteui-angular-progressbar.mjs +19 -19
  50. package/fesm2022/igniteui-angular-query-builder.mjs +22 -22
  51. package/fesm2022/igniteui-angular-radio.mjs +25 -21
  52. package/fesm2022/igniteui-angular-radio.mjs.map +1 -1
  53. package/fesm2022/igniteui-angular-select.mjs +25 -25
  54. package/fesm2022/igniteui-angular-simple-combo.mjs +9 -9
  55. package/fesm2022/igniteui-angular-simple-combo.mjs.map +1 -1
  56. package/fesm2022/igniteui-angular-slider.mjs +28 -28
  57. package/fesm2022/igniteui-angular-snackbar.mjs +7 -7
  58. package/fesm2022/igniteui-angular-splitter.mjs +13 -13
  59. package/fesm2022/igniteui-angular-stepper.mjs +34 -34
  60. package/fesm2022/igniteui-angular-switch.mjs +7 -7
  61. package/fesm2022/igniteui-angular-tabs.mjs +34 -34
  62. package/fesm2022/igniteui-angular-time-picker.mjs +19 -19
  63. package/fesm2022/igniteui-angular-toast.mjs +7 -7
  64. package/fesm2022/igniteui-angular-tree.mjs +28 -28
  65. package/fesm2022/igniteui-angular-virtual-scroll.mjs +497 -145
  66. package/fesm2022/igniteui-angular-virtual-scroll.mjs.map +1 -1
  67. package/migrations/common/UpdateChanges.d.ts +25 -5
  68. package/migrations/common/UpdateChanges.js +218 -34
  69. package/migrations/common/UpdateChanges.spec.js +763 -0
  70. package/migrations/migration-collection.json +1 -1
  71. package/migrations/update-22_2_0/index.js +145 -0
  72. package/migrations/update-22_2_0/index.spec.js +133 -0
  73. package/navigation-drawer/README.md +1 -1
  74. package/package.json +4 -4
  75. package/schematics/tsconfig.tsbuildinfo +1 -1
  76. package/skills/igniteui-angular-components/SKILL.md +9 -5
  77. package/skills/igniteui-angular-components/references/form-controls.md +1 -1
  78. package/skills/igniteui-angular-components/references/mcp-setup.md +14 -2
  79. package/skills/igniteui-angular-figma-to-app/SKILL.md +112 -525
  80. package/skills/igniteui-angular-figma-to-app/references/asset-extraction.md +49 -75
  81. package/skills/igniteui-angular-figma-to-app/references/design-provenance.md +201 -0
  82. package/skills/igniteui-angular-figma-to-app/references/design-token-bridge.md +175 -52
  83. package/skills/igniteui-angular-figma-to-app/references/figma-component-map.md +153 -99
  84. package/skills/igniteui-angular-figma-to-app/references/figma-exploration.md +226 -0
  85. package/skills/igniteui-angular-figma-to-app/references/mcp-setup.md +71 -105
  86. package/skills/igniteui-angular-figma-to-app/references/project-setup.md +63 -0
  87. package/skills/igniteui-angular-figma-to-app/references/theme-generation.md +120 -0
  88. package/skills/igniteui-angular-figma-to-app/references/validation-patterns.md +48 -50
  89. package/skills/igniteui-angular-generate-from-image-design/SKILL.md +11 -7
  90. package/skills/igniteui-angular-grids/SKILL.md +7 -3
  91. package/skills/igniteui-angular-grids/references/editing.md +1 -2
  92. package/skills/igniteui-angular-grids/references/grid-migration.md +1 -1
  93. package/skills/igniteui-angular-theming/SKILL.md +9 -5
  94. package/skills/igniteui-angular-theming/references/mcp-setup.md +12 -2
  95. package/types/igniteui-angular-button-group.d.ts +49 -34
  96. package/types/igniteui-angular-calendar.d.ts +33 -50
  97. package/types/igniteui-angular-card.d.ts +12 -17
  98. package/types/igniteui-angular-combo.d.ts +6 -0
  99. package/types/igniteui-angular-core.d.ts +10 -2
  100. package/types/igniteui-angular-grids-core.d.ts +48 -4
  101. package/types/igniteui-angular-grids-grid.d.ts +4 -0
  102. package/types/igniteui-angular-grids-lite.d.ts +5 -1
  103. package/types/igniteui-angular-grids-pivot-grid.d.ts +5 -1
  104. package/types/igniteui-angular-navigation-drawer.d.ts +1 -0
  105. package/types/igniteui-angular-radio.d.ts +5 -0
  106. package/types/igniteui-angular-virtual-scroll.d.ts +41 -13
  107. package/virtual-scroll/README.md +32 -1
@@ -1 +1 @@
1
- {"version":3,"file":"igniteui-angular-virtual-scroll.mjs","sources":["../../../projects/igniteui-angular/virtual-scroll/src/virtual-scroll/scroll-engine.ts","../../../projects/igniteui-angular/virtual-scroll/src/virtual-scroll/types.ts","../../../projects/igniteui-angular/virtual-scroll/src/virtual-scroll/virtual-scroll-item.directive.ts","../../../projects/igniteui-angular/virtual-scroll/src/virtual-scroll/virtual-scroll.component.ts","../../../projects/igniteui-angular/virtual-scroll/src/virtual-scroll/virtual-scroll.component.html","../../../projects/igniteui-angular/virtual-scroll/src/igniteui-angular-virtual-scroll.ts"],"sourcesContent":["import { computed, signal } from \"@angular/core\";\nimport { clamp } from \"igniteui-angular/core\";\nimport type { ScrollAlignment, VisibleRange } from \"./types\";\n\n/** The maximum scroll coordinate is a per-document constant, so probe once. */\nconst _maxBrowserSizeCache = new WeakMap<Document, number>();\n\n/** Measures the largest scroll coordinate the browser can represent. */\nfunction probeMaxBrowserSize(doc: Document): number {\n const cached = _maxBrowserSizeCache.get(doc);\n if (cached !== undefined) {\n return cached;\n }\n\n const container = doc.body ?? doc.documentElement;\n if (!container) {\n return Number.POSITIVE_INFINITY;\n }\n\n const probe = doc.createElement(\"div\");\n probe.style.position = \"absolute\";\n probe.style.top = `${Number.MAX_SAFE_INTEGER}px`;\n probe.style.width = \"0\";\n probe.style.height = \"0\";\n probe.style.visibility = \"hidden\";\n container.appendChild(probe);\n\n // The rect is viewport relative, so add back how far the document is scrolled.\n const scrollOffset = doc.documentElement?.scrollTop ?? 0;\n const size = Math.abs(probe.getBoundingClientRect().top) + scrollOffset;\n container.removeChild(probe);\n\n _maxBrowserSizeCache.set(doc, size);\n return size;\n}\n\n/**\n * Fills `tree` with the partial range sums of `sizes` in one O(N) pass.\n * `tree` is a 1-indexed Fenwick array of `sizes.length + 1` zeroed entries.\n * Returns the total sum.\n */\nfunction buildTree(tree: Float64Array, sizes: Float64Array): number {\n const length = sizes.length;\n let total = 0;\n\n for (let i = 1; i <= length; i++) {\n tree[i] += sizes[i - 1];\n total += sizes[i - 1];\n\n const parent = i + (i & -i);\n if (parent <= length) {\n tree[parent] += tree[i];\n }\n }\n return total;\n}\n\n/**\n * Binary Indexed Tree (Fenwick tree) over item sizes. Each hot-path operation\n * is O(log N): point update (item measured), prefix sum (scroll offset), and\n * index at offset (scroll to item, through binary lifting).\n */\nclass SizeTree {\n public readonly length: number;\n\n /** A 1-indexed BIT. Each cell holds a partial range sum. */\n private readonly _tree: Float64Array;\n\n /** Raw per-item sizes, 0-indexed. Kept for O(1) reads and delta calculation. */\n private readonly _sizes: Float64Array;\n\n /**\n * Flags the indices holding a DOM-measured size (`1`) instead of an\n * estimate (`0`). `applyEstimate` changes only the estimated entries.\n */\n private readonly _measured: Uint8Array;\n\n /** Running total. Updated together with the tree in O(1). */\n private _total: number;\n\n /**\n * The highest power of two <= `length`, for the binary lifting in\n * `findIndexAtOffset`. Precomputed because that runs on each scroll event.\n */\n private readonly _topBit: number;\n\n private constructor(\n sizes: Float64Array,\n tree: Float64Array,\n total: number,\n measured: Uint8Array,\n ) {\n this.length = sizes.length;\n this._sizes = sizes;\n this._tree = tree;\n this._total = total;\n this._measured = measured;\n this._topBit = this.length > 0 ? 1 << (31 - Math.clz32(this.length)) : 0;\n }\n\n /** Creates a tree of `length` unmeasured items, each set to `fillSize`. O(N). */\n public static filled(length: number, fillSize: number): SizeTree {\n return SizeTree._build(\n new Float64Array(length).fill(fillSize),\n new Uint8Array(length),\n );\n }\n\n /** Builds a tree from a sizes array and its matching measured flags. O(N). */\n private static _build(sizes: Float64Array, measured: Uint8Array): SizeTree {\n const tree = new Float64Array(sizes.length + 1);\n const total = buildTree(tree, sizes);\n return new SizeTree(sizes, tree, total, measured);\n }\n\n /** Total size of all items. O(1). */\n public get totalSize(): number {\n return this._total;\n }\n\n /**\n * Prefix sum of items [0, i): the virtual scroll offset at the leading\n * edge of item i. O(log N).\n */\n public prefixSum(i: number): number {\n let sum = 0;\n for (let j = i; j > 0; j -= j & -j) {\n sum += this._tree[j];\n }\n return sum;\n }\n\n /**\n * Sets the size of the item at a 0-based index and marks it measured, so\n * later `applyEstimate` calls leave it alone. Returns true when the size\n * changed. O(log N).\n */\n public update(index: number, newSize: number): boolean {\n if (index < 0 || index >= this.length) {\n return false;\n }\n\n const old = this._sizes[index];\n this._measured[index] = 1;\n\n if (old === newSize) {\n return false;\n }\n\n const delta = newSize - old;\n this._sizes[index] = newSize;\n this._total += delta;\n\n for (let i = index + 1; i <= this.length; i += i & -i) {\n this._tree[i] += delta;\n }\n return true;\n }\n\n /**\n * Returns a new tree of `newLength` items in one O(N) pass. Sizes and\n * measured flags are kept up to `min(this.length, newLength, retainCount)`.\n * The remainder is filled with `fillSize` and marked unmeasured. Pass a\n * `retainCount` below the item count when the data behind those indices\n * changed identity.\n */\n public cloneResized(\n newLength: number,\n fillSize: number,\n retainCount = newLength,\n ): SizeTree {\n const sizes = new Float64Array(newLength).fill(fillSize);\n const measured = new Uint8Array(newLength);\n const retained = Math.max(0, Math.min(this.length, newLength, retainCount));\n\n sizes.set(this._sizes.subarray(0, retained));\n measured.set(this._measured.subarray(0, retained));\n return SizeTree._build(sizes, measured);\n }\n\n /**\n * Sets `estimatedSize` on each unmeasured item. Returns true when at least\n * one size changed.\n *\n * One estimate change can touch most of the list, so this rebuilds in one\n * O(N) pass instead of one O(log N) `update` per item.\n */\n public applyEstimate(estimatedSize: number): boolean {\n let changed = false;\n\n for (let i = 0; i < this.length; i++) {\n if (!this._measured[i] && this._sizes[i] !== estimatedSize) {\n this._sizes[i] = estimatedSize;\n changed = true;\n }\n }\n\n if (!changed) {\n return false;\n }\n\n this._tree.fill(0);\n this._total = buildTree(this._tree, this._sizes);\n return true;\n }\n\n /**\n * Returns the 0-based index of the item containing the scroll `offset`:\n * the largest i where `prefixSum(i) <= offset < prefixSum(i + 1)`. O(log N).\n */\n public findIndexAtOffset(offset: number): number {\n if (offset <= 0 || this.length === 0) {\n return 0;\n }\n\n let index = 0;\n let remaining = offset;\n\n for (let bit = this._topBit; bit > 0; bit >>= 1) {\n const next = index + bit;\n if (next <= this.length && this._tree[next] <= remaining) {\n index = next;\n remaining -= this._tree[index];\n }\n }\n return Math.min(this.length - 1, index);\n }\n}\n\n/**\n * Pure scroll-math engine for one axis of virtual scrolling. A Fenwick tree\n * holds all size state, exposed through signals so downstream `computed()`\n * values (visible range, spacer size, translate offset) react to any change\n * of item sizes or item count.\n *\n * ### Virtual and DOM coordinates\n *\n * Browsers limit how far an element can scroll. When the total item size is\n * larger than that limit, the engine maps the *virtual* scroll range\n * (`0…totalSize - viewport`) onto the *DOM* scroll range the browser can\n * represent (`0…domSize - viewport`), see `_scrollRanges`. Incoming scroll\n * positions are converted to virtual offsets, outgoing offsets to DOM ones.\n * Items render at their real pixel size, so item sizes are always virtual.\n */\nexport class VirtualScrollEngine {\n private _maxBrowserSize = Number.POSITIVE_INFINITY;\n\n private _tree: SizeTree | null = null;\n\n /** Bumped on every structural change: resize, measurement or estimate. */\n private readonly _version = signal(0);\n\n /**\n * Read this from a `computed()` to make it recompute on any size change.\n * `totalSize` and `domSize` already do.\n */\n public readonly version = this._version.asReadonly();\n\n /** Total virtual size of all items in px. */\n public readonly totalSize = computed<number>(() => {\n this._version();\n return this._tree?.totalSize ?? 0;\n });\n\n /**\n * Total size in DOM space, clamped to the maximum browser size.\n *\n * Depends on `_version` directly rather than on `totalSize()`. The maximum\n * can change while the total does not (it is probed after the first\n * render), and an unchanged `totalSize` would not propagate.\n */\n public readonly domSize = computed<number>(() => {\n this._version();\n return Math.min(this._tree?.totalSize ?? 0, this._maxBrowserSize);\n });\n\n /**\n * Probes the document's maximum scroll coordinate and rescales. Notifies,\n * because the probe can only run after the first render, by which point\n * `domSize` has already been read at the uncompressed total.\n */\n public initMaxBrowserSize(doc: Document): void {\n this._maxBrowserSize = probeMaxBrowserSize(doc);\n this._invalidate();\n }\n\n /**\n * Resizes the internal sizes array to `length`. Measured sizes below\n * `retainCount` are kept, the remainder falls back to `estimatedSize`.\n * Callers that only append can keep the default `retainCount`. Callers\n * whose data changed identity at some index must pass that index, so the\n * stale measurements after it are discarded.\n */\n public resize(\n length: number,\n estimatedSize: number,\n retainCount = length,\n ): void {\n if (this._tree?.length === length && retainCount >= length) {\n return;\n }\n\n this._tree = this._tree\n ? this._tree.cloneResized(length, estimatedSize, retainCount)\n : SizeTree.filled(length, estimatedSize);\n this._invalidate();\n }\n\n /** Records the measured DOM size for a single item. */\n public measureItem(index: number, size: number): void {\n if (this._tree?.update(index, size)) {\n this._invalidate();\n }\n }\n\n /**\n * Applies a new estimate to every item not yet measured in the DOM. Use\n * this when `estimatedItemSize` changes but the item count does not,\n * because `resize` is then a no-op.\n */\n public updateEstimatedSize(estimatedSize: number): void {\n if (this._tree?.applyEstimate(estimatedSize)) {\n this._invalidate();\n }\n }\n\n /**\n * Returns the DOM scroll offset in px that puts the item at `index` at the\n * leading edge of a `viewportSize` px viewport.\n */\n public getScrollOffsetForIndex(index: number, viewportSize: number): number {\n if (!this._tree || index <= 0) {\n return 0;\n }\n return this._toDom(\n this._tree.prefixSum(Math.min(index, this._tree.length)),\n viewportSize,\n );\n }\n\n /**\n * Returns the DOM scroll offset that positions the item at `index` in a\n * `viewportSize` px viewport, aligned by `align` and clamped to the\n * reachable scroll range.\n *\n * The slack is computed in virtual space against the item's real size and\n * converted to DOM space once, at the end. Under compression one DOM pixel\n * is several virtual pixels, so mixed coordinates would scale the slack.\n */\n public getAlignedScrollOffset(\n index: number,\n viewportSize: number,\n align: ScrollAlignment,\n ): number {\n const bounds = this._itemBounds(index);\n if (!bounds) {\n return 0;\n }\n\n const [start, end] = bounds;\n const slack = viewportSize - Math.max(0, end - start);\n let offset = start;\n\n if (align === \"center\") {\n offset -= slack / 2;\n } else if (align === \"end\") {\n offset -= slack;\n }\n\n return clamp(\n this._toDom(offset, viewportSize),\n 0,\n Math.max(0, this.domSize() - viewportSize),\n );\n }\n\n /**\n * The alignment `scrollIntoView({ block: 'nearest' })` resolves to for the\n * item at `index` at the given DOM scroll position: `start` for an item\n * before the viewport, `end` for one past it, and `null` for one that needs\n * no scrolling because it is fully inside the viewport, or larger than the\n * viewport and covering it.\n */\n public getNearestAlignment(\n index: number,\n scrollPosition: number,\n viewportSize: number,\n ): ScrollAlignment | null {\n const bounds = this._itemBounds(index);\n if (!bounds) {\n return null;\n }\n\n const [start, end] = bounds;\n const viewStart = this._toVirtual(scrollPosition, viewportSize);\n const viewEnd = viewStart + viewportSize;\n\n const contained = start >= viewStart && end <= viewEnd;\n const spanning = start <= viewStart && end >= viewEnd;\n if (contained || spanning) {\n return null;\n }\n return start < viewStart ? \"start\" : \"end\";\n }\n\n /** Returns the visible and over-scanned item range for the given scroll state. */\n public getVisibleRange(\n scrollPosition: number,\n viewportSize: number,\n overScan: number,\n ): VisibleRange {\n if (!this._tree || this._tree.length === 0 || viewportSize <= 0) {\n return { startIndex: 0, endIndex: -1 };\n }\n\n // The viewport is not compressed. Items render at their real pixel size,\n // so a `viewportSize` px viewport always shows that many virtual pixels of\n // items, at any compression of the scroll range.\n const startOffset = this._toVirtual(scrollPosition, viewportSize);\n const first = this._tree.findIndexAtOffset(startOffset);\n const last = this._tree.findIndexAtOffset(startOffset + viewportSize);\n\n return {\n startIndex: Math.max(0, first - overScan),\n endIndex: Math.min(this._tree.length - 1, last + overScan),\n };\n }\n\n /**\n * Sum of the real sizes of the items in [startIndex, endIndex]. The render\n * pass uses it to clamp the content translate offset, so rendered items do\n * not overflow past `domSize` under coordinate compression.\n */\n public getPhysicalRangeSize(startIndex: number, endIndex: number): number {\n if (!this._tree) {\n return 0;\n }\n\n const start = Math.max(0, startIndex);\n const end = Math.min(Math.max(endIndex + 1, start), this._tree.length);\n return this._tree.prefixSum(end) - this._tree.prefixSum(start);\n }\n\n /**\n * The virtual [start, end] offsets of the item at `index`, clamped into the\n * item range. Null while there are no items.\n */\n private _itemBounds(index: number): [number, number] | null {\n if (!this._tree || this._tree.length === 0) {\n return null;\n }\n\n const clamped = clamp(index, 0, this._tree.length - 1);\n return [this._tree.prefixSum(clamped), this._tree.prefixSum(clamped + 1)];\n }\n\n private _invalidate(): void {\n this._version.update((v) => v + 1);\n }\n\n /**\n * A virtual offset as the DOM scroll position that shows it, for a\n * `viewportSize` px viewport.\n */\n private _toDom(virtualOffset: number, viewportSize: number): number {\n const [virtualRange, domRange] = this._scrollRanges(viewportSize);\n return (virtualOffset * domRange) / virtualRange;\n }\n\n /**\n * A DOM scroll position as the virtual offset it shows, for a\n * `viewportSize` px viewport.\n */\n private _toVirtual(domOffset: number, viewportSize: number): number {\n const [virtualRange, domRange] = this._scrollRanges(viewportSize);\n return (Math.max(0, domOffset) * virtualRange) / domRange;\n }\n\n /**\n * The virtual and DOM scroll ranges to map between; the identity while the\n * content fits the browser's limit. One viewport of items renders at real\n * size at any scroll position, so both ranges exclude it: mapping the totals\n * instead would leave the last `viewport * (ratio - 1)` virtual pixels past\n * the largest DOM offset. Callers multiply before dividing, so exact\n * positions come back exact.\n */\n private _scrollRanges(viewportSize: number): [number, number] {\n const totalSize = this._tree?.totalSize ?? 0;\n const domRange = this._maxBrowserSize - viewportSize;\n\n if (totalSize <= this._maxBrowserSize || domRange <= 0) {\n return [1, 1];\n }\n return [totalSize - viewportSize, domRange];\n }\n}\n","/** Template context for a single item of the virtual scroll. */\nexport class IgxVsItemContext<T> {\n constructor(\n /** The current item in the virtual scroll. */\n public $implicit: T,\n /** The index of the current item. */\n public index: number,\n /** The total number of items in the virtual scroll. */\n public count: number,\n ) {}\n\n /** Whether the current item is the first in the list. */\n public get first(): boolean {\n return this.index === 0;\n }\n\n /** Whether the current item is the last in the list. */\n public get last(): boolean {\n return this.index === this.count - 1;\n }\n\n /** Whether the current item is at an even index. */\n public get even(): boolean {\n return this.index % 2 === 0;\n }\n\n /** Whether the current item is at an odd index. */\n public get odd(): boolean {\n return !this.even;\n }\n}\n\n/**\n * How `scrollToIndex` positions the requested item in the viewport.\n * The subset of `ScrollLogicalPosition` that the engine supports.\n */\nexport type ScrollAlignment = \"start\" | \"center\" | \"end\";\n\n/** The currently rendered (visible plus over-scanned) range of items. */\nexport interface VisibleRange {\n /** Index of the first rendered item, inclusive. */\n startIndex: number;\n /** Index of the last rendered item, inclusive. */\n endIndex: number;\n}\n\n/** Snapshot of the currently rendered virtual window. */\nexport interface VirtualScrollState extends VisibleRange {\n /** The size of the viewport in pixels. */\n viewportSize: number;\n /** The total size of the virtual scroll content in pixels. */\n totalSize: number;\n}\n\n/**\n * A loaded page of a larger collection, for data that arrives a page at a time.\n *\n * The list is sized by `totalCount` while only `items` are in memory. Indices are indices\n * in the whole collection: the item at `index` is `items[index - startIndex]`, and indices\n * the page does not cover render nothing.\n *\n * Measured sizes are kept per index across pages while `totalCount` holds: the indices still\n * mean the same records. A page with another `totalCount` is a different collection, and\n * every size is measured again. A page that keeps the count but puts different records at\n * the same indices keeps the sizes measured for the previous ones until those rows render.\n */\nexport interface VirtualDataWindow<T> {\n /** The loaded items. */\n readonly items: readonly T[];\n /** The index `items[0]` has in the whole collection. */\n readonly startIndex: number;\n /** How many items the whole collection has. */\n readonly totalCount: number;\n}\n\n/**\n * Request for more data, emitted when the rendered window nears the end of\n * the loaded items. Listen to it to implement infinite / remote scrolling.\n */\nexport interface VirtualScrollDataRequest {\n /** The first index that does not yet have data. */\n startIndex: number;\n /** Number of items being requested. */\n count: number;\n}\n","import { Directive, inject, TemplateRef } from \"@angular/core\";\nimport { IgxVsItemContext } from \"./types\";\n\n/**\n * Directive to mark an `ng-template` as the item template for the virtual scroll component.\n * The template provided by this directive will be used to render each item in the virtual scroll.\n * The context for the template will include the item data and its index.\n *\n * @example\n * ```html\n * <igx-virtual-scroll [data]=\"items\">\n * <ng-template igxVirtualItem let-item let-i=\"index\">\n * <div>{{ i }}: {{ item }}</div>\n * </ng-template>\n * </igx-virtual-scroll>\n * ```\n */\n@Directive({ selector: \"ng-template[igxVirtualItem]\" })\nexport class IgxVirtualItemDirective<T = unknown> {\n public readonly template =\n inject<TemplateRef<IgxVsItemContext<T>>>(TemplateRef);\n}\n","import { isPlatformBrowser, NgTemplateOutlet } from \"@angular/common\";\nimport {\n afterNextRender,\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DOCUMENT,\n effect,\n ElementRef,\n inject,\n input,\n NgZone,\n OnDestroy,\n output,\n PLATFORM_ID,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewEncapsulation,\n} from \"@angular/core\";\nimport { clamp, isLeftToRight } from \"igniteui-angular/core\";\nimport { VirtualScrollEngine } from \"./scroll-engine\";\nimport {\n IgxVsItemContext,\n VirtualDataWindow,\n VirtualScrollDataRequest,\n VirtualScrollState,\n VisibleRange,\n} from \"./types\";\nimport { IgxVirtualItemDirective } from \"./virtual-scroll-item.directive\";\n\n/** Defaults for the inputs, also used as the fallback for invalid values. */\nconst DEFAULT_OVER_SCAN = 2;\nconst DEFAULT_ESTIMATED_ITEM_SIZE = 50;\n\n/** How close to the end of `data` the window must get to emit `dataRequest`. */\nconst DATA_REQUEST_THRESHOLD = 5;\nconst DATA_REQUEST_MIN_COUNT = 20;\nconst DATA_REQUEST_OVER_SCAN_FACTOR = 4;\n\n/** Give-up bounds for the two loops that wait for the layout to stabilize. */\nconst MAX_LAYOUT_SETTLE_PASSES = 20;\nconst MAX_SCROLL_CORRECTION_PASSES = 5;\n\nconst SCROLL_END_TIMEOUT_MS = 2000;\nconst SCROLL_OFFSET_EPSILON_PX = 1;\n\n/** How long the scroll position must stay unchanged to count as settled. */\nconst SCROLL_IDLE_MS = 100;\n\n/**\n * Upper limit on one `requestAnimationFrame` wait. A hidden tab or a detached\n * element gets no frames, and `layoutComplete` must still resolve there.\n */\nconst LAYOUT_FRAME_TIMEOUT_MS = 100;\n\nconst EMPTY_RANGE: VisibleRange = Object.freeze({ startIndex: 0, endIndex: -1 });\n\n/** `data` and `dataWindow` seen as one thing: what is loaded, and where it sits. */\ninterface LoadedItems<T> extends VirtualDataWindow<T> {\n /** Whether this came from `dataWindow`, which is a page of something larger. */\n readonly windowed: boolean;\n}\n\n/** A consumer-supplied index, count or size, reduced to a whole non-negative number. */\nfunction toCount(value: number): number {\n const count = Math.trunc(value);\n return Number.isFinite(count) ? Math.max(0, count) : 0;\n}\n\nfunction loadedEqual<T>(a: LoadedItems<T>, b: LoadedItems<T>): boolean {\n return (\n a.items === b.items &&\n a.startIndex === b.startIndex &&\n a.totalCount === b.totalCount &&\n a.windowed === b.windowed\n );\n}\n\nfunction rangesEqual(a: VisibleRange, b: VisibleRange): boolean {\n return a.startIndex === b.startIndex && a.endIndex === b.endIndex;\n}\n\nfunction statesEqual(\n a: VirtualScrollState | null,\n b: VirtualScrollState,\n): boolean {\n return (\n a !== null &&\n rangesEqual(a, b) &&\n a.viewportSize === b.viewportSize &&\n a.totalSize === b.totalSize\n );\n}\n\n/** The data index an item wrapper carries, or -1 when it has none. */\nfunction itemIndex(element: Element): number {\n const index = Number.parseInt(\n (element as HTMLElement).dataset[\"index\"] ?? \"\",\n 10,\n );\n return Number.isInteger(index) && index >= 0 ? index : -1;\n}\n\nfunction onAbort(abort: AbortSignal, cancel: () => void): void {\n abort.addEventListener(\"abort\", cancel, { once: true });\n}\n\n/**\n * A virtual scroll component for large lists. Only the items visible in the\n * viewport (plus a configurable over-scan) are rendered.\n *\n * @igxKeywords virtual, scroll, virtualization, list\n * @igxGroup Grids & Lists\n *\n * @example\n * ```html\n * <igx-virtual-scroll [data]=\"items\" style=\"height: 400px\">\n * <ng-template igxVirtualItem let-item let-i=\"index\">\n * <div>{{ i }}: {{ item }}</div>\n * </ng-template>\n * </igx-virtual-scroll>\n * ```\n */\n@Component({\n selector: \"igx-virtual-scroll\",\n templateUrl: \"./virtual-scroll.component.html\",\n styleUrls: [\"./virtual-scroll.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [NgTemplateOutlet],\n host: {\n class: \"igx-virtual-scroll\",\n role: \"list\",\n \"[attr.data-orientation]\": \"orientation()\",\n },\n})\nexport class IgxVirtualScrollComponent<T> implements OnDestroy {\n //#region Dependency injection\n\n private readonly _hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _zone = inject(NgZone);\n private readonly _document = inject(DOCUMENT);\n private readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n //#endregion\n\n //#region Internal state\n\n private readonly _engine = new VirtualScrollEngine();\n\n private _viewportResizeObserver: ResizeObserver | null = null;\n private _itemResizeObserver: ResizeObserver | null = null;\n private _onScroll: (() => void) | null = null;\n\n /** Elements currently registered with the item resize observer. */\n private readonly _observedItems = new Set<Element>();\n\n /** The data index each observed wrapper element last hosted. */\n private readonly _observedItemIndexes = new WeakMap<Element, number>();\n\n /**\n * The live scroll offset on the active axis. A plain field, not a signal:\n * `_visibleRange` reads it but is invalidated by `_scrollTick`, so a scroll\n * that does not move the rendered window schedules no work.\n */\n private _scrollPosition = 0;\n\n /** Bumped only when a scroll actually moves the rendered window. */\n private readonly _scrollTick = signal(0);\n\n /** The measured viewport, or `null` while the host has never been laid out. */\n private readonly _viewportSize = signal<number | null>(null);\n\n /**\n * Whether the host is laid out left-to-right, as of the last read of the\n * horizontal axis. `_contentTransform` depends on it, so a `dir` change\n * flips the wrapper even while the rendered window stays put.\n */\n private readonly _ltr = signal(true);\n\n /** What was loaded as of the previous change, for `_retainCount`. */\n private _previousItems: LoadedItems<T> | undefined;\n\n private _lastEmittedState: VirtualScrollState | null = null;\n private _hasPendingDataRequest = false;\n\n /**\n * The `startIndex` of the last emitted `dataRequest`, which is also the\n * item count at that emit. See `_checkDataRequest`.\n */\n private _lastDataRequestIndex = -1;\n\n private _layoutCompletePromise: Promise<void> | null = null;\n private _scrollRequestId = 0;\n\n //#endregion\n\n //#region View and content children\n\n private readonly _itemDirective = contentChild(IgxVirtualItemDirective);\n\n private readonly _contentDivRef =\n viewChild<ElementRef<HTMLElement>>(\"contentDiv\");\n\n //#endregion\n\n //#region Public inputs\n\n /**\n * The array of items to virtualize.\n *\n * Compared by reference: mutating the array in place (`data.push(...)`)\n * causes no update. Assign a new array instead. The `dataRequest` flow\n * also expects a new array.\n */\n public readonly data = input<T[]>([]);\n\n /**\n * Scroll orientation of the virtual scroll.\n * Can be either \"vertical\" or \"horizontal\".\n * Default is \"vertical\".\n */\n public readonly orientation = input<\"vertical\" | \"horizontal\">(\"vertical\");\n\n /**\n * Number of extra items to render beyond the visible area of the viewport.\n * Higher values reduce blank flashes during fast scrolling but may impact performance.\n * Default is 2.\n */\n public readonly overScan = input<number>(DEFAULT_OVER_SCAN);\n\n /**\n * Estimated item size in pixels used before an item is measured in the DOM.\n * The engine replaces this with the actual measured size after the first render of each item.\n * Default is 50 pixels.\n * Setting this to a value close to the actual average item size can improve initial rendering performance.\n */\n public readonly estimatedItemSize = input<number>(DEFAULT_ESTIMATED_ITEM_SIZE);\n\n /**\n * A loaded page of a larger collection, for data that arrives a page at a time.\n *\n * Takes the place of `data` while it is set. The list is as long as `totalCount`, so the\n * scrollbar spans the whole collection while only the page is in memory. Indices the page\n * does not cover render nothing; use `stateChange` to see which range is wanted and supply\n * the page that covers it.\n *\n * Measured sizes are kept per index across pages while `totalCount` holds: the indices still\n * mean the same records. A page with another `totalCount` is a different collection, and\n * every size is measured again. A page that keeps the count but puts different records at\n * the same indices keeps the sizes measured for the previous ones until those rows render.\n *\n * @example\n * ```html\n * <igx-virtual-scroll [dataWindow]=\"page\" (stateChange)=\"load($event)\" style=\"height: 400px\">\n * <ng-template igxVirtualItem let-item>{{ item?.name }}</ng-template>\n * </igx-virtual-scroll>\n * ```\n */\n public readonly dataWindow = input<VirtualDataWindow<T> | null>(null);\n\n /**\n * @hidden @internal\n *\n * Viewport size in pixels to render the first window against, for a list that is hidden\n * until the change detection pass that reveals it and so has no size to measure in it.\n *\n * A hint for that first render: once the host has been laid out its own size takes over,\n * zero included. Changing `orientation` begins an axis with no measurement of its own, so\n * the hint applies again there. Negative, `NaN` and infinite values count as no hint.\n *\n * A workaround for the drop-down family, which reads and focuses items in the pass that\n * opens the list. To be removed once those components render their list on reveal.\n */\n public readonly initialViewportSize = input<number>(0);\n\n /**\n * Item template provided programmatically. Takes precedence over a content\n * `ng-template[igxVirtualItem]` when both are provided.\n *\n * Items are measured by their border box, so margins accumulate as drift\n * down the list. Use padding on the item, or a gap on a wrapper, instead.\n *\n * Only the current window is in the DOM, so assistive technology cannot\n * infer an item's position from the markup. Templates that render a role\n * with set semantics (`listitem`, `option`, `row`, ...) should map the\n * context's `index` and `count` onto `aria-posinset` and `aria-setsize`.\n */\n public readonly itemTemplate = input<TemplateRef<IgxVsItemContext<T>> | null>(\n null,\n );\n\n //#endregion\n\n //#region Public outputs\n\n /** Emitted when the rendered virtual window changes. */\n public readonly stateChange = output<VirtualScrollState>();\n\n /**\n * Emitted when the rendered window comes within a few items of the end of\n * `data`. Also emitted on the first render, when the loaded items do not\n * fill the viewport. Listen to this event to append more items\n * (infinite / remote scrolling).\n */\n public readonly dataRequest = output<VirtualScrollDataRequest>();\n\n //#endregion\n\n //#region Derived state\n\n protected readonly _isVertical = computed(\n () => this.orientation() === \"vertical\",\n );\n\n protected readonly _resolvedTemplate = computed(\n () => this.itemTemplate() ?? this._itemDirective()?.template ?? null,\n );\n\n /**\n * What the component has to work with, from whichever data input is in use. A page is\n * trusted to be no longer than the collection it says it belongs to.\n */\n private readonly _loaded = computed<LoadedItems<T>>(() => {\n const window = this.dataWindow();\n\n if (!window) {\n const items = this.data() ?? [];\n return { items, startIndex: 0, totalCount: items.length, windowed: false };\n }\n\n const items = window.items ?? [];\n const startIndex = toCount(window.startIndex);\n return {\n items,\n startIndex,\n totalCount: Math.max(toCount(window.totalCount), startIndex + items.length),\n windowed: true,\n };\n }, { equal: loadedEqual });\n\n /** The measured size once the host has been laid out, the hint until then. */\n private readonly _effectiveViewportSize = computed(\n () => this._viewportSize() ?? toCount(this.initialViewportSize()),\n );\n\n /** The configured `overScan`, normalized to a non-negative integer. */\n private readonly _normalizedOverScan = computed(() => {\n const value = Number(this.overScan());\n return Number.isFinite(value)\n ? Math.max(0, Math.floor(value))\n : DEFAULT_OVER_SCAN;\n });\n\n /** The configured `estimatedItemSize`, normalized to a positive number. */\n private readonly _normalizedItemSize = computed(() => {\n const value = Number(this.estimatedItemSize());\n return Number.isFinite(value) && value > 0\n ? value\n : DEFAULT_ESTIMATED_ITEM_SIZE;\n });\n\n /**\n * The window to render for the current scroll position and viewport. Empty\n * until an item template is resolved, because nothing renders without one.\n *\n * The scroll position is read from the plain `_scrollPosition` field so\n * that a recompute triggered by a measurement uses the live offset, while\n * `_scrollTick` limits recomputes to scrolls that actually move the window.\n */\n private readonly _visibleRange = computed<VisibleRange>(\n () => {\n // Depend on the engine so the range recomputes whenever item sizes or\n // the item count change.\n this._engine.version();\n this._scrollTick();\n\n return this._resolvedTemplate()\n ? this._engine.getVisibleRange(\n this._scrollPosition,\n this._effectiveViewportSize(),\n this._normalizedOverScan(),\n )\n : EMPTY_RANGE;\n },\n { equal: rangesEqual },\n );\n\n /** The track size, in DOM space. */\n protected readonly _spaceSize = this._engine.domSize;\n\n /** The part of the rendered range a page actually covers. */\n private readonly _loadedRange = computed<VisibleRange>(\n () => {\n const { startIndex, endIndex } = this._visibleRange();\n const { items, startIndex: from } = this._loaded();\n\n return {\n startIndex: Math.max(startIndex, from),\n endIndex: Math.min(endIndex, from + items.length - 1),\n };\n },\n { equal: rangesEqual },\n );\n\n /** The item contexts for the currently rendered window, in render order. */\n protected readonly _renderedItems = computed<IgxVsItemContext<T>[]>(() => {\n const { startIndex, endIndex } = this._loadedRange();\n const { items, startIndex: from, totalCount } = this._loaded();\n\n const rendered: IgxVsItemContext<T>[] = [];\n for (let i = startIndex; i <= endIndex; i++) {\n rendered.push(new IgxVsItemContext<T>(items[i - from], i, totalCount));\n }\n return rendered;\n });\n\n /**\n * The `translateY` / `translateX` for the content wrapper. It is absolutely\n * positioned at the origin of a `domSize` px track, so translating it to\n * the first rendered item's offset puts that item at its virtual position.\n */\n protected readonly _contentTransform = computed(() => {\n // The offsets below are plain reads of the engine's size state, so depend\n // on its version explicitly.\n this._engine.version();\n const range = this._loadedRange();\n\n // Under coordinate compression item positions are scaled down but item\n // sizes are not. Without this cap the rendered range would overflow past\n // domSize at the end of the list, pushing the last items beyond the\n // maximum browser scroll coordinate.\n const position = clamp(\n this._engine.getScrollOffsetForIndex(\n range.startIndex,\n this._effectiveViewportSize(),\n ),\n 0,\n this._engine.domSize() -\n this._engine.getPhysicalRangeSize(range.startIndex, range.endIndex),\n );\n\n if (this._isVertical()) {\n return `translateY(${position}px)`;\n }\n\n // In RTL the wrapper is anchored to the right edge of the track, so it\n // translates towards the negative (leading) direction.\n return `translateX(${this._ltr() ? position : -position}px)`;\n });\n\n //#endregion\n\n constructor() {\n // Sync the engine's item count with `data`, discarding the measurements\n // of items whose identity changed.\n effect(() => {\n const loaded = this._loaded();\n untracked(() => {\n const previous = this._previousItems;\n const retained = this._retainCount(previous, loaded);\n this._previousItems = loaded;\n this._engine.resize(\n loaded.totalCount,\n this._normalizedItemSize(),\n retained,\n );\n this._remeasureFrom(retained);\n // New data (or a reset) clears any in-flight data request so the next\n // approach to the end of the list can emit again.\n this._hasPendingDataRequest = false;\n });\n });\n\n // Re-apply the estimate when it changes but the item count does not,\n // because `resize` is then a no-op.\n effect(() => {\n const size = this._normalizedItemSize();\n untracked(() => this._engine.updateEstimatedSize(size));\n });\n\n // The scroll offset of the previous axis does not carry over.\n effect(() => {\n this.orientation();\n untracked(() => {\n if (!this._isBrowser) {\n return;\n }\n\n // The size of the previous axis says nothing about the new one.\n this._viewportSize.set(null);\n this._measureViewport();\n this._scrollPosition = this._currentAxisScroll();\n this._scrollTick.update((v) => v + 1);\n });\n });\n\n afterNextRender(() => {\n this._engine.initMaxBrowserSize(this._document);\n this._measureViewport();\n this._setupScrollListener();\n this._setupViewportResizeObserver();\n });\n\n // Runs after the DOM reflects the current window, and re-runs whenever\n // the window or the engine's sizes change.\n afterRenderEffect({\n read: () => {\n // What is wanted and what is rendered change independently: the viewport can move\n // into indices no page covers, and a page can arrive without the viewport moving.\n this._visibleRange();\n this._renderedItems();\n this._engine.version();\n untracked(() => {\n this._scheduleItemMeasurement();\n this._checkDataRequest();\n this._emitStateChange();\n });\n },\n });\n }\n\n public ngOnDestroy(): void {\n this._teardown();\n }\n\n //#region Public API\n\n /**\n * Resolves when the virtual scroll has settled: the current render pass is\n * complete, the item-size measurements it triggers are complete, and so\n * are the renders those measurements schedule.\n */\n public get layoutComplete(): Promise<void> {\n if (!this._layoutCompletePromise) {\n this._layoutCompletePromise = this._resolveLayoutComplete();\n }\n return this._layoutCompletePromise;\n }\n\n /**\n * Scrolls to the specified item index.\n *\n * Items outside the rendered window have only an estimated size, so the\n * first jump can miss the target. The items at the landing point are then\n * measured and the scroll position is corrected, until the offset is\n * stable. The returned promise resolves on that final offset; callers that\n * need only the first, approximate scroll can ignore it.\n *\n * @param index The index of the item to scroll to.\n * @param options `block` / `inline` select the alignment (`start`,\n * `center`, `end` or `nearest`); `behavior` selects `auto` or `smooth`.\n */\n public async scrollToIndex(\n index: number,\n options?: ScrollIntoViewOptions,\n ): Promise<void> {\n const clampedIndex = clamp(\n index,\n 0,\n Math.max(0, this._loaded().totalCount - 1),\n );\n\n // A newer call supersedes a correction loop that still runs for a\n // previous call, for example under rapid, repeated calls.\n const requestId = ++this._scrollRequestId;\n\n let offset = this._getAlignedScrollOffset(clampedIndex, options);\n await this._scrollAndWaitForEnd(offset, options?.behavior ?? \"auto\");\n\n for (let i = 0; i < MAX_SCROLL_CORRECTION_PASSES; i++) {\n await this.layoutComplete;\n\n if (requestId !== this._scrollRequestId) {\n return;\n }\n\n const corrected = this._getAlignedScrollOffset(clampedIndex, options);\n if (Math.abs(corrected - offset) < SCROLL_OFFSET_EPSILON_PX) {\n break;\n }\n\n offset = corrected;\n await this._scrollAndWaitForEnd(offset, \"auto\");\n\n if (requestId !== this._scrollRequestId) {\n return;\n }\n }\n }\n\n //#endregion\n\n //#region Scrolling\n\n /**\n * Re-reads the host's direction, which `dir` can change at runtime. `:dir()`\n * is a selector match, so this costs no layout.\n */\n private _syncDirection(): boolean {\n const ltr = isLeftToRight(this._hostRef.nativeElement);\n this._ltr.set(ltr);\n return ltr;\n }\n\n /** The current real scroll position on the active axis, normalized for RTL. */\n private _currentAxisScroll(): number {\n const host = this._hostRef.nativeElement;\n\n if (this._isVertical()) {\n return host.scrollTop;\n }\n\n // Standards-compliant browsers expose a negative scrollLeft in RTL.\n return this._syncDirection() ? host.scrollLeft : -host.scrollLeft;\n }\n\n /** Applies a scroll offset to the active axis, accounting for RTL. */\n private _applyScroll(offset: number, behavior: ScrollBehavior): void {\n const host = this._hostRef.nativeElement;\n\n if (this._isVertical()) {\n host.scrollTo({ top: offset, behavior });\n return;\n }\n\n host.scrollTo({ left: this._syncDirection() ? offset : -offset, behavior });\n }\n\n /**\n * The scroll offset that aligns `index` in the viewport according to\n * `options`, from the engine's current size data. As more items are\n * measured, the same input can give a different, more accurate result.\n *\n * `nearest` keeps the current offset for an item already in view and\n * otherwise brings the item to its nearer edge, as native `scrollIntoView`\n * does.\n */\n private _getAlignedScrollOffset(\n index: number,\n options?: ScrollIntoViewOptions,\n ): number {\n const requested = this._isVertical()\n ? (options?.block ?? \"start\")\n : (options?.inline ?? options?.block ?? \"start\");\n const current = this._currentAxisScroll();\n const viewport = this._effectiveViewportSize();\n\n const align =\n requested === \"nearest\"\n ? this._engine.getNearestAlignment(index, current, viewport)\n : requested;\n\n if (align === null) {\n return current;\n }\n\n return this._engine.getAlignedScrollOffset(index, viewport, align);\n }\n\n /**\n * Applies a scroll offset to the active axis and waits for the scroll,\n * instant or smooth, to settle.\n *\n * `scrollend` does not fire when the requested offset does not move the\n * scroll position, so that case resolves immediately. The deadline covers\n * an event that never arrives, for example when the element is detached\n * mid-scroll.\n */\n private _scrollAndWaitForEnd(\n offset: number,\n behavior: ScrollBehavior,\n ): Promise<void> {\n if (\n !this._isBrowser ||\n Math.abs(this._currentAxisScroll() - offset) < SCROLL_OFFSET_EPSILON_PX\n ) {\n return Promise.resolve();\n }\n\n return this._withDeadline(SCROLL_END_TIMEOUT_MS, (abort) => {\n // `scrollend` reports exactly when a scroll has settled. Safari before\n // 18.2 does not have it, and the scroll-idle timer stands in there.\n const settled =\n \"onscrollend\" in this._hostRef.nativeElement\n ? this._waitForScrollEnd(abort)\n : this._waitForScrollIdle(abort);\n\n // Applied only after the listener is attached, so an instant scroll\n // cannot settle before something watches for it.\n this._applyScroll(offset, behavior);\n return settled;\n });\n }\n\n private _waitForScrollEnd(abort: AbortSignal): Promise<void> {\n return this._promiseOutsideZone((resolve) => {\n this._hostRef.nativeElement.addEventListener(\"scrollend\", resolve, {\n once: true,\n signal: abort,\n });\n });\n }\n\n /**\n * Resolves when no `scroll` event arrives for `SCROLL_IDLE_MS`: the closest\n * replacement for `scrollend`. The first timer starts immediately, so a\n * scroll that does not move still settles.\n */\n private _waitForScrollIdle(abort: AbortSignal): Promise<void> {\n return this._promiseOutsideZone((resolve) => {\n let id = setTimeout(resolve, SCROLL_IDLE_MS);\n\n this._hostRef.nativeElement.addEventListener(\n \"scroll\",\n () => {\n clearTimeout(id);\n id = setTimeout(resolve, SCROLL_IDLE_MS);\n },\n { passive: true, signal: abort },\n );\n\n onAbort(abort, () => clearTimeout(id));\n });\n }\n\n //#endregion\n\n //#region Async helpers\n\n /** A promise whose subscription work stays out of the Angular zone. */\n private _promiseOutsideZone(\n subscribe: (resolve: () => void) => void,\n ): Promise<void> {\n return this._zone.runOutsideAngular(\n () => new Promise<void>((resolve) => subscribe(() => resolve())),\n );\n }\n\n /**\n * Resolves with `task` or with a deadline of `ms`, whichever comes first.\n * The signal then tears down the other, so no live timer or dangling\n * listener remains.\n */\n private _withDeadline(\n ms: number,\n task: (abort: AbortSignal) => Promise<void>,\n ): Promise<void> {\n const controller = new AbortController();\n\n return Promise.race([\n task(controller.signal),\n this._promiseOutsideZone((resolve) => {\n const id = setTimeout(resolve, ms);\n onAbort(controller.signal, () => clearTimeout(id));\n }),\n ]).finally(() => controller.abort());\n }\n\n /**\n * Resolves on the next animation frame, or after `LAYOUT_FRAME_TIMEOUT_MS`\n * when no frame arrives. A hidden tab or a detached element gets no frames\n * and has no layout to wait for, so resolving early there is safe.\n */\n private _nextFrame(): Promise<void> {\n if (!this._isBrowser) {\n return Promise.resolve();\n }\n\n return this._withDeadline(LAYOUT_FRAME_TIMEOUT_MS, (abort) =>\n this._promiseOutsideZone((resolve) => {\n const id = requestAnimationFrame(resolve);\n onAbort(abort, () => cancelAnimationFrame(id));\n }),\n );\n }\n\n /**\n * Waits out the frames in which the item measurements land. Each\n * measurement that changes a size bumps the engine's version and schedules\n * another render, so the layout has settled once the version holds still\n * across two consecutive frames.\n */\n private async _resolveLayoutComplete(): Promise<void> {\n try {\n let lastVersion = -1;\n\n for (let i = 0; i < MAX_LAYOUT_SETTLE_PASSES; i++) {\n await this._nextFrame();\n\n const version = untracked(this._engine.version);\n if (version === lastVersion) {\n break;\n }\n lastVersion = version;\n }\n } finally {\n // Cleared here, not after the loop, so a run that throws cannot leave\n // the getter with a permanently rejected promise.\n this._layoutCompletePromise = null;\n }\n }\n\n //#endregion\n\n //#region Measurement\n\n private _measureViewport(): void {\n const host = this._hostRef.nativeElement;\n\n // A host with no box is hidden or detached, not sized: its last measurement is kept so\n // it renders in the pass that reveals it. A laid-out zero is a size like any other.\n if (!host.isConnected || host.getClientRects().length === 0) {\n return;\n }\n\n const size = this._isVertical() ? host.clientHeight : host.clientWidth;\n if (size !== untracked(this._viewportSize)) {\n this._viewportSize.set(size);\n }\n }\n\n private _setupViewportResizeObserver(): void {\n this._viewportResizeObserver?.disconnect();\n\n this._zone.runOutsideAngular(() => {\n this._viewportResizeObserver = new ResizeObserver(() =>\n this._measureViewport(),\n );\n this._viewportResizeObserver.observe(this._hostRef.nativeElement);\n });\n }\n\n private _setupScrollListener(): void {\n const host = this._hostRef.nativeElement;\n\n if (this._onScroll) {\n host.removeEventListener(\"scroll\", this._onScroll);\n }\n\n this._zone.runOutsideAngular(() => {\n this._onScroll = () => this._handleScroll();\n host.addEventListener(\"scroll\", this._onScroll, { passive: true });\n });\n }\n\n /**\n * Records the new scroll offset and invalidates the rendered window only\n * when it actually moves. Without the guard, a scroll inside a single item\n * would schedule a change detection pass for an identical result.\n */\n private _handleScroll(): void {\n this._scrollPosition = this._currentAxisScroll();\n\n const next = this._engine.getVisibleRange(\n this._scrollPosition,\n untracked(this._effectiveViewportSize),\n untracked(this._normalizedOverScan),\n );\n\n if (!rangesEqual(next, untracked(this._visibleRange))) {\n this._scrollTick.update((v) => v + 1);\n }\n }\n\n private _handleItemResize(entries: ResizeObserverEntry[]): void {\n for (const entry of entries) {\n const index = itemIndex(entry.target);\n if (index < 0) {\n continue;\n }\n\n const measured = this._isVertical()\n ? (entry.borderBoxSize?.[0]?.blockSize ?? entry.contentRect.height)\n : (entry.borderBoxSize?.[0]?.inlineSize ?? entry.contentRect.width);\n\n if (measured > 0) {\n this._engine.measureItem(index, measured);\n }\n }\n }\n\n /**\n * Synchronizes the item observer with the rendered window, applying only\n * the difference. A newly observed element gets one initial measurement.\n *\n * An element whose `data-index` changed is re-registered, because\n * `observe` on an already observed element is a no-op. `@for` tracks by\n * slot and reuses the wrapper elements, so after a scroll the same element\n * can host a different item at an identical size. The observer stays quiet\n * about that and the new index would keep its estimated size.\n */\n private _scheduleItemMeasurement(): void {\n const content = this._contentDivRef()?.nativeElement;\n if (!content) {\n return;\n }\n\n const observer = this._getItemResizeObserver();\n\n for (const element of [...this._observedItems]) {\n if (element.parentNode !== content) {\n observer.unobserve(element);\n this._observedItems.delete(element);\n }\n }\n\n for (const element of Array.from(content.children)) {\n const index = itemIndex(element);\n\n if (this._observedItems.has(element)) {\n if (this._observedItemIndexes.get(element) === index) {\n continue;\n }\n observer.unobserve(element);\n }\n\n observer.observe(element);\n this._observedItems.add(element);\n this._observedItemIndexes.set(element, index);\n }\n }\n\n /**\n * Forgets the wrappers from `index` on, so the next pass registers them\n * again: the resize dropped their sizes, and a wrapper whose size did not\n * change reports nothing on its own.\n */\n private _remeasureFrom(index: number): void {\n for (const element of this._observedItems) {\n if ((this._observedItemIndexes.get(element) ?? -1) >= index) {\n this._observedItemIndexes.delete(element);\n }\n }\n }\n\n private _getItemResizeObserver(): ResizeObserver {\n if (!this._itemResizeObserver) {\n this._itemResizeObserver = this._zone.runOutsideAngular(\n () => new ResizeObserver((entries) => this._handleItemResize(entries)),\n );\n }\n return this._itemResizeObserver;\n }\n\n //#endregion\n\n //#region Events\n\n /**\n * The number of leading items that kept their identity across a `data`\n * change: the index of the first item whose measured size no longer\n * matches its rendered content. An append (the `dataRequest` flow) retains\n * all items. A filter or a replacement retains only the unchanged prefix.\n */\n private _firstChangedIndex(\n previous: readonly T[],\n current: readonly T[],\n ): number {\n const shared = Math.min(previous.length, current.length);\n for (let i = 0; i < shared; i++) {\n if (previous[i] !== current[i]) {\n return i;\n }\n }\n return shared;\n }\n\n /**\n * How many leading items keep their measured size across a change. A page of the same\n * collection keeps all of them - its indices still mean the same records. A page with\n * another `totalCount` comes from a filtered or otherwise different collection, and\n * switching inputs starts over, so neither keeps any.\n */\n private _retainCount(\n previous: LoadedItems<T> | undefined,\n current: LoadedItems<T>,\n ): number {\n if (previous?.windowed !== current.windowed) {\n return 0;\n }\n\n if (!current.windowed) {\n return this._firstChangedIndex(previous.items, current.items);\n }\n\n return previous.totalCount === current.totalCount ? current.totalCount : 0;\n }\n\n /**\n * Emits `stateChange`. Skipped when the window is empty or equal to the\n * last reported one, because measurement passes re-render without a window\n * change.\n */\n private _emitStateChange(): void {\n const { startIndex, endIndex } = untracked(this._visibleRange);\n if (endIndex < startIndex) {\n return;\n }\n\n const state: VirtualScrollState = {\n startIndex,\n endIndex,\n viewportSize: untracked(this._effectiveViewportSize),\n totalSize: untracked(this._engine.totalSize),\n };\n\n if (statesEqual(this._lastEmittedState, state)) {\n return;\n }\n\n this._lastEmittedState = { ...state };\n this.stateChange.emit(state);\n }\n\n private _checkDataRequest(): void {\n const loaded = untracked(this._loaded);\n\n // `dataRequest` asks for items to append, which a sized collection does not need. The\n // count `data` had reached before says nothing once a window is bound, so forget it here.\n if (loaded.windowed) {\n this._lastDataRequestIndex = -1;\n return;\n }\n\n if (this._hasPendingDataRequest) {\n return;\n }\n\n const { endIndex } = untracked(this._visibleRange);\n const total = loaded.items.length;\n\n if (total === 0 || endIndex < total - DATA_REQUEST_THRESHOLD) {\n return;\n }\n\n // Each `data` change clears `_hasPendingDataRequest`, including one that\n // appends nothing. Without this second guard, a consumer whose source is\n // exhausted, and that reassigns `data` in response to a request, would\n // receive the same request on each reassignment.\n if (this._lastDataRequestIndex === total) {\n return;\n }\n\n this._hasPendingDataRequest = true;\n this._lastDataRequestIndex = total;\n\n this.dataRequest.emit({\n startIndex: total,\n count: Math.max(\n untracked(this._normalizedOverScan) * DATA_REQUEST_OVER_SCAN_FACTOR,\n DATA_REQUEST_MIN_COUNT,\n ),\n });\n }\n\n //#endregion\n\n private _teardown(): void {\n const host = this._hostRef.nativeElement;\n\n if (this._onScroll) {\n host.removeEventListener(\"scroll\", this._onScroll);\n this._onScroll = null;\n }\n\n this._viewportResizeObserver?.disconnect();\n this._viewportResizeObserver = null;\n\n this._itemResizeObserver?.disconnect();\n this._itemResizeObserver = null;\n this._observedItems.clear();\n }\n}\n","<div\n class=\"igx-virtual-scroll__track\"\n role=\"presentation\"\n [style.height.px]=\"_isVertical() ? _spaceSize() : null\"\n [style.width.px]=\"!_isVertical() ? _spaceSize() : null\"\n>\n <div\n class=\"igx-virtual-scroll__content\"\n #contentDiv\n role=\"presentation\"\n [style.transform]=\"_contentTransform()\"\n >\n @if (_resolvedTemplate(); as template) {\n @for (context of _renderedItems(); track $index) {\n <div\n class=\"igx-virtual-item\"\n role=\"presentation\"\n [attr.data-index]=\"context.index\"\n >\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"context\"\n />\n </div>\n }\n }\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"igniteui-angular-virtual-scroll.mjs","sources":["../../../projects/igniteui-angular/virtual-scroll/src/virtual-scroll/scroll-engine.ts","../../../projects/igniteui-angular/virtual-scroll/src/virtual-scroll/types.ts","../../../projects/igniteui-angular/virtual-scroll/src/virtual-scroll/virtual-scroll-item.directive.ts","../../../projects/igniteui-angular/virtual-scroll/src/virtual-scroll/virtual-scroll-recycle.directive.ts","../../../projects/igniteui-angular/virtual-scroll/src/virtual-scroll/virtual-scroll.component.ts","../../../projects/igniteui-angular/virtual-scroll/src/virtual-scroll/virtual-scroll.component.html","../../../projects/igniteui-angular/virtual-scroll/src/igniteui-angular-virtual-scroll.ts"],"sourcesContent":["import { computed, signal } from \"@angular/core\";\nimport { clamp } from \"igniteui-angular/core\";\nimport type { ScrollAlignment, VisibleRange } from \"./types\";\n\n/** The maximum scroll coordinate is a per-document constant, so probe once. */\nconst _maxBrowserSizeCache = new WeakMap<Document, number>();\n\n/** Measures the largest scroll coordinate the browser can represent. */\nfunction probeMaxBrowserSize(doc: Document): number {\n const cached = _maxBrowserSizeCache.get(doc);\n if (cached !== undefined) {\n return cached;\n }\n\n const container = doc.body ?? doc.documentElement;\n if (!container) {\n return Number.POSITIVE_INFINITY;\n }\n\n const probe = doc.createElement(\"div\");\n probe.style.position = \"absolute\";\n probe.style.top = `${Number.MAX_SAFE_INTEGER}px`;\n probe.style.width = \"0\";\n probe.style.height = \"0\";\n probe.style.visibility = \"hidden\";\n container.appendChild(probe);\n\n // The rect is viewport relative, so add back how far the document is scrolled.\n const scrollOffset = doc.documentElement?.scrollTop ?? 0;\n const size = Math.abs(probe.getBoundingClientRect().top) + scrollOffset;\n container.removeChild(probe);\n\n _maxBrowserSizeCache.set(doc, size);\n return size;\n}\n\n/** The item holds the estimate. */\nconst UNMEASURED = 0;\n/** The item was measured under an older estimate. */\nconst MEASURED = 1;\n/** The item was measured under the current estimate. */\nconst SAMPLED = 2;\n\n/**\n * Binary Indexed Tree (Fenwick tree) over item sizes. Each hot-path operation\n * is O(log N): point update (item measured), prefix sum (scroll offset), and\n * index at offset (scroll to item, through binary lifting).\n *\n * The tree holds only the measured sizes and the number of measured items.\n * Each unmeasured item counts as `estimate`, so an estimate change is O(1).\n */\nclass SizeTree {\n public readonly length: number;\n\n /** The size of each unmeasured item. */\n public estimate: number;\n\n /** A 1-indexed BIT of the measured sizes. */\n private readonly _sums: Float64Array;\n\n /** A 1-indexed BIT of the number of measured items. */\n private readonly _counts: Int32Array;\n\n /** Raw measured sizes, 0-indexed. Kept for O(1) delta calculation. */\n private readonly _sizes: Float64Array;\n\n /** `UNMEASURED`, `MEASURED` or `SAMPLED` for each item. */\n private readonly _states: Uint8Array;\n\n private _measuredCount = 0;\n private _measuredTotal = 0;\n\n /** Count and size sum of the `SAMPLED` items. */\n private _sampleCount = 0;\n private _sampleTotal = 0;\n\n /**\n * The highest power of two <= `length`, for the binary lifting in\n * `findIndexAtOffset`. Precomputed because that runs on each scroll event.\n */\n private readonly _topBit: number;\n\n /** Builds the tree in one O(N) pass. Without `states`, no item is measured. */\n constructor(\n length: number,\n estimate: number,\n sizes = new Float64Array(length),\n states = new Uint8Array(length),\n ) {\n this.length = length;\n this.estimate = estimate;\n this._sizes = sizes;\n this._states = states;\n this._sums = new Float64Array(length + 1);\n this._counts = new Int32Array(length + 1);\n this._topBit = length > 0 ? 1 << (31 - Math.clz32(length)) : 0;\n\n for (let i = 1; i <= length; i++) {\n const state = states[i - 1];\n\n if (state !== UNMEASURED) {\n const size = sizes[i - 1];\n this._sums[i] += size;\n this._counts[i]++;\n this._measuredCount++;\n this._measuredTotal += size;\n\n if (state === SAMPLED) {\n this._sampleCount++;\n this._sampleTotal += size;\n }\n }\n\n const parent = i + (i & -i);\n if (parent <= length) {\n this._sums[parent] += this._sums[i];\n this._counts[parent] += this._counts[i];\n }\n }\n }\n\n /** Total size of all items. O(1). */\n public get totalSize(): number {\n return this.totalSizeAt(this.estimate);\n }\n\n /** Total size of all items if unmeasured ones took `estimate`. O(1). */\n public totalSizeAt(estimate: number): number {\n return this._measuredTotal + (this.length - this._measuredCount) * estimate;\n }\n\n /** The number of measured items. O(1). */\n public get measuredCount(): number {\n return this._measuredCount;\n }\n\n /** The average size of the `SAMPLED` items, or `0` if there are none. */\n public get sampleAverage(): number {\n return this._sampleCount > 0 ? this._sampleTotal / this._sampleCount : 0;\n }\n\n /** Whether each item before `index` is measured. O(log N). */\n public isMeasuredBefore(index: number): boolean {\n let count = 0;\n for (let j = index; j > 0; j -= j & -j) {\n count += this._counts[j];\n }\n return count === index;\n }\n\n /**\n * Prefix sum of items [0, i): the virtual scroll offset at the leading\n * edge of item i. O(log N).\n */\n public prefixSum(i: number): number {\n let sum = 0;\n let count = 0;\n for (let j = i; j > 0; j -= j & -j) {\n sum += this._sums[j];\n count += this._counts[j];\n }\n return sum + (i - count) * this.estimate;\n }\n\n /**\n * Sets the size of the item at a 0-based index and marks it `SAMPLED`.\n * Returns true when the size changed. O(log N).\n */\n public update(index: number, size: number): boolean {\n if (index < 0 || index >= this.length) {\n return false;\n }\n\n const state = this._states[index];\n const isNew = state === UNMEASURED;\n const old = isNew ? 0 : this._sizes[index];\n const delta = size - old;\n\n this._states[index] = SAMPLED;\n this._sizes[index] = size;\n this._measuredTotal += delta;\n this._sampleTotal += state === SAMPLED ? delta : size;\n\n if (state !== SAMPLED) {\n this._sampleCount++;\n }\n if (isNew) {\n this._measuredCount++;\n }\n\n if (isNew || delta !== 0) {\n for (let i = index + 1; i <= this.length; i += i & -i) {\n this._sums[i] += delta;\n if (isNew) {\n this._counts[i]++;\n }\n }\n }\n\n return size !== (isNew ? this.estimate : old);\n }\n\n /**\n * Returns a new tree of `newLength` items. Measured sizes are kept up to\n * `min(this.length, newLength, retainCount)`, and the other items are\n * unmeasured. Pass a `retainCount` below the item count when the data\n * behind those indices changed identity. O(N).\n */\n public cloneResized(newLength: number, retainCount = newLength): SizeTree {\n const retained = Math.max(0, Math.min(this.length, newLength, retainCount));\n const sizes = new Float64Array(newLength);\n const states = new Uint8Array(newLength);\n\n sizes.set(this._sizes.subarray(0, retained));\n states.set(this._states.subarray(0, retained));\n return new SizeTree(newLength, this.estimate, sizes, states);\n }\n\n /**\n * Starts a new sample: `sampleAverage` then counts only the items measured\n * after this call. O(N).\n */\n public startSample(): void {\n for (let i = 0; i < this.length; i++) {\n if (this._states[i] === SAMPLED) {\n this._states[i] = MEASURED;\n }\n }\n this._sampleCount = 0;\n this._sampleTotal = 0;\n }\n\n /**\n * Returns the 0-based index of the item containing the scroll `offset`:\n * the largest i where `prefixSum(i) <= offset < prefixSum(i + 1)`. O(log N).\n */\n public findIndexAtOffset(offset: number): number {\n if (offset <= 0 || this.length === 0) {\n return 0;\n }\n\n let index = 0;\n let remaining = offset;\n\n for (let bit = this._topBit; bit > 0; bit >>= 1) {\n const next = index + bit;\n if (next > this.length) {\n continue;\n }\n\n // Node `next` covers the `bit` items after `index`.\n const size = this._sums[next] + (bit - this._counts[next]) * this.estimate;\n if (size <= remaining) {\n index = next;\n remaining -= size;\n }\n }\n return Math.min(this.length - 1, index);\n }\n}\n\n/**\n * Pure scroll-math engine for one axis of virtual scrolling. A Fenwick tree\n * holds all size state, exposed through signals so downstream `computed()`\n * values (visible range, spacer size, translate offset) react to any change\n * of item sizes or item count.\n *\n * ### Virtual and DOM coordinates\n *\n * Browsers limit how far an element can scroll. When the total item size is\n * larger than that limit, the engine maps the *virtual* scroll range\n * (`0…totalSize - viewport`) onto the *DOM* scroll range the browser can\n * represent (`0…domSize - viewport`), see `_scrollRanges`. Incoming scroll\n * positions are converted to virtual offsets, outgoing offsets to DOM ones.\n * Items render at their real pixel size, so item sizes are always virtual.\n */\nexport class VirtualScrollEngine {\n private _maxBrowserSize = Number.POSITIVE_INFINITY;\n\n private _tree: SizeTree | null = null;\n\n /** The estimate last given to `resize` or `updateEstimatedSize`. */\n private _configuredEstimate = Number.NaN;\n\n /** Whether `adaptEstimate` has applied a measured average. */\n private _hasAdaptedEstimate = false;\n\n /** Bumped on every structural change: resize, measurement or estimate. */\n private readonly _version = signal(0);\n\n /**\n * Read this from a `computed()` to make it recompute on any size change.\n * `totalSize` and `domSize` already do.\n */\n public readonly version = this._version.asReadonly();\n\n /** Total virtual size of all items in px. */\n public readonly totalSize = computed<number>(() => {\n this._version();\n return this._tree?.totalSize ?? 0;\n });\n\n /**\n * Total size in DOM space, clamped to the maximum browser size.\n *\n * Depends on `_version` directly rather than on `totalSize()`. The maximum\n * can change while the total does not (it is probed after the first\n * render), and an unchanged `totalSize` would not propagate.\n */\n public readonly domSize = computed<number>(() => {\n this._version();\n return Math.min(this._tree?.totalSize ?? 0, this._maxBrowserSize);\n });\n\n /**\n * Probes the document's maximum scroll coordinate and rescales. Notifies,\n * because the probe can only run after the first render, by which point\n * `domSize` has already been read at the uncompressed total.\n */\n public initMaxBrowserSize(doc: Document): void {\n this._maxBrowserSize = probeMaxBrowserSize(doc);\n this._invalidate();\n }\n\n /**\n * Resizes the internal sizes array to `length`. Measured sizes below\n * `retainCount` are kept, and the other items are unmeasured. Callers that\n * only append can keep the default `retainCount`. Callers whose data\n * changed identity at some index must pass that index, so the stale\n * measurements after it are discarded.\n *\n * Unmeasured items take `estimatedSize`, or keep the adapted average while\n * `estimatedSize` is unchanged.\n */\n public resize(\n length: number,\n estimatedSize: number,\n retainCount = length,\n ): void {\n if (this._tree?.length === length && retainCount >= length) {\n return;\n }\n\n this._tree =\n this._tree?.cloneResized(length, retainCount) ??\n new SizeTree(length, estimatedSize);\n\n if (this._configureEstimate(estimatedSize)) {\n this._tree.estimate = estimatedSize;\n }\n this._invalidate();\n }\n\n /** Records the measured DOM size for a single item. */\n public measureItem(index: number, size: number): void {\n if (this._tree?.update(index, size)) {\n this._invalidate();\n }\n }\n\n /**\n * Applies a new estimate to every item not yet measured in the DOM. Use\n * this when `estimatedItemSize` changes but the item count does not,\n * because `resize` is then a no-op.\n */\n public updateEstimatedSize(estimatedSize: number): void {\n if (this._configureEstimate(estimatedSize)) {\n this._applyEstimate(estimatedSize);\n }\n }\n\n /**\n * Sets the unmeasured estimate to the average size measured since the\n * estimate was configured; older sizes may predate a density change. After\n * the first call, applies only while every item before `windowStart` is\n * measured and the list stays uncompressed, so rendered items cannot shift.\n */\n public adaptEstimate(windowStart: number): void {\n const tree = this._tree;\n if (!tree?.sampleAverage) {\n return;\n }\n\n // Compressed before or after, the total sets the scroll ratio: a new average moves every item.\n const largerTotal = tree.totalSizeAt(Math.max(tree.estimate, tree.sampleAverage));\n if (\n this._hasAdaptedEstimate &&\n (largerTotal > this._maxBrowserSize || !tree.isMeasuredBefore(windowStart))\n ) {\n return;\n }\n\n this._hasAdaptedEstimate = true;\n this._applyEstimate(tree.sampleAverage);\n }\n\n /** Drops the measured sizes and the adapted estimate, keeping the item count. */\n public clearSizes(): void {\n const tree = this._tree;\n if (!tree || (tree.measuredCount === 0 && !this._hasAdaptedEstimate)) {\n return;\n }\n\n this._tree = new SizeTree(tree.length, this._configuredEstimate);\n this._hasAdaptedEstimate = false;\n this._invalidate();\n }\n\n /**\n * Returns the DOM scroll offset in px that puts the item at `index` at the\n * leading edge of a `viewportSize` px viewport.\n */\n public getScrollOffsetForIndex(index: number, viewportSize: number): number {\n if (!this._tree || index <= 0) {\n return 0;\n }\n return this._toDom(\n this._tree.prefixSum(Math.min(index, this._tree.length)),\n viewportSize,\n );\n }\n\n /**\n * Returns the DOM scroll offset that positions the item at `index` in a\n * `viewportSize` px viewport, aligned by `align` and clamped to the\n * reachable scroll range.\n *\n * The slack is computed in virtual space against the item's real size and\n * converted to DOM space once, at the end. Under compression one DOM pixel\n * is several virtual pixels, so mixed coordinates would scale the slack.\n */\n public getAlignedScrollOffset(\n index: number,\n viewportSize: number,\n align: ScrollAlignment,\n ): number {\n const bounds = this._itemBounds(index);\n if (!bounds) {\n return 0;\n }\n\n const [start, end] = bounds;\n const slack = viewportSize - Math.max(0, end - start);\n let offset = start;\n\n if (align === \"center\") {\n offset -= slack / 2;\n } else if (align === \"end\") {\n offset -= slack;\n }\n\n return clamp(\n this._toDom(offset, viewportSize),\n 0,\n this._maxDomOffset(viewportSize),\n );\n }\n\n /**\n * Returns the DOM scroll offset that brings the item at `index` into view\n * as `position` asks. `nearest` follows native `scrollIntoView`: an item in\n * view, or one that covers the viewport, keeps `scrollPosition`, and any\n * other item scrolls the smallest distance to an edge alignment.\n *\n * Example: 50px items in a 300px viewport at offset 0. Item 10 spans\n * 500-550, so `nearest` returns 250 (end aligned) and `start` returns 500.\n */\n public resolveScrollOffset(\n index: number,\n scrollPosition: number,\n viewportSize: number,\n position: ScrollLogicalPosition,\n ): number {\n if (position === \"nearest\") {\n const start = this.getAlignedScrollOffset(index, viewportSize, \"start\");\n const end = this.getAlignedScrollOffset(index, viewportSize, \"end\");\n return clamp(scrollPosition, Math.min(start, end), Math.max(start, end));\n }\n\n return this.getAlignedScrollOffset(\n index,\n viewportSize,\n position === \"center\" || position === \"end\" ? position : \"start\",\n );\n }\n\n /** Returns the visible and over-scanned item range for the given scroll state. */\n public getVisibleRange(\n scrollPosition: number,\n viewportSize: number,\n overScan: number,\n ): VisibleRange {\n if (!this._tree || this._tree.length === 0 || viewportSize <= 0) {\n return { startIndex: 0, endIndex: -1 };\n }\n\n // The viewport is not compressed. Items render at their real pixel size,\n // so a `viewportSize` px viewport always shows that many virtual pixels of\n // items, at any compression of the scroll range.\n const startOffset = this._toVirtual(scrollPosition, viewportSize);\n const first = this._tree.findIndexAtOffset(startOffset);\n const last = this._tree.findIndexAtOffset(startOffset + viewportSize);\n\n return {\n startIndex: Math.max(0, first - overScan),\n endIndex: Math.min(this._tree.length - 1, last + overScan),\n };\n }\n\n /**\n * Sum of the real sizes of the items in [startIndex, endIndex]. The render\n * pass uses it to clamp the content translate offset, so rendered items do\n * not overflow past `domSize` under coordinate compression.\n */\n public getPhysicalRangeSize(startIndex: number, endIndex: number): number {\n if (!this._tree) {\n return 0;\n }\n\n const start = Math.max(0, startIndex);\n const end = Math.min(Math.max(endIndex + 1, start), this._tree.length);\n return this._tree.prefixSum(end) - this._tree.prefixSum(start);\n }\n\n /**\n * The virtual [start, end] offsets of the item at `index`, clamped into the\n * item range. Null while there are no items.\n */\n private _itemBounds(index: number): [number, number] | null {\n if (!this._tree || this._tree.length === 0) {\n return null;\n }\n\n const clamped = clamp(index, 0, this._tree.length - 1);\n return [this._tree.prefixSum(clamped), this._tree.prefixSum(clamped + 1)];\n }\n\n /**\n * Records a changed configured estimate and starts a new sample. Returns\n * false for an unchanged one, which keeps the adapted average.\n */\n private _configureEstimate(estimatedSize: number): boolean {\n if (estimatedSize === this._configuredEstimate) {\n return false;\n }\n\n this._configuredEstimate = estimatedSize;\n this._tree?.startSample();\n return true;\n }\n\n private _applyEstimate(estimatedSize: number): void {\n if (!this._tree || this._tree.estimate === estimatedSize) {\n return;\n }\n\n this._tree.estimate = estimatedSize;\n this._invalidate();\n }\n\n private _invalidate(): void {\n this._version.update((v) => v + 1);\n }\n\n /**\n * A virtual offset as the DOM scroll position that shows it, for a\n * `viewportSize` px viewport.\n */\n private _toDom(virtualOffset: number, viewportSize: number): number {\n const [virtualRange, domRange] = this._scrollRanges(viewportSize);\n return (virtualOffset * domRange) / virtualRange;\n }\n\n /**\n * A DOM scroll position as the virtual offset it shows, for a\n * `viewportSize` px viewport.\n */\n private _toVirtual(domOffset: number, viewportSize: number): number {\n const [virtualRange, domRange] = this._scrollRanges(viewportSize);\n\n // A shrunken track's scroll event lags a frame, so clamp the stale offset now.\n // E.g. 10 x 50px items, 300px viewport, stale 1000px: items 4-9, not 9 alone.\n const reachable = clamp(domOffset, 0, this._maxDomOffset(viewportSize));\n return (reachable * virtualRange) / domRange;\n }\n\n /** The largest DOM scroll offset for a `viewportSize` px viewport. */\n private _maxDomOffset(viewportSize: number): number {\n return Math.max(0, this.domSize() - viewportSize);\n }\n\n /**\n * The virtual and DOM scroll ranges to map between; the identity while the\n * content fits the browser's limit. One viewport of items renders at real\n * size at any scroll position, so both ranges exclude it: mapping the totals\n * instead would leave the last `viewport * (ratio - 1)` virtual pixels past\n * the largest DOM offset. Callers multiply before dividing, so exact\n * positions come back exact.\n */\n private _scrollRanges(viewportSize: number): [number, number] {\n const totalSize = this._tree?.totalSize ?? 0;\n const domRange = this._maxBrowserSize - viewportSize;\n\n if (totalSize <= this._maxBrowserSize || domRange <= 0) {\n return [1, 1];\n }\n return [totalSize - viewportSize, domRange];\n }\n}\n","/** Template context for a single item of the virtual scroll. */\nexport class IgxVsItemContext<T> {\n constructor(\n /** The current item in the virtual scroll. */\n public $implicit: T,\n /** The index of the current item. */\n public index: number,\n /** The total number of items in the virtual scroll. */\n public count: number,\n ) {}\n\n /** Whether the current item is the first in the list. */\n public get first(): boolean {\n return this.index === 0;\n }\n\n /** Whether the current item is the last in the list. */\n public get last(): boolean {\n return this.index === this.count - 1;\n }\n\n /** Whether the current item is at an even index. */\n public get even(): boolean {\n return this.index % 2 === 0;\n }\n\n /** Whether the current item is at an odd index. */\n public get odd(): boolean {\n return !this.even;\n }\n}\n\n/** Returns an item's key from the item and its index in the whole collection. */\nexport type VirtualScrollKeyFunction<T> = (item: T, index: number) => unknown;\n\n/**\n * How `scrollToIndex` positions the requested item in the viewport.\n * The subset of `ScrollLogicalPosition` that the engine supports.\n */\nexport type ScrollAlignment = \"start\" | \"center\" | \"end\";\n\n/** The currently rendered (visible plus over-scanned) range of items. */\nexport interface VisibleRange {\n /** Index of the first rendered item, inclusive. */\n startIndex: number;\n /** Index of the last rendered item, inclusive. */\n endIndex: number;\n}\n\n/** Snapshot of the currently rendered virtual window. */\nexport interface VirtualScrollState extends VisibleRange {\n /** The size of the viewport in pixels. */\n viewportSize: number;\n /** The total size of the virtual scroll content in pixels. */\n totalSize: number;\n}\n\n/**\n * A loaded page of a larger collection, for data that arrives a page at a time.\n *\n * The list is sized by `totalCount` while only `items` are in memory. Indices are indices\n * in the whole collection: the item at `index` is `items[index - startIndex]`, and indices\n * the page does not cover render nothing.\n *\n * Measured sizes are kept per index across pages while `totalCount` holds: the indices still\n * mean the same records. A page with another `totalCount` is a different collection, and\n * every size is measured again. A page that keeps the count but puts different records at\n * the same indices keeps the sizes measured for the previous ones until those rows render.\n */\nexport interface VirtualDataWindow<T> {\n /** The loaded items. */\n readonly items: readonly T[];\n /** The index `items[0]` has in the whole collection. */\n readonly startIndex: number;\n /** How many items the whole collection has. */\n readonly totalCount: number;\n}\n\n/**\n * Request for more data, emitted when the rendered window nears the end of\n * the loaded items. Listen to it to implement infinite / remote scrolling.\n */\nexport interface VirtualScrollDataRequest {\n /** The first index that does not yet have data. */\n startIndex: number;\n /** Number of items being requested. */\n count: number;\n}\n","import { Directive, inject, TemplateRef } from \"@angular/core\";\nimport { IgxVsItemContext } from \"./types\";\n\n/**\n * Directive to mark an `ng-template` as the item template for the virtual scroll component.\n * The template provided by this directive will be used to render each item in the virtual scroll.\n * The context for the template will include the item data and its index.\n *\n * @example\n * ```html\n * <igx-virtual-scroll [data]=\"items\">\n * <ng-template igxVirtualItem let-item let-i=\"index\">\n * <div>{{ i }}: {{ item }}</div>\n * </ng-template>\n * </igx-virtual-scroll>\n * ```\n */\n@Directive({ selector: \"ng-template[igxVirtualItem]\" })\nexport class IgxVirtualItemDirective<T = unknown> {\n public readonly template =\n inject<TemplateRef<IgxVsItemContext<T>>>(TemplateRef);\n}\n","import {\n Directive,\n EmbeddedViewRef,\n inject,\n input,\n OnChanges,\n TemplateRef,\n ViewContainerRef,\n} from \"@angular/core\";\n\n/** The context of a recycled view. A reused view gets a new `$implicit`. */\nexport interface IgxVsRecycleContext<T> {\n $implicit: T;\n}\n\ntype RecycledView<T> = EmbeddedViewRef<IgxVsRecycleContext<T>>;\n\n/**\n * Weights for choosing the views that stay in place. A recycled view needs a\n * new layout anyway, so kept views move only when fewer than half the recycled\n * ones.\n */\nconst KEPT_WEIGHT = 2;\nconst RECYCLED_WEIGHT = 1;\n\n/**\n * Marks the entries of the increasing subsequence of `values` with the largest\n * total weight. The values are distinct integers in `[0, size)`, or negative\n * for the entries to skip. O(n log size).\n */\nfunction heaviestIncreasingSubsequence(\n values: Int32Array,\n weights: Int32Array,\n size: number,\n): Uint8Array {\n // Fenwick tree over values: each node holds the heaviest weight ending in\n // its range, and that entry.\n const heaviest = new Int32Array(size + 1);\n const endsAt = new Int32Array(size + 1);\n const previous = new Int32Array(values.length);\n const marked = new Uint8Array(values.length);\n let best = 0;\n let last = -1;\n\n for (let i = 0; i < values.length; i++) {\n if (values[i] < 0) {\n continue;\n }\n\n let total = 0;\n let before = -1;\n for (let node = values[i]; node > 0; node -= node & -node) {\n if (heaviest[node] > total) {\n total = heaviest[node];\n before = endsAt[node];\n }\n }\n\n total += weights[i];\n previous[i] = before;\n for (let node = values[i] + 1; node <= size; node += node & -node) {\n if (total > heaviest[node]) {\n heaviest[node] = total;\n endsAt[node] = i;\n }\n }\n\n if (total > best) {\n best = total;\n last = i;\n }\n }\n\n for (let i = last; i >= 0; i = previous[i]) {\n marked[i] = 1;\n }\n return marked;\n}\n\n/**\n * @hidden @internal\n *\n * Like `@for`, but hands the view of a leaving key to an entering key instead\n * of destroying and recreating it, which avoids DOM churn on each scroll step.\n * Reused views keep DOM state the template does not bind.\n *\n * ```\n * keys 0 1 2 3 2 3 4 5 a scroll by two items\n * views A B C D -> C D A B C, D kept; A, B recycled\n * ```\n *\n * Untaken views are destroyed, not pooled: content queries still report\n * components in detached views.\n */\n@Directive({ selector: \"[igxVsRecycle][igxVsRecycleOf]\" })\nexport class IgxVsRecycleDirective<T> implements OnChanges {\n private readonly _container = inject(ViewContainerRef);\n private readonly _template =\n inject<TemplateRef<IgxVsRecycleContext<T>>>(TemplateRef);\n\n /** The items to render, in order. */\n public readonly igxVsRecycleOf = input.required<readonly T[]>();\n\n /** Returns the key of an item. */\n public readonly igxVsRecycleKey = input.required<(item: T) => unknown>();\n\n /** The rendered views and their keys, in DOM order. */\n private _views: RecycledView<T>[] = [];\n private _keys: unknown[] = [];\n\n public static ngTemplateContextGuard<T>(\n _directive: IgxVsRecycleDirective<T>,\n _context: unknown,\n ): _context is IgxVsRecycleContext<T> {\n return true;\n }\n\n public ngOnChanges(): void {\n const items = this.igxVsRecycleOf();\n const keys = items.map(this.igxVsRecycleKey());\n\n this._views = this._reconcile(items, keys);\n this._keys = keys;\n }\n\n /**\n * Gives each key a view, orders the views by key, and sets their items.\n *\n * 1. A staying key keeps its view.\n * 2. Other keys take the leftover views in DOM order, so a full replacement\n * moves no DOM. Views are created when those run out; untaken ones are\n * destroyed.\n * 3. The heaviest subsequence of reused views that keeps its order stays put\n * (see `KEPT_WEIGHT`). The focused view outweighs all others, so it keeps\n * focus. Each other view moves in front of its successor.\n */\n private _reconcile(\n items: readonly T[],\n keys: readonly unknown[],\n ): RecycledView<T>[] {\n const oldViews = this._views;\n\n // Hydration hands out the server-rendered DOM in creation order.\n if (oldViews.length === 0) {\n return items.map((item) =>\n this._container.createEmbeddedView(this._template, { $implicit: item }),\n );\n }\n\n const count = keys.length;\n const focused = this._focusedPosition();\n\n // The old DOM position (-1 for a new view) and the weight of the view at\n // each new position.\n const from = new Int32Array(count).fill(-1);\n const weights = new Int32Array(count);\n const claimed = new Uint8Array(oldViews.length);\n\n // The first old position of each key, so duplicate keys keep one view.\n const oldPositions = new Map<unknown, number>();\n for (let i = this._keys.length - 1; i >= 0; i--) {\n oldPositions.set(this._keys[i], i);\n }\n\n for (let i = 0; i < count; i++) {\n const position = oldPositions.get(keys[i]);\n if (position === undefined || claimed[position]) {\n continue;\n }\n\n claimed[position] = 1;\n from[i] = position;\n weights[i] = position === focused ? KEPT_WEIGHT * count : KEPT_WEIGHT;\n }\n\n let spare = 0;\n for (let i = 0; i < count && spare < oldViews.length; i++) {\n if (from[i] >= 0) {\n continue;\n }\n\n while (spare < oldViews.length && claimed[spare]) {\n spare++;\n }\n if (spare < oldViews.length) {\n claimed[spare] = 1;\n from[i] = spare;\n weights[i] = RECYCLED_WEIGHT;\n }\n }\n\n oldViews.forEach((view, position) => {\n if (!claimed[position]) {\n view.destroy();\n }\n });\n\n const stable = heaviestIncreasingSubsequence(from, weights, oldViews.length);\n const views: RecycledView<T>[] = new Array(count);\n let next: RecycledView<T> | undefined;\n\n // Walk backwards, so the successor of each view is already in place.\n for (let i = count - 1; i >= 0; i--) {\n let view = from[i] < 0 ? undefined : oldViews[from[i]];\n\n if (view) {\n if (!stable[i]) {\n this._moveBefore(view, next);\n }\n view.context.$implicit = items[i];\n } else {\n view = this._container.createEmbeddedView(\n this._template,\n { $implicit: items[i] },\n next ? this._container.indexOf(next) : undefined,\n );\n }\n\n views[i] = view;\n next = view;\n }\n return views;\n }\n\n /** Moves `view` in front of `next`, or to the end without one. */\n private _moveBefore(view: RecycledView<T>, next?: RecycledView<T>): void {\n const current = this._container.indexOf(view);\n const target = next\n ? this._container.indexOf(next)\n : this._container.length;\n\n if (current === target - 1) {\n return;\n }\n\n // `move` removes the view before it inserts it, which shifts the later\n // indices down by one.\n this._container.move(view, current < target ? target - 1 : target);\n }\n\n /** The position in `_views` of the view that holds the focus, or -1. */\n private _focusedPosition(): number {\n const parent = (this._container.element.nativeElement as Node).parentNode;\n // Angular's server DOM has no getRootNode, and nothing has focus there.\n if (typeof parent?.getRootNode !== \"function\") {\n return -1;\n }\n\n // The root, not the document: the list can render in a shadow root.\n const root = parent.getRootNode() as Partial<DocumentOrShadowRoot>;\n let node: Node | null = root.activeElement ?? null;\n\n while (node && node.parentNode !== parent) {\n node = node.parentNode;\n }\n if (!node) {\n return -1;\n }\n\n return this._views.findIndex((view) => view.rootNodes.includes(node));\n }\n}\n","import { isPlatformBrowser, NgTemplateOutlet } from \"@angular/common\";\nimport {\n afterNextRender,\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DOCUMENT,\n effect,\n ElementRef,\n inject,\n input,\n NgZone,\n OnDestroy,\n output,\n PLATFORM_ID,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewEncapsulation,\n} from \"@angular/core\";\nimport { clamp, isLeftToRight } from \"igniteui-angular/core\";\nimport { VirtualScrollEngine } from \"./scroll-engine\";\nimport {\n IgxVsItemContext,\n VirtualDataWindow,\n VirtualScrollDataRequest,\n VirtualScrollKeyFunction,\n VirtualScrollState,\n VisibleRange,\n} from \"./types\";\nimport { IgxVirtualItemDirective } from \"./virtual-scroll-item.directive\";\nimport { IgxVsRecycleDirective } from \"./virtual-scroll-recycle.directive\";\n\n/** Defaults for the inputs, also used as the fallback for invalid values. */\nconst DEFAULT_OVER_SCAN = 2;\nconst DEFAULT_ESTIMATED_ITEM_SIZE = 50;\n\n/** How close to the end of `data` the window must get to emit `dataRequest`. */\nconst DATA_REQUEST_THRESHOLD = 5;\nconst DATA_REQUEST_MIN_COUNT = 20;\nconst DATA_REQUEST_OVER_SCAN_FACTOR = 4;\n\n/** Give-up bounds for the two loops that wait for the layout to stabilize. */\nconst MAX_LAYOUT_SETTLE_PASSES = 20;\nconst MAX_SCROLL_CORRECTION_PASSES = 5;\n\nconst SCROLL_END_TIMEOUT_MS = 2000;\nconst SCROLL_OFFSET_EPSILON_PX = 1;\n\n/** How long the scroll position must stay unchanged to count as settled. */\nconst SCROLL_IDLE_MS = 100;\n\n/**\n * Upper limit on one `requestAnimationFrame` wait. A hidden tab or a detached\n * element gets no frames, and `layoutComplete` must still resolve there.\n */\nconst LAYOUT_FRAME_TIMEOUT_MS = 100;\n\nconst EMPTY_RANGE: VisibleRange = Object.freeze({ startIndex: 0, endIndex: -1 });\n\n/** `data` and `dataWindow` seen as one thing: what is loaded, and where it sits. */\ninterface LoadedItems<T> extends VirtualDataWindow<T> {\n /** Whether this came from `dataWindow`, which is a page of something larger. */\n readonly windowed: boolean;\n}\n\n/** A consumer-supplied index, count or size, reduced to a whole non-negative number. */\nfunction toCount(value: number): number {\n const count = Math.trunc(value);\n return Number.isFinite(count) ? Math.max(0, count) : 0;\n}\n\nfunction loadedEqual<T>(a: LoadedItems<T>, b: LoadedItems<T>): boolean {\n return (\n a.items === b.items &&\n a.startIndex === b.startIndex &&\n a.totalCount === b.totalCount &&\n a.windowed === b.windowed\n );\n}\n\nfunction rangesEqual(a: VisibleRange, b: VisibleRange): boolean {\n return a.startIndex === b.startIndex && a.endIndex === b.endIndex;\n}\n\nfunction statesEqual(\n a: VirtualScrollState | null,\n b: VirtualScrollState,\n): boolean {\n return (\n a !== null &&\n rangesEqual(a, b) &&\n a.viewportSize === b.viewportSize &&\n a.totalSize === b.totalSize\n );\n}\n\n/** The data index an item wrapper carries, or -1 when it has none. */\nfunction itemIndex(element: Element): number {\n const index = Number.parseInt(\n (element as HTMLElement).dataset[\"index\"] ?? \"\",\n 10,\n );\n return Number.isInteger(index) && index >= 0 ? index : -1;\n}\n\nfunction onAbort(abort: AbortSignal, cancel: () => void): void {\n abort.addEventListener(\"abort\", cancel, { once: true });\n}\n\n/**\n * A virtual scroll component for large lists. Only the items visible in the\n * viewport (plus a configurable over-scan) are rendered.\n *\n * @igxKeywords virtual, scroll, virtualization, list\n * @igxGroup Grids & Lists\n *\n * @example\n * ```html\n * <igx-virtual-scroll [data]=\"items\" style=\"height: 400px\">\n * <ng-template igxVirtualItem let-item let-i=\"index\">\n * <div>{{ i }}: {{ item }}</div>\n * </ng-template>\n * </igx-virtual-scroll>\n * ```\n */\n@Component({\n selector: \"igx-virtual-scroll\",\n templateUrl: \"./virtual-scroll.component.html\",\n styleUrls: [\"./virtual-scroll.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [NgTemplateOutlet, IgxVsRecycleDirective],\n host: {\n class: \"igx-virtual-scroll\",\n role: \"list\",\n \"[attr.data-orientation]\": \"orientation()\",\n },\n})\nexport class IgxVirtualScrollComponent<T> implements OnDestroy {\n //#region Dependency injection\n\n private readonly _hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _zone = inject(NgZone);\n private readonly _document = inject(DOCUMENT);\n private readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n //#endregion\n\n //#region Internal state\n\n private readonly _engine = new VirtualScrollEngine();\n\n private _viewportResizeObserver: ResizeObserver | null = null;\n private _itemResizeObserver: ResizeObserver | null = null;\n private _onScroll: (() => void) | null = null;\n\n /** Elements currently registered with the item resize observer. */\n private readonly _observedItems = new Set<Element>();\n\n /** The data index each observed wrapper element last hosted. */\n private readonly _observedItemIndexes = new WeakMap<Element, number>();\n\n /**\n * The live scroll offset on the active axis. A plain field, not a signal:\n * `_visibleRange` reads it but is invalidated by `_scrollTick`, so a scroll\n * that does not move the rendered window schedules no work.\n */\n private _scrollPosition = 0;\n\n /** Bumped only when a scroll actually moves the rendered window. */\n private readonly _scrollTick = signal(0);\n\n /** The measured viewport, or `null` while the host has never been laid out. */\n private readonly _viewportSize = signal<number | null>(null);\n\n /**\n * Whether the host is laid out left-to-right, as of the last read of the\n * horizontal axis. `_contentTransform` depends on it, so a `dir` change\n * flips the wrapper even while the rendered window stays put.\n */\n private readonly _ltr = signal(true);\n\n /** What was loaded as of the previous change, for `_retainCount`. */\n private _previousItems: LoadedItems<T> | undefined;\n\n private _lastEmittedState: VirtualScrollState | null = null;\n private _hasPendingDataRequest = false;\n\n /**\n * The `startIndex` of the last emitted `dataRequest`, which is also the\n * item count at that emit. See `_checkDataRequest`.\n */\n private _lastDataRequestIndex = -1;\n\n private _layoutCompletePromise: Promise<void> | null = null;\n private _scrollRequestId = 0;\n\n //#endregion\n\n //#region View and content children\n\n private readonly _itemDirective = contentChild(IgxVirtualItemDirective);\n\n private readonly _contentDivRef =\n viewChild<ElementRef<HTMLElement>>(\"contentDiv\");\n\n //#endregion\n\n //#region Public inputs\n\n /**\n * The array of items to virtualize.\n *\n * Compared by reference: mutating the array in place (`data.push(...)`)\n * causes no update. Assign a new array instead. The `dataRequest` flow\n * also expects a new array.\n */\n public readonly data = input<T[]>([]);\n\n /**\n * Scroll orientation of the virtual scroll.\n * Can be either \"vertical\" or \"horizontal\".\n * Default is \"vertical\".\n */\n public readonly orientation = input<\"vertical\" | \"horizontal\">(\"vertical\");\n\n /**\n * Number of extra items to render beyond the visible area of the viewport.\n * Higher values reduce blank flashes during fast scrolling but may impact performance.\n * Default is 2.\n */\n public readonly overScan = input<number>(DEFAULT_OVER_SCAN);\n\n /**\n * Estimated item size in pixels used before an item is measured in the DOM.\n * The engine replaces this with the actual measured size after the first render of each item.\n * Unmeasured items then take the average measured size.\n * Default is 50 pixels.\n * Setting this to a value close to the actual average item size can improve initial rendering performance.\n */\n public readonly estimatedItemSize = input<number>(DEFAULT_ESTIMATED_ITEM_SIZE);\n\n /**\n * A loaded page of a larger collection, for data that arrives a page at a time.\n *\n * Takes the place of `data` while it is set. The list is as long as `totalCount`, so the\n * scrollbar spans the whole collection while only the page is in memory. Indices the page\n * does not cover render nothing; use `stateChange` to see which range is wanted and supply\n * the page that covers it.\n *\n * Measured sizes are kept per index across pages while `totalCount` holds: the indices still\n * mean the same records. A page with another `totalCount` is a different collection, and\n * every size is measured again. A page that keeps the count but puts different records at\n * the same indices keeps the sizes measured for the previous ones until those rows render.\n *\n * @example\n * ```html\n * <igx-virtual-scroll [dataWindow]=\"page\" (stateChange)=\"load($event)\" style=\"height: 400px\">\n * <ng-template igxVirtualItem let-item>{{ item?.name }}</ng-template>\n * </igx-virtual-scroll>\n * ```\n */\n public readonly dataWindow = input<VirtualDataWindow<T> | null>(null);\n\n /**\n * @hidden @internal\n *\n * Viewport size in pixels to render the first window against, for a list that is hidden\n * until the change detection pass that reveals it and so has no size to measure in it.\n *\n * A hint for that first render: once the host has been laid out its own size takes over,\n * zero included. Changing `orientation` begins an axis with no measurement of its own, so\n * the hint applies again there. Negative, `NaN` and infinite values count as no hint.\n *\n * A workaround for the drop-down family, which reads and focuses items in the pass that\n * opens the list. To be removed once those components render their list on reveal.\n */\n public readonly initialViewportSize = input<number>(0);\n\n /**\n * Item template provided programmatically. Takes precedence over a content\n * `ng-template[igxVirtualItem]` when both are provided.\n *\n * Items are measured by their border box, so margins accumulate as drift\n * down the list. Use padding on the item, or a gap on a wrapper, instead.\n *\n * Only the current window is in the DOM, so assistive technology cannot\n * infer an item's position from the markup. Templates that render a role\n * with set semantics (`listitem`, `option`, `row`, ...) should map the\n * context's `index` and `count` onto `aria-posinset` and `aria-setsize`.\n *\n * Item elements are recycled: bind all item state and write user changes\n * back to the item, or unbound DOM state (e.g. a toggled checkbox) shows on\n * another item. See `keyFunction`.\n */\n public readonly itemTemplate = input<TemplateRef<IgxVsItemContext<T>> | null>(\n null,\n );\n\n /**\n * Returns a unique key from an item and its index in the whole collection. An item keeps its\n * element while its key stays rendered. Defaults to the index; set it when items move within\n * `data` (sort, insert, remove).\n *\n * @example\n * ```html\n * <igx-virtual-scroll [data]=\"people\" [keyFunction]=\"byId\">...</igx-virtual-scroll>\n * ```\n * ```ts\n * byId = (person: Person) => person.id;\n * ```\n */\n public readonly keyFunction = input<VirtualScrollKeyFunction<T> | null>(null);\n\n //#endregion\n\n //#region Public outputs\n\n /** Emitted when the rendered virtual window changes. */\n public readonly stateChange = output<VirtualScrollState>();\n\n /**\n * Emitted when the rendered window comes within a few items of the end of\n * `data`. Also emitted on the first render, when the loaded items do not\n * fill the viewport. Listen to this event to append more items\n * (infinite / remote scrolling).\n */\n public readonly dataRequest = output<VirtualScrollDataRequest>();\n\n //#endregion\n\n //#region Derived state\n\n protected readonly _isVertical = computed(\n () => this.orientation() === \"vertical\",\n );\n\n protected readonly _resolvedTemplate = computed(\n () => this.itemTemplate() ?? this._itemDirective()?.template ?? null,\n );\n\n /**\n * What the component has to work with, from whichever data input is in use. A page is\n * trusted to be no longer than the collection it says it belongs to.\n */\n private readonly _loaded = computed<LoadedItems<T>>(() => {\n const window = this.dataWindow();\n\n if (!window) {\n const items = this.data() ?? [];\n return { items, startIndex: 0, totalCount: items.length, windowed: false };\n }\n\n const items = window.items ?? [];\n const startIndex = toCount(window.startIndex);\n return {\n items,\n startIndex,\n totalCount: Math.max(toCount(window.totalCount), startIndex + items.length),\n windowed: true,\n };\n }, { equal: loadedEqual });\n\n /** The measured size once the host has been laid out, the hint until then. */\n private readonly _effectiveViewportSize = computed(\n () => this._viewportSize() ?? toCount(this.initialViewportSize()),\n );\n\n /** The configured `overScan`, normalized to a non-negative integer. */\n private readonly _normalizedOverScan = computed(() => {\n const value = Number(this.overScan());\n return Number.isFinite(value)\n ? Math.max(0, Math.floor(value))\n : DEFAULT_OVER_SCAN;\n });\n\n /** The configured `estimatedItemSize`, normalized to a positive number. */\n private readonly _normalizedItemSize = computed(() => {\n const value = Number(this.estimatedItemSize());\n return Number.isFinite(value) && value > 0\n ? value\n : DEFAULT_ESTIMATED_ITEM_SIZE;\n });\n\n /**\n * The window to render for the current scroll position and viewport. Empty\n * until an item template is resolved, because nothing renders without one.\n *\n * The scroll position is read from the plain `_scrollPosition` field so\n * that a recompute triggered by a measurement uses the live offset, while\n * `_scrollTick` limits recomputes to scrolls that actually move the window.\n */\n private readonly _visibleRange = computed<VisibleRange>(\n () => {\n // Depend on the engine so the range recomputes whenever item sizes or\n // the item count change.\n this._engine.version();\n this._scrollTick();\n\n return this._resolvedTemplate()\n ? this._engine.getVisibleRange(\n this._scrollPosition,\n this._effectiveViewportSize(),\n this._normalizedOverScan(),\n )\n : EMPTY_RANGE;\n },\n { equal: rangesEqual },\n );\n\n /** The track size, in DOM space. */\n protected readonly _spaceSize = this._engine.domSize;\n\n /** The part of the rendered range a page actually covers. */\n private readonly _loadedRange = computed<VisibleRange>(\n () => {\n const { startIndex, endIndex } = this._visibleRange();\n const { items, startIndex: from } = this._loaded();\n\n return {\n startIndex: Math.max(startIndex, from),\n endIndex: Math.min(endIndex, from + items.length - 1),\n };\n },\n { equal: rangesEqual },\n );\n\n /** The key of each rendered item: from `keyFunction`, or its index. */\n protected readonly _itemKey = computed<(context: IgxVsItemContext<T>) => unknown>(\n () => {\n const keyOf = this.keyFunction();\n return keyOf\n ? (context) => keyOf(context.$implicit, context.index)\n : (context) => context.index;\n },\n );\n\n /** The item contexts for the currently rendered window, in render order. */\n protected readonly _renderedItems = computed<IgxVsItemContext<T>[]>(() => {\n const { startIndex, endIndex } = this._loadedRange();\n const { items, startIndex: from, totalCount } = this._loaded();\n\n const rendered: IgxVsItemContext<T>[] = [];\n for (let i = startIndex; i <= endIndex; i++) {\n rendered.push(new IgxVsItemContext<T>(items[i - from], i, totalCount));\n }\n return rendered;\n });\n\n /**\n * The `translateY` / `translateX` for the content wrapper. It is absolutely\n * positioned at the origin of a `domSize` px track, so translating it to\n * the first rendered item's offset puts that item at its virtual position.\n */\n protected readonly _contentTransform = computed(() => {\n // The offsets below are plain reads of the engine's size state, so depend\n // on its version explicitly.\n this._engine.version();\n const range = this._loadedRange();\n\n // Under coordinate compression item positions are scaled down but item\n // sizes are not. Without this cap the rendered range would overflow past\n // domSize at the end of the list, pushing the last items beyond the\n // maximum browser scroll coordinate.\n const position = clamp(\n this._engine.getScrollOffsetForIndex(\n range.startIndex,\n this._effectiveViewportSize(),\n ),\n 0,\n this._engine.domSize() -\n this._engine.getPhysicalRangeSize(range.startIndex, range.endIndex),\n );\n\n if (this._isVertical()) {\n return `translateY(${position}px)`;\n }\n\n // In RTL the wrapper is anchored to the right edge of the track, so it\n // translates towards the negative (leading) direction.\n return `translateX(${this._ltr() ? position : -position}px)`;\n });\n\n //#endregion\n\n constructor() {\n // Sync the engine's item count with `data`, discarding the measurements\n // of items whose identity changed.\n effect(() => {\n const loaded = this._loaded();\n untracked(() => {\n const previous = this._previousItems;\n const retained = this._retainCount(previous, loaded);\n // Data that grew past the last request answered it, so a later reset may ask again.\n if (loaded.items.length > this._lastDataRequestIndex) {\n this._lastDataRequestIndex = -1;\n }\n this._previousItems = loaded;\n this._engine.resize(\n loaded.totalCount,\n this._normalizedItemSize(),\n retained,\n );\n this._remeasureFrom(retained);\n // New data (or a reset) clears any in-flight data request so the next\n // approach to the end of the list can emit again.\n this._hasPendingDataRequest = false;\n });\n });\n\n // Re-apply the estimate when it changes but the item count does not,\n // because `resize` is then a no-op.\n effect(() => {\n const size = this._normalizedItemSize();\n untracked(() => this._engine.updateEstimatedSize(size));\n });\n\n // The sizes and scroll offset of the previous axis do not carry over.\n effect(() => {\n this.orientation();\n untracked(() => {\n if (!this._isBrowser) {\n return;\n }\n\n this._viewportSize.set(null);\n this._engine.clearSizes();\n this._remeasureFrom(0);\n this._measureViewport();\n this._scrollPosition = this._currentAxisScroll();\n this._scrollTick.update((v) => v + 1);\n });\n });\n\n afterNextRender(() => {\n this._engine.initMaxBrowserSize(this._document);\n this._measureViewport();\n this._setupScrollListener();\n this._setupViewportResizeObserver();\n });\n\n // Runs after the DOM reflects the current window, and re-runs whenever\n // the window or the engine's sizes change.\n afterRenderEffect({\n read: () => {\n // What is wanted and what is rendered change independently: the viewport can move\n // into indices no page covers, and a page can arrive without the viewport moving.\n this._visibleRange();\n this._renderedItems();\n this._engine.version();\n untracked(() => {\n this._scheduleItemMeasurement();\n this._checkDataRequest();\n this._emitStateChange();\n });\n },\n });\n }\n\n public ngOnDestroy(): void {\n this._teardown();\n }\n\n //#region Public API\n\n /**\n * Resolves when the virtual scroll has settled: the current render pass is\n * complete, the item-size measurements it triggers are complete, and so\n * are the renders those measurements schedule.\n */\n public get layoutComplete(): Promise<void> {\n if (!this._layoutCompletePromise) {\n this._layoutCompletePromise = this._resolveLayoutComplete();\n }\n return this._layoutCompletePromise;\n }\n\n /**\n * Scrolls to the specified item index.\n *\n * Items outside the rendered window have only an estimated size, so the\n * first jump can miss the target. The items at the landing point are then\n * measured and the scroll position is corrected, until the offset is\n * stable. The returned promise resolves on that final offset; callers that\n * need only the first, approximate scroll can ignore it, because the first\n * jump is applied before the call returns.\n *\n * @param index The index of the item to scroll to.\n * @param options `block` / `inline` select the alignment (`start`,\n * `center`, `end` or `nearest`, which scrolls the smallest distance that\n * brings the item into view); `behavior` selects `auto` or `smooth`.\n */\n public async scrollToIndex(\n index: number,\n options?: ScrollIntoViewOptions,\n ): Promise<void> {\n const clampedIndex = clamp(\n index,\n 0,\n Math.max(0, this._loaded().totalCount - 1),\n );\n\n // A newer call supersedes a correction loop that still runs for a\n // previous call, for example under rapid, repeated calls.\n const requestId = ++this._scrollRequestId;\n\n let offset = this._getAlignedScrollOffset(clampedIndex, options);\n await this._scrollAndWaitForEnd(offset, options?.behavior ?? \"auto\");\n\n for (let i = 0; i < MAX_SCROLL_CORRECTION_PASSES; i++) {\n await this.layoutComplete;\n\n if (requestId !== this._scrollRequestId) {\n return;\n }\n\n const corrected = this._getAlignedScrollOffset(clampedIndex, options);\n if (Math.abs(corrected - offset) < SCROLL_OFFSET_EPSILON_PX) {\n break;\n }\n\n offset = corrected;\n await this._scrollAndWaitForEnd(offset, \"auto\");\n\n if (requestId !== this._scrollRequestId) {\n return;\n }\n }\n }\n\n //#endregion\n\n //#region Scrolling\n\n /**\n * Re-reads the host's direction, which `dir` can change at runtime. `:dir()`\n * is a selector match, so this costs no layout.\n */\n private _syncDirection(): boolean {\n const ltr = isLeftToRight(this._hostRef.nativeElement);\n this._ltr.set(ltr);\n return ltr;\n }\n\n /** The current real scroll position on the active axis, normalized for RTL. */\n private _currentAxisScroll(): number {\n const host = this._hostRef.nativeElement;\n\n if (this._isVertical()) {\n return host.scrollTop;\n }\n\n // Standards-compliant browsers expose a negative scrollLeft in RTL.\n return this._syncDirection() ? host.scrollLeft : -host.scrollLeft;\n }\n\n /** Applies a scroll offset to the active axis, accounting for RTL. */\n private _applyScroll(offset: number, behavior: ScrollBehavior): void {\n const host = this._hostRef.nativeElement;\n\n if (this._isVertical()) {\n host.scrollTo({ top: offset, behavior });\n return;\n }\n\n host.scrollTo({ left: this._syncDirection() ? offset : -offset, behavior });\n }\n\n /**\n * The scroll offset that aligns `index` in the viewport according to\n * `options`, from the engine's current size data. As more items are\n * measured, the same input can give a different, more accurate result.\n */\n private _getAlignedScrollOffset(\n index: number,\n options?: ScrollIntoViewOptions,\n ): number {\n const position = this._isVertical()\n ? (options?.block ?? \"start\")\n : (options?.inline ?? options?.block ?? \"start\");\n\n return this._engine.resolveScrollOffset(\n index,\n this._currentAxisScroll(),\n this._effectiveViewportSize(),\n position,\n );\n }\n\n /**\n * Applies a scroll offset to the active axis and waits for the scroll,\n * instant or smooth, to settle.\n *\n * `scrollend` does not fire when the requested offset does not move the\n * scroll position, so that case resolves immediately. The deadline covers\n * an event that never arrives, for example when the element is detached\n * mid-scroll.\n */\n private _scrollAndWaitForEnd(\n offset: number,\n behavior: ScrollBehavior,\n ): Promise<void> {\n if (!this._isBrowser) {\n return Promise.resolve();\n }\n\n if (Math.abs(this._currentAxisScroll() - offset) < SCROLL_OFFSET_EPSILON_PX) {\n // Already there, but the window may lag: a re-attached host got there without a scroll\n // event, and the event for a scroll that was just applied may still be pending.\n this._syncScrollPosition();\n return Promise.resolve();\n }\n\n return this._withDeadline(SCROLL_END_TIMEOUT_MS, (abort) => {\n // `scrollend` reports exactly when a scroll has settled. Safari before\n // 18.2 does not have it, and the scroll-idle timer stands in there.\n const settled =\n \"onscrollend\" in this._hostRef.nativeElement\n ? this._waitForScrollEnd(abort)\n : this._waitForScrollIdle(abort);\n\n // Applied only after the listener is attached, so an instant scroll\n // cannot settle before something watches for it.\n this._applyScroll(offset, behavior);\n return settled;\n });\n }\n\n private _waitForScrollEnd(abort: AbortSignal): Promise<void> {\n return this._promiseOutsideZone((resolve) => {\n this._hostRef.nativeElement.addEventListener(\"scrollend\", resolve, {\n once: true,\n signal: abort,\n });\n });\n }\n\n /**\n * Resolves when no `scroll` event arrives for `SCROLL_IDLE_MS`: the closest\n * replacement for `scrollend`. The first timer starts immediately, so a\n * scroll that does not move still settles.\n */\n private _waitForScrollIdle(abort: AbortSignal): Promise<void> {\n return this._promiseOutsideZone((resolve) => {\n let id = setTimeout(resolve, SCROLL_IDLE_MS);\n\n this._hostRef.nativeElement.addEventListener(\n \"scroll\",\n () => {\n clearTimeout(id);\n id = setTimeout(resolve, SCROLL_IDLE_MS);\n },\n { passive: true, signal: abort },\n );\n\n onAbort(abort, () => clearTimeout(id));\n });\n }\n\n //#endregion\n\n //#region Async helpers\n\n /** A promise whose subscription work stays out of the Angular zone. */\n private _promiseOutsideZone(\n subscribe: (resolve: () => void) => void,\n ): Promise<void> {\n return this._zone.runOutsideAngular(\n () => new Promise<void>((resolve) => subscribe(() => resolve())),\n );\n }\n\n /**\n * Resolves with `task` or with a deadline of `ms`, whichever comes first.\n * The signal then tears down the other, so no live timer or dangling\n * listener remains.\n */\n private _withDeadline(\n ms: number,\n task: (abort: AbortSignal) => Promise<void>,\n ): Promise<void> {\n const controller = new AbortController();\n\n return Promise.race([\n task(controller.signal),\n this._promiseOutsideZone((resolve) => {\n const id = setTimeout(resolve, ms);\n onAbort(controller.signal, () => clearTimeout(id));\n }),\n ]).finally(() => controller.abort());\n }\n\n /**\n * Resolves on the next animation frame, or after `LAYOUT_FRAME_TIMEOUT_MS`\n * when no frame arrives. A hidden tab or a detached element gets no frames\n * and has no layout to wait for, so resolving early there is safe.\n */\n private _nextFrame(): Promise<void> {\n if (!this._isBrowser) {\n return Promise.resolve();\n }\n\n return this._withDeadline(LAYOUT_FRAME_TIMEOUT_MS, (abort) =>\n this._promiseOutsideZone((resolve) => {\n const id = requestAnimationFrame(resolve);\n onAbort(abort, () => cancelAnimationFrame(id));\n }),\n );\n }\n\n /**\n * Waits out the frames in which the item measurements land. Each\n * measurement that changes a size bumps the engine's version and schedules\n * another render, so the layout has settled once the version holds still\n * across two consecutive frames.\n */\n private async _resolveLayoutComplete(): Promise<void> {\n try {\n let lastVersion = -1;\n\n for (let i = 0; i < MAX_LAYOUT_SETTLE_PASSES; i++) {\n await this._nextFrame();\n\n const version = untracked(this._engine.version);\n if (version === lastVersion) {\n break;\n }\n lastVersion = version;\n }\n } finally {\n // Cleared here, not after the loop, so a run that throws cannot leave\n // the getter with a permanently rejected promise.\n this._layoutCompletePromise = null;\n }\n }\n\n //#endregion\n\n //#region Measurement\n\n /** Whether the host has a box, as opposed to being hidden or detached. */\n private _isLaidOut(): boolean {\n const host = this._hostRef.nativeElement;\n return host.isConnected && host.getClientRects().length > 0;\n }\n\n private _measureViewport(): void {\n const host = this._hostRef.nativeElement;\n\n // A host with no box is hidden or detached, not sized: its last measurement is kept so\n // it renders in the pass that reveals it. A laid-out zero is a size like any other.\n if (!this._isLaidOut()) {\n return;\n }\n\n const size = this._isVertical() ? host.clientHeight : host.clientWidth;\n if (size !== untracked(this._viewportSize)) {\n this._viewportSize.set(size);\n }\n }\n\n private _setupViewportResizeObserver(): void {\n this._viewportResizeObserver?.disconnect();\n\n this._zone.runOutsideAngular(() => {\n this._viewportResizeObserver = new ResizeObserver(() => {\n this._measureViewport();\n // Detaching the host resets its scroll position without a scroll event. Following it\n // while detached renders the window the host comes back with, so it does not show blank.\n this._syncScrollPosition();\n });\n this._viewportResizeObserver.observe(this._hostRef.nativeElement);\n });\n }\n\n private _setupScrollListener(): void {\n const host = this._hostRef.nativeElement;\n\n if (this._onScroll) {\n host.removeEventListener(\"scroll\", this._onScroll);\n }\n\n this._zone.runOutsideAngular(() => {\n this._onScroll = () => this._handleScroll();\n host.addEventListener(\"scroll\", this._onScroll, { passive: true });\n });\n }\n\n /**\n * Records the new scroll offset and invalidates the rendered window only\n * when it actually moves. Without the guard, a scroll inside a single item\n * would schedule a change detection pass for an identical result.\n */\n private _handleScroll(): void {\n this._scrollPosition = this._currentAxisScroll();\n\n const next = this._engine.getVisibleRange(\n this._scrollPosition,\n untracked(this._effectiveViewportSize),\n untracked(this._normalizedOverScan),\n );\n\n if (!rangesEqual(next, untracked(this._visibleRange))) {\n this._scrollTick.update((v) => v + 1);\n }\n }\n\n /**\n * Re-reads the scroll offset outside a scroll event. Detaching the host resets the offset\n * without one, and the event for a scroll that was just applied may not have arrived yet.\n */\n private _syncScrollPosition(): void {\n // A hidden host reads 0 but gets its offset back when it is shown again. A detached one\n // reads the 0 it is re-attached with, so it is not skipped.\n if (this._hostRef.nativeElement.isConnected && !this._isLaidOut()) {\n return;\n }\n\n this._handleScroll();\n }\n\n private _handleItemResize(entries: ResizeObserverEntry[]): void {\n for (const entry of entries) {\n const index = itemIndex(entry.target);\n if (index < 0) {\n continue;\n }\n\n const measured = this._isVertical()\n ? (entry.borderBoxSize?.[0]?.blockSize ?? entry.contentRect.height)\n : (entry.borderBoxSize?.[0]?.inlineSize ?? entry.contentRect.width);\n\n if (measured > 0) {\n this._engine.measureItem(index, measured);\n }\n }\n\n // Unmeasured items follow the measured average.\n this._engine.adaptEstimate(untracked(this._loadedRange).startIndex);\n }\n\n /**\n * Synchronizes the item observer with the rendered window, applying only\n * the difference. A newly observed element gets one initial measurement.\n *\n * An element whose `data-index` changed is re-registered, because\n * `observe` on an already observed element is a no-op. The wrapper elements\n * are recycled, so after a scroll the same element can host a different\n * item at an identical size. The observer stays quiet about that and the\n * new index would keep its estimated size.\n */\n private _scheduleItemMeasurement(): void {\n const content = this._contentDivRef()?.nativeElement;\n if (!content) {\n return;\n }\n\n const observer = this._getItemResizeObserver();\n\n for (const element of [...this._observedItems]) {\n if (element.parentNode !== content) {\n observer.unobserve(element);\n this._observedItems.delete(element);\n }\n }\n\n for (const element of Array.from(content.children)) {\n const index = itemIndex(element);\n\n if (this._observedItems.has(element)) {\n if (this._observedItemIndexes.get(element) === index) {\n continue;\n }\n observer.unobserve(element);\n }\n\n observer.observe(element);\n this._observedItems.add(element);\n this._observedItemIndexes.set(element, index);\n }\n }\n\n /**\n * Forgets the wrappers from `index` on, so the next pass registers them\n * again: the engine dropped their sizes, and a wrapper whose size did not\n * change reports nothing on its own.\n */\n private _remeasureFrom(index: number): void {\n for (const element of this._observedItems) {\n if ((this._observedItemIndexes.get(element) ?? -1) >= index) {\n this._observedItemIndexes.delete(element);\n }\n }\n }\n\n private _getItemResizeObserver(): ResizeObserver {\n if (!this._itemResizeObserver) {\n this._itemResizeObserver = this._zone.runOutsideAngular(\n () => new ResizeObserver((entries) => this._handleItemResize(entries)),\n );\n }\n return this._itemResizeObserver;\n }\n\n //#endregion\n\n //#region Events\n\n /**\n * The number of leading items that kept their identity across a `data`\n * change: the index of the first item whose measured size no longer\n * matches its rendered content. An append (the `dataRequest` flow) retains\n * all items. A filter or a replacement retains only the unchanged prefix.\n */\n private _firstChangedIndex(\n previous: readonly T[],\n current: readonly T[],\n ): number {\n const shared = Math.min(previous.length, current.length);\n for (let i = 0; i < shared; i++) {\n if (previous[i] !== current[i]) {\n return i;\n }\n }\n return shared;\n }\n\n /**\n * How many leading items keep their measured size across a change. A page of the same\n * collection keeps all of them - its indices still mean the same records. A page with\n * another `totalCount` comes from a filtered or otherwise different collection, and\n * switching inputs starts over, so neither keeps any.\n */\n private _retainCount(\n previous: LoadedItems<T> | undefined,\n current: LoadedItems<T>,\n ): number {\n if (previous?.windowed !== current.windowed) {\n return 0;\n }\n\n if (!current.windowed) {\n return this._firstChangedIndex(previous.items, current.items);\n }\n\n return previous.totalCount === current.totalCount ? current.totalCount : 0;\n }\n\n /**\n * Emits `stateChange`. Skipped when the window is empty or equal to the\n * last reported one, because measurement passes re-render without a window\n * change.\n */\n private _emitStateChange(): void {\n const { startIndex, endIndex } = untracked(this._visibleRange);\n if (endIndex < startIndex) {\n return;\n }\n\n const state: VirtualScrollState = {\n startIndex,\n endIndex,\n viewportSize: untracked(this._effectiveViewportSize),\n totalSize: untracked(this._engine.totalSize),\n };\n\n if (statesEqual(this._lastEmittedState, state)) {\n return;\n }\n\n this._lastEmittedState = { ...state };\n this.stateChange.emit(state);\n }\n\n private _checkDataRequest(): void {\n const loaded = untracked(this._loaded);\n\n // `dataRequest` asks for items to append, which a sized collection does not need. The\n // count `data` had reached before says nothing once a window is bound, so forget it here.\n if (loaded.windowed) {\n this._lastDataRequestIndex = -1;\n return;\n }\n\n if (this._hasPendingDataRequest) {\n return;\n }\n\n const { endIndex } = untracked(this._visibleRange);\n const total = loaded.items.length;\n\n if (total === 0 || endIndex < total - DATA_REQUEST_THRESHOLD) {\n return;\n }\n\n // Each `data` change clears `_hasPendingDataRequest`, including one that\n // appends nothing. Without this second guard, a consumer whose source is\n // exhausted, and that reassigns `data` in response to a request, would\n // receive the same request on each reassignment.\n if (this._lastDataRequestIndex === total) {\n return;\n }\n\n this._hasPendingDataRequest = true;\n this._lastDataRequestIndex = total;\n\n this.dataRequest.emit({\n startIndex: total,\n count: Math.max(\n untracked(this._normalizedOverScan) * DATA_REQUEST_OVER_SCAN_FACTOR,\n DATA_REQUEST_MIN_COUNT,\n ),\n });\n }\n\n //#endregion\n\n private _teardown(): void {\n const host = this._hostRef.nativeElement;\n\n if (this._onScroll) {\n host.removeEventListener(\"scroll\", this._onScroll);\n this._onScroll = null;\n }\n\n this._viewportResizeObserver?.disconnect();\n this._viewportResizeObserver = null;\n\n this._itemResizeObserver?.disconnect();\n this._itemResizeObserver = null;\n this._observedItems.clear();\n }\n}\n","<div\n class=\"igx-virtual-scroll__track\"\n role=\"presentation\"\n [style.height.px]=\"_isVertical() ? _spaceSize() : null\"\n [style.width.px]=\"!_isVertical() ? _spaceSize() : null\"\n>\n <div\n class=\"igx-virtual-scroll__content\"\n #contentDiv\n role=\"presentation\"\n [style.transform]=\"_contentTransform()\"\n >\n @if (_resolvedTemplate(); as template) {\n <div\n *igxVsRecycle=\"let context of _renderedItems(); key: _itemKey()\"\n class=\"igx-virtual-item\"\n role=\"presentation\"\n [attr.data-index]=\"context.index\"\n >\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"context\"\n />\n </div>\n }\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;AAIA;AACA,MAAM,oBAAoB,GAAG,IAAI,OAAO,EAAoB;AAE5D;AACA,SAAS,mBAAmB,CAAC,GAAa,EAAA;IACxC,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC;AAC5C,IAAA,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,QAAA,OAAO,MAAM;IACf;IAEA,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,eAAe;IACjD,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,MAAM,CAAC,iBAAiB;IACjC;IAEA,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC;AACtC,IAAA,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;IACjC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAA,EAAA,CAAI;AAChD,IAAA,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG;AACvB,IAAA,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;AACxB,IAAA,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ;AACjC,IAAA,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC;;IAG5B,MAAM,YAAY,GAAG,GAAG,CAAC,eAAe,EAAE,SAAS,IAAI,CAAC;AACxD,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,GAAG,YAAY;AACvE,IAAA,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC;AAE5B,IAAA,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC;AACnC,IAAA,OAAO,IAAI;AACb;AAEA;AACA,MAAM,UAAU,GAAG,CAAC;AACpB;AACA,MAAM,QAAQ,GAAG,CAAC;AAClB;AACA,MAAM,OAAO,GAAG,CAAC;AAEjB;;;;;;;AAOG;AACH,MAAM,QAAQ,CAAA;;AAgCZ,IAAA,WAAA,CACE,MAAc,EACd,QAAgB,EAChB,KAAK,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,EAChC,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,EAAA;QAlBzB,IAAA,CAAA,cAAc,GAAG,CAAC;QAClB,IAAA,CAAA,cAAc,GAAG,CAAC;;QAGlB,IAAA,CAAA,YAAY,GAAG,CAAC;QAChB,IAAA,CAAA,YAAY,GAAG,CAAC;AAetB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM;QACrB,IAAI,CAAC,KAAK,GAAG,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC;AAE9D,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE;YAChC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AAE3B,YAAA,IAAI,KAAK,KAAK,UAAU,EAAE;gBACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;AACzB,gBAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;AACrB,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACjB,IAAI,CAAC,cAAc,EAAE;AACrB,gBAAA,IAAI,CAAC,cAAc,IAAI,IAAI;AAE3B,gBAAA,IAAI,KAAK,KAAK,OAAO,EAAE;oBACrB,IAAI,CAAC,YAAY,EAAE;AACnB,oBAAA,IAAI,CAAC,YAAY,IAAI,IAAI;gBAC3B;YACF;YAEA,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,YAAA,IAAI,MAAM,IAAI,MAAM,EAAE;AACpB,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACnC,gBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACzC;QACF;IACF;;AAGA,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;IACxC;;AAGO,IAAA,WAAW,CAAC,QAAgB,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,IAAI,QAAQ;IAC7E;;AAGA,IAAA,IAAW,aAAa,GAAA;QACtB,OAAO,IAAI,CAAC,cAAc;IAC5B;;AAGA,IAAA,IAAW,aAAa,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC;IAC1E;;AAGO,IAAA,gBAAgB,CAAC,KAAa,EAAA;QACnC,IAAI,KAAK,GAAG,CAAC;AACb,QAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;AACtC,YAAA,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1B;QACA,OAAO,KAAK,KAAK,KAAK;IACxB;AAEA;;;AAGG;AACI,IAAA,SAAS,CAAC,CAAS,EAAA;QACxB,IAAI,GAAG,GAAG,CAAC;QACX,IAAI,KAAK,GAAG,CAAC;AACb,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;AAClC,YAAA,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACpB,YAAA,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1B;QACA,OAAO,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,QAAQ;IAC1C;AAEA;;;AAGG;IACI,MAAM,CAAC,KAAa,EAAE,IAAY,EAAA;QACvC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;AACrC,YAAA,OAAO,KAAK;QACd;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;AACjC,QAAA,MAAM,KAAK,GAAG,KAAK,KAAK,UAAU;AAClC,QAAA,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAC1C,QAAA,MAAM,KAAK,GAAG,IAAI,GAAG,GAAG;AAExB,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO;AAC7B,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,cAAc,IAAI,KAAK;AAC5B,QAAA,IAAI,CAAC,YAAY,IAAI,KAAK,KAAK,OAAO,GAAG,KAAK,GAAG,IAAI;AAErD,QAAA,IAAI,KAAK,KAAK,OAAO,EAAE;YACrB,IAAI,CAAC,YAAY,EAAE;QACrB;QACA,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,cAAc,EAAE;QACvB;AAEA,QAAA,IAAI,KAAK,IAAI,KAAK,KAAK,CAAC,EAAE;YACxB,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;AACrD,gBAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK;gBACtB,IAAI,KAAK,EAAE;AACT,oBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACnB;YACF;QACF;AAEA,QAAA,OAAO,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;IAC/C;AAEA;;;;;AAKG;AACI,IAAA,YAAY,CAAC,SAAiB,EAAE,WAAW,GAAG,SAAS,EAAA;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AAC3E,QAAA,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC;AACzC,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC;AAExC,QAAA,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC5C,QAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC9C,QAAA,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC;IAC9D;AAEA;;;AAGG;IACI,WAAW,GAAA;AAChB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE;AAC/B,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,QAAQ;YAC5B;QACF;AACA,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC;IACvB;AAEA;;;AAGG;AACI,IAAA,iBAAiB,CAAC,MAAc,EAAA;QACrC,IAAI,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACpC,YAAA,OAAO,CAAC;QACV;QAEA,IAAI,KAAK,GAAG,CAAC;QACb,IAAI,SAAS,GAAG,MAAM;AAEtB,QAAA,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE;AAC/C,YAAA,MAAM,IAAI,GAAG,KAAK,GAAG,GAAG;AACxB,YAAA,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE;gBACtB;YACF;;YAGA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ;AAC1E,YAAA,IAAI,IAAI,IAAI,SAAS,EAAE;gBACrB,KAAK,GAAG,IAAI;gBACZ,SAAS,IAAI,IAAI;YACnB;QACF;AACA,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC;IACzC;AACD;AAED;;;;;;;;;;;;;;AAcG;MACU,mBAAmB,CAAA;AAAhC,IAAA,WAAA,GAAA;AACU,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB;QAE1C,IAAA,CAAA,KAAK,GAAoB,IAAI;;AAG7B,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,GAAG;;QAGhC,IAAA,CAAA,mBAAmB,GAAG,KAAK;;QAGlB,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,CAAC;qFAAC;AAErC;;;AAGG;AACa,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;;AAGpC,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAS,MAAK;YAChD,IAAI,CAAC,QAAQ,EAAE;AACf,YAAA,OAAO,IAAI,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC;QACnC,CAAC;sFAAC;AAEF;;;;;;AAMG;AACa,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAS,MAAK;YAC9C,IAAI,CAAC,QAAQ,EAAE;AACf,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC;QACnE,CAAC;oFAAC;IAwSJ;AAtSE;;;;AAIG;AACI,IAAA,kBAAkB,CAAC,GAAa,EAAA;AACrC,QAAA,IAAI,CAAC,eAAe,GAAG,mBAAmB,CAAC,GAAG,CAAC;QAC/C,IAAI,CAAC,WAAW,EAAE;IACpB;AAEA;;;;;;;;;AASG;AACI,IAAA,MAAM,CACX,MAAc,EACd,aAAqB,EACrB,WAAW,GAAG,MAAM,EAAA;AAEpB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,IAAI,WAAW,IAAI,MAAM,EAAE;YAC1D;QACF;AAEA,QAAA,IAAI,CAAC,KAAK;YACR,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC;AAC7C,gBAAA,IAAI,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;AAErC,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,EAAE;AAC1C,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,aAAa;QACrC;QACA,IAAI,CAAC,WAAW,EAAE;IACpB;;IAGO,WAAW,CAAC,KAAa,EAAE,IAAY,EAAA;QAC5C,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;YACnC,IAAI,CAAC,WAAW,EAAE;QACpB;IACF;AAEA;;;;AAIG;AACI,IAAA,mBAAmB,CAAC,aAAqB,EAAA;AAC9C,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,EAAE;AAC1C,YAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;QACpC;IACF;AAEA;;;;;AAKG;AACI,IAAA,aAAa,CAAC,WAAmB,EAAA;AACtC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK;AACvB,QAAA,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE;YACxB;QACF;;AAGA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACjF,IACE,IAAI,CAAC,mBAAmB;AACxB,aAAC,WAAW,GAAG,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,EAC3E;YACA;QACF;AAEA,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAC/B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC;IACzC;;IAGO,UAAU,GAAA;AACf,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK;AACvB,QAAA,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE;YACpE;QACF;AAEA,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC;AAChE,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;QAChC,IAAI,CAAC,WAAW,EAAE;IACpB;AAEA;;;AAGG;IACI,uBAAuB,CAAC,KAAa,EAAE,YAAoB,EAAA;QAChE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC,EAAE;AAC7B,YAAA,OAAO,CAAC;QACV;QACA,OAAO,IAAI,CAAC,MAAM,CAChB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EACxD,YAAY,CACb;IACH;AAEA;;;;;;;;AAQG;AACI,IAAA,sBAAsB,CAC3B,KAAa,EACb,YAAoB,EACpB,KAAsB,EAAA;QAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,MAAM;AAC3B,QAAA,MAAM,KAAK,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC;QACrD,IAAI,MAAM,GAAG,KAAK;AAElB,QAAA,IAAI,KAAK,KAAK,QAAQ,EAAE;AACtB,YAAA,MAAM,IAAI,KAAK,GAAG,CAAC;QACrB;AAAO,aAAA,IAAI,KAAK,KAAK,KAAK,EAAE;YAC1B,MAAM,IAAI,KAAK;QACjB;QAEA,OAAO,KAAK,CACV,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EACjC,CAAC,EACD,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CACjC;IACH;AAEA;;;;;;;;AAQG;AACI,IAAA,mBAAmB,CACxB,KAAa,EACb,cAAsB,EACtB,YAAoB,EACpB,QAA+B,EAAA;AAE/B,QAAA,IAAI,QAAQ,KAAK,SAAS,EAAE;AAC1B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC;AACvE,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC;YACnE,OAAO,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC1E;QAEA,OAAO,IAAI,CAAC,sBAAsB,CAChC,KAAK,EACL,YAAY,EACZ,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,KAAK,GAAG,QAAQ,GAAG,OAAO,CACjE;IACH;;AAGO,IAAA,eAAe,CACpB,cAAsB,EACtB,YAAoB,EACpB,QAAgB,EAAA;AAEhB,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE;YAC/D,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE;QACxC;;;;QAKA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,YAAY,CAAC;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC;AACvD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,WAAW,GAAG,YAAY,CAAC;QAErE,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;AACzC,YAAA,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC;SAC3D;IACH;AAEA;;;;AAIG;IACI,oBAAoB,CAAC,UAAkB,EAAE,QAAgB,EAAA;AAC9D,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACf,YAAA,OAAO,CAAC;QACV;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AACtE,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;IAChE;AAEA;;;AAGG;AACK,IAAA,WAAW,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1C,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IAC3E;AAEA;;;AAGG;AACK,IAAA,kBAAkB,CAAC,aAAqB,EAAA;AAC9C,QAAA,IAAI,aAAa,KAAK,IAAI,CAAC,mBAAmB,EAAE;AAC9C,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,CAAC,mBAAmB,GAAG,aAAa;AACxC,QAAA,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE;AACzB,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,cAAc,CAAC,aAAqB,EAAA;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,aAAa,EAAE;YACxD;QACF;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,aAAa;QACnC,IAAI,CAAC,WAAW,EAAE;IACpB;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC;AAEA;;;AAGG;IACK,MAAM,CAAC,aAAqB,EAAE,YAAoB,EAAA;AACxD,QAAA,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;AACjE,QAAA,OAAO,CAAC,aAAa,GAAG,QAAQ,IAAI,YAAY;IAClD;AAEA;;;AAGG;IACK,UAAU,CAAC,SAAiB,EAAE,YAAoB,EAAA;AACxD,QAAA,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;;;AAIjE,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;AACvE,QAAA,OAAO,CAAC,SAAS,GAAG,YAAY,IAAI,QAAQ;IAC9C;;AAGQ,IAAA,aAAa,CAAC,YAAoB,EAAA;AACxC,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC;IACnD;AAEA;;;;;;;AAOG;AACK,IAAA,aAAa,CAAC,YAAoB,EAAA;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC;AAC5C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,GAAG,YAAY;QAEpD,IAAI,SAAS,IAAI,IAAI,CAAC,eAAe,IAAI,QAAQ,IAAI,CAAC,EAAE;AACtD,YAAA,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QACf;AACA,QAAA,OAAO,CAAC,SAAS,GAAG,YAAY,EAAE,QAAQ,CAAC;IAC7C;AACD;;AChmBD;MACa,gBAAgB,CAAA;AAC3B,IAAA,WAAA;;IAES,SAAY;;IAEZ,KAAa;;IAEb,KAAa,EAAA;QAJb,IAAA,CAAA,SAAS,GAAT,SAAS;QAET,IAAA,CAAA,KAAK,GAAL,KAAK;QAEL,IAAA,CAAA,KAAK,GAAL,KAAK;IACX;;AAGH,IAAA,IAAW,KAAK,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC;IACzB;;AAGA,IAAA,IAAW,IAAI,GAAA;QACb,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC;IACtC;;AAGA,IAAA,IAAW,IAAI,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;IAC7B;;AAGA,IAAA,IAAW,GAAG,GAAA;AACZ,QAAA,OAAO,CAAC,IAAI,CAAC,IAAI;IACnB;AACD;;AC3BD;;;;;;;;;;;;;AAaG;MAEU,uBAAuB,CAAA;AADpC,IAAA,WAAA,GAAA;AAEkB,QAAA,IAAA,CAAA,QAAQ,GACtB,MAAM,CAAmC,WAAW,CAAC;AACxD,IAAA;8GAHY,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,SAAS;mBAAC,EAAE,QAAQ,EAAE,6BAA6B,EAAE;;;ACAtD;;;;AAIG;AACH,MAAM,WAAW,GAAG,CAAC;AACrB,MAAM,eAAe,GAAG,CAAC;AAEzB;;;;AAIG;AACH,SAAS,6BAA6B,CACpC,MAAkB,EAClB,OAAmB,EACnB,IAAY,EAAA;;;IAIZ,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5C,IAAI,IAAI,GAAG,CAAC;AACZ,IAAA,IAAI,IAAI,GAAG,CAAC,CAAC;AAEb,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACtC,QAAA,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;YACjB;QACF;QAEA,IAAI,KAAK,GAAG,CAAC;AACb,QAAA,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,QAAA,KAAK,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE;AACzD,YAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE;AAC1B,gBAAA,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC;AACtB,gBAAA,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;YACvB;QACF;AAEA,QAAA,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC;AACnB,QAAA,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM;QACpB,KAAK,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE;AACjE,YAAA,IAAI,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC1B,gBAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK;AACtB,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAClB;QACF;AAEA,QAAA,IAAI,KAAK,GAAG,IAAI,EAAE;YAChB,IAAI,GAAG,KAAK;YACZ,IAAI,GAAG,CAAC;QACV;IACF;AAEA,IAAA,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE;AAC1C,QAAA,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IACf;AACA,IAAA,OAAO,MAAM;AACf;AAEA;;;;;;;;;;;;;;AAcG;MAEU,qBAAqB,CAAA;AADlC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACrC,QAAA,IAAA,CAAA,SAAS,GACxB,MAAM,CAAsC,WAAW,CAAC;;QAG1C,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,QAAQ;2FAAgB;;QAG/C,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,QAAQ;4FAAwB;;QAGhE,IAAA,CAAA,MAAM,GAAsB,EAAE;QAC9B,IAAA,CAAA,KAAK,GAAc,EAAE;AAyJ9B,IAAA;AAvJQ,IAAA,OAAO,sBAAsB,CAClC,UAAoC,EACpC,QAAiB,EAAA;AAEjB,QAAA,OAAO,IAAI;IACb;IAEO,WAAW,GAAA;AAChB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAE9C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC;AAC1C,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACnB;AAEA;;;;;;;;;;AAUG;IACK,UAAU,CAChB,KAAmB,EACnB,IAAwB,EAAA;AAExB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM;;AAG5B,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KACpB,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CACxE;QACH;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM;AACzB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;;;AAIvC,QAAA,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC3C,QAAA,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;;AAG/C,QAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAmB;AAC/C,QAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAC/C,YAAA,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpC;AAEA,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAC/C;YACF;AAEA,YAAA,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;AACrB,YAAA,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ;AAClB,YAAA,OAAO,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,OAAO,GAAG,WAAW,GAAG,KAAK,GAAG,WAAW;QACvE;QAEA,IAAI,KAAK,GAAG,CAAC;AACb,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACzD,YAAA,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;gBAChB;YACF;YAEA,OAAO,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;AAChD,gBAAA,KAAK,EAAE;YACT;AACA,YAAA,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE;AAC3B,gBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;AAClB,gBAAA,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK;AACf,gBAAA,OAAO,CAAC,CAAC,CAAC,GAAG,eAAe;YAC9B;QACF;QAEA,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,QAAQ,KAAI;AAClC,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBACtB,IAAI,CAAC,OAAO,EAAE;YAChB;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,MAAM,GAAG,6BAA6B,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC;AAC5E,QAAA,MAAM,KAAK,GAAsB,IAAI,KAAK,CAAC,KAAK,CAAC;AACjD,QAAA,IAAI,IAAiC;;AAGrC,QAAA,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACnC,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEtD,IAAI,IAAI,EAAE;AACR,gBAAA,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;AACd,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;gBAC9B;gBACA,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;YACnC;iBAAO;AACL,gBAAA,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB,CACvC,IAAI,CAAC,SAAS,EACd,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EACvB,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CACjD;YACH;AAEA,YAAA,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;YACf,IAAI,GAAG,IAAI;QACb;AACA,QAAA,OAAO,KAAK;IACd;;IAGQ,WAAW,CAAC,IAAqB,EAAE,IAAsB,EAAA;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;QAC7C,MAAM,MAAM,GAAG;cACX,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI;AAC9B,cAAE,IAAI,CAAC,UAAU,CAAC,MAAM;AAE1B,QAAA,IAAI,OAAO,KAAK,MAAM,GAAG,CAAC,EAAE;YAC1B;QACF;;;QAIA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;IACpE;;IAGQ,gBAAgB,GAAA;QACtB,MAAM,MAAM,GAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAsB,CAAC,UAAU;;AAEzE,QAAA,IAAI,OAAO,MAAM,EAAE,WAAW,KAAK,UAAU,EAAE;YAC7C,OAAO,CAAC,CAAC;QACX;;AAGA,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAmC;AAClE,QAAA,IAAI,IAAI,GAAgB,IAAI,CAAC,aAAa,IAAI,IAAI;QAElD,OAAO,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,EAAE;AACzC,YAAA,IAAI,GAAG,IAAI,CAAC,UAAU;QACxB;QACA,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,CAAC,CAAC;QACX;QAEA,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvE;8GArKW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,SAAS;mBAAC,EAAE,QAAQ,EAAE,gCAAgC,EAAE;;;AC1DzD;AACA,MAAM,iBAAiB,GAAG,CAAC;AAC3B,MAAM,2BAA2B,GAAG,EAAE;AAEtC;AACA,MAAM,sBAAsB,GAAG,CAAC;AAChC,MAAM,sBAAsB,GAAG,EAAE;AACjC,MAAM,6BAA6B,GAAG,CAAC;AAEvC;AACA,MAAM,wBAAwB,GAAG,EAAE;AACnC,MAAM,4BAA4B,GAAG,CAAC;AAEtC,MAAM,qBAAqB,GAAG,IAAI;AAClC,MAAM,wBAAwB,GAAG,CAAC;AAElC;AACA,MAAM,cAAc,GAAG,GAAG;AAE1B;;;AAGG;AACH,MAAM,uBAAuB,GAAG,GAAG;AAEnC,MAAM,WAAW,GAAiB,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;AAQhF;AACA,SAAS,OAAO,CAAC,KAAa,EAAA;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC/B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC;AACxD;AAEA,SAAS,WAAW,CAAI,CAAiB,EAAE,CAAiB,EAAA;AAC1D,IAAA,QACE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;AACnB,QAAA,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;AAC7B,QAAA,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;AAC7B,QAAA,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;AAE7B;AAEA,SAAS,WAAW,CAAC,CAAe,EAAE,CAAe,EAAA;AACnD,IAAA,OAAO,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;AACnE;AAEA,SAAS,WAAW,CAClB,CAA4B,EAC5B,CAAqB,EAAA;IAErB,QACE,CAAC,KAAK,IAAI;AACV,QAAA,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;AACjB,QAAA,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY;AACjC,QAAA,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;AAE/B;AAEA;AACA,SAAS,SAAS,CAAC,OAAgB,EAAA;AACjC,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAC1B,OAAuB,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAC/C,EAAE,CACH;AACD,IAAA,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAC3D;AAEA,SAAS,OAAO,CAAC,KAAkB,EAAE,MAAkB,EAAA;AACrD,IAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACzD;AAEA;;;;;;;;;;;;;;;AAeG;MAcU,yBAAyB,CAAA;;AA2VpC,IAAA,WAAA,GAAA;;AAxViB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAA0B,UAAU,CAAC;AACtD,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;AACtB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC5B,IAAA,CAAA,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;;;AAMnD,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,mBAAmB,EAAE;QAE5C,IAAA,CAAA,uBAAuB,GAA0B,IAAI;QACrD,IAAA,CAAA,mBAAmB,GAA0B,IAAI;QACjD,IAAA,CAAA,SAAS,GAAwB,IAAI;;AAG5B,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,GAAG,EAAW;;AAGnC,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,OAAO,EAAmB;AAEtE;;;;AAIG;QACK,IAAA,CAAA,eAAe,GAAG,CAAC;;QAGV,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,CAAC;wFAAC;;QAGvB,IAAA,CAAA,aAAa,GAAG,MAAM,CAAgB,IAAI;0FAAC;AAE5D;;;;AAIG;QACc,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,IAAI;iFAAC;QAK5B,IAAA,CAAA,iBAAiB,GAA8B,IAAI;QACnD,IAAA,CAAA,sBAAsB,GAAG,KAAK;AAEtC;;;AAGG;QACK,IAAA,CAAA,qBAAqB,GAAG,CAAC,CAAC;QAE1B,IAAA,CAAA,sBAAsB,GAAyB,IAAI;QACnD,IAAA,CAAA,gBAAgB,GAAG,CAAC;;;QAMX,IAAA,CAAA,cAAc,GAAG,YAAY,CAAC,uBAAuB;2FAAC;QAEtD,IAAA,CAAA,cAAc,GAC7B,SAAS,CAA0B,YAAY;2FAAC;;;AAMlD;;;;;;AAMG;QACa,IAAA,CAAA,IAAI,GAAG,KAAK,CAAM,EAAE;iFAAC;AAErC;;;;AAIG;QACa,IAAA,CAAA,WAAW,GAAG,KAAK,CAA4B,UAAU;wFAAC;AAE1E;;;;AAIG;QACa,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAS,iBAAiB;qFAAC;AAE3D;;;;;;AAMG;QACa,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAAS,2BAA2B;8FAAC;AAE9E;;;;;;;;;;;;;;;;;;;AAmBG;QACa,IAAA,CAAA,UAAU,GAAG,KAAK,CAA8B,IAAI;uFAAC;AAErE;;;;;;;;;;;;AAYG;QACa,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAS,CAAC;gGAAC;AAEtD;;;;;;;;;;;;;;;AAeG;QACa,IAAA,CAAA,YAAY,GAAG,KAAK,CAClC,IAAI;yFACL;AAED;;;;;;;;;;;;AAYG;QACa,IAAA,CAAA,WAAW,GAAG,KAAK,CAAqC,IAAI;wFAAC;;;;QAO7D,IAAA,CAAA,WAAW,GAAG,MAAM,EAAsB;AAE1D;;;;;AAKG;QACa,IAAA,CAAA,WAAW,GAAG,MAAM,EAA4B;;;QAM7C,IAAA,CAAA,WAAW,GAAG,QAAQ,CACvC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU;wFACxC;AAEkB,QAAA,IAAA,CAAA,iBAAiB,GAAG,QAAQ,CAC7C,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,QAAQ,IAAI,IAAI;8FACrE;AAED;;;AAGG;AACc,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAiB,MAAK;AACvD,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;YAEhC,IAAI,CAAC,MAAM,EAAE;gBACX,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;AAC/B,gBAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC5E;AAEA,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;YAC7C,OAAO;gBACL,KAAK;gBACL,UAAU;AACV,gBAAA,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;AAC3E,gBAAA,QAAQ,EAAE,IAAI;aACf;AACH,QAAA,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,SAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,KAAK,EAAE,WAAW,GAAG;;AAGT,QAAA,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAChD,MAAM,IAAI,CAAC,aAAa,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;mGAClE;;AAGgB,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;YACnD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACrC,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK;AAC1B,kBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;kBAC7B,iBAAiB;QACvB,CAAC;gGAAC;;AAGe,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;YACnD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC9C,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG;AACvC,kBAAE;kBACA,2BAA2B;QACjC,CAAC;gGAAC;AAEF;;;;;;;AAOG;AACc,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CACvC,MAAK;;;AAGH,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACtB,IAAI,CAAC,WAAW,EAAE;YAElB,OAAO,IAAI,CAAC,iBAAiB;kBACzB,IAAI,CAAC,OAAO,CAAC,eAAe,CAC1B,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,sBAAsB,EAAE,EAC7B,IAAI,CAAC,mBAAmB,EAAE;kBAE5B,WAAW;AACjB,QAAA,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,eAAA,EAAA,8BAAA,EAAA,CAAA,EACC,KAAK,EAAE,WAAW,GACrB;;AAGkB,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;;AAGnC,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CACtC,MAAK;YACH,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE;AACrD,YAAA,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;YAElD,OAAO;gBACL,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC;AACtC,gBAAA,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;aACtD;AACH,QAAA,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,cAAA,EAAA,8BAAA,EAAA,CAAA,EACC,KAAK,EAAE,WAAW,GACrB;;AAGkB,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CACpC,MAAK;AACH,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;AAChC,YAAA,OAAO;AACL,kBAAE,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK;kBACnD,CAAC,OAAO,KAAK,OAAO,CAAC,KAAK;QAChC,CAAC;qFACF;;AAGkB,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAwB,MAAK;YACvE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE;AACpD,YAAA,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;YAE9D,MAAM,QAAQ,GAA0B,EAAE;AAC1C,YAAA,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,EAAE,EAAE;AAC3C,gBAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;YACxE;AACA,YAAA,OAAO,QAAQ;QACjB,CAAC;2FAAC;AAEF;;;;AAIG;AACgB,QAAA,IAAA,CAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;;;AAGnD,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AACtB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;;;;;YAMjC,MAAM,QAAQ,GAAG,KAAK,CACpB,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAClC,KAAK,CAAC,UAAU,EAChB,IAAI,CAAC,sBAAsB,EAAE,CAC9B,EACD,CAAC,EACD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AACpB,gBAAA,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CACtE;AAED,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;gBACtB,OAAO,CAAA,WAAA,EAAc,QAAQ,CAAA,GAAA,CAAK;YACpC;;;AAIA,YAAA,OAAO,CAAA,WAAA,EAAc,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,GAAG,CAAC,QAAQ,KAAK;QAC9D,CAAC;8FAAC;;;QAOA,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE;YAC7B,SAAS,CAAC,MAAK;AACb,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc;gBACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC;;gBAEpD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,qBAAqB,EAAE;AACpD,oBAAA,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;gBACjC;AACA,gBAAA,IAAI,CAAC,cAAc,GAAG,MAAM;AAC5B,gBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CACjB,MAAM,CAAC,UAAU,EACjB,IAAI,CAAC,mBAAmB,EAAE,EAC1B,QAAQ,CACT;AACD,gBAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;;;AAG7B,gBAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK;AACrC,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;;;QAIF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,EAAE;AACvC,YAAA,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACzD,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,WAAW,EAAE;YAClB,SAAS,CAAC,MAAK;AACb,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;oBACpB;gBACF;AAEA,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,gBAAA,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AACzB,gBAAA,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,gBAAgB,EAAE;AACvB,gBAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAChD,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACvC,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,eAAe,CAAC,MAAK;YACnB,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;YAC/C,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,oBAAoB,EAAE;YAC3B,IAAI,CAAC,4BAA4B,EAAE;AACrC,QAAA,CAAC,CAAC;;;AAIF,QAAA,iBAAiB,CAAC;YAChB,IAAI,EAAE,MAAK;;;gBAGT,IAAI,CAAC,aAAa,EAAE;gBACpB,IAAI,CAAC,cAAc,EAAE;AACrB,gBAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;gBACtB,SAAS,CAAC,MAAK;oBACb,IAAI,CAAC,wBAAwB,EAAE;oBAC/B,IAAI,CAAC,iBAAiB,EAAE;oBACxB,IAAI,CAAC,gBAAgB,EAAE;AACzB,gBAAA,CAAC,CAAC;YACJ,CAAC;AACF,SAAA,CAAC;IACJ;IAEO,WAAW,GAAA;QAChB,IAAI,CAAC,SAAS,EAAE;IAClB;;AAIA;;;;AAIG;AACH,IAAA,IAAW,cAAc,GAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;AAChC,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,EAAE;QAC7D;QACA,OAAO,IAAI,CAAC,sBAAsB;IACpC;AAEA;;;;;;;;;;;;;;AAcG;AACI,IAAA,MAAM,aAAa,CACxB,KAAa,EACb,OAA+B,EAAA;QAE/B,MAAM,YAAY,GAAG,KAAK,CACxB,KAAK,EACL,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC,CAC3C;;;AAID,QAAA,MAAM,SAAS,GAAG,EAAE,IAAI,CAAC,gBAAgB;QAEzC,IAAI,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,YAAY,EAAE,OAAO,CAAC;AAChE,QAAA,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,IAAI,MAAM,CAAC;AAEpE,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,4BAA4B,EAAE,CAAC,EAAE,EAAE;YACrD,MAAM,IAAI,CAAC,cAAc;AAEzB,YAAA,IAAI,SAAS,KAAK,IAAI,CAAC,gBAAgB,EAAE;gBACvC;YACF;YAEA,MAAM,SAAS,GAAG,IAAI,CAAC,uBAAuB,CAAC,YAAY,EAAE,OAAO,CAAC;YACrE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,wBAAwB,EAAE;gBAC3D;YACF;YAEA,MAAM,GAAG,SAAS;YAClB,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC;AAE/C,YAAA,IAAI,SAAS,KAAK,IAAI,CAAC,gBAAgB,EAAE;gBACvC;YACF;QACF;IACF;;;AAMA;;;AAGG;IACK,cAAc,GAAA;QACpB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;AACtD,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,QAAA,OAAO,GAAG;IACZ;;IAGQ,kBAAkB,GAAA;AACxB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa;AAExC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB,OAAO,IAAI,CAAC,SAAS;QACvB;;AAGA,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU;IACnE;;IAGQ,YAAY,CAAC,MAAc,EAAE,QAAwB,EAAA;AAC3D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa;AAExC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;YACxC;QACF;QAEA,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC7E;AAEA;;;;AAIG;IACK,uBAAuB,CAC7B,KAAa,EACb,OAA+B,EAAA;AAE/B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW;AAC/B,eAAG,OAAO,EAAE,KAAK,IAAI,OAAO;AAC5B,eAAG,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC;QAElD,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CACrC,KAAK,EACL,IAAI,CAAC,kBAAkB,EAAE,EACzB,IAAI,CAAC,sBAAsB,EAAE,EAC7B,QAAQ,CACT;IACH;AAEA;;;;;;;;AAQG;IACK,oBAAoB,CAC1B,MAAc,EACd,QAAwB,EAAA;AAExB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,YAAA,OAAO,OAAO,CAAC,OAAO,EAAE;QAC1B;AAEA,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,MAAM,CAAC,GAAG,wBAAwB,EAAE;;;YAG3E,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,OAAO,OAAO,CAAC,OAAO,EAAE;QAC1B;QAEA,OAAO,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK,KAAI;;;YAGzD,MAAM,OAAO,GACX,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC;AAC7B,kBAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK;AAC9B,kBAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;;;AAIpC,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;AACnC,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,iBAAiB,CAAC,KAAkB,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC,OAAO,KAAI;YAC1C,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,EAAE;AACjE,gBAAA,IAAI,EAAE,IAAI;AACV,gBAAA,MAAM,EAAE,KAAK;AACd,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEA;;;;AAIG;AACK,IAAA,kBAAkB,CAAC,KAAkB,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC,OAAO,KAAI;YAC1C,IAAI,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC;YAE5C,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAC1C,QAAQ,EACR,MAAK;gBACH,YAAY,CAAC,EAAE,CAAC;AAChB,gBAAA,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC;YAC1C,CAAC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CACjC;YAED,OAAO,CAAC,KAAK,EAAE,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;AACxC,QAAA,CAAC,CAAC;IACJ;;;;AAOQ,IAAA,mBAAmB,CACzB,SAAwC,EAAA;QAExC,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,CACjC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,KAAK,SAAS,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CACjE;IACH;AAEA;;;;AAIG;IACK,aAAa,CACnB,EAAU,EACV,IAA2C,EAAA;AAE3C,QAAA,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE;QAExC,OAAO,OAAO,CAAC,IAAI,CAAC;AAClB,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;AACvB,YAAA,IAAI,CAAC,mBAAmB,CAAC,CAAC,OAAO,KAAI;gBACnC,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;AAClC,gBAAA,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;AACpD,YAAA,CAAC,CAAC;SACH,CAAC,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;IACtC;AAEA;;;;AAIG;IACK,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,YAAA,OAAO,OAAO,CAAC,OAAO,EAAE;QAC1B;AAEA,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,uBAAuB,EAAE,CAAC,KAAK,KACvD,IAAI,CAAC,mBAAmB,CAAC,CAAC,OAAO,KAAI;AACnC,YAAA,MAAM,EAAE,GAAG,qBAAqB,CAAC,OAAO,CAAC;YACzC,OAAO,CAAC,KAAK,EAAE,MAAM,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC,CAAC,CACH;IACH;AAEA;;;;;AAKG;AACK,IAAA,MAAM,sBAAsB,GAAA;AAClC,QAAA,IAAI;AACF,YAAA,IAAI,WAAW,GAAG,CAAC,CAAC;AAEpB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,wBAAwB,EAAE,CAAC,EAAE,EAAE;AACjD,gBAAA,MAAM,IAAI,CAAC,UAAU,EAAE;gBAEvB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AAC/C,gBAAA,IAAI,OAAO,KAAK,WAAW,EAAE;oBAC3B;gBACF;gBACA,WAAW,GAAG,OAAO;YACvB;QACF;gBAAU;;;AAGR,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;QACpC;IACF;;;;IAOQ,UAAU,GAAA;AAChB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa;AACxC,QAAA,OAAO,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;IAC7D;IAEQ,gBAAgB,GAAA;AACtB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa;;;AAIxC,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;YACtB;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW;QACtE,IAAI,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;AAC1C,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B;IACF;IAEQ,4BAA4B,GAAA;AAClC,QAAA,IAAI,CAAC,uBAAuB,EAAE,UAAU,EAAE;AAE1C,QAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAK;AAChC,YAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,cAAc,CAAC,MAAK;gBACrD,IAAI,CAAC,gBAAgB,EAAE;;;gBAGvB,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,CAAC,CAAC;YACF,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;AACnE,QAAA,CAAC,CAAC;IACJ;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa;AAExC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;QACpD;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAK;YAChC,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE;AAC3C,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACpE,QAAA,CAAC,CAAC;IACJ;AAEA;;;;AAIG;IACK,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE;QAEhD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CACvC,IAAI,CAAC,eAAe,EACpB,SAAS,CAAC,IAAI,CAAC,sBAAsB,CAAC,EACtC,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,CACpC;AAED,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE;AACrD,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC;IACF;AAEA;;;AAGG;IACK,mBAAmB,GAAA;;;AAGzB,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;YACjE;QACF;QAEA,IAAI,CAAC,aAAa,EAAE;IACtB;AAEQ,IAAA,iBAAiB,CAAC,OAA8B,EAAA;AACtD,QAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;YAC3B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;AACrC,YAAA,IAAI,KAAK,GAAG,CAAC,EAAE;gBACb;YACF;AAEA,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW;AAC/B,mBAAG,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,SAAS,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM;AAClE,mBAAG,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,UAAU,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC;AAErE,YAAA,IAAI,QAAQ,GAAG,CAAC,EAAE;gBAChB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC;YAC3C;QACF;;AAGA,QAAA,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC;IACrE;AAEA;;;;;;;;;AASG;IACK,wBAAwB,GAAA;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa;QACpD,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE;QAE9C,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE;AAC9C,YAAA,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,EAAE;AAClC,gBAAA,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC;AAC3B,gBAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC;YACrC;QACF;AAEA,QAAA,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAClD,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC;YAEhC,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;gBACpC,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,EAAE;oBACpD;gBACF;AACA,gBAAA,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7B;AAEA,YAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;AACzB,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC;YAChC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;QAC/C;IACF;AAEA;;;;AAIG;AACK,IAAA,cAAc,CAAC,KAAa,EAAA;AAClC,QAAA,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE;AACzC,YAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,EAAE;AAC3D,gBAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC;YAC3C;QACF;IACF;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;AAC7B,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CACrD,MAAM,IAAI,cAAc,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CACvE;QACH;QACA,OAAO,IAAI,CAAC,mBAAmB;IACjC;;;AAMA;;;;;AAKG;IACK,kBAAkB,CACxB,QAAsB,EACtB,OAAqB,EAAA;AAErB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;AACxD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;YAC/B,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE;AAC9B,gBAAA,OAAO,CAAC;YACV;QACF;AACA,QAAA,OAAO,MAAM;IACf;AAEA;;;;;AAKG;IACK,YAAY,CAClB,QAAoC,EACpC,OAAuB,EAAA;QAEvB,IAAI,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE;AAC3C,YAAA,OAAO,CAAC;QACV;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;QAC/D;AAEA,QAAA,OAAO,QAAQ,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,CAAC;IAC5E;AAEA;;;;AAIG;IACK,gBAAgB,GAAA;AACtB,QAAA,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC;AAC9D,QAAA,IAAI,QAAQ,GAAG,UAAU,EAAE;YACzB;QACF;AAEA,QAAA,MAAM,KAAK,GAAuB;YAChC,UAAU;YACV,QAAQ;AACR,YAAA,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,sBAAsB,CAAC;YACpD,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;SAC7C;QAED,IAAI,WAAW,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,EAAE;YAC9C;QACF;AAEA,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE,GAAG,KAAK,EAAE;AACrC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9B;IAEQ,iBAAiB,GAAA;QACvB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;;;AAItC,QAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnB,YAAA,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;YAC/B;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE;YAC/B;QACF;QAEA,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC;AAClD,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;QAEjC,IAAI,KAAK,KAAK,CAAC,IAAI,QAAQ,GAAG,KAAK,GAAG,sBAAsB,EAAE;YAC5D;QACF;;;;;AAMA,QAAA,IAAI,IAAI,CAAC,qBAAqB,KAAK,KAAK,EAAE;YACxC;QACF;AAEA,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;AAClC,QAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;AAElC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,KAAK,EAAE,IAAI,CAAC,GAAG,CACb,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,6BAA6B,EACnE,sBAAsB,CACvB;AACF,SAAA,CAAC;IACJ;;IAIQ,SAAS,GAAA;AACf,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa;AAExC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;AAClD,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACvB;AAEA,QAAA,IAAI,CAAC,uBAAuB,EAAE,UAAU,EAAE;AAC1C,QAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI;AAEnC,QAAA,IAAI,CAAC,mBAAmB,EAAE,UAAU,EAAE;AACtC,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAC/B,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;IAC7B;8GAj+BW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,i7CA+DW,uBAAuB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7MxE,6vBA2BA,EAAA,MAAA,EAAA,CAAA,y3BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED4GY,gBAAgB,oJAAE,qBAAqB,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAOtC,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAbrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,eAAA,EAGb,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,EAAA,IAAA,EAC5C;AACJ,wBAAA,KAAK,EAAE,oBAAoB;AAC3B,wBAAA,IAAI,EAAE,MAAM;AACZ,wBAAA,yBAAyB,EAAE,eAAe;AAC3C,qBAAA,EAAA,QAAA,EAAA,6vBAAA,EAAA,MAAA,EAAA,CAAA,y3BAAA,CAAA,EAAA;AAiE8C,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,uBAAuB,yEAGjC,YAAY,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,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,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,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,mBAAA,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,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,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,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,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEhNnD;;AAEG;;;;"}
@@ -43,6 +43,8 @@ export declare class UpdateChanges {
43
43
  private _sassFiles;
44
44
  /** Sass (both .scss and .sass) files in the project being updated. */
45
45
  get sassFiles(): string[];
46
+ /** Collects the Sass files under a folder, skipping dependency and build output folders. */
47
+ private collectSassFiles;
46
48
  private _service;
47
49
  get service(): ts.LanguageService;
48
50
  private _packageManager;
@@ -68,10 +70,13 @@ export declare class UpdateChanges {
68
70
  /**
69
71
  * Returns the argument list boundaries of every top-level `owner(...)` call in the content.
70
72
  * Strings, comments and `url()` tokens are scanned over, so an `owner(` that is only mentioned
71
- * in one of those is not taken for a call, and a `@mixin` or `@function` that declares the same
72
- * name is left alone. The brackets are tracked too, so a call nested in another one -
73
+ * in one of those is not taken for a call, and anything the stylesheet declares itself is left
74
+ * alone. The brackets are tracked too, so a call nested in another one -
73
75
  * `@include scrollbar(scrollbar-theme($sb-size: 6px))` - reports its own closing bracket
74
76
  * rather than the one of the call surrounding it.
77
+ *
78
+ * An owner is matched anywhere in a name, because migrations rely on it: `circular-theme` is
79
+ * how `progress-circular-theme` is addressed, and `theme` covers every `*-theme` mixin.
75
80
  */
76
81
  private findFunctionCalls;
77
82
  /**
@@ -79,11 +84,26 @@ export declare class UpdateChanges {
79
84
  * content is unbalanced. Brackets in strings, comments and `url()` tokens are ignored.
80
85
  */
81
86
  private findClosingBracket;
87
+ /** Collects declarations within their brace or indentation scopes in code with non-code masked. */
88
+ private declarationScopes;
82
89
  /**
83
- * Tells whether the name at `index` is the one a `@mixin` or a `@function` declares rather
84
- * than a call to it. Rewriting a declaration would strip a parameter its body still reads.
90
+ * Tells whether the `owner` at `index` is part of a member the stylesheet declares itself. A
91
+ * user's own `app-grid-summary-theme` ends with a theme function name, so without this its
92
+ * declaration would lose a parameter its body reads.
93
+ *
94
+ * Only this stylesheet is read. Telling which member a call loaded from another one refers to
95
+ * needs the module rules of `@use` and `@forward` - re-exports, `hide` and `as prefix-*` - so a
96
+ * member of the app that another stylesheet declares is still taken for the Ignite UI one.
85
97
  */
86
- private isDeclaredName;
98
+ private isOwnMember;
99
+ /** The at-rule before a member name, or indented shorthand when outside an expression. */
100
+ private keywordBefore;
101
+ /** Masks non-code with whitespace, preserving offsets, line endings and the original stylesheet. */
102
+ private sassCode;
103
+ /** Index where an argument's code starts, after its leading whitespace and comments. */
104
+ private leadingCommentsEnd;
105
+ /** The line break a carried `//` comment needs so that it does not swallow what follows it. */
106
+ private commentBreak;
87
107
  /**
88
108
  * When a string, a comment or a `url()` token starts at `index`, returns the index of its last
89
109
  * character so that a scan can carry on past it. Returns -1 when `index` is on code.