@dynamix-layout/core 0.0.2-beta.0 → 0.0.5

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 (47) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +155 -61
  3. package/{LICENSE → dist/LICENSE} +1 -1
  4. package/dist/core.cjs.js +57 -0
  5. package/dist/core.cjs.js.br +0 -0
  6. package/dist/core.cjs.js.gz +0 -0
  7. package/dist/core.cjs.js.map +1 -0
  8. package/dist/core.es.js +1025 -0
  9. package/dist/core.es.js.br +0 -0
  10. package/dist/core.es.js.gz +0 -0
  11. package/dist/core.es.js.map +1 -0
  12. package/dist/core.iife.js +57 -1
  13. package/dist/core.iife.js.br +0 -0
  14. package/dist/core.iife.js.gz +0 -0
  15. package/dist/core.iife.js.map +1 -0
  16. package/dist/core.umd.js +57 -1
  17. package/dist/core.umd.js.br +0 -0
  18. package/dist/core.umd.js.gz +0 -0
  19. package/dist/core.umd.js.map +1 -0
  20. package/dist/types/app/comparator.d.ts +3 -0
  21. package/dist/types/app/dynamix.d.ts +97 -0
  22. package/dist/types/app/index.d.ts +4 -64
  23. package/dist/types/app/queue.d.ts +217 -0
  24. package/dist/types/app/reactive-state.d.ts +3 -0
  25. package/dist/types/index.d.ts +2 -2
  26. package/dist/types/type/index.d.ts +54 -0
  27. package/package.json +58 -29
  28. package/dist/core.js +0 -1
  29. package/dist/core.mjs +0 -244
  30. package/dist/types/lib/Constant.d.ts +0 -14
  31. package/dist/types/lib/Element.d.ts +0 -22
  32. package/dist/types/lib/Helper.d.ts +0 -21
  33. package/dist/types/lib/Method.d.ts +0 -1
  34. package/dist/types/lib/index.d.ts +0 -4
  35. package/dist/types/types/Element.d.ts +0 -103
  36. package/dist/types/types/Method.d.ts +0 -5
  37. package/dist/types/types/index.d.ts +0 -2
  38. package/src/app/index.ts +0 -291
  39. package/src/index.ts +0 -3
  40. package/src/lib/Constant.ts +0 -17
  41. package/src/lib/Element.ts +0 -66
  42. package/src/lib/Helper.ts +0 -259
  43. package/src/lib/Method.ts +0 -12
  44. package/src/lib/index.ts +0 -4
  45. package/src/types/Element.ts +0 -116
  46. package/src/types/Method.ts +0 -4
  47. package/src/types/index.ts +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.iife.js","sources":["../src/app/queue.ts","../src/app/reactive-state.ts","../src/app/comparator.ts","../src/app/dynamix.ts","../src/index.ts"],"sourcesContent":["class Queue<T> {\n\tprivate buffer: (T | undefined)[]\n\tprivate head: number = 0\n\tprivate tail: number = 0\n\tprivate count: number = 0\n\tprivate capacity: number\n\n\tconstructor(initialCapacity: number = 16, array: T[] = []) {\n\t\tthis.capacity = Math.max(initialCapacity, array.length)\n\t\tthis.buffer = new Array(this.capacity)\n\n\t\tarray.forEach((element) => {\n\t\t\tthis.enqueue(element)\n\t\t})\n\t}\n\n\t// ==================== INSERTION OPERATIONS ====================\n\n\t/**\n\t * Add element to the back of the queue - O(1) amortized\n\t * Used for FIFO and FILO patterns\n\t */\n\tenqueue(item: T): void {\n\t\tif (this.count === this.capacity) {\n\t\t\tthis.resize()\n\t\t}\n\n\t\tthis.buffer[this.tail] = item\n\t\tthis.tail = (this.tail + 1) % this.capacity\n\t\tthis.count++\n\t}\n\n\t/**\n\t * Add element to the front of the queue - O(1) amortized\n\t * Used for LIFO and LILO patterns\n\t */\n\tenqueueFront(item: T): void {\n\t\tif (this.count === this.capacity) {\n\t\t\tthis.resize()\n\t\t}\n\n\t\tthis.head = (this.head - 1 + this.capacity) % this.capacity\n\t\tthis.buffer[this.head] = item\n\t\tthis.count++\n\t}\n\n\t/**\n\t * Insert element at specific logical index - O(n)\n\t * All elements at and after the index are shifted right\n\t * @param index - Logical index (0 = front of queue)\n\t * @param item - Element to insert\n\t * @returns true if insertion successful, false if index out of bounds\n\t */\n\tinsert(index: number, item: T): boolean {\n\t\t// Validate index bounds\n\t\tif (index < 0 || index > this.count) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Handle edge cases with existing O(1) operations\n\t\tif (index === 0) {\n\t\t\tthis.enqueueFront(item)\n\t\t\treturn true\n\t\t}\n\t\tif (index === this.count) {\n\t\t\tthis.enqueue(item)\n\t\t\treturn true\n\t\t}\n\n\t\t// Ensure we have capacity\n\t\tif (this.count === this.capacity) {\n\t\t\tthis.resize()\n\t\t}\n\n\t\t// Determine which direction to shift (minimize operations)\n\t\tconst distanceFromHead = index\n\t\tconst distanceFromTail = this.count - index\n\n\t\tif (distanceFromHead <= distanceFromTail) {\n\t\t\t// Shift elements towards head (left shift)\n\t\t\tthis.shiftLeft(index, item)\n\t\t} else {\n\t\t\t// Shift elements towards tail (right shift)\n\t\t\tthis.shiftRight(index, item)\n\t\t}\n\n\t\tthis.count++\n\t\treturn true\n\t}\n\n\t/**\n\t * Insert array of elements at specific logical index - O(n + m) where n is elements to shift, m is array length\n\t * All elements at and after the index are shifted right to make room for the entire array\n\t * @param index - Logical index (0 = front of queue)\n\t * @param items - Array of elements to insert\n\t * @returns true if insertion successful, false if index out of bounds\n\t */\n\tinsertArray(index: number, items: T[]): boolean {\n\t\t// Validate index bounds\n\t\tif (index < 0 || index > this.count) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Handle empty array case\n\t\tif (items.length === 0) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Handle edge cases - append/prepend entire array\n\t\tif (index === 0) {\n\t\t\t// Insert at beginning - add all items to front in reverse order\n\t\t\tfor (let i = items.length - 1; i >= 0; i--) {\n\t\t\t\tthis.enqueueFront(items[i])\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\t\tif (index === this.count) {\n\t\t\t// Insert at end - add all items to back\n\t\t\titems.forEach((item) => this.enqueue(item))\n\t\t\treturn true\n\t\t}\n\n\t\t// Ensure we have enough capacity\n\t\twhile (this.count + items.length > this.capacity) {\n\t\t\tthis.resize()\n\t\t}\n\n\t\t// Determine which direction to shift (minimize operations)\n\t\tconst distanceFromHead = index\n\t\tconst distanceFromTail = this.count - index\n\t\tconst insertLength = items.length\n\n\t\tif (distanceFromHead <= distanceFromTail) {\n\t\t\t// Shift elements towards head (left shift)\n\t\t\tthis.shiftLeftArray(index, items)\n\t\t} else {\n\t\t\t// Shift elements towards tail (right shift)\n\t\t\tthis.shiftRightArray(index, items)\n\t\t}\n\n\t\tthis.count += insertLength\n\t\treturn true\n\t}\n\n\t/**\n\t * Insert another queue at specific logical index - O(n + m) where n is elements to shift, m is queue size\n\t * All elements at and after the index are shifted right to make room for the entire queue\n\t * @param index - Logical index (0 = front of queue)\n\t * @param queue - Queue to insert\n\t * @returns true if insertion successful, false if index out of bounds\n\t */\n\tinsertQueue(index: number, queue: Queue<T>): boolean {\n\t\t// Validate index bounds\n\t\tif (index < 0 || index > this.count) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Handle empty queue case\n\t\tif (queue.isEmpty()) {\n\t\t\treturn true\n\t\t}\n\n\t\tconst queueSize = queue.size()\n\n\t\t// Handle edge cases - append/prepend entire queue\n\t\tif (index === 0) {\n\t\t\t// Insert at beginning - add all items to front in reverse order\n\t\t\t// Use reverse iterator to maintain order\n\t\t\tconst items = queue.toArray()\n\t\t\tfor (let i = items.length - 1; i >= 0; i--) {\n\t\t\t\tthis.enqueueFront(items[i])\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\t\tif (index === this.count) {\n\t\t\t// Insert at end - add all items to back\n\t\t\tfor (const item of queue) {\n\t\t\t\tthis.enqueue(item)\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\n\t\t// Ensure we have enough capacity\n\t\twhile (this.count + queueSize > this.capacity) {\n\t\t\tthis.resize()\n\t\t}\n\n\t\t// Convert queue to array for efficient insertion\n\t\tconst queueItems = queue.toArray()\n\n\t\t// Determine which direction to shift (minimize operations)\n\t\tconst distanceFromHead = index\n\t\tconst distanceFromTail = this.count - index\n\n\t\tif (distanceFromHead <= distanceFromTail) {\n\t\t\t// Shift elements towards head (left shift)\n\t\t\tthis.shiftLeftArray(index, queueItems)\n\t\t} else {\n\t\t\t// Shift elements towards tail (right shift)\n\t\t\tthis.shiftRightArray(index, queueItems)\n\t\t}\n\n\t\tthis.count += queueSize\n\t\treturn true\n\t}\n\n\t/**\n\t * Alias for enqueue (add to back)\n\t */\n\tpush(item: T): void {\n\t\tthis.enqueue(item)\n\t}\n\n\t/**\n\t * Alias for enqueueFront (add to front)\n\t */\n\tunshift(item: T): void {\n\t\tthis.enqueueFront(item)\n\t}\n\n\t// ==================== REMOVAL OPERATIONS ====================\n\n\t/**\n\t * Remove and return element from front of queue - O(1)\n\t * Used for FIFO and LIFO patterns\n\t */\n\tdequeue(): T | undefined {\n\t\tif (this.count === 0) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst item = this.buffer[this.head]\n\t\t// Don't store undefined - just move the head pointer\n\t\tthis.head = (this.head + 1) % this.capacity\n\t\tthis.count--\n\n\t\treturn item\n\t}\n\n\t/**\n\t * Remove and return element from back of queue - O(1)\n\t * Used for FILO and LILO patterns\n\t */\n\tdequeueBack(): T | undefined {\n\t\tif (this.count === 0) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tthis.tail = (this.tail - 1 + this.capacity) % this.capacity\n\t\tconst item = this.buffer[this.tail]\n\t\t// Don't store undefined - the tail pointer now excludes this position\n\t\tthis.count--\n\n\t\treturn item\n\t}\n\n\tindexOf(item: T): number {\n\t\tfor (let i = 0; i < this.count; i++) {\n\t\t\tconst actualIndex = (this.head + i) % this.capacity\n\t\t\tif (this.buffer[actualIndex] === item) {\n\t\t\t\treturn i // Return logical index\n\t\t\t}\n\t\t}\n\t\treturn -1 // Not found\n\t}\n\n\tremove(item: T): boolean {\n\t\tconst index = this.indexOf(item)\n\t\tif (index === -1) return false\n\t\tthis.removeAt(index)\n\t\treturn true\n\t}\n\n\t/**\n\t * Remove element at specific logical index - O(n)\n\t * All elements after the index are shifted left\n\t * @param index - Logical index (0 = front of queue)\n\t * @returns The removed element, or undefined if index out of bounds\n\t */\n\tremoveAt(index: number): T | undefined {\n\t\t// Validate index bounds\n\t\tif (index < 0 || index >= this.count) {\n\t\t\treturn undefined\n\t\t}\n\n\t\t// Handle edge cases with existing O(1) operations\n\t\tif (index === 0) {\n\t\t\treturn this.dequeue()\n\t\t}\n\t\tif (index === this.count - 1) {\n\t\t\treturn this.dequeueBack()\n\t\t}\n\n\t\t// Get the element to remove\n\t\tconst actualIndex = (this.head + index) % this.capacity\n\t\tconst removedItem = this.buffer[actualIndex]\n\n\t\t// Determine which direction to shift (minimize operations)\n\t\tconst distanceFromHead = index\n\t\tconst distanceFromTail = this.count - index - 1\n\n\t\tif (distanceFromHead <= distanceFromTail) {\n\t\t\t// Shift elements from head towards the gap (right shift)\n\t\t\tthis.shiftRightForRemoval(index)\n\t\t} else {\n\t\t\t// Shift elements from tail towards the gap (left shift)\n\t\t\tthis.shiftLeftForRemoval(index)\n\t\t}\n\n\t\tthis.count--\n\t\treturn removedItem\n\t}\n\n\t/**\n\t * Alias for dequeue (remove from front)\n\t */\n\tshift(): T | undefined {\n\t\treturn this.dequeue()\n\t}\n\n\t/**\n\t * Alias for dequeueBack (remove from back)\n\t */\n\tpop(): T | undefined {\n\t\treturn this.dequeueBack()\n\t}\n\n\t// ==================== PATTERN-SPECIFIC METHODS ====================\n\n\t/**\n\t * FIFO: First In, First Out\n\t * Add to back, remove from front\n\t */\n\tfifoAdd(item: T): void {\n\t\tthis.enqueue(item)\n\t}\n\n\tfifoRemove(): T | undefined {\n\t\treturn this.dequeue()\n\t}\n\n\t/**\n\t * FILO: First In, Last Out\n\t * Add to back, remove from back\n\t */\n\tfiloAdd(item: T): void {\n\t\tthis.enqueue(item)\n\t}\n\n\tfiloRemove(): T | undefined {\n\t\treturn this.dequeueBack()\n\t}\n\n\t/**\n\t * LIFO: Last In, First Out\n\t * Add to front, remove from front\n\t */\n\tlifoAdd(item: T): void {\n\t\tthis.enqueueFront(item)\n\t}\n\n\tlifoRemove(): T | undefined {\n\t\treturn this.dequeue()\n\t}\n\n\t/**\n\t * LILO: Last In, Last Out\n\t * Add to front, remove from back\n\t */\n\tliloAdd(item: T): void {\n\t\tthis.enqueueFront(item)\n\t}\n\n\tliloRemove(): T | undefined {\n\t\treturn this.dequeueBack()\n\t}\n\n\t// ==================== ACCESS OPERATIONS ====================\n\n\t/**\n\t * Get element at logical index (0 = front of queue) - O(1)\n\t */\n\tget(index: number): T | undefined {\n\t\tif (index < 0 || index >= this.count) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst actualIndex = (this.head + index) % this.capacity\n\t\treturn this.buffer[actualIndex]\n\t}\n\n\t/**\n\t * Set element at logical index - O(1)\n\t */\n\tset(index: number, item: T): boolean {\n\t\tif (index < 0 || index >= this.count) {\n\t\t\treturn false\n\t\t}\n\n\t\tconst actualIndex = (this.head + index) % this.capacity\n\t\tthis.buffer[actualIndex] = item\n\t\treturn true\n\t}\n\n\t/**\n\t * Get the front element without removing it - O(1)\n\t */\n\tpeek(): T | undefined {\n\t\treturn this.count > 0 ? this.buffer[this.head] : undefined\n\t}\n\n\t/**\n\t * Get the back element without removing it - O(1)\n\t */\n\tpeekBack(): T | undefined {\n\t\tif (this.count === 0) return undefined\n\t\tconst backIndex = (this.tail - 1 + this.capacity) % this.capacity\n\t\treturn this.buffer[backIndex]\n\t}\n\n\t/**\n\t * Alias for peek (front element)\n\t */\n\tfront(): T | undefined {\n\t\treturn this.peek()\n\t}\n\n\t/**\n\t * Alias for peekBack (back element)\n\t */\n\tback(): T | undefined {\n\t\treturn this.peekBack()\n\t}\n\n\t// ==================== UTILITY METHODS ====================\n\n\t/**\n\t * Get current size of queue - O(1)\n\t */\n\tsize(): number {\n\t\treturn this.count\n\t}\n\n\t/**\n\t * Get current capacity - O(1)\n\t */\n\tgetCapacity(): number {\n\t\treturn this.capacity\n\t}\n\n\t/**\n\t * Check if queue is empty - O(1)\n\t */\n\tisEmpty(): boolean {\n\t\treturn this.count === 0\n\t}\n\n\t/**\n\t * Check if queue is full - O(1)\n\t */\n\tisFull(): boolean {\n\t\treturn this.count === this.capacity\n\t}\n\n\t/**\n\t * Clear all elements from queue - O(1)\n\t */\n\tclear(): void {\n\t\t// Don't create new array, just reset pointers\n\t\tthis.head = 0\n\t\tthis.tail = 0\n\t\tthis.count = 0\n\t}\n\n\t/**\n\t * Convert queue to array (maintains order from front to back) - O(n)\n\t */\n\ttoArray(): T[] {\n\t\tconst result: T[] = []\n\t\tfor (let i = 0; i < this.count; i++) {\n\t\t\tconst actualIndex = (this.head + i) % this.capacity\n\t\t\tresult.push(this.buffer[actualIndex] as T)\n\t\t}\n\t\treturn result\n\t}\n\n\t/**\n\t * Forward iterator support for for...of loops - O(n) total\n\t * Iterates from front to back\n\t */\n\t*[Symbol.iterator](): IterableIterator<T> {\n\t\tfor (let i = 0; i < this.count; i++) {\n\t\t\tconst actualIndex = (this.head + i) % this.capacity\n\t\t\tyield this.buffer[actualIndex] as T\n\t\t}\n\t}\n\n\t/**\n\t * Forward iterator (same as Symbol.iterator) - O(n) total\n\t * Iterates from front to back\n\t */\n\t*forward(): IterableIterator<T> {\n\t\tfor (let i = 0; i < this.count; i++) {\n\t\t\tconst actualIndex = (this.head + i) % this.capacity\n\t\t\tyield this.buffer[actualIndex] as T\n\t\t}\n\t}\n\n\t/**\n\t * Reverse iterator - O(n) total\n\t * Iterates from back to front\n\t */\n\t*reverse(): IterableIterator<T> {\n\t\tfor (let i = this.count - 1; i >= 0; i--) {\n\t\t\tconst actualIndex = (this.head + i) % this.capacity\n\t\t\tyield this.buffer[actualIndex] as T\n\t\t}\n\t}\n\n\t/**\n\t * Iterator with index information - O(n) total\n\t * Returns [index, value] pairs from front to back\n\t */\n\t*entries(): IterableIterator<[number, T]> {\n\t\tfor (let i = 0; i < this.count; i++) {\n\t\t\tconst actualIndex = (this.head + i) % this.capacity\n\t\t\tyield [i, this.buffer[actualIndex] as T]\n\t\t}\n\t}\n\n\t/**\n\t * Iterator for keys (indices) - O(n) total\n\t */\n\t*keys(): IterableIterator<number> {\n\t\tfor (let i = 0; i < this.count; i++) {\n\t\t\tyield i\n\t\t}\n\t}\n\n\t/**\n\t * Iterator for values only - O(n) total\n\t * Same as Symbol.iterator but more explicit\n\t */\n\t*values(): IterableIterator<T> {\n\t\tfor (let i = 0; i < this.count; i++) {\n\t\t\tconst actualIndex = (this.head + i) % this.capacity\n\t\t\tyield this.buffer[actualIndex] as T\n\t\t}\n\t}\n\n\t/**\n\t * Get string representation - O(n)\n\t */\n\ttoString(): string {\n\t\treturn `Queue(${this.toArray().join(', ')})`\n\t}\n\n\t// ==================== PRIVATE HELPER METHODS ====================\n\n\t/**\n\t * Private method to resize buffer when capacity is exceeded\n\t */\n\tprivate resize(): void {\n\t\tconst newCapacity = this.capacity * 2\n\t\tconst newBuffer = new Array(newCapacity)\n\n\t\t// Copy elements in correct order to new buffer\n\t\tfor (let i = 0; i < this.count; i++) {\n\t\t\tconst oldIndex = (this.head + i) % this.capacity\n\t\t\tnewBuffer[i] = this.buffer[oldIndex]\n\t\t}\n\n\t\tthis.buffer = newBuffer\n\t\tthis.capacity = newCapacity\n\t\tthis.head = 0\n\t\tthis.tail = this.count\n\t}\n\n\t/**\n\t * Shift elements left (towards head) to make room for insertion\n\t * Used when inserting closer to head\n\t */\n\tprivate shiftLeft(insertIndex: number, item: T): void {\n\t\t// Move head one position left\n\t\tthis.head = (this.head - 1 + this.capacity) % this.capacity\n\n\t\t// Shift elements from old head position to insert position\n\t\tfor (let i = 0; i < insertIndex; i++) {\n\t\t\tconst fromIndex = (this.head + 1 + i) % this.capacity\n\t\t\tconst toIndex = (this.head + i) % this.capacity\n\t\t\tthis.buffer[toIndex] = this.buffer[fromIndex]\n\t\t}\n\n\t\t// Insert the new item\n\t\tconst actualInsertIndex = (this.head + insertIndex) % this.capacity\n\t\tthis.buffer[actualInsertIndex] = item\n\t}\n\n\t/**\n\t * Shift elements right (towards tail) to make room for insertion\n\t * Used when inserting closer to tail\n\t */\n\tprivate shiftRight(insertIndex: number, item: T): void {\n\t\t// Shift elements from insert position to tail\n\t\tfor (let i = this.count - 1; i >= insertIndex; i--) {\n\t\t\tconst fromIndex = (this.head + i) % this.capacity\n\t\t\tconst toIndex = (this.head + i + 1) % this.capacity\n\t\t\tthis.buffer[toIndex] = this.buffer[fromIndex]\n\t\t}\n\n\t\t// Insert the new item\n\t\tconst actualInsertIndex = (this.head + insertIndex) % this.capacity\n\t\tthis.buffer[actualInsertIndex] = item\n\n\t\t// Move tail one position right\n\t\tthis.tail = (this.tail + 1) % this.capacity\n\t}\n\n\t/**\n\t * Shift elements right (towards tail) to fill gap after removal\n\t * Used when removing closer to head\n\t */\n\tprivate shiftRightForRemoval(removeIndex: number): void {\n\t\t// Shift elements from head to remove position\n\t\tfor (let i = removeIndex; i > 0; i--) {\n\t\t\tconst fromIndex = (this.head + i - 1) % this.capacity\n\t\t\tconst toIndex = (this.head + i) % this.capacity\n\t\t\tthis.buffer[toIndex] = this.buffer[fromIndex]\n\t\t}\n\n\t\t// Move head pointer (don't store undefined)\n\t\tthis.head = (this.head + 1) % this.capacity\n\t}\n\n\t/**\n\t * Shift elements left (towards head) to fill gap after removal\n\t * Used when removing closer to tail\n\t */\n\tprivate shiftLeftForRemoval(removeIndex: number): void {\n\t\t// Shift elements from remove position to tail\n\t\tfor (let i = removeIndex; i < this.count - 1; i++) {\n\t\t\tconst fromIndex = (this.head + i + 1) % this.capacity\n\t\t\tconst toIndex = (this.head + i) % this.capacity\n\t\t\tthis.buffer[toIndex] = this.buffer[fromIndex]\n\t\t}\n\n\t\t// Move tail pointer (don't store undefined)\n\t\tthis.tail = (this.tail - 1 + this.capacity) % this.capacity\n\t}\n\n\t/**\n\t * Shift elements left (towards head) to make room for array insertion\n\t * Used when inserting array closer to head\n\t */\n\tprivate shiftLeftArray(insertIndex: number, items: T[]): void {\n\t\tconst insertLength = items.length\n\n\t\t// Move head left by insertLength positions\n\t\tthis.head = (this.head - insertLength + this.capacity) % this.capacity\n\n\t\t// Shift existing elements from old head position to insert position\n\t\tfor (let i = 0; i < insertIndex; i++) {\n\t\t\tconst fromIndex = (this.head + insertLength + i) % this.capacity\n\t\t\tconst toIndex = (this.head + i) % this.capacity\n\t\t\tthis.buffer[toIndex] = this.buffer[fromIndex]\n\t\t}\n\n\t\t// Insert the new items\n\t\tfor (let i = 0; i < insertLength; i++) {\n\t\t\tconst actualInsertIndex =\n\t\t\t\t(this.head + insertIndex + i) % this.capacity\n\t\t\tthis.buffer[actualInsertIndex] = items[i]\n\t\t}\n\t}\n\n\t/**\n\t * Shift elements right (towards tail) to make room for array insertion\n\t * Used when inserting array closer to tail\n\t */\n\tprivate shiftRightArray(insertIndex: number, items: T[]): void {\n\t\tconst insertLength = items.length\n\n\t\t// Shift existing elements from insert position to tail, moving right\n\t\tfor (let i = this.count - 1; i >= insertIndex; i--) {\n\t\t\tconst fromIndex = (this.head + i) % this.capacity\n\t\t\tconst toIndex = (this.head + i + insertLength) % this.capacity\n\t\t\tthis.buffer[toIndex] = this.buffer[fromIndex]\n\t\t}\n\n\t\t// Insert the new items\n\t\tfor (let i = 0; i < insertLength; i++) {\n\t\t\tconst actualInsertIndex =\n\t\t\t\t(this.head + insertIndex + i) % this.capacity\n\t\t\tthis.buffer[actualInsertIndex] = items[i]\n\t\t}\n\n\t\t// Move tail right by insertLength positions\n\t\tthis.tail = (this.tail + insertLength) % this.capacity\n\t}\n}\n\nexport { Queue }\n","import type { ReactiveValue, ChangeListener } from '../type'\n\nfunction createReactiveState<T>(\n\tinitialValue: T,\n\tcomparator: (a: T, b: T) => boolean = (a, b) => a === b\n): ReactiveValue<T> {\n\tlet value = initialValue\n\tconst listeners = new Set<ChangeListener<T>>()\n\tlet pendingResolvers: Array<(val: T) => void> = []\n\n\tconst get = (): T => value\n\n\tconst set = (newValue: T, flag: boolean = false): void => {\n\t\tif (flag) {\n\t\t\tvalue = newValue\n\t\t\treturn\n\t\t}\n\n\t\tif (!comparator(value, newValue)) {\n\t\t\tvalue = newValue\n\n\t\t\tlisteners.forEach((cb) => cb(value))\n\t\t\tpendingResolvers.forEach((resolve) => resolve(value))\n\t\t\tpendingResolvers = []\n\t\t}\n\t}\n\n\tconst triggerChange = (): void => {\n\t\tlisteners.forEach((cb) => cb(value))\n\t\tpendingResolvers.forEach((resolve) => resolve(value))\n\t\tpendingResolvers = []\n\t}\n\n\tconst onChange = (listener: ChangeListener<T>): (() => void) => {\n\t\tlisteners.add(listener)\n\t\treturn () => listeners.delete(listener)\n\t}\n\n\tconst nextChange = (): Promise<T> => {\n\t\treturn new Promise<T>((resolve) => {\n\t\t\tpendingResolvers.push(resolve)\n\t\t})\n\t}\n\n\tconst onChangePromise = (listener: ChangeListener<T>): (() => void) => {\n\t\tlet active = true\n\n\t\tconst loop = async () => {\n\t\t\twhile (active) {\n\t\t\t\tconst val = await nextChange()\n\t\t\t\tif (!active) break\n\t\t\t\tlistener(val)\n\t\t\t}\n\t\t}\n\n\t\tloop()\n\n\t\treturn () => {\n\t\t\tactive = false\n\t\t}\n\t}\n\n\treturn {\n\t\tget,\n\t\tset,\n\n\t\tonChange,\n\t\tnextChange,\n\t\ttriggerChange,\n\t\tonChangePromise,\n\t}\n}\n\nexport { createReactiveState }\n","import type { NodeOptions } from '../type'\n\nexport function areNodeOptionsMapEqual(\n\tmapA: Map<string, NodeOptions>,\n\tmapB: Map<string, NodeOptions>\n): boolean {\n\tif (mapA.size !== mapB.size) return false\n\n\tfor (const [key, valA] of mapA.entries()) {\n\t\tconst valB = mapB.get(key)\n\t\tif (!valB) return false\n\n\t\tif (!areNodeOptionsEqual(valA, valB)) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\nexport function areNodeOptionsEqual(a: NodeOptions, b: NodeOptions): boolean {\n\tif (a.typNode !== b.typNode) return false\n\tif (a.nodName !== b.nodName) return false\n\tif (a.uidNode !== b.uidNode) return false\n\tif (a.nodPart !== b.nodPart) return false\n\n\tconst dimA = a.nodDims\n\tconst dimB = b.nodDims\n\n\treturn (\n\t\tdimA.x === dimB.x &&\n\t\tdimA.y === dimB.y &&\n\t\tdimA.w === dimB.w &&\n\t\tdimA.h === dimB.h\n\t)\n}\n","import { Queue } from './queue'\nimport { createReactiveState } from './reactive-state'\nimport { areNodeOptionsMapEqual } from '../app/comparator'\nimport type {\n\tDimension,\n\tLayoutTree,\n\tNodeCache,\n\tNodeOptions,\n\tRootAdjustment,\n\tReactiveValue,\n\tTabsIds,\n} from '../type'\n\nexport class Node {\n\tstatic cache: NodeCache = {\n\t\tdimMins: new Map<string, { minWidth: number; minHeight: number }>(),\n\t\tmapDirs: new Map<string, boolean>(),\n\t\ttabCnts: new Map<string, { horizontal: number; vertical: number }>(),\n\t\tmapElem: new Map<string, Node | Bond>(),\n\t\ttabOpts: createReactiveState(\n\t\t\tnew Map<string, NodeOptions>(),\n\t\t\tareNodeOptionsMapEqual\n\t\t),\n\t\tnodOpts: createReactiveState(\n\t\t\tnew Map<string, NodeOptions>(),\n\t\t\tareNodeOptionsMapEqual\n\t\t),\n\t\tbndOpts: createReactiveState(\n\t\t\tnew Map<string, NodeOptions>(),\n\t\t\tareNodeOptionsMapEqual\n\t\t),\n\t}\n\n\tkids: Queue<Node> = new Queue<Node>()\n\tdims: Dimension = { w: 0, h: 0, x: 0, y: 0 }\n\tunId: string\n\tnext: Bond | null = null\n\tprev: Bond | null = null\n\ttype: 'row' | 'tabset' | 'tab' | 'bond' = 'row'\n\tname: string = ''\n\tpart: number = 0\n\thost: Node | null = null\n\topen: string = ''\n\n\tconstructor(\n\t\toptions: {\n\t\t\ttype?: 'row' | 'tabset' | 'tab' | 'bond'\n\t\t\thost?: Node | null\n\t\t\tname?: string\n\t\t\tpart?: number\n\t\t\tdims?: Dimension\n\t\t\tunId?: string\n\t\t\topen?: string\n\t\t} = {}\n\t) {\n\t\tconst defaults = {\n\t\t\ttype: 'row' as 'row' | 'tabset' | 'tab' | 'bond',\n\t\t\thost: null,\n\t\t\tname: '',\n\t\t\tpart: 100,\n\t\t\tdims: { w: 0, h: 0, x: 0, y: 0 },\n\t\t\tunId: crypto.randomUUID(),\n\t\t\topen: '',\n\t\t}\n\n\t\tthis.type = options.type ?? defaults.type\n\t\tthis.host = options.host ?? defaults.host\n\t\tthis.name = options.name ?? defaults.name\n\t\tthis.part = options.part ?? defaults.part\n\t\tthis.dims = options.dims ?? defaults.dims\n\t\tthis.open = options.open ?? defaults.open\n\n\t\tthis.unId = options.unId || defaults.unId\n\t}\n\n\taddBond(parent: Node | null, prev: Node | null = null) {\n\t\tif (!prev) return\n\n\t\tconst bond = new Bond(parent, this, prev)\n\t\tNode.cache.mapElem.set(bond.unId, bond)\n\t}\n\n\tgetReqDimension(): { width: number; height: number } {\n\t\tconst minDims = Node.cache.dimMins.get(this.unId)\n\t\tconst tabCnts = Node.cache.tabCnts.get(this.unId)\n\n\t\tconst reqW = Math.max(\n\t\t\tminDims!.minWidth,\n\t\t\ttabCnts!.horizontal * Layout._minW +\n\t\t\t\tMath.max(0, tabCnts!.horizontal - 1) * Layout._bond\n\t\t)\n\n\t\tconst reqH = Math.max(\n\t\t\tminDims!.minHeight,\n\t\t\ttabCnts!.vertical * Layout._minH +\n\t\t\t\tMath.max(0, tabCnts!.vertical - 1) * Layout._bond\n\t\t)\n\n\t\treturn {\n\t\t\twidth: reqW,\n\t\t\theight: reqH,\n\t\t}\n\t}\n\n\tcalcDimensions() {\n\t\tconst nodeDir = Node.cache.mapDirs.get(this.unId)\n\n\t\tif (!this.kids) return\n\n\t\tlet totalWeight = 0\n\t\tconst totlMinSize = Node.cache.dimMins.get(this.unId) || {\n\t\t\tminWidth: 0,\n\t\t\tminHeight: 0,\n\t\t}\n\t\tlet curntOffset = 0\n\n\t\tfor (const kid of this.kids) {\n\t\t\ttotalWeight += kid.part\n\t\t}\n\n\t\tif (totalWeight === 0) return\n\n\t\tlet extraSpace\n\t\tif (nodeDir) {\n\t\t\textraSpace = this.dims.w - totlMinSize.minWidth\n\t\t} else {\n\t\t\textraSpace = this.dims.h - totlMinSize.minHeight\n\t\t}\n\n\t\tlet unallocate = extraSpace\n\n\t\tfor (const kid of this.kids) {\n\t\t\tconst kidDims = Node.cache.dimMins.get(kid.unId) || {\n\t\t\t\tminWidth: 0,\n\t\t\t\tminHeight: 0,\n\t\t\t}\n\n\t\t\tif (this.dims.w < totlMinSize.minWidth) {\n\t\t\t\tif (nodeDir) {\n\t\t\t\t\tkid.dims.w = kidDims.minWidth\n\t\t\t\t\tkid.dims.h = this.dims.h\n\t\t\t\t\tkid.dims.x = this.dims.x + curntOffset\n\t\t\t\t\tkid.dims.y = this.dims.y\n\t\t\t\t\tcurntOffset += kid.dims.w + Layout._bond\n\t\t\t\t} else {\n\t\t\t\t\tkid.dims.h = kidDims.minHeight\n\t\t\t\t\tkid.dims.w = this.dims.w\n\t\t\t\t\tkid.dims.y = this.dims.y + curntOffset\n\t\t\t\t\tkid.dims.x = this.dims.x\n\t\t\t\t\tcurntOffset += kid.dims.h + Layout._bond\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst childShareRatio = kid.part / totalWeight\n\t\t\t\tconst extraChildSpace = Math.floor(extraSpace * childShareRatio)\n\n\t\t\t\tif (kid === this.kids.peekBack()) {\n\t\t\t\t\tif (nodeDir) {\n\t\t\t\t\t\tkid.dims.w = kidDims.minWidth + unallocate\n\t\t\t\t\t\tkid.dims.h = this.dims.h\n\t\t\t\t\t\tkid.dims.x = this.dims.x + curntOffset\n\t\t\t\t\t\tkid.dims.y = this.dims.y\n\t\t\t\t\t\tcurntOffset += kid.dims.w + Layout._bond\n\t\t\t\t\t} else {\n\t\t\t\t\t\tkid.dims.h = kidDims.minHeight + unallocate\n\t\t\t\t\t\tkid.dims.w = this.dims.w\n\t\t\t\t\t\tkid.dims.y = this.dims.y + curntOffset\n\t\t\t\t\t\tkid.dims.x = this.dims.x\n\t\t\t\t\t\tcurntOffset += kid.dims.h + Layout._bond\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tif (nodeDir) {\n\t\t\t\t\tkid.dims.w = kidDims.minWidth + extraChildSpace\n\t\t\t\t\tkid.dims.h = this.dims.h\n\t\t\t\t\tkid.dims.x = this.dims.x + curntOffset\n\t\t\t\t\tkid.dims.y = this.dims.y\n\t\t\t\t\tcurntOffset += kid.dims.w + Layout._bond\n\t\t\t\t} else {\n\t\t\t\t\tkid.dims.h = kidDims.minHeight + extraChildSpace\n\t\t\t\t\tkid.dims.w = this.dims.w\n\t\t\t\t\tkid.dims.y = this.dims.y + curntOffset\n\t\t\t\t\tkid.dims.x = this.dims.x\n\t\t\t\t\tcurntOffset += kid.dims.h + Layout._bond\n\t\t\t\t}\n\n\t\t\t\tunallocate -= extraChildSpace\n\t\t\t}\n\n\t\t\tif (kid.next) {\n\t\t\t\tif (nodeDir) {\n\t\t\t\t\tkid.next!.dims = {\n\t\t\t\t\t\tw: Layout._bond,\n\t\t\t\t\t\th: kid.dims.h,\n\t\t\t\t\t\tx: kid.dims.x + kid.dims.w,\n\t\t\t\t\t\ty: kid.dims.y,\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tkid.next!.dims = {\n\t\t\t\t\t\tw: kid.dims.w,\n\t\t\t\t\t\th: Layout._bond,\n\t\t\t\t\t\tx: kid.dims.x,\n\t\t\t\t\t\ty: kid.dims.y + kid.dims.h,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\ttoJSON(): LayoutTree {\n\t\tconst children: LayoutTree[] = []\n\n\t\tfor (const child of this.kids) {\n\t\t\tchildren.push(child.toJSON())\n\t\t}\n\n\t\tconst result: LayoutTree = {\n\t\t\ttypNode: this.type,\n\t\t\tnodPart: this.part,\n\t\t\tnodName: this.name,\n\t\t\tuidNode: this.unId,\n\t\t}\n\n\t\tif (this.open) {\n\t\t\tresult.nodOpen = this.open\n\t\t}\n\n\t\tif (children.length > 0) {\n\t\t\tresult.nodKids = children\n\t\t}\n\n\t\treturn result\n\t}\n}\n\nclass Layout {\n\tstatic _root: Node\n\tstatic _tree: LayoutTree\n\tstatic _minW: number = 40\n\tstatic _minH: number = 40\n\tstatic _bond: number = 10\n\tstatic _inst: Layout | null = null\n\n\tnodeOps: ReactiveValue<Map<string, NodeOptions>>\n\tcntdown: ReturnType<typeof setTimeout> | null = null\n\ttabsIds: TabsIds = new Map<string, string>()\n\tconstructor(\n\t\toptions: {\n\t\t\ttabs?: string[]\n\t\t\ttree?: LayoutTree | null\n\t\t\tminW?: number\n\t\t\tminH?: number\n\t\t\tbond?: number\n\t\t\tuqid?: string\n\t\t\ttabsIds?: TabsIds\n\t\t} = {}\n\t) {\n\t\tconst config = {\n\t\t\ttabs: [],\n\t\t\ttree: null,\n\t\t\tminW: 40,\n\t\t\tminH: 40,\n\t\t\tbond: 10,\n\t\t\tuqid: 'dynamix-layout-root',\n\t\t\ttabsIds: new Map<string, string>(),\n\t\t\t...options,\n\t\t}\n\n\t\tthis.tabsIds = config.tabsIds\n\n\t\tif (config.tree) Layout._tree = config.tree\n\n\t\tLayout._root = new Node({\n\t\t\tunId: config.uqid,\n\t\t\tname: config.uqid,\n\t\t\ttype: 'row',\n\t\t})\n\n\t\tthis.nodeOps = createReactiveState(\n\t\t\tnew Map<string, NodeOptions>(),\n\t\t\tareNodeOptionsMapEqual\n\t\t)\n\n\t\tLayout._minW = config.minW\n\t\tLayout._minH = config.minH\n\t\tLayout._bond = config.bond\n\n\t\tconst tabsQueue = new Queue<string>(config.tabs.length, config.tabs)\n\t\tif (Layout._tree) this.createNodeLayout()\n\t\telse this.createBinaryNodeTreeFromQueue(tabsQueue)\n\n\t\tLayout._inst = this\n\t}\n\n\t*JSONLayoutIterator(root: LayoutTree): IterableIterator<LayoutTree> {\n\t\tconst queue = new Queue<LayoutTree>()\n\t\tqueue.enqueue(root)\n\n\t\twhile (!queue.isEmpty()) {\n\t\t\tconst current = queue.dequeue()\n\t\t\tif (!current) continue\n\n\t\t\tyield current\n\n\t\t\tif (current.nodKids && current.nodKids.length > 0) {\n\t\t\t\tfor (const child of current.nodKids) {\n\t\t\t\t\tqueue.enqueue(child)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t*NodeLayoutIterator(root: Node): IterableIterator<Node> {\n\t\tconst queue = new Queue<Node>()\n\t\tqueue.enqueue(root)\n\n\t\twhile (!queue.isEmpty()) {\n\t\t\tconst current = queue.dequeue()\n\t\t\tif (!current) continue\n\n\t\t\tNode.cache.mapElem.set(current.unId, current)\n\n\t\t\tyield current\n\n\t\t\tif (current.kids.size() > 0) {\n\t\t\t\tfor (const child of current.kids) {\n\t\t\t\t\tqueue.enqueue(child)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t*NodeLayoutRecursiveIterator(root: Node): IterableIterator<Node> {\n\t\tfor (const child of root.kids) {\n\t\t\tyield* this.NodeLayoutRecursiveIterator(child)\n\t\t}\n\n\t\tyield root\n\t}\n\n\tupdateChildDirections(parent: Node) {\n\t\tconst parentDir = Node.cache.mapDirs.get(parent.unId)\n\t\tif (parentDir === undefined) {\n\t\t\tconsole.warn(\n\t\t\t\t`Cannot update child directions for node ${parent.unId}; its own direction is not set.`\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tfor (const child of parent.kids) {\n\t\t\tNode.cache.mapDirs.set(child.unId, !parentDir)\n\t\t\tif (child.kids.size() > 0) {\n\t\t\t\tchild.host = parent\n\t\t\t\tthis.updateChildDirections(child)\n\n\t\t\t\tif (child.next) {\n\t\t\t\t\tNode.cache.mapDirs.set(child.next.unId, !parentDir)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcreateNodeLayout(root: LayoutTree = Layout._tree) {\n\t\tconst JSONIterator = this.JSONLayoutIterator(root)\n\t\tconst nodeIterator = this.NodeLayoutIterator(Layout._root)\n\n\t\tNode.cache.mapDirs.set(Layout._root.unId, true)\n\n\t\twhile (true) {\n\t\t\tconst jsonNode = JSONIterator.next()\n\t\t\tconst nodeNode = nodeIterator.next()\n\n\t\t\tif (jsonNode.done || nodeNode.done) {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tconst jsonValue = jsonNode.value\n\t\t\tconst nodeValue = nodeNode.value\n\n\t\t\tif (!jsonValue || !nodeValue) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tthis.createNodeTreeFromJSONTree(jsonValue, nodeValue)\n\t\t}\n\n\t\tthis.calcTabsetCountAndMinDim()\n\t}\n\n\tcreateNodeTreeFromJSONTree(json: LayoutTree, host: Node) {\n\t\tconst direction = Node.cache.mapDirs.get(host.unId)\n\n\t\tfor (const child of json.nodKids || []) {\n\t\t\tconst node = this.createNodeFromJSON(child)\n\t\t\tconst prev = host.kids.peekBack()\n\t\t\tnode.host = host\n\t\t\tnode.addBond(node.host, prev)\n\t\t\thost.kids.enqueue(node)\n\n\t\t\tNode.cache.mapDirs.set(node.unId, !direction!)\n\t\t}\n\n\t\tif (host.type === 'tabset') Node.cache.mapElem.set(host.unId, host)\n\t\tif (host.type === 'tab') Node.cache.mapElem.set(host.unId, host)\n\t}\n\n\t/**\n\t * Create binary tree\n\t * @param queue\n\t * @param host\n\t */\n\tcreateBinaryNodeTreeFromQueue(\n\t\tqueue: Queue<string>,\n\t\thost: Node = Layout._root\n\t) {\n\t\tconst nodeQueue = new Queue<Node>()\n\t\tnodeQueue.enqueue(host)\n\n\t\tNode.cache.mapDirs.set(Layout._root.unId, true)\n\n\t\twhile (!queue.isEmpty()) {\n\t\t\tconst host = nodeQueue.dequeue()\n\t\t\tif (!host) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tconst dir = Node.cache.mapDirs.get(host.unId)\n\n\t\t\tif (queue.size() == 2) {\n\t\t\t\tconst leftName = queue.dequeue()\n\t\t\t\tconst rghtName = queue.dequeue()\n\t\t\t\tconst left = new Node({ type: 'tabset', host })\n\t\t\t\tconst rght = new Node({ type: 'tabset', host })\n\n\t\t\t\tconst leftKid = new Node({\n\t\t\t\t\ttype: 'tab',\n\t\t\t\t\thost: left,\n\t\t\t\t\tname: leftName,\n\t\t\t\t\tunId:\n\t\t\t\t\t\tthis.tabsIds.get(leftName ?? '') ?? crypto.randomUUID(),\n\t\t\t\t})\n\t\t\t\tconst rghtKid = new Node({\n\t\t\t\t\ttype: 'tab',\n\t\t\t\t\thost: rght,\n\t\t\t\t\tname: rghtName,\n\t\t\t\t\tunId:\n\t\t\t\t\t\tthis.tabsIds.get(rghtName ?? '') ?? crypto.randomUUID(),\n\t\t\t\t})\n\t\t\t\tleft.open = leftKid.name\n\t\t\t\trght.open = rghtKid.name\n\t\t\t\tleft.kids.enqueue(leftKid)\n\t\t\t\trght.kids.enqueue(rghtKid)\n\t\t\t\thost.kids.enqueue(left)\n\t\t\t\thost.kids.enqueue(rght)\n\n\t\t\t\trght.addBond(host, left)\n\n\t\t\t\tNode.cache.mapDirs.set(left.unId, !dir!)\n\t\t\t\tNode.cache.mapDirs.set(rght.unId, !dir!)\n\t\t\t\tNode.cache.mapElem.set(left.unId, left)\n\t\t\t\tNode.cache.mapElem.set(rght.unId, rght)\n\t\t\t\tNode.cache.mapDirs.set(leftKid.unId, dir!)\n\t\t\t\tNode.cache.mapDirs.set(rghtKid.unId, dir!)\n\t\t\t\tNode.cache.mapElem.set(leftKid.unId, leftKid)\n\t\t\t\tNode.cache.mapElem.set(rghtKid.unId, rghtKid)\n\n\t\t\t\tconsole.log(this.tabsIds)\n\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tconst leftName = queue.dequeue()\n\t\t\tconst left = new Node({ type: 'tabset', host })\n\t\t\tconst rght = new Node({ type: 'row', host })\n\t\t\tconst leftKid = new Node({\n\t\t\t\ttype: 'tab',\n\t\t\t\thost: left,\n\t\t\t\tname: leftName,\n\t\t\t\tunId: this.tabsIds.get(leftName ?? '') ?? crypto.randomUUID(),\n\t\t\t})\n\t\t\tleft.open = leftKid.name\n\n\t\t\tleft.kids.enqueue(leftKid)\n\t\t\thost.kids.enqueue(left)\n\t\t\thost.kids.enqueue(rght)\n\n\t\t\trght.addBond(host, left)\n\n\t\t\tNode.cache.mapDirs.set(left.unId, !dir!)\n\t\t\tNode.cache.mapDirs.set(rght.unId, !dir!)\n\t\t\tNode.cache.mapElem.set(left.unId, left)\n\t\t\tNode.cache.mapDirs.set(leftKid.unId, dir!)\n\t\t\tNode.cache.mapElem.set(leftKid.unId, leftKid)\n\n\t\t\tnodeQueue.enqueue(rght)\n\t\t}\n\n\t\tthis.calcTabsetCountAndMinDim()\n\t}\n\n\tcreateNodeFromJSON(json: LayoutTree): Node {\n\t\tconst newNode = new Node({\n\t\t\ttype: json.typNode as 'row' | 'tabset' | 'tab',\n\t\t\tname: json.nodName,\n\t\t\tunId: json.uidNode,\n\t\t\tpart: json.nodPart,\n\t\t\tdims: { w: 0, h: 0, x: 0, y: 0 },\n\t\t\topen: typeof json.nodOpen === 'string' ? json.nodOpen : '',\n\t\t})\n\n\t\tif (json.typNode === 'tab') {\n\t\t\tnewNode.unId = this.tabsIds.get(json.nodName) || json.uidNode\n\t\t}\n\n\t\treturn newNode\n\t}\n\n\tcalcTabsetCountAndMinDim(root: Node = Layout._root, clear: boolean = true) {\n\t\tif (root === Layout._root && clear) {\n\t\t\tNode.cache.tabCnts.clear()\n\t\t\tNode.cache.dimMins.clear()\n\t\t\tNode.cache.mapElem.clear()\n\t\t\tNode.cache.mapElem.clear()\n\t\t\tNode.cache.mapElem.clear()\n\t\t\tNode.cache.mapElem.clear()\n\t\t\tNode.cache.nodOpts.get().clear()\n\t\t\tNode.cache.bndOpts.get().clear()\n\t\t}\n\n\t\tfor (const node of this.NodeLayoutRecursiveIterator(root)) {\n\t\t\tconst tabCnts = Node.cache.tabCnts\n\t\t\tconst dimMins = Node.cache.dimMins\n\n\t\t\tNode.cache.mapElem.set(node.unId, node)\n\n\t\t\tconst hostCnt = tabCnts\n\t\t\t\t.set(node.unId, {\n\t\t\t\t\thorizontal: 0,\n\t\t\t\t\tvertical: 0,\n\t\t\t\t})\n\t\t\t\t.get(node.unId)\n\n\t\t\tconst hostDim = dimMins\n\t\t\t\t.set(node.unId, {\n\t\t\t\t\tminWidth: 0,\n\t\t\t\t\tminHeight: 0,\n\t\t\t\t})\n\t\t\t\t.get(node.unId)\n\n\t\t\tconst nodeDir = Node.cache.mapDirs.get(node.unId)\n\n\t\t\tif (node.type === 'tab') {\n\t\t\t\tNode.cache.mapElem.set(node.unId, node)\n\t\t\t\tdimMins.set(node.unId, {\n\t\t\t\t\tminWidth: 0,\n\t\t\t\t\tminHeight: 0,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (node.next) Node.cache.mapElem.set(node.next.unId, node.next)\n\n\t\t\tif (node.type === 'tabset') {\n\t\t\t\tNode.cache.mapElem.set(node.unId, node)\n\t\t\t\tdimMins.set(node.unId, {\n\t\t\t\t\tminWidth: Layout._minW,\n\t\t\t\t\tminHeight: Layout._minH,\n\t\t\t\t})\n\n\t\t\t\tif (nodeDir) {\n\t\t\t\t\ttabCnts.set(node.unId, {\n\t\t\t\t\t\thorizontal: 0,\n\t\t\t\t\t\tvertical: 1,\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\ttabCnts.set(node.unId, {\n\t\t\t\t\t\thorizontal: 1,\n\t\t\t\t\t\tvertical: 0,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (node.type === 'row') {\n\t\t\t\tfor (const child of node.kids) {\n\t\t\t\t\tconst kidCnt = tabCnts.get(child.unId)\n\t\t\t\t\tconst kidDim = dimMins.get(child.unId)\n\n\t\t\t\t\tif (!kidCnt) continue\n\t\t\t\t\thostCnt!.horizontal += kidCnt!.horizontal\n\t\t\t\t\thostCnt!.vertical += kidCnt!.vertical\n\n\t\t\t\t\tif (nodeDir) {\n\t\t\t\t\t\thostDim!.minHeight = Math.max(\n\t\t\t\t\t\t\thostDim!.minHeight,\n\t\t\t\t\t\t\tkidDim!.minHeight!\n\t\t\t\t\t\t)\n\t\t\t\t\t\thostDim!.minWidth += kidDim!.minWidth!\n\t\t\t\t\t} else {\n\t\t\t\t\t\thostDim!.minHeight += kidDim!.minHeight!\n\t\t\t\t\t\thostDim!.minWidth = Math.max(\n\t\t\t\t\t\t\thostDim!.minWidth,\n\t\t\t\t\t\t\tkidDim!.minWidth!\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (nodeDir) {\n\t\t\t\t\thostDim!.minWidth += (node.kids.size() - 1) * Layout._bond\n\t\t\t\t} else {\n\t\t\t\t\thostDim!.minHeight += (node.kids.size() - 1) * Layout._bond\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tcalculateRootAdjustment(): RootAdjustment {\n\t\tconst reqDims = Layout._root.getReqDimension()\n\n\t\tlet wasAdjusted = false\n\t\tlet adjustedW = Layout._root.dims.w\n\t\tlet adjustedH = Layout._root.dims.h\n\n\t\tif (Layout._root.dims.w < reqDims.width) {\n\t\t\tadjustedW = reqDims.width\n\t\t\twasAdjusted = true\n\t\t}\n\t\tif (Layout._root.dims.h < reqDims.height) {\n\t\t\tadjustedH = reqDims.height\n\t\t\twasAdjusted = true\n\t\t}\n\n\t\tif (wasAdjusted) {\n\t\t\tLayout._root.dims.w = adjustedW\n\t\t\tLayout._root.dims.h = adjustedH\n\t\t}\n\n\t\treturn {\n\t\t\tadjustedW,\n\t\t\tadjustedH,\n\t\t\twasAdjusted,\n\t\t}\n\t}\n\n\tcalcDimensions(root: Node = Layout._root, supress: boolean = false) {\n\t\tconst nodeOpts = new Map<string, NodeOptions>()\n\t\tconst bondOpts = new Map<string, NodeOptions>()\n\t\tconst tabsIds = new Map<string, NodeOptions>()\n\n\t\tif (root === Layout._root) this.calculateRootAdjustment()\n\n\t\tfor (const node of this.NodeLayoutIterator(root)) {\n\t\t\tnode.calcDimensions()\n\n\t\t\tconst nodeDir = Node.cache.mapDirs.get(node.unId)!\n\n\t\t\tif (node.type === 'tabset') {\n\t\t\t\tconst nodeOption: NodeOptions = {\n\t\t\t\t\ttypNode: node.type,\n\t\t\t\t\tnodName: node.name,\n\t\t\t\t\tuidNode: node.unId,\n\t\t\t\t\tnodPart: node.part,\n\t\t\t\t\tnodOpen: node.open,\n\t\t\t\t\tnodeDir: nodeDir,\n\n\t\t\t\t\tnodKids: Array.from(node.kids).map((kid) => {\n\t\t\t\t\t\tconst KidNode = {\n\t\t\t\t\t\t\ttypNode: kid.type,\n\t\t\t\t\t\t\tnodName: kid.name,\n\t\t\t\t\t\t\tuidNode: kid.unId,\n\t\t\t\t\t\t\tnodPart: kid.part,\n\t\t\t\t\t\t\tnodOpen: node.open === kid.name ? true : false,\n\t\t\t\t\t\t\tnodeDir: !nodeDir,\n\t\t\t\t\t\t\tnodDims: {\n\t\t\t\t\t\t\t\t...node.dims,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttabsIds.set(kid.unId, KidNode)\n\t\t\t\t\t\treturn KidNode as NodeOptions\n\t\t\t\t\t}),\n\t\t\t\t\tnodDims: {\n\t\t\t\t\t\t...node.dims,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tnodeOpts.set(node.unId, nodeOption)\n\t\t\t}\n\n\t\t\tif (node.next && node.type !== 'tab') {\n\t\t\t\tconst bondOption: NodeOptions = {\n\t\t\t\t\ttypNode: 'bond',\n\t\t\t\t\tnodName: node.name,\n\t\t\t\t\tuidNode: node.next.unId,\n\t\t\t\t\tnodeDir: nodeDir,\n\t\t\t\t\tnodPart: 0,\n\t\t\t\t\tnodDims: {\n\t\t\t\t\t\t...node.next.dims,\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\tbondOpts.set(node.next.unId, bondOption)\n\t\t\t}\n\t\t}\n\t\tNode.cache.nodOpts.set(nodeOpts, supress)\n\t\tNode.cache.bndOpts.set(bondOpts, supress)\n\t\tNode.cache.tabOpts.set(tabsIds, supress)\n\t}\n\n\tupdateDimension(\n\t\tdim: Dimension,\n\t\tdisableTimeout: boolean = false,\n\t\ttimeout: number = 2\n\t) {\n\t\tLayout._root.dims = dim\n\n\t\tif (disableTimeout) {\n\t\t\tthis.calcDimensions(Layout._root)\n\t\t\treturn\n\t\t}\n\n\t\tif (this.cntdown) {\n\t\t\tclearTimeout(this.cntdown)\n\t\t\tthis.cntdown = null\n\t\t}\n\n\t\tthis.cntdown = setTimeout(() => {\n\t\t\tthis.cntdown = null\n\t\t\tthis.calcDimensions()\n\t\t}, timeout)\n\t}\n\n\tupdateSlider(\n\t\tid: string,\n\t\tdim: { x: number; y: number },\n\t\tdisableTimeout: boolean = false,\n\t\ttimeout: number = 2\n\t) {\n\t\tif (disableTimeout) {\n\t\t\tthis.updateSliderDimension(id, dim)\n\t\t\treturn\n\t\t}\n\n\t\tif (this.cntdown) {\n\t\t\tclearTimeout(this.cntdown)\n\t\t\tthis.cntdown = null\n\t\t}\n\n\t\tthis.cntdown = setTimeout(() => {\n\t\t\tthis.cntdown = null\n\t\t\tthis.updateSliderDimension(id, dim)\n\t\t}, timeout)\n\t}\n\n\tupdateSliderDimension(id: string, dim: { x: number; y: number }) {\n\t\tconst bnd = Node.cache.mapElem.get(id)\n\n\t\tif (!bnd || !(bnd instanceof Bond)) {\n\t\t\tconsole.warn(\n\t\t\t\t`Bond with id ${id} not found or is not a Bond instance`\n\t\t\t)\n\t\t\treturn\n\t\t}\n\n\t\tconst dir = Node.cache.mapDirs.get(bnd.host!.unId)\n\n\t\tconst prev = bnd.prev\n\t\tconst next = bnd.next\n\t\tconst host = bnd.host\n\n\t\tif (!prev || !next || !host) {\n\t\t\tconsole.warn('Missing prev, next, or host node', prev, next, host)\n\t\t\treturn\n\t\t}\n\n\t\tconst prevMinDim = Node.cache.dimMins.get(prev.unId) || {\n\t\t\tminWidth: 0,\n\t\t\tminHeight: 0,\n\t\t}\n\t\tconst nextMinDim = Node.cache.dimMins.get(next.unId) || {\n\t\t\tminWidth: 0,\n\t\t\tminHeight: 0,\n\t\t}\n\t\tconst half = Layout._bond / 2\n\n\t\tif (dir) {\n\t\t\tconst endX = next.dims.x + next.dims.w\n\n\t\t\tconst minX = prev.dims.x + prevMinDim.minWidth + half\n\t\t\tconst maxX = endX - nextMinDim.minWidth - half\n\n\t\t\tconst clampedX = Math.max(minX, Math.min(maxX, dim.x))\n\n\t\t\tbnd.dims.x = clampedX - half\n\n\t\t\tprev.dims.w = bnd.dims.x - prev.dims.x\n\n\t\t\tnext.dims.x = clampedX + half\n\t\t\tnext.dims.w = endX - next.dims.x\n\n\t\t\tconst prevExtraSpace = Math.max(\n\t\t\t\t0,\n\t\t\t\tprev.dims.w - prevMinDim.minWidth\n\t\t\t)\n\t\t\tconst nextExtraSpace = Math.max(\n\t\t\t\t0,\n\t\t\t\tnext.dims.w - nextMinDim.minWidth\n\t\t\t)\n\t\t\tconst totalExtraSpace = prevExtraSpace + nextExtraSpace\n\t\t\tconst totalPart = prev.part + next.part\n\n\t\t\tif (totalExtraSpace > 0) {\n\t\t\t\tprev.part = (prevExtraSpace / totalExtraSpace) * totalPart\n\t\t\t\tnext.part = (nextExtraSpace / totalExtraSpace) * totalPart\n\t\t\t} else {\n\t\t\t\tprev.part = totalPart / 2\n\t\t\t\tnext.part = totalPart / 2\n\t\t\t}\n\t\t} else {\n\t\t\tconst endY = next.dims.y + next.dims.h\n\n\t\t\tconst minY = prev.dims.y + prevMinDim.minHeight + half\n\t\t\tconst maxY = endY - nextMinDim.minHeight - half\n\n\t\t\tconst clampedY = Math.max(minY, Math.min(maxY, dim.y))\n\n\t\t\tbnd.dims.y = clampedY - half\n\n\t\t\tprev.dims.h = bnd.dims.y - prev.dims.y\n\n\t\t\tnext.dims.y = clampedY + half\n\t\t\tnext.dims.h = endY - next.dims.y\n\n\t\t\tconst prevExtraSpace = Math.max(\n\t\t\t\t0,\n\t\t\t\tprev.dims.h - prevMinDim.minHeight\n\t\t\t)\n\t\t\tconst nextExtraSpace = Math.max(\n\t\t\t\t0,\n\t\t\t\tnext.dims.h - nextMinDim.minHeight\n\t\t\t)\n\t\t\tconst totalExtraSpace = prevExtraSpace + nextExtraSpace\n\t\t\tconst totalPart = prev.part + next.part\n\n\t\t\tif (totalExtraSpace > 0) {\n\t\t\t\tprev.part = (prevExtraSpace / totalExtraSpace) * totalPart\n\t\t\t\tnext.part = (nextExtraSpace / totalExtraSpace) * totalPart\n\t\t\t} else {\n\t\t\t\tprev.part = totalPart / 2\n\t\t\t\tnext.part = totalPart / 2\n\t\t\t}\n\t\t}\n\n\t\tthis.calcDimensions(host)\n\t}\n\n\tupdateTree(\n\t\tsrc: string,\n\t\tdes: string,\n\t\tlayout: 'top' | 'bottom' | 'left' | 'right' | 'contain'\n\t): boolean {\n\t\tconst srcNode = Node.cache.mapElem.get(src)\n\t\tlet desNode = Node.cache.mapElem.get(des)\n\n\t\tif (\n\t\t\t!srcNode ||\n\t\t\t!(srcNode instanceof Node) ||\n\t\t\t!desNode ||\n\t\t\t!(desNode instanceof Node)\n\t\t) {\n\t\t\tconsole.warn(\n\t\t\t\t`Source node ${src} not found or is not a Node instance`\n\t\t\t)\n\t\t\treturn false\n\t\t}\n\n\t\tif (\n\t\t\tsrcNode?.type == 'tab' &&\n\t\t\tsrcNode.host === desNode &&\n\t\t\tdesNode.kids.size() < 2\n\t\t) {\n\t\t\tconsole.warn(`Cannot move to self as it has only one tab`)\n\t\t\treturn false\n\t\t}\n\n\t\tif (srcNode?.type == 'tabset' && desNode?.host === srcNode) {\n\t\t\tconsole.warn(`Cannot move tabset to self as it is already a child`)\n\t\t\treturn false\n\t\t}\n\n\t\tif (!srcNode || !desNode) {\n\t\t\tconsole.warn(`Source or destination node not found: ${src}, ${des}`)\n\t\t\treturn false\n\t\t}\n\n\t\tif (srcNode === desNode) {\n\t\t\tconsole.warn(\n\t\t\t\t'Source and destination nodes are the same, no action taken.'\n\t\t\t)\n\t\t\treturn false\n\t\t}\n\n\t\tif (!srcNode.host || (!desNode.host && desNode.type !== 'row')) {\n\t\t\tconsole.warn(\n\t\t\t\t`Source node or destination node's host is null: ${srcNode.unId}, ${desNode.unId}`\n\t\t\t)\n\t\t\treturn false\n\t\t}\n\n\t\tif (desNode.type === 'row' && layout === 'contain') {\n\t\t\tconsole.warn(\n\t\t\t\t`Cannot move to a row with 'contain' layout: ${desNode.unId}`\n\t\t\t)\n\t\t\treturn false\n\t\t}\n\n\t\tif (srcNode.type === 'row') {\n\t\t\treturn false\n\t\t}\n\n\t\tif (desNode.type === 'tabset' && layout === 'contain') {\n\t\t\tdesNode = desNode.kids.peekBack() || desNode\n\t\t}\n\n\t\tif (\n\t\t\tdesNode.type === 'tab' &&\n\t\t\t(layout === 'contain' || layout === 'left' || layout === 'right')\n\t\t) {\n\t\t\tthis.moveNodeAsTab(srcNode, desNode, layout)\n\t\t} else if (desNode.type === 'row' && layout !== 'contain') {\n\t\t\tthis.moveRelativeToRoot(srcNode, desNode, layout)\n\t\t} else if (desNode.type === 'tabset' && layout !== 'contain') {\n\t\t\tthis.moveRelativeToTabset(srcNode, desNode, layout)\n\t\t}\n\n\t\tthis.calcTabsetCountAndMinDim()\n\t\tthis.calcDimensions(Layout._root, true)\n\t\treturn true\n\t}\n\n\tmoveNodeAsTab(src: Node, des: Node, layout: 'left' | 'right' | 'contain') {\n\t\tif (!des || !des.host) {\n\t\t\tconsole.warn(\n\t\t\t\t`Destination node ${des.unId} has no host, cannot move.`\n\t\t\t)\n\t\t\treturn\n\t\t}\n\n\t\tthis.removeNode(src)\n\n\t\tconst desHst = des.host\n\t\tconst desIdx = desHst.kids.indexOf(des)\n\n\t\tif (desIdx === undefined || desIdx === -1) {\n\t\t\treturn\n\t\t}\n\n\t\tconst insertFlg = layout === 'contain' || layout === 'left'\n\t\tconst insertIdx = insertFlg ? desIdx : desIdx + 1\n\n\t\tconst desNxt = desHst.kids.get(insertIdx + 1)\n\t\tconst desPre = desHst.kids.get(insertIdx - 1)\n\t\tconst nxtBnd = des.next\n\t\tconst prvBnd = des.prev\n\n\t\tif (!insertFlg && nxtBnd) {\n\t\t\tNode.cache.mapElem.delete(nxtBnd.unId)\n\t\t\tNode.cache.nodOpts.get().delete(nxtBnd.unId)\n\t\t} else if (insertFlg && prvBnd) {\n\t\t\tNode.cache.mapElem.delete(prvBnd.unId)\n\t\t\tNode.cache.nodOpts.get().delete(prvBnd.unId)\n\t\t}\n\n\t\tif (src.type == 'tab') {\n\t\t\tif (insertFlg) {\n\t\t\t\tif (desPre) src.addBond(desHst, desPre)\n\t\t\t\tdes.addBond(desHst, src)\n\t\t\t} else {\n\t\t\t\tsrc.addBond(desHst, des)\n\t\t\t\tif (desNxt) desNxt.addBond(desHst, src)\n\t\t\t}\n\t\t\tdesHst.kids.insert(insertIdx, src)\n\t\t\tsrc.host = desHst\n\t\t\tdesHst.open = src.name\n\t\t} else if (src.type == 'tabset') {\n\t\t\tconst kidFst = src.kids.peek()\n\t\t\tconst kidLst = src.kids.peekBack()\n\n\t\t\tif (insertFlg) {\n\t\t\t\tif (kidFst && desPre) kidFst.addBond(desHst, desPre)\n\t\t\t\tif (kidLst && des) des.addBond(desHst, kidLst)\n\t\t\t} else {\n\t\t\t\tif (kidFst && des) kidFst.addBond(desHst, des)\n\t\t\t\tif (kidLst && desNxt) desNxt.addBond(desHst, kidLst)\n\t\t\t}\n\n\t\t\tdesHst.kids.insertQueue(insertIdx, src.kids)\n\n\t\t\tfor (const kid of src.kids) {\n\t\t\t\tkid.host = desHst\n\t\t\t\tif (kid.next) kid.next.host = desHst\n\t\t\t}\n\n\t\t\tdesHst.open = kidLst ? kidLst.name : ''\n\t\t}\n\n\t\tthis.updateChildDirections(desHst)\n\t}\n\n\tmoveRelativeToRoot(\n\t\tsrc: Node,\n\t\tdes: Node,\n\t\tlayout: 'top' | 'bottom' | 'left' | 'right'\n\t) {\n\t\tthis.removeNode(src)\n\n\t\tconst nodeDir = Node.cache.mapDirs.get(des.unId)\n\t\tconst destDir = layout === 'top' || layout === 'left'\n\n\t\tif (src.type === 'tab') {\n\t\t\tconst tabset = new Node({ type: 'tabset', host: des.host })\n\t\t\ttabset.kids.enqueue(src)\n\t\t\tsrc.host = tabset\n\t\t\ttabset.open = src.name\n\n\t\t\tif (nodeDir == false) {\n\t\t\t\tif (layout === 'left' || layout === 'right') {\n\t\t\t\t\tthis.insertNodeWithNewParent(tabset, des, destDir)\n\t\t\t\t} else {\n\t\t\t\t\tthis.insertNode(des, tabset, destDir)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (layout === 'top' || layout === 'bottom') {\n\t\t\t\t\tthis.insertNodeWithNewParent(tabset, des, destDir)\n\t\t\t\t} else {\n\t\t\t\t\tthis.insertNode(des, tabset, destDir)\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (src.type === 'tabset') {\n\t\t\tif (nodeDir == false) {\n\t\t\t\tif (layout === 'left' || layout === 'right') {\n\t\t\t\t\tthis.insertNodeWithNewParent(src, des, destDir)\n\t\t\t\t} else {\n\t\t\t\t\tthis.insertNode(des, src, destDir)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (layout === 'top' || layout === 'bottom') {\n\t\t\t\t\tthis.insertNodeWithNewParent(src, des, destDir)\n\t\t\t\t} else {\n\t\t\t\t\tthis.insertNode(des, src, destDir)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tmoveRelativeToTabset(\n\t\tsrc: Node,\n\t\tdes: Node,\n\t\tlayout: 'top' | 'bottom' | 'left' | 'right'\n\t) {\n\t\tthis.removeNode(src)\n\n\t\tconst nodeDir = Node.cache.mapDirs.get(des.unId)\n\t\tconst destDir = layout === 'top' || layout === 'left'\n\n\t\tif (src.type === 'tab') {\n\t\t\tconst tabset = new Node({ type: 'tabset', host: des.host })\n\t\t\ttabset.kids.enqueue(src)\n\t\t\tsrc.host = tabset\n\t\t\ttabset.open = src.name\n\n\t\t\tif (nodeDir == false) {\n\t\t\t\tif (layout === 'top' || layout === 'bottom') {\n\t\t\t\t\tthis.insertNodeWithNewParent(tabset, des, destDir)\n\t\t\t\t} else {\n\t\t\t\t\tthis.insertNode(des, tabset, destDir)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (layout === 'left' || layout === 'right') {\n\t\t\t\t\tthis.insertNodeWithNewParent(tabset, des, destDir)\n\t\t\t\t} else {\n\t\t\t\t\tthis.insertNode(des, tabset, destDir)\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (src.type === 'tabset') {\n\t\t\tif (nodeDir == false) {\n\t\t\t\tif (layout === 'top' || layout === 'bottom') {\n\t\t\t\t\tthis.insertNodeWithNewParent(src, des, destDir)\n\t\t\t\t} else {\n\t\t\t\t\tthis.insertNode(des, src, destDir)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (layout === 'left' || layout === 'right') {\n\t\t\t\t\tthis.insertNodeWithNewParent(src, des, destDir)\n\t\t\t\t} else {\n\t\t\t\t\tthis.insertNode(des, src, destDir)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tinsertNode(des: Node, src: Node, flag: boolean) {\n\t\tconst desHost = des.host\n\t\tif (des == Layout._root) {\n\t\t\tconst kidhead = Layout._root.kids.peek()\n\t\t\tconst kidTail = Layout._root.kids.peekBack()\n\n\t\t\tif (flag) {\n\t\t\t\tLayout._root.kids.enqueueFront(src)\n\t\t\t\tif (kidhead) kidhead.addBond(Layout._root, src)\n\t\t\t} else {\n\t\t\t\tLayout._root.kids.enqueue(src)\n\t\t\t\tif (kidTail) src.addBond(Layout._root, kidTail)\n\t\t\t}\n\n\t\t\tsrc!.host = Layout._root\n\t\t\tthis.updateChildDirections(Layout._root)\n\t\t\treturn\n\t\t}\n\n\t\tif (!desHost) {\n\t\t\tconsole.warn(\n\t\t\t\t`Destination node ${des.unId} has no host, cannot insert.`\n\t\t\t)\n\t\t\treturn\n\t\t}\n\n\t\tconst desIdx = desHost.kids.indexOf(des)\n\t\tif (desIdx === -1) {\n\t\t\tconsole.warn(\n\t\t\t\t`Destination node ${des.unId} not found in its host's kids.`\n\t\t\t)\n\t\t\treturn\n\t\t}\n\n\t\tconst hostDir = Node.cache.mapDirs.get(desHost.unId)\n\t\tif (hostDir) Node.cache.mapDirs.set(src.unId, !hostDir)\n\n\t\tconst desNxt = desHost.kids.get(desIdx + 1)\n\t\tconst desPre = desHost.kids.get(desIdx - 1)\n\t\tconst bndNxt = des.next\n\t\tconst bndPre = des.prev\n\n\t\tsrc.host = desHost\n\n\t\tif (flag) {\n\t\t\tdesHost.kids.insert(desIdx, src)\n\n\t\t\tdes.addBond(desHost, src)\n\t\t\tif (desPre) src.addBond(desHost, desPre)\n\n\t\t\tif (bndPre) {\n\t\t\t\tNode.cache.mapElem.delete(bndPre.unId)\n\t\t\t\tNode.cache.nodOpts.get().delete(bndPre.unId)\n\t\t\t}\n\t\t} else {\n\t\t\tdesHost.kids.insert(desIdx + 1, src)\n\t\t\tsrc.addBond(desHost, des)\n\t\t\tif (desNxt) desNxt.addBond(desHost, src)\n\n\t\t\tif (bndNxt) {\n\t\t\t\tNode.cache.mapElem.delete(bndNxt.unId)\n\t\t\t\tNode.cache.nodOpts.get().delete(bndNxt.unId)\n\t\t\t}\n\t\t}\n\n\t\tthis.updateChildDirections(desHost)\n\t}\n\n\tinsertNodeWithNewParent(src: Node, des: Node, flag: boolean) {\n\t\tconst kids = new Queue<Node>()\n\t\tconst node = new Node({ type: 'tabset', host: des.host })\n\n\t\tif (!des || !src) {\n\t\t\tconsole.warn(\n\t\t\t\t`Destination node ${des.unId} has no host, cannot insert.`\n\t\t\t)\n\t\t\treturn\n\t\t}\n\n\t\tif (des === Layout._root) {\n\t\t\tconst row = new Node({ type: 'row', host: des })\n\t\t\tif (des.kids.size() == 1 && des.kids.peek()?.type === 'tabset') {\n\t\t\t\tconst kid = des.kids.dequeue()\n\n\t\t\t\tif (!kid) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`No kid found in destination node ${des.unId}, cannot insert.`\n\t\t\t\t\t)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (flag) {\n\t\t\t\t\trow.kids.enqueue(src)\n\t\t\t\t\trow.kids.enqueue(kid)\n\t\t\t\t\tdes.kids.enqueue(row)\n\t\t\t\t\tkid.addBond(row, src)\n\t\t\t\t} else {\n\t\t\t\t\trow.kids.enqueue(kid)\n\t\t\t\t\trow.kids.enqueue(src)\n\t\t\t\t\tsrc.addBond(row, kid)\n\t\t\t\t\tdes.kids.enqueue(row)\n\t\t\t\t}\n\t\t\t\tsrc.host = row\n\t\t\t\tkid.host = row\n\t\t\t} else if (\n\t\t\t\tdes.kids.size() == 1 &&\n\t\t\t\tdes.kids.peek()?.type === 'row'\n\t\t\t) {\n\t\t\t\tconst kid = des.kids.peek()\n\n\t\t\t\tconst kidhead = kid?.kids.peek()\n\t\t\t\tconst kidTail = kid?.kids.peekBack()\n\n\t\t\t\tif (flag && kid) {\n\t\t\t\t\tkid.kids.enqueueFront(src)\n\t\t\t\t\tif (kidhead) kidhead.addBond(kid, src)\n\t\t\t\t} else if (kid) {\n\t\t\t\t\tkid.kids.enqueue(src)\n\t\t\t\t\tif (kidTail) src.addBond(kid, kidTail)\n\t\t\t\t}\n\n\t\t\t\tsrc!.host = kid!\n\t\t\t} else if (des.kids.size() > 1) {\n\t\t\t\tconst rowA = new Node({ type: 'row', host: des })\n\t\t\t\tconst rowB = new Node({ type: 'row', host: rowA })\n\n\t\t\t\tfor (const kid of des.kids) {\n\t\t\t\t\trowB.kids.enqueue(kid)\n\t\t\t\t\tkid.host = rowB\n\t\t\t\t\tif (kid.next) kid.next.host = rowB\n\t\t\t\t}\n\n\t\t\t\tsrc.host = rowA\n\t\t\t\tdes.kids.clear()\n\n\t\t\t\tif (flag) {\n\t\t\t\t\trowA.kids.enqueueFront(src)\n\t\t\t\t\trowA.kids.enqueue(rowB)\n\t\t\t\t\trowB.addBond(rowA, src)\n\t\t\t\t} else {\n\t\t\t\t\trowA.kids.enqueue(rowB)\n\t\t\t\t\trowA.kids.enqueue(src)\n\t\t\t\t\tsrc.addBond(rowA, rowB)\n\t\t\t\t}\n\n\t\t\t\tdes.kids.enqueue(rowA)\n\t\t\t}\n\n\t\t\tthis.updateChildDirections(des)\n\t\t\treturn\n\t\t}\n\n\t\tsrc.host = des\n\n\t\tnode.host = des\n\t\tnode.kids = des.kids\n\t\tnode.open = des.open\n\n\t\tconst desDir = Node.cache.mapDirs.get(des.unId)\n\n\t\tfor (const kid of node.kids) {\n\t\t\tkid.host = node\n\t\t\tif (kid.next) kid.next.host = node\n\t\t\tNode.cache.mapDirs.set(kid.unId, desDir!)\n\t\t}\n\n\t\tfor (const kid of src.kids) {\n\t\t\tkid.host = src\n\t\t\tif (kid.next) kid.next.host = src\n\t\t\tNode.cache.mapDirs.set(kid.unId, desDir!)\n\t\t}\n\n\t\tNode.cache.mapDirs.set(node.unId, !desDir!)\n\t\tNode.cache.mapDirs.set(src.unId, !desDir!)\n\n\t\tif (flag) {\n\t\t\tkids.enqueue(src)\n\t\t\tkids.enqueue(node)\n\t\t\tdes.kids = kids\n\t\t\tdes.type = 'row'\n\t\t\tnode.addBond(des, src)\n\t\t} else {\n\t\t\tkids.enqueue(node)\n\t\t\tkids.enqueue(src)\n\t\t\tdes.kids = kids\n\t\t\tdes.type = 'row'\n\t\t\tsrc.addBond(des, node)\n\t\t}\n\t}\n\n\tmoveAdjacentNodeToGrandParent(src: Node) {\n\t\tif (!src.host || !src.host.host) {\n\t\t\tconsole.warn(`Source node ${src.unId} has no host, cannot move.`)\n\t\t\treturn\n\t\t}\n\n\t\tconst srcHost = src.host\n\t\tconst gndHost = src.host.host\n\n\t\tconst srcHostIndex = gndHost.kids.indexOf(srcHost)\n\t\tconst hostPrev = gndHost.kids.get(srcHostIndex - 1)\n\t\tconst hostNext = gndHost.kids.get(srcHostIndex + 1)\n\t\tconst fstKid = src.kids.peek()\n\t\tconst lstKid = src.kids.peekBack()\n\n\t\tthis.removeKid(srcHost)\n\n\t\tlet insrtIndex = srcHostIndex\n\n\t\tif (src.type == 'row' && srcHost) {\n\t\t\tif (hostPrev && fstKid) fstKid.addBond(gndHost, hostPrev)\n\t\t\tif (hostNext && lstKid) hostNext.addBond(gndHost, lstKid)\n\n\t\t\tfor (const kid of src.kids) {\n\t\t\t\tkid.host = gndHost\n\t\t\t\tif (kid.next) kid.next.host = gndHost\n\t\t\t\tgndHost.kids.insert(insrtIndex, kid)\n\n\t\t\t\tNode.cache.mapDirs.set(\n\t\t\t\t\tkid.unId,\n\t\t\t\t\t!Node.cache.mapDirs.get(gndHost.unId)!\n\t\t\t\t)\n\t\t\t\tNode.cache.dimMins.delete(kid.unId)\n\t\t\t\tinsrtIndex++\n\t\t\t}\n\t\t} else if (src.type == 'tabset') {\n\t\t\tif (hostPrev) src.addBond(gndHost, hostPrev)\n\t\t\tif (hostNext) hostNext.addBond(gndHost, src)\n\n\t\t\tgndHost.kids.insert(insrtIndex, src)\n\n\t\t\tsrc.host = gndHost\n\n\t\t\tNode.cache.mapDirs.set(\n\t\t\t\tsrc.unId,\n\t\t\t\t!Node.cache.mapDirs.get(gndHost.unId)!\n\t\t\t)\n\n\t\t\tfor (const kid of src.kids) {\n\t\t\t\tNode.cache.mapDirs.set(\n\t\t\t\t\tkid.unId,\n\t\t\t\t\tNode.cache.mapDirs.get(gndHost.unId)!\n\t\t\t\t)\n\t\t\t\tNode.cache.dimMins.delete(kid.unId)\n\t\t\t}\n\t\t}\n\t}\n\n\tremoveRelation(src: Node, fix: boolean = true) {\n\t\tconst host = src.host\n\t\tconst prev = src.prev\n\t\tconst next = src.next\n\n\t\tsrc.host = null\n\t\tsrc.next = null\n\t\tsrc.prev = null\n\n\t\tif (prev) prev.next = null\n\t\tif (next) next.prev = null\n\n\t\tif (!fix) {\n\t\t\treturn src\n\t\t}\n\n\t\tif (prev && next && prev.prev && next.next) {\n\t\t\tprev.prev.addBond(host, next.next)\n\t\t} else if (prev && prev.prev) {\n\t\t\tprev.prev.next = null\n\t\t} else if (next && next.next) {\n\t\t\tnext.next.prev = null\n\t\t}\n\t}\n\n\tremoveNode(src: Node) {\n\t\tif (!src.host) {\n\t\t\tconsole.warn(`Kid node has no host, cannot remove.`)\n\t\t\treturn\n\t\t}\n\n\t\tconst papa = src?.host\n\t\tconst dada = papa?.host\n\n\t\tthis.removeKid(src)\n\n\t\tif (src.type === 'tabset' && papa.kids.size() === 1) {\n\t\t\t/**\n\t\t\t *\n\t\t\t */\n\t\t\tconst kid = papa.kids.peek()\n\t\t\tif (kid) this.moveAdjacentNodeToGrandParent(kid)\n\t\t} else if (\n\t\t\t/**\n\t\t\t *\n\t\t\t */\n\t\t\tsrc.type === 'tab' &&\n\t\t\tpapa!.kids.size() === 0 &&\n\t\t\tdada!.kids.size() === 2\n\t\t) {\n\t\t\tthis.removeKid(papa)\n\t\t\tconst kid = dada?.kids.peek()\n\t\t\tif (kid) this.moveAdjacentNodeToGrandParent(kid)\n\t\t} else if (\n\t\t\t/**\n\t\t\t *\n\t\t\t */\n\t\t\tsrc.type === 'tab' &&\n\t\t\tpapa!.kids.size() === 0 &&\n\t\t\tdada!.kids.size() > 2\n\t\t) {\n\t\t\tthis.removeKid(papa)\n\t\t} else if (\n\t\t\t/**\n\t\t\t *\n\t\t\t */\n\t\t\tsrc.type === 'tab' &&\n\t\t\tpapa!.open === src.name &&\n\t\t\tpapa!.kids.size() > 0\n\t\t) {\n\t\t\tconst kid = papa.kids.peek()\n\t\t\tif (kid) papa.open = kid.name\n\t\t}\n\t}\n\n\tremoveKid(kid: Node) {\n\t\tif (!kid.host) {\n\t\t\tconsole.warn(`Kid node has no host, cannot remove.`)\n\t\t\treturn\n\t\t}\n\n\t\tconst host = kid.host\n\t\tconst idx = host.kids.indexOf(kid)\n\n\t\tconst nextNode = host.kids.get(idx + 1)\n\t\tconst prevNode = host.kids.get(idx - 1)\n\t\tconst nextBond = kid.next\n\t\tconst prevBond = kid.prev\n\n\t\tif (idx === -1) {\n\t\t\tconsole.warn(`Kid node not found in its host's kids.`)\n\t\t\treturn\n\t\t}\n\n\t\tif (nextBond) {\n\t\t\tNode.cache.mapElem.delete(nextBond.unId)\n\t\t\tNode.cache.nodOpts.get().delete(nextBond.unId)\n\t\t}\n\n\t\tif (prevBond) {\n\t\t\tNode.cache.mapElem.delete(prevBond.unId)\n\t\t\tNode.cache.nodOpts.get().delete(prevBond.unId)\n\t\t}\n\n\t\tif (nextNode && prevNode) {\n\t\t\tnextNode.addBond(host, prevNode)\n\t\t} else if (nextNode) {\n\t\t\tnextNode.prev = null\n\t\t} else if (prevNode) {\n\t\t\tprevNode.next = null\n\t\t}\n\n\t\thost.kids.removeAt(idx)\n\n\t\tNode.cache.mapElem.delete(kid.unId)\n\t\tNode.cache.dimMins.delete(kid.unId)\n\t\tNode.cache.mapDirs.delete(kid.unId)\n\t\tNode.cache.tabCnts.delete(kid.unId)\n\n\t\tif (kid.type === 'tabset') {\n\t\t\tNode.cache.mapElem.delete(kid.unId)\n\t\t}\n\n\t\tif (kid.type === 'tab') {\n\t\t\tNode.cache.mapElem.delete(kid.unId)\n\t\t}\n\n\t\tkid.host = null\n\t\tkid.next = null\n\t\tkid.prev = null\n\t}\n\n\tclearAllCache() {\n\t\tNode.cache.dimMins.clear()\n\t\tNode.cache.mapDirs.clear()\n\t\tNode.cache.tabCnts.clear()\n\t\tNode.cache.mapElem.clear()\n\n\t\tNode.cache.nodOpts.get().clear()\n\t\tNode.cache.bndOpts.get().clear()\n\t}\n}\n\nexport class Bond {\n\tdims: Dimension = { w: 0, h: 0, x: 0, y: 0 }\n\tunId: string = crypto.randomUUID()\n\tnext: Node | null = null\n\tprev: Node | null = null\n\thost: Node | null = null\n\n\tconstructor(\n\t\tparent: Node | null = null,\n\t\tnext: Node | null = null,\n\t\tprev: Node | null = null\n\t) {\n\t\tthis.host = parent\n\t\tthis.next = next\n\t\tthis.prev = prev\n\t\tif (this.next) this.next.prev = this\n\t\tif (this.prev) this.prev.next = this\n\t}\n\n\ttoJSON(): LayoutTree {\n\t\treturn {\n\t\t\tnodName: this.host?.name || '',\n\t\t\ttypNode: 'bond',\n\t\t\tuidNode: this.unId,\n\t\t\tnodPart: 0,\n\t\t\tnodOpen: '',\n\t\t\tnodKids: [],\n\t\t}\n\t}\n}\n\nexport { Layout as DynamixLayoutCore }\n","import { DynamixLayoutCore } from './app/dynamix'\n\n/**\n * Self-executing function to log a message to the console when the module is imported.\n * This provides information and a link back to the project for developers.\n */\ndeclare const __LICENSE__: string\n;(() => {\n\tif (typeof window === 'undefined') return\n\n\tconst titleStyle = `color: #03A9F4; font-weight: bold; line-height: 1.2;`\n\tconst textStyle = 'color: #E0E0E0; font-size: 12px;'\n\tconst linkStyle = 'color: #42a5f5; font-size: 12px;'\n\tconst licenseStyle = 'color: #9E9E9E; font-size: 10px;'\n\n\tconst asciiArt = `\n██████╗ ██╗ ██╗ ███╗ ██╗ █████╗ ███╗ ███╗ ██████╗ ██╗ ██╗\n██╔══██╗╚██╗ ██╔╝ ████╗ ██║ ██╔══██╗ ████╗ ████║ ╚═██╔═╝ ╚██╗██╔╝\n██║ ██║ ╚████╔╝ ██╔██╗ ██║ ███████║ ██╔████╔██║ ██║ ╚███╔╝ \n██║ ██║ ╚██╔╝ ██║╚██╗██║ ██╔══██║ ██║╚██╔╝██║ ██║ ██╔██╗ \n██████╔╝ ██║ ██║ ╚████║ ██║ ██║ ██║ ╚═╝ ██║ ██████╗ ██╔╝ ██╗\n╚═════╝ ╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝\n██╗ █████╗ ██╗ ██╗ ██████╗ ██╗ ██╗████████╗\n██║ ██╔══██╗ ╚██╗ ██╔╝ ██╔═══██╗ ██║ ██║╚══██╔══╝\n██║ ███████║ ╚████╔╝ ██║ ██║ ██║ ██║ ██║ \n██║ ██╔══██║ ╚██╔╝ ██║ ██║ ██║ ██║ ██║ \n███████╗ ██║ ██║ ██║ ╚██████╔╝ ╚█████╔╝ ██║ \n╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚════╝ ╚═╝ \n `\n\n\tconsole.groupCollapsed(\n\t\t`%cDYNAMIX LAYOUT (click to expand)`,\n\t\t'color: #03A9F4; font-weight: bold; font-size: 14px;'\n\t)\n\tconsole.log(`%c${asciiArt}`, titleStyle)\n\tconsole.log('%c A powerful, dynamic layout system 🚀', textStyle)\n\tconsole.log(\n\t\t'%c ⚡ For docs and more info, \\n ⚡ visit: https://github.com/akash-aman/dynamix-layout',\n\t\tlinkStyle\n\t)\n\tconsole.log(`%c${__LICENSE__}`, licenseStyle)\n\tconsole.groupEnd()\n\n\tif (typeof window !== 'undefined') {\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t;(window as any).__DYNAMIX_LAYOUT__ = {\n\t\t\t__LICENSE__: __LICENSE__,\n\t\t\t__LAYOUT__: DynamixLayoutCore,\n\t\t}\n\t}\n})()\n\nexport * from './app/index'\nexport type * from './type'\n"],"names":["Queue","initialCapacity","array","element","item","index","distanceFromHead","distanceFromTail","items","i","insertLength","queue","queueSize","queueItems","actualIndex","removedItem","backIndex","result","newCapacity","newBuffer","oldIndex","insertIndex","fromIndex","toIndex","actualInsertIndex","removeIndex","createReactiveState","initialValue","comparator","a","b","value","listeners","pendingResolvers","get","set","newValue","flag","cb","resolve","triggerChange","onChange","listener","nextChange","active","val","areNodeOptionsMapEqual","mapA","mapB","key","valA","valB","areNodeOptionsEqual","dimA","dimB","Node","options","defaults","parent","prev","bond","Bond","minDims","tabCnts","reqW","Layout","reqH","nodeDir","totalWeight","totlMinSize","curntOffset","kid","extraSpace","unallocate","kidDims","childShareRatio","extraChildSpace","children","child","config","tabsQueue","root","current","parentDir","JSONIterator","nodeIterator","jsonNode","nodeNode","jsonValue","nodeValue","json","host","direction","node","nodeQueue","dir","leftName","rghtName","left","rght","leftKid","rghtKid","newNode","clear","dimMins","hostCnt","hostDim","kidCnt","kidDim","reqDims","wasAdjusted","adjustedW","adjustedH","supress","nodeOpts","bondOpts","tabsIds","nodeOption","KidNode","bondOption","dim","disableTimeout","timeout","id","bnd","next","prevMinDim","nextMinDim","half","endX","minX","maxX","clampedX","prevExtraSpace","nextExtraSpace","totalExtraSpace","totalPart","endY","minY","maxY","clampedY","src","des","layout","srcNode","desNode","desHst","desIdx","insertFlg","insertIdx","desNxt","desPre","nxtBnd","prvBnd","kidFst","kidLst","destDir","tabset","desHost","kidhead","kidTail","hostDir","bndNxt","bndPre","kids","row","rowA","rowB","desDir","srcHost","gndHost","srcHostIndex","hostPrev","hostNext","fstKid","lstKid","insrtIndex","fix","papa","dada","idx","nextNode","prevNode","nextBond","prevBond","titleStyle","textStyle","linkStyle","licenseStyle","asciiArt","DynamixLayoutCore"],"mappings":"4HAAA,MAAMA,CAAS,CACN,OACA,KAAe,EACf,KAAe,EACf,MAAgB,EAChB,SAER,YAAYC,EAA0B,GAAIC,EAAa,CAAA,EAAI,CAC1D,KAAK,SAAW,KAAK,IAAID,EAAiBC,EAAM,MAAM,EACtD,KAAK,OAAS,IAAI,MAAM,KAAK,QAAQ,EAErCA,EAAM,QAASC,GAAY,CAC1B,KAAK,QAAQA,CAAO,CACrB,CAAC,CACF,CAKA,QAAQC,EAAe,CAClB,KAAK,QAAU,KAAK,UACvB,KAAK,OAAA,EAGN,KAAK,OAAO,KAAK,IAAI,EAAIA,EACzB,KAAK,MAAQ,KAAK,KAAO,GAAK,KAAK,SACnC,KAAK,OACN,CAGA,aAAaA,EAAe,CACvB,KAAK,QAAU,KAAK,UACvB,KAAK,OAAA,EAGN,KAAK,MAAQ,KAAK,KAAO,EAAI,KAAK,UAAY,KAAK,SACnD,KAAK,OAAO,KAAK,IAAI,EAAIA,EACzB,KAAK,OACN,CAGA,OAAOC,EAAeD,EAAkB,CAEvC,GAAIC,EAAQ,GAAKA,EAAQ,KAAK,MAC7B,MAAO,GAIR,GAAIA,IAAU,EACb,YAAK,aAAaD,CAAI,EACf,GAER,GAAIC,IAAU,KAAK,MAClB,YAAK,QAAQD,CAAI,EACV,GAIJ,KAAK,QAAU,KAAK,UACvB,KAAK,OAAA,EAIN,MAAME,EAAmBD,EACnBE,EAAmB,KAAK,MAAQF,EAEtC,OAAIC,GAAoBC,EAEvB,KAAK,UAAUF,EAAOD,CAAI,EAG1B,KAAK,WAAWC,EAAOD,CAAI,EAG5B,KAAK,QACE,EACR,CAGA,YAAYC,EAAeG,EAAqB,CAE/C,GAAIH,EAAQ,GAAKA,EAAQ,KAAK,MAC7B,MAAO,GAIR,GAAIG,EAAM,SAAW,EACpB,MAAO,GAIR,GAAIH,IAAU,EAAG,CAEhB,QAASI,EAAID,EAAM,OAAS,EAAGC,GAAK,EAAGA,IACtC,KAAK,aAAaD,EAAMC,CAAC,CAAC,EAE3B,MAAO,EACR,CACA,GAAIJ,IAAU,KAAK,MAElB,OAAAG,EAAM,QAASJ,GAAS,KAAK,QAAQA,CAAI,CAAC,EACnC,GAIR,KAAO,KAAK,MAAQI,EAAM,OAAS,KAAK,UACvC,KAAK,OAAA,EAIN,MAAMF,EAAmBD,EACnBE,EAAmB,KAAK,MAAQF,EAChCK,EAAeF,EAAM,OAE3B,OAAIF,GAAoBC,EAEvB,KAAK,eAAeF,EAAOG,CAAK,EAGhC,KAAK,gBAAgBH,EAAOG,CAAK,EAGlC,KAAK,OAASE,EACP,EACR,CAGA,YAAYL,EAAeM,EAA0B,CAEpD,GAAIN,EAAQ,GAAKA,EAAQ,KAAK,MAC7B,MAAO,GAIR,GAAIM,EAAM,UACT,MAAO,GAGR,MAAMC,EAAYD,EAAM,KAAA,EAGxB,GAAIN,IAAU,EAAG,CAGhB,MAAMG,EAAQG,EAAM,QAAA,EACpB,QAASF,EAAID,EAAM,OAAS,EAAGC,GAAK,EAAGA,IACtC,KAAK,aAAaD,EAAMC,CAAC,CAAC,EAE3B,MAAO,EACR,CACA,GAAIJ,IAAU,KAAK,MAAO,CAEzB,UAAWD,KAAQO,EAClB,KAAK,QAAQP,CAAI,EAElB,MAAO,EACR,CAGA,KAAO,KAAK,MAAQQ,EAAY,KAAK,UACpC,KAAK,OAAA,EAIN,MAAMC,EAAaF,EAAM,QAAA,EAGnBL,EAAmBD,EACnBE,EAAmB,KAAK,MAAQF,EAEtC,OAAIC,GAAoBC,EAEvB,KAAK,eAAeF,EAAOQ,CAAU,EAGrC,KAAK,gBAAgBR,EAAOQ,CAAU,EAGvC,KAAK,OAASD,EACP,EACR,CAGA,KAAKR,EAAe,CACnB,KAAK,QAAQA,CAAI,CAClB,CAGA,QAAQA,EAAe,CACtB,KAAK,aAAaA,CAAI,CACvB,CAKA,SAAyB,CACxB,GAAI,KAAK,QAAU,EAClB,OAGD,MAAMA,EAAO,KAAK,OAAO,KAAK,IAAI,EAElC,YAAK,MAAQ,KAAK,KAAO,GAAK,KAAK,SACnC,KAAK,QAEEA,CACR,CAGA,aAA6B,CAC5B,GAAI,KAAK,QAAU,EAClB,OAGD,KAAK,MAAQ,KAAK,KAAO,EAAI,KAAK,UAAY,KAAK,SACnD,MAAMA,EAAO,KAAK,OAAO,KAAK,IAAI,EAElC,YAAK,QAEEA,CACR,CAEA,QAAQA,EAAiB,CACxB,QAASK,EAAI,EAAGA,EAAI,KAAK,MAAOA,IAAK,CACpC,MAAMK,GAAe,KAAK,KAAOL,GAAK,KAAK,SAC3C,GAAI,KAAK,OAAOK,CAAW,IAAMV,EAChC,OAAOK,CAET,CACA,MAAO,EACR,CAEA,OAAOL,EAAkB,CACxB,MAAMC,EAAQ,KAAK,QAAQD,CAAI,EAC/B,OAAIC,IAAU,GAAW,IACzB,KAAK,SAASA,CAAK,EACZ,GACR,CAGA,SAASA,EAA8B,CAEtC,GAAIA,EAAQ,GAAKA,GAAS,KAAK,MAC9B,OAID,GAAIA,IAAU,EACb,OAAO,KAAK,QAAA,EAEb,GAAIA,IAAU,KAAK,MAAQ,EAC1B,OAAO,KAAK,YAAA,EAIb,MAAMS,GAAe,KAAK,KAAOT,GAAS,KAAK,SACzCU,EAAc,KAAK,OAAOD,CAAW,EAGrCR,EAAmBD,EACnBE,EAAmB,KAAK,MAAQF,EAAQ,EAE9C,OAAIC,GAAoBC,EAEvB,KAAK,qBAAqBF,CAAK,EAG/B,KAAK,oBAAoBA,CAAK,EAG/B,KAAK,QACEU,CACR,CAGA,OAAuB,CACtB,OAAO,KAAK,QAAA,CACb,CAGA,KAAqB,CACpB,OAAO,KAAK,YAAA,CACb,CAKA,QAAQX,EAAe,CACtB,KAAK,QAAQA,CAAI,CAClB,CAEA,YAA4B,CAC3B,OAAO,KAAK,QAAA,CACb,CAGA,QAAQA,EAAe,CACtB,KAAK,QAAQA,CAAI,CAClB,CAEA,YAA4B,CAC3B,OAAO,KAAK,YAAA,CACb,CAGA,QAAQA,EAAe,CACtB,KAAK,aAAaA,CAAI,CACvB,CAEA,YAA4B,CAC3B,OAAO,KAAK,QAAA,CACb,CAGA,QAAQA,EAAe,CACtB,KAAK,aAAaA,CAAI,CACvB,CAEA,YAA4B,CAC3B,OAAO,KAAK,YAAA,CACb,CAKA,IAAIC,EAA8B,CACjC,GAAIA,EAAQ,GAAKA,GAAS,KAAK,MAC9B,OAGD,MAAMS,GAAe,KAAK,KAAOT,GAAS,KAAK,SAC/C,OAAO,KAAK,OAAOS,CAAW,CAC/B,CAGA,IAAIT,EAAeD,EAAkB,CACpC,GAAIC,EAAQ,GAAKA,GAAS,KAAK,MAC9B,MAAO,GAGR,MAAMS,GAAe,KAAK,KAAOT,GAAS,KAAK,SAC/C,YAAK,OAAOS,CAAW,EAAIV,EACpB,EACR,CAGA,MAAsB,CACrB,OAAO,KAAK,MAAQ,EAAI,KAAK,OAAO,KAAK,IAAI,EAAI,MAClD,CAGA,UAA0B,CACzB,GAAI,KAAK,QAAU,EAAG,OACtB,MAAMY,GAAa,KAAK,KAAO,EAAI,KAAK,UAAY,KAAK,SACzD,OAAO,KAAK,OAAOA,CAAS,CAC7B,CAGA,OAAuB,CACtB,OAAO,KAAK,KAAA,CACb,CAGA,MAAsB,CACrB,OAAO,KAAK,SAAA,CACb,CAKA,MAAe,CACd,OAAO,KAAK,KACb,CAGA,aAAsB,CACrB,OAAO,KAAK,QACb,CAGA,SAAmB,CAClB,OAAO,KAAK,QAAU,CACvB,CAGA,QAAkB,CACjB,OAAO,KAAK,QAAU,KAAK,QAC5B,CAGA,OAAc,CAEb,KAAK,KAAO,EACZ,KAAK,KAAO,EACZ,KAAK,MAAQ,CACd,CAGA,SAAe,CACd,MAAMC,EAAc,CAAA,EACpB,QAASR,EAAI,EAAGA,EAAI,KAAK,MAAOA,IAAK,CACpC,MAAMK,GAAe,KAAK,KAAOL,GAAK,KAAK,SAC3CQ,EAAO,KAAK,KAAK,OAAOH,CAAW,CAAM,CAC1C,CACA,OAAOG,CACR,CAGA,EAAE,OAAO,QAAQ,GAAyB,CACzC,QAASR,EAAI,EAAGA,EAAI,KAAK,MAAOA,IAAK,CACpC,MAAMK,GAAe,KAAK,KAAOL,GAAK,KAAK,SAC3C,MAAM,KAAK,OAAOK,CAAW,CAC9B,CACD,CAGA,CAAC,SAA+B,CAC/B,QAASL,EAAI,EAAGA,EAAI,KAAK,MAAOA,IAAK,CACpC,MAAMK,GAAe,KAAK,KAAOL,GAAK,KAAK,SAC3C,MAAM,KAAK,OAAOK,CAAW,CAC9B,CACD,CAGA,CAAC,SAA+B,CAC/B,QAASL,EAAI,KAAK,MAAQ,EAAGA,GAAK,EAAGA,IAAK,CACzC,MAAMK,GAAe,KAAK,KAAOL,GAAK,KAAK,SAC3C,MAAM,KAAK,OAAOK,CAAW,CAC9B,CACD,CAGA,CAAC,SAAyC,CACzC,QAASL,EAAI,EAAGA,EAAI,KAAK,MAAOA,IAAK,CACpC,MAAMK,GAAe,KAAK,KAAOL,GAAK,KAAK,SAC3C,KAAM,CAACA,EAAG,KAAK,OAAOK,CAAW,CAAM,CACxC,CACD,CAGA,CAAC,MAAiC,CACjC,QAASL,EAAI,EAAGA,EAAI,KAAK,MAAOA,IAC/B,MAAMA,CAER,CAGA,CAAC,QAA8B,CAC9B,QAASA,EAAI,EAAGA,EAAI,KAAK,MAAOA,IAAK,CACpC,MAAMK,GAAe,KAAK,KAAOL,GAAK,KAAK,SAC3C,MAAM,KAAK,OAAOK,CAAW,CAC9B,CACD,CAGA,UAAmB,CAClB,MAAO,SAAS,KAAK,QAAA,EAAU,KAAK,IAAI,CAAC,GAC1C,CAKQ,QAAe,CACtB,MAAMI,EAAc,KAAK,SAAW,EAC9BC,EAAY,IAAI,MAAMD,CAAW,EAGvC,QAAS,EAAI,EAAG,EAAI,KAAK,MAAO,IAAK,CACpC,MAAME,GAAY,KAAK,KAAO,GAAK,KAAK,SACxCD,EAAU,CAAC,EAAI,KAAK,OAAOC,CAAQ,CACpC,CAEA,KAAK,OAASD,EACd,KAAK,SAAWD,EAChB,KAAK,KAAO,EACZ,KAAK,KAAO,KAAK,KAClB,CAGQ,UAAUG,EAAqBjB,EAAe,CAErD,KAAK,MAAQ,KAAK,KAAO,EAAI,KAAK,UAAY,KAAK,SAGnD,QAASK,EAAI,EAAGA,EAAIY,EAAaZ,IAAK,CACrC,MAAMa,GAAa,KAAK,KAAO,EAAIb,GAAK,KAAK,SACvCc,GAAW,KAAK,KAAOd,GAAK,KAAK,SACvC,KAAK,OAAOc,CAAO,EAAI,KAAK,OAAOD,CAAS,CAC7C,CAGA,MAAME,GAAqB,KAAK,KAAOH,GAAe,KAAK,SAC3D,KAAK,OAAOG,CAAiB,EAAIpB,CAClC,CAGQ,WAAWiB,EAAqBjB,EAAe,CAEtD,QAASK,EAAI,KAAK,MAAQ,EAAGA,GAAKY,EAAaZ,IAAK,CACnD,MAAMa,GAAa,KAAK,KAAOb,GAAK,KAAK,SACnCc,GAAW,KAAK,KAAOd,EAAI,GAAK,KAAK,SAC3C,KAAK,OAAOc,CAAO,EAAI,KAAK,OAAOD,CAAS,CAC7C,CAGA,MAAME,GAAqB,KAAK,KAAOH,GAAe,KAAK,SAC3D,KAAK,OAAOG,CAAiB,EAAIpB,EAGjC,KAAK,MAAQ,KAAK,KAAO,GAAK,KAAK,QACpC,CAGQ,qBAAqBqB,EAA2B,CAEvD,QAAShB,EAAIgB,EAAahB,EAAI,EAAGA,IAAK,CACrC,MAAMa,GAAa,KAAK,KAAOb,EAAI,GAAK,KAAK,SACvCc,GAAW,KAAK,KAAOd,GAAK,KAAK,SACvC,KAAK,OAAOc,CAAO,EAAI,KAAK,OAAOD,CAAS,CAC7C,CAGA,KAAK,MAAQ,KAAK,KAAO,GAAK,KAAK,QACpC,CAGQ,oBAAoBG,EAA2B,CAEtD,QAAShB,EAAIgB,EAAahB,EAAI,KAAK,MAAQ,EAAGA,IAAK,CAClD,MAAMa,GAAa,KAAK,KAAOb,EAAI,GAAK,KAAK,SACvCc,GAAW,KAAK,KAAOd,GAAK,KAAK,SACvC,KAAK,OAAOc,CAAO,EAAI,KAAK,OAAOD,CAAS,CAC7C,CAGA,KAAK,MAAQ,KAAK,KAAO,EAAI,KAAK,UAAY,KAAK,QACpD,CAGQ,eAAeD,EAAqBb,EAAkB,CAC7D,MAAME,EAAeF,EAAM,OAG3B,KAAK,MAAQ,KAAK,KAAOE,EAAe,KAAK,UAAY,KAAK,SAG9D,QAASD,EAAI,EAAGA,EAAIY,EAAaZ,IAAK,CACrC,MAAMa,GAAa,KAAK,KAAOZ,EAAeD,GAAK,KAAK,SAClDc,GAAW,KAAK,KAAOd,GAAK,KAAK,SACvC,KAAK,OAAOc,CAAO,EAAI,KAAK,OAAOD,CAAS,CAC7C,CAGA,QAASb,EAAI,EAAGA,EAAIC,EAAcD,IAAK,CACtC,MAAMe,GACJ,KAAK,KAAOH,EAAcZ,GAAK,KAAK,SACtC,KAAK,OAAOe,CAAiB,EAAIhB,EAAMC,CAAC,CACzC,CACD,CAGQ,gBAAgBY,EAAqBb,EAAkB,CAC9D,MAAME,EAAeF,EAAM,OAG3B,QAASC,EAAI,KAAK,MAAQ,EAAGA,GAAKY,EAAaZ,IAAK,CACnD,MAAMa,GAAa,KAAK,KAAOb,GAAK,KAAK,SACnCc,GAAW,KAAK,KAAOd,EAAIC,GAAgB,KAAK,SACtD,KAAK,OAAOa,CAAO,EAAI,KAAK,OAAOD,CAAS,CAC7C,CAGA,QAASb,EAAI,EAAGA,EAAIC,EAAcD,IAAK,CACtC,MAAMe,GACJ,KAAK,KAAOH,EAAcZ,GAAK,KAAK,SACtC,KAAK,OAAOe,CAAiB,EAAIhB,EAAMC,CAAC,CACzC,CAGA,KAAK,MAAQ,KAAK,KAAOC,GAAgB,KAAK,QAC/C,CACD,CCnkBA,SAASgB,EACRC,EACAC,EAAsC,CAACC,EAAGC,IAAMD,IAAMC,EACnC,CACnB,IAAIC,EAAQJ,EACZ,MAAMK,MAAgB,IACtB,IAAIC,EAA4C,CAAA,EAEhD,MAAMC,EAAM,IAASH,EAEfI,EAAM,CAACC,EAAaC,EAAgB,KAAgB,CACzD,GAAIA,EAAM,CACTN,EAAQK,EACR,MACD,CAEKR,EAAWG,EAAOK,CAAQ,IAC9BL,EAAQK,EAERJ,EAAU,QAASM,GAAOA,EAAGP,CAAK,CAAC,EACnCE,EAAiB,QAASM,GAAYA,EAAQR,CAAK,CAAC,EACpDE,EAAmB,CAAA,EAErB,EAEMO,EAAgB,IAAY,CACjCR,EAAU,QAASM,GAAOA,EAAGP,CAAK,CAAC,EACnCE,EAAiB,QAASM,GAAYA,EAAQR,CAAK,CAAC,EACpDE,EAAmB,CAAA,CACpB,EAEMQ,EAAYC,IACjBV,EAAU,IAAIU,CAAQ,EACf,IAAMV,EAAU,OAAOU,CAAQ,GAGjCC,EAAa,IACX,IAAI,QAAYJ,GAAY,CAClCN,EAAiB,KAAKM,CAAO,CAC9B,CAAC,EAqBF,MAAO,CACN,IAAAL,EACA,IAAAC,EAEA,SAAAM,EACA,WAAAE,EACA,cAAAH,EACA,gBAzBwBE,GAA8C,CACtE,IAAIE,EAAS,GAUb,OARa,SAAY,CACxB,KAAOA,GAAQ,CACd,MAAMC,EAAM,MAAMF,EAAA,EAClB,GAAI,CAACC,EAAQ,MACbF,EAASG,CAAG,CACb,CACD,GAEA,EAEO,IAAM,CACZD,EAAS,EACV,CACD,CASC,CAEF,CCrEO,SAASE,EACfC,EACAC,EACU,CACV,GAAID,EAAK,OAASC,EAAK,KAAM,MAAO,GAEpC,SAAW,CAACC,EAAKC,CAAI,IAAKH,EAAK,UAAW,CACzC,MAAMI,EAAOH,EAAK,IAAIC,CAAG,EAGzB,GAFI,CAACE,GAED,CAACC,EAAoBF,EAAMC,CAAI,EAClC,MAAO,EAET,CAEA,MAAO,EACR,CAEO,SAASC,EAAoBvB,EAAgBC,EAAyB,CAI5E,GAHID,EAAE,UAAYC,EAAE,SAChBD,EAAE,UAAYC,EAAE,SAChBD,EAAE,UAAYC,EAAE,SAChBD,EAAE,UAAYC,EAAE,QAAS,MAAO,GAEpC,MAAMuB,EAAOxB,EAAE,QACTyB,EAAOxB,EAAE,QAEf,OACCuB,EAAK,IAAMC,EAAK,GAChBD,EAAK,IAAMC,EAAK,GAChBD,EAAK,IAAMC,EAAK,GAChBD,EAAK,IAAMC,EAAK,CAElB,CCtBO,MAAMC,CAAK,CACjB,OAAO,MAAmB,CACzB,YAAa,IACb,YAAa,IACb,YAAa,IACb,YAAa,IACb,QAAS7B,MACJ,IACJoB,CAAA,EAED,QAASpB,MACJ,IACJoB,CAAA,EAED,QAASpB,MACJ,IACJoB,CAAA,CACD,EAGD,KAAoB,IAAI9C,EACxB,KAAkB,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EACzC,KACA,KAAoB,KACpB,KAAoB,KACpB,KAA0C,MAC1C,KAAe,GACf,KAAe,EACf,KAAoB,KACpB,KAAe,GAEf,YACCwD,EAQI,GACH,CACD,MAAMC,EAAW,CAChB,KAAM,MACN,KAAM,KACN,KAAM,GACN,KAAM,IACN,KAAM,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC7B,KAAM,OAAO,WAAA,EACb,KAAM,EAAA,EAGP,KAAK,KAAOD,EAAQ,MAAQC,EAAS,KACrC,KAAK,KAAOD,EAAQ,MAAQC,EAAS,KACrC,KAAK,KAAOD,EAAQ,MAAQC,EAAS,KACrC,KAAK,KAAOD,EAAQ,MAAQC,EAAS,KACrC,KAAK,KAAOD,EAAQ,MAAQC,EAAS,KACrC,KAAK,KAAOD,EAAQ,MAAQC,EAAS,KAErC,KAAK,KAAOD,EAAQ,MAAQC,EAAS,IACtC,CAEA,QAAQC,EAAqBC,EAAoB,KAAM,CACtD,GAAI,CAACA,EAAM,OAEX,MAAMC,EAAO,IAAIC,EAAKH,EAAQ,KAAMC,CAAI,EACxCJ,EAAK,MAAM,QAAQ,IAAIK,EAAK,KAAMA,CAAI,CACvC,CAEA,iBAAqD,CACpD,MAAME,EAAUP,EAAK,MAAM,QAAQ,IAAI,KAAK,IAAI,EAC1CQ,EAAUR,EAAK,MAAM,QAAQ,IAAI,KAAK,IAAI,EAE1CS,EAAO,KAAK,IACjBF,EAAS,SACTC,EAAS,WAAaE,EAAO,MAC5B,KAAK,IAAI,EAAGF,EAAS,WAAa,CAAC,EAAIE,EAAO,KAAA,EAG1CC,EAAO,KAAK,IACjBJ,EAAS,UACTC,EAAS,SAAWE,EAAO,MAC1B,KAAK,IAAI,EAAGF,EAAS,SAAW,CAAC,EAAIE,EAAO,KAAA,EAG9C,MAAO,CACN,MAAOD,EACP,OAAQE,CAAA,CAEV,CAEA,gBAAiB,CAChB,MAAMC,EAAUZ,EAAK,MAAM,QAAQ,IAAI,KAAK,IAAI,EAEhD,GAAI,CAAC,KAAK,KAAM,OAEhB,IAAIa,EAAc,EAClB,MAAMC,EAAcd,EAAK,MAAM,QAAQ,IAAI,KAAK,IAAI,GAAK,CACxD,SAAU,EACV,UAAW,CAAA,EAEZ,IAAIe,EAAc,EAElB,UAAWC,KAAO,KAAK,KACtBH,GAAeG,EAAI,KAGpB,GAAIH,IAAgB,EAAG,OAEvB,IAAII,EACAL,EACHK,EAAa,KAAK,KAAK,EAAIH,EAAY,SAEvCG,EAAa,KAAK,KAAK,EAAIH,EAAY,UAGxC,IAAII,EAAaD,EAEjB,UAAWD,KAAO,KAAK,KAAM,CAC5B,MAAMG,EAAUnB,EAAK,MAAM,QAAQ,IAAIgB,EAAI,IAAI,GAAK,CACnD,SAAU,EACV,UAAW,CAAA,EAGZ,GAAI,KAAK,KAAK,EAAIF,EAAY,SACzBF,GACHI,EAAI,KAAK,EAAIG,EAAQ,SACrBH,EAAI,KAAK,EAAI,KAAK,KAAK,EACvBA,EAAI,KAAK,EAAI,KAAK,KAAK,EAAID,EAC3BC,EAAI,KAAK,EAAI,KAAK,KAAK,EACvBD,GAAeC,EAAI,KAAK,EAAIN,EAAO,QAEnCM,EAAI,KAAK,EAAIG,EAAQ,UACrBH,EAAI,KAAK,EAAI,KAAK,KAAK,EACvBA,EAAI,KAAK,EAAI,KAAK,KAAK,EAAID,EAC3BC,EAAI,KAAK,EAAI,KAAK,KAAK,EACvBD,GAAeC,EAAI,KAAK,EAAIN,EAAO,WAE9B,CACN,MAAMU,EAAkBJ,EAAI,KAAOH,EAC7BQ,EAAkB,KAAK,MAAMJ,EAAaG,CAAe,EAE/D,GAAIJ,IAAQ,KAAK,KAAK,SAAA,EAAY,CAC7BJ,GACHI,EAAI,KAAK,EAAIG,EAAQ,SAAWD,EAChCF,EAAI,KAAK,EAAI,KAAK,KAAK,EACvBA,EAAI,KAAK,EAAI,KAAK,KAAK,EAAID,EAC3BC,EAAI,KAAK,EAAI,KAAK,KAAK,EACvBD,GAAeC,EAAI,KAAK,EAAIN,EAAO,QAEnCM,EAAI,KAAK,EAAIG,EAAQ,UAAYD,EACjCF,EAAI,KAAK,EAAI,KAAK,KAAK,EACvBA,EAAI,KAAK,EAAI,KAAK,KAAK,EAAID,EAC3BC,EAAI,KAAK,EAAI,KAAK,KAAK,EACvBD,GAAeC,EAAI,KAAK,EAAIN,EAAO,OAGpC,KACD,CAEIE,GACHI,EAAI,KAAK,EAAIG,EAAQ,SAAWE,EAChCL,EAAI,KAAK,EAAI,KAAK,KAAK,EACvBA,EAAI,KAAK,EAAI,KAAK,KAAK,EAAID,EAC3BC,EAAI,KAAK,EAAI,KAAK,KAAK,EACvBD,GAAeC,EAAI,KAAK,EAAIN,EAAO,QAEnCM,EAAI,KAAK,EAAIG,EAAQ,UAAYE,EACjCL,EAAI,KAAK,EAAI,KAAK,KAAK,EACvBA,EAAI,KAAK,EAAI,KAAK,KAAK,EAAID,EAC3BC,EAAI,KAAK,EAAI,KAAK,KAAK,EACvBD,GAAeC,EAAI,KAAK,EAAIN,EAAO,OAGpCQ,GAAcG,CACf,CAEIL,EAAI,OACHJ,EACHI,EAAI,KAAM,KAAO,CAChB,EAAGN,EAAO,MACV,EAAGM,EAAI,KAAK,EACZ,EAAGA,EAAI,KAAK,EAAIA,EAAI,KAAK,EACzB,EAAGA,EAAI,KAAK,CAAA,EAGbA,EAAI,KAAM,KAAO,CAChB,EAAGA,EAAI,KAAK,EACZ,EAAGN,EAAO,MACV,EAAGM,EAAI,KAAK,EACZ,EAAGA,EAAI,KAAK,EAAIA,EAAI,KAAK,CAAA,EAI7B,CACD,CAEA,QAAqB,CACpB,MAAMM,EAAyB,CAAA,EAE/B,UAAWC,KAAS,KAAK,KACxBD,EAAS,KAAKC,EAAM,QAAQ,EAG7B,MAAM7D,EAAqB,CAC1B,QAAS,KAAK,KACd,QAAS,KAAK,KACd,QAAS,KAAK,KACd,QAAS,KAAK,IAAA,EAGf,OAAI,KAAK,OACRA,EAAO,QAAU,KAAK,MAGnB4D,EAAS,OAAS,IACrB5D,EAAO,QAAU4D,GAGX5D,CACR,CACD,CAEA,MAAMgD,CAAO,CACZ,OAAO,MACP,OAAO,MACP,OAAO,MAAgB,GACvB,OAAO,MAAgB,GACvB,OAAO,MAAgB,GACvB,OAAO,MAAuB,KAE9B,QACA,QAAgD,KAChD,YAAuB,IACvB,YACCT,EAQI,GACH,CACD,MAAMuB,EAAS,CACd,KAAM,CAAA,EACN,KAAM,KACN,KAAM,GACN,KAAM,GACN,KAAM,GACN,KAAM,sBACN,YAAa,IACb,GAAGvB,CAAA,EAGJ,KAAK,QAAUuB,EAAO,QAElBA,EAAO,OAAMd,EAAO,MAAQc,EAAO,MAEvCd,EAAO,MAAQ,IAAIV,EAAK,CACvB,KAAMwB,EAAO,KACb,KAAMA,EAAO,KACb,KAAM,KAAA,CACN,EAED,KAAK,QAAUrD,MACV,IACJoB,CAAA,EAGDmB,EAAO,MAAQc,EAAO,KACtBd,EAAO,MAAQc,EAAO,KACtBd,EAAO,MAAQc,EAAO,KAEtB,MAAMC,EAAY,IAAIhF,EAAc+E,EAAO,KAAK,OAAQA,EAAO,IAAI,EAC/Dd,EAAO,MAAO,KAAK,iBAAA,EAClB,KAAK,8BAA8Be,CAAS,EAEjDf,EAAO,MAAQ,IAChB,CAEA,CAAC,mBAAmBgB,EAAgD,CACnE,MAAMtE,EAAQ,IAAIX,EAGlB,IAFAW,EAAM,QAAQsE,CAAI,EAEX,CAACtE,EAAM,WAAW,CACxB,MAAMuE,EAAUvE,EAAM,QAAA,EACtB,GAAKuE,IAEL,MAAMA,EAEFA,EAAQ,SAAWA,EAAQ,QAAQ,OAAS,GAC/C,UAAWJ,KAASI,EAAQ,QAC3BvE,EAAM,QAAQmE,CAAK,CAGtB,CACD,CAEA,CAAC,mBAAmBG,EAAoC,CACvD,MAAMtE,EAAQ,IAAIX,EAGlB,IAFAW,EAAM,QAAQsE,CAAI,EAEX,CAACtE,EAAM,WAAW,CACxB,MAAMuE,EAAUvE,EAAM,QAAA,EACtB,GAAKuE,IAEL3B,EAAK,MAAM,QAAQ,IAAI2B,EAAQ,KAAMA,CAAO,EAE5C,MAAMA,EAEFA,EAAQ,KAAK,KAAA,EAAS,GACzB,UAAWJ,KAASI,EAAQ,KAC3BvE,EAAM,QAAQmE,CAAK,CAGtB,CACD,CAEA,CAAC,4BAA4BG,EAAoC,CAChE,UAAWH,KAASG,EAAK,KACxB,MAAO,KAAK,4BAA4BH,CAAK,EAG9C,MAAMG,CACP,CAEA,sBAAsBvB,EAAc,CACnC,MAAMyB,EAAY5B,EAAK,MAAM,QAAQ,IAAIG,EAAO,IAAI,EACpD,GAAIyB,IAAc,OAAW,CAC5B,QAAQ,KACP,2CAA2CzB,EAAO,IAAI,iCAAA,EAEvD,MACD,CACA,UAAWoB,KAASpB,EAAO,KAC1BH,EAAK,MAAM,QAAQ,IAAIuB,EAAM,KAAM,CAACK,CAAS,EACzCL,EAAM,KAAK,KAAA,EAAS,IACvBA,EAAM,KAAOpB,EACb,KAAK,sBAAsBoB,CAAK,EAE5BA,EAAM,MACTvB,EAAK,MAAM,QAAQ,IAAIuB,EAAM,KAAK,KAAM,CAACK,CAAS,EAItD,CAEA,iBAAiBF,EAAmBhB,EAAO,MAAO,CACjD,MAAMmB,EAAe,KAAK,mBAAmBH,CAAI,EAC3CI,EAAe,KAAK,mBAAmBpB,EAAO,KAAK,EAIzD,IAFAV,EAAK,MAAM,QAAQ,IAAIU,EAAO,MAAM,KAAM,EAAI,IAEjC,CACZ,MAAMqB,EAAWF,EAAa,KAAA,EACxBG,EAAWF,EAAa,KAAA,EAE9B,GAAIC,EAAS,MAAQC,EAAS,KAC7B,MAGD,MAAMC,EAAYF,EAAS,MACrBG,EAAYF,EAAS,MAEvB,CAACC,GAAa,CAACC,GAInB,KAAK,2BAA2BD,EAAWC,CAAS,CACrD,CAEA,KAAK,yBAAA,CACN,CAEA,2BAA2BC,EAAkBC,EAAY,CACxD,MAAMC,EAAYrC,EAAK,MAAM,QAAQ,IAAIoC,EAAK,IAAI,EAElD,UAAWb,KAASY,EAAK,SAAW,CAAA,EAAI,CACvC,MAAMG,EAAO,KAAK,mBAAmBf,CAAK,EACpCnB,EAAOgC,EAAK,KAAK,SAAA,EACvBE,EAAK,KAAOF,EACZE,EAAK,QAAQA,EAAK,KAAMlC,CAAI,EAC5BgC,EAAK,KAAK,QAAQE,CAAI,EAEtBtC,EAAK,MAAM,QAAQ,IAAIsC,EAAK,KAAM,CAACD,CAAU,CAC9C,CAEID,EAAK,OAAS,UAAUpC,EAAK,MAAM,QAAQ,IAAIoC,EAAK,KAAMA,CAAI,EAC9DA,EAAK,OAAS,OAAOpC,EAAK,MAAM,QAAQ,IAAIoC,EAAK,KAAMA,CAAI,CAChE,CAGA,8BACChF,EACAgF,EAAa1B,EAAO,MACnB,CACD,MAAM6B,EAAY,IAAI9F,EAKtB,IAJA8F,EAAU,QAAQH,CAAI,EAEtBpC,EAAK,MAAM,QAAQ,IAAIU,EAAO,MAAM,KAAM,EAAI,EAEvC,CAACtD,EAAM,WAAW,CACxB,MAAMgF,EAAOG,EAAU,QAAA,EACvB,GAAI,CAACH,EACJ,MAED,MAAMI,EAAMxC,EAAK,MAAM,QAAQ,IAAIoC,EAAK,IAAI,EAE5C,GAAIhF,EAAM,KAAA,GAAU,EAAG,CACtB,MAAMqF,EAAWrF,EAAM,QAAA,EACjBsF,EAAWtF,EAAM,QAAA,EACjBuF,EAAO,IAAI3C,EAAK,CAAE,KAAM,SAAU,KAAAoC,EAAM,EACxCQ,EAAO,IAAI5C,EAAK,CAAE,KAAM,SAAU,KAAAoC,EAAM,EAExCS,EAAU,IAAI7C,EAAK,CACxB,KAAM,MACN,KAAM2C,EACN,KAAMF,EACN,KACC,KAAK,QAAQ,IAAIA,GAAY,EAAE,GAAK,OAAO,WAAA,CAAW,CACvD,EACKK,EAAU,IAAI9C,EAAK,CACxB,KAAM,MACN,KAAM4C,EACN,KAAMF,EACN,KACC,KAAK,QAAQ,IAAIA,GAAY,EAAE,GAAK,OAAO,WAAA,CAAW,CACvD,EACDC,EAAK,KAAOE,EAAQ,KACpBD,EAAK,KAAOE,EAAQ,KACpBH,EAAK,KAAK,QAAQE,CAAO,EACzBD,EAAK,KAAK,QAAQE,CAAO,EACzBV,EAAK,KAAK,QAAQO,CAAI,EACtBP,EAAK,KAAK,QAAQQ,CAAI,EAEtBA,EAAK,QAAQR,EAAMO,CAAI,EAEvB3C,EAAK,MAAM,QAAQ,IAAI2C,EAAK,KAAM,CAACH,CAAI,EACvCxC,EAAK,MAAM,QAAQ,IAAI4C,EAAK,KAAM,CAACJ,CAAI,EACvCxC,EAAK,MAAM,QAAQ,IAAI2C,EAAK,KAAMA,CAAI,EACtC3C,EAAK,MAAM,QAAQ,IAAI4C,EAAK,KAAMA,CAAI,EACtC5C,EAAK,MAAM,QAAQ,IAAI6C,EAAQ,KAAML,CAAI,EACzCxC,EAAK,MAAM,QAAQ,IAAI8C,EAAQ,KAAMN,CAAI,EACzCxC,EAAK,MAAM,QAAQ,IAAI6C,EAAQ,KAAMA,CAAO,EAC5C7C,EAAK,MAAM,QAAQ,IAAI8C,EAAQ,KAAMA,CAAO,EAE5C,QAAQ,IAAI,KAAK,OAAO,EAExB,KACD,CACA,MAAML,EAAWrF,EAAM,QAAA,EACjBuF,EAAO,IAAI3C,EAAK,CAAE,KAAM,SAAU,KAAAoC,EAAM,EACxCQ,EAAO,IAAI5C,EAAK,CAAE,KAAM,MAAO,KAAAoC,EAAM,EACrCS,EAAU,IAAI7C,EAAK,CACxB,KAAM,MACN,KAAM2C,EACN,KAAMF,EACN,KAAM,KAAK,QAAQ,IAAIA,GAAY,EAAE,GAAK,OAAO,WAAA,CAAW,CAC5D,EACDE,EAAK,KAAOE,EAAQ,KAEpBF,EAAK,KAAK,QAAQE,CAAO,EACzBT,EAAK,KAAK,QAAQO,CAAI,EACtBP,EAAK,KAAK,QAAQQ,CAAI,EAEtBA,EAAK,QAAQR,EAAMO,CAAI,EAEvB3C,EAAK,MAAM,QAAQ,IAAI2C,EAAK,KAAM,CAACH,CAAI,EACvCxC,EAAK,MAAM,QAAQ,IAAI4C,EAAK,KAAM,CAACJ,CAAI,EACvCxC,EAAK,MAAM,QAAQ,IAAI2C,EAAK,KAAMA,CAAI,EACtC3C,EAAK,MAAM,QAAQ,IAAI6C,EAAQ,KAAML,CAAI,EACzCxC,EAAK,MAAM,QAAQ,IAAI6C,EAAQ,KAAMA,CAAO,EAE5CN,EAAU,QAAQK,CAAI,CACvB,CAEA,KAAK,yBAAA,CACN,CAEA,mBAAmBT,EAAwB,CAC1C,MAAMY,EAAU,IAAI/C,EAAK,CACxB,KAAMmC,EAAK,QACX,KAAMA,EAAK,QACX,KAAMA,EAAK,QACX,KAAMA,EAAK,QACX,KAAM,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EAC7B,KAAM,OAAOA,EAAK,SAAY,SAAWA,EAAK,QAAU,EAAA,CACxD,EAED,OAAIA,EAAK,UAAY,QACpBY,EAAQ,KAAO,KAAK,QAAQ,IAAIZ,EAAK,OAAO,GAAKA,EAAK,SAGhDY,CACR,CAEA,yBAAyBrB,EAAahB,EAAO,MAAOsC,EAAiB,GAAM,CACtEtB,IAAShB,EAAO,OAASsC,IAC5BhD,EAAK,MAAM,QAAQ,MAAA,EACnBA,EAAK,MAAM,QAAQ,MAAA,EACnBA,EAAK,MAAM,QAAQ,MAAA,EACnBA,EAAK,MAAM,QAAQ,MAAA,EACnBA,EAAK,MAAM,QAAQ,MAAA,EACnBA,EAAK,MAAM,QAAQ,MAAA,EACnBA,EAAK,MAAM,QAAQ,IAAA,EAAM,MAAA,EACzBA,EAAK,MAAM,QAAQ,IAAA,EAAM,MAAA,GAG1B,UAAWsC,KAAQ,KAAK,4BAA4BZ,CAAI,EAAG,CAC1D,MAAMlB,EAAUR,EAAK,MAAM,QACrBiD,EAAUjD,EAAK,MAAM,QAE3BA,EAAK,MAAM,QAAQ,IAAIsC,EAAK,KAAMA,CAAI,EAEtC,MAAMY,EAAU1C,EACd,IAAI8B,EAAK,KAAM,CACf,WAAY,EACZ,SAAU,CAAA,CACV,EACA,IAAIA,EAAK,IAAI,EAETa,EAAUF,EACd,IAAIX,EAAK,KAAM,CACf,SAAU,EACV,UAAW,CAAA,CACX,EACA,IAAIA,EAAK,IAAI,EAET1B,EAAUZ,EAAK,MAAM,QAAQ,IAAIsC,EAAK,IAAI,EAgChD,GA9BIA,EAAK,OAAS,QACjBtC,EAAK,MAAM,QAAQ,IAAIsC,EAAK,KAAMA,CAAI,EACtCW,EAAQ,IAAIX,EAAK,KAAM,CACtB,SAAU,EACV,UAAW,CAAA,CACX,GAGEA,EAAK,MAAMtC,EAAK,MAAM,QAAQ,IAAIsC,EAAK,KAAK,KAAMA,EAAK,IAAI,EAE3DA,EAAK,OAAS,WACjBtC,EAAK,MAAM,QAAQ,IAAIsC,EAAK,KAAMA,CAAI,EACtCW,EAAQ,IAAIX,EAAK,KAAM,CACtB,SAAU5B,EAAO,MACjB,UAAWA,EAAO,KAAA,CAClB,EAEGE,EACHJ,EAAQ,IAAI8B,EAAK,KAAM,CACtB,WAAY,EACZ,SAAU,CAAA,CACV,EAED9B,EAAQ,IAAI8B,EAAK,KAAM,CACtB,WAAY,EACZ,SAAU,CAAA,CACV,GAICA,EAAK,OAAS,MAAO,CACxB,UAAWf,KAASe,EAAK,KAAM,CAC9B,MAAMc,EAAS5C,EAAQ,IAAIe,EAAM,IAAI,EAC/B8B,EAASJ,EAAQ,IAAI1B,EAAM,IAAI,EAEhC6B,IACLF,EAAS,YAAcE,EAAQ,WAC/BF,EAAS,UAAYE,EAAQ,SAEzBxC,GACHuC,EAAS,UAAY,KAAK,IACzBA,EAAS,UACTE,EAAQ,SAAA,EAETF,EAAS,UAAYE,EAAQ,WAE7BF,EAAS,WAAaE,EAAQ,UAC9BF,EAAS,SAAW,KAAK,IACxBA,EAAS,SACTE,EAAQ,QAAA,GAGX,CAEIzC,EACHuC,EAAS,WAAab,EAAK,KAAK,OAAS,GAAK5B,EAAO,MAErDyC,EAAS,YAAcb,EAAK,KAAK,OAAS,GAAK5B,EAAO,KAExD,CACD,CACD,CAEA,yBAA0C,CACzC,MAAM4C,EAAU5C,EAAO,MAAM,gBAAA,EAE7B,IAAI6C,EAAc,GACdC,EAAY9C,EAAO,MAAM,KAAK,EAC9B+C,EAAY/C,EAAO,MAAM,KAAK,EAElC,OAAIA,EAAO,MAAM,KAAK,EAAI4C,EAAQ,QACjCE,EAAYF,EAAQ,MACpBC,EAAc,IAEX7C,EAAO,MAAM,KAAK,EAAI4C,EAAQ,SACjCG,EAAYH,EAAQ,OACpBC,EAAc,IAGXA,IACH7C,EAAO,MAAM,KAAK,EAAI8C,EACtB9C,EAAO,MAAM,KAAK,EAAI+C,GAGhB,CACN,UAAAD,EACA,UAAAC,EACA,YAAAF,CAAA,CAEF,CAEA,eAAe7B,EAAahB,EAAO,MAAOgD,EAAmB,GAAO,CACnE,MAAMC,MAAe,IACfC,MAAe,IACfC,MAAc,IAEhBnC,IAAShB,EAAO,OAAO,KAAK,wBAAA,EAEhC,UAAW4B,KAAQ,KAAK,mBAAmBZ,CAAI,EAAG,CACjDY,EAAK,eAAA,EAEL,MAAM1B,EAAUZ,EAAK,MAAM,QAAQ,IAAIsC,EAAK,IAAI,EAEhD,GAAIA,EAAK,OAAS,SAAU,CAC3B,MAAMwB,EAA0B,CAC/B,QAASxB,EAAK,KACd,QAASA,EAAK,KACd,QAASA,EAAK,KACd,QAASA,EAAK,KACd,QAASA,EAAK,KACd,QAAA1B,EAEA,QAAS,MAAM,KAAK0B,EAAK,IAAI,EAAE,IAAKtB,GAAQ,CAC3C,MAAM+C,EAAU,CACf,QAAS/C,EAAI,KACb,QAASA,EAAI,KACb,QAASA,EAAI,KACb,QAASA,EAAI,KACb,QAASsB,EAAK,OAAStB,EAAI,KAC3B,QAAS,CAACJ,EACV,QAAS,CACR,GAAG0B,EAAK,IAAA,CACT,EAED,OAAAuB,EAAQ,IAAI7C,EAAI,KAAM+C,CAAO,EACtBA,CACR,CAAC,EACD,QAAS,CACR,GAAGzB,EAAK,IAAA,CACT,EAEDqB,EAAS,IAAIrB,EAAK,KAAMwB,CAAU,CACnC,CAEA,GAAIxB,EAAK,MAAQA,EAAK,OAAS,MAAO,CACrC,MAAM0B,EAA0B,CAC/B,QAAS,OACT,QAAS1B,EAAK,KACd,QAASA,EAAK,KAAK,KACnB,QAAA1B,EACA,QAAS,EACT,QAAS,CACR,GAAG0B,EAAK,KAAK,IAAA,CACd,EAGDsB,EAAS,IAAItB,EAAK,KAAK,KAAM0B,CAAU,CACxC,CACD,CACAhE,EAAK,MAAM,QAAQ,IAAI2D,EAAUD,CAAO,EACxC1D,EAAK,MAAM,QAAQ,IAAI4D,EAAUF,CAAO,EACxC1D,EAAK,MAAM,QAAQ,IAAI6D,EAASH,CAAO,CACxC,CAEA,gBACCO,EACAC,EAA0B,GAC1BC,EAAkB,EACjB,CAGD,GAFAzD,EAAO,MAAM,KAAOuD,EAEhBC,EAAgB,CACnB,KAAK,eAAexD,EAAO,KAAK,EAChC,MACD,CAEI,KAAK,UACR,aAAa,KAAK,OAAO,EACzB,KAAK,QAAU,MAGhB,KAAK,QAAU,WAAW,IAAM,CAC/B,KAAK,QAAU,KACf,KAAK,eAAA,CACN,EAAGyD,CAAO,CACX,CAEA,aACCC,EACAH,EACAC,EAA0B,GAC1BC,EAAkB,EACjB,CACD,GAAID,EAAgB,CACnB,KAAK,sBAAsBE,EAAIH,CAAG,EAClC,MACD,CAEI,KAAK,UACR,aAAa,KAAK,OAAO,EACzB,KAAK,QAAU,MAGhB,KAAK,QAAU,WAAW,IAAM,CAC/B,KAAK,QAAU,KACf,KAAK,sBAAsBG,EAAIH,CAAG,CACnC,EAAGE,CAAO,CACX,CAEA,sBAAsBC,EAAYH,EAA+B,CAChE,MAAMI,EAAMrE,EAAK,MAAM,QAAQ,IAAIoE,CAAE,EAErC,GAAI,CAACC,GAAO,EAAEA,aAAe/D,GAAO,CACnC,QAAQ,KACP,gBAAgB8D,CAAE,sCAAA,EAEnB,MACD,CAEA,MAAM5B,EAAMxC,EAAK,MAAM,QAAQ,IAAIqE,EAAI,KAAM,IAAI,EAE3CjE,EAAOiE,EAAI,KACXC,EAAOD,EAAI,KACXjC,EAAOiC,EAAI,KAEjB,GAAI,CAACjE,GAAQ,CAACkE,GAAQ,CAAClC,EAAM,CAC5B,QAAQ,KAAK,mCAAoChC,EAAMkE,EAAMlC,CAAI,EACjE,MACD,CAEA,MAAMmC,EAAavE,EAAK,MAAM,QAAQ,IAAII,EAAK,IAAI,GAAK,CACvD,SAAU,EACV,UAAW,CAAA,EAENoE,EAAaxE,EAAK,MAAM,QAAQ,IAAIsE,EAAK,IAAI,GAAK,CACvD,SAAU,EACV,UAAW,CAAA,EAENG,EAAO/D,EAAO,MAAQ,EAE5B,GAAI8B,EAAK,CACR,MAAMkC,EAAOJ,EAAK,KAAK,EAAIA,EAAK,KAAK,EAE/BK,EAAOvE,EAAK,KAAK,EAAImE,EAAW,SAAWE,EAC3CG,EAAOF,EAAOF,EAAW,SAAWC,EAEpCI,EAAW,KAAK,IAAIF,EAAM,KAAK,IAAIC,EAAMX,EAAI,CAAC,CAAC,EAErDI,EAAI,KAAK,EAAIQ,EAAWJ,EAExBrE,EAAK,KAAK,EAAIiE,EAAI,KAAK,EAAIjE,EAAK,KAAK,EAErCkE,EAAK,KAAK,EAAIO,EAAWJ,EACzBH,EAAK,KAAK,EAAII,EAAOJ,EAAK,KAAK,EAE/B,MAAMQ,EAAiB,KAAK,IAC3B,EACA1E,EAAK,KAAK,EAAImE,EAAW,QAAA,EAEpBQ,EAAiB,KAAK,IAC3B,EACAT,EAAK,KAAK,EAAIE,EAAW,QAAA,EAEpBQ,EAAkBF,EAAiBC,EACnCE,EAAY7E,EAAK,KAAOkE,EAAK,KAE/BU,EAAkB,GACrB5E,EAAK,KAAQ0E,EAAiBE,EAAmBC,EACjDX,EAAK,KAAQS,EAAiBC,EAAmBC,IAEjD7E,EAAK,KAAO6E,EAAY,EACxBX,EAAK,KAAOW,EAAY,EAE1B,KAAO,CACN,MAAMC,EAAOZ,EAAK,KAAK,EAAIA,EAAK,KAAK,EAE/Ba,EAAO/E,EAAK,KAAK,EAAImE,EAAW,UAAYE,EAC5CW,EAAOF,EAAOV,EAAW,UAAYC,EAErCY,EAAW,KAAK,IAAIF,EAAM,KAAK,IAAIC,EAAMnB,EAAI,CAAC,CAAC,EAErDI,EAAI,KAAK,EAAIgB,EAAWZ,EAExBrE,EAAK,KAAK,EAAIiE,EAAI,KAAK,EAAIjE,EAAK,KAAK,EAErCkE,EAAK,KAAK,EAAIe,EAAWZ,EACzBH,EAAK,KAAK,EAAIY,EAAOZ,EAAK,KAAK,EAE/B,MAAMQ,EAAiB,KAAK,IAC3B,EACA1E,EAAK,KAAK,EAAImE,EAAW,SAAA,EAEpBQ,EAAiB,KAAK,IAC3B,EACAT,EAAK,KAAK,EAAIE,EAAW,SAAA,EAEpBQ,EAAkBF,EAAiBC,EACnCE,EAAY7E,EAAK,KAAOkE,EAAK,KAE/BU,EAAkB,GACrB5E,EAAK,KAAQ0E,EAAiBE,EAAmBC,EACjDX,EAAK,KAAQS,EAAiBC,EAAmBC,IAEjD7E,EAAK,KAAO6E,EAAY,EACxBX,EAAK,KAAOW,EAAY,EAE1B,CAEA,KAAK,eAAe7C,CAAI,CACzB,CAEA,WACCkD,EACAC,EACAC,EACU,CACV,MAAMC,EAAUzF,EAAK,MAAM,QAAQ,IAAIsF,CAAG,EAC1C,IAAII,EAAU1F,EAAK,MAAM,QAAQ,IAAIuF,CAAG,EAExC,MACC,CAACE,GACD,EAAEA,aAAmBzF,IACrB,CAAC0F,GACD,EAAEA,aAAmB1F,IAErB,QAAQ,KACP,eAAesF,CAAG,sCAAA,EAEZ,IAIPG,GAAS,MAAQ,OACjBA,EAAQ,OAASC,GACjBA,EAAQ,KAAK,KAAA,EAAS,GAEtB,QAAQ,KAAK,4CAA4C,EAClD,IAGJD,GAAS,MAAQ,UAAYC,GAAS,OAASD,GAClD,QAAQ,KAAK,qDAAqD,EAC3D,IAGJ,CAACA,GAAW,CAACC,GAChB,QAAQ,KAAK,yCAAyCJ,CAAG,KAAKC,CAAG,EAAE,EAC5D,IAGJE,IAAYC,GACf,QAAQ,KACP,6DAAA,EAEM,IAGJ,CAACD,EAAQ,MAAS,CAACC,EAAQ,MAAQA,EAAQ,OAAS,OACvD,QAAQ,KACP,mDAAmDD,EAAQ,IAAI,KAAKC,EAAQ,IAAI,EAAA,EAE1E,IAGJA,EAAQ,OAAS,OAASF,IAAW,WACxC,QAAQ,KACP,+CAA+CE,EAAQ,IAAI,EAAA,EAErD,IAGJD,EAAQ,OAAS,MACb,IAGJC,EAAQ,OAAS,UAAYF,IAAW,YAC3CE,EAAUA,EAAQ,KAAK,SAAA,GAAcA,GAIrCA,EAAQ,OAAS,QAChBF,IAAW,WAAaA,IAAW,QAAUA,IAAW,SAEzD,KAAK,cAAcC,EAASC,EAASF,CAAM,EACjCE,EAAQ,OAAS,OAASF,IAAW,UAC/C,KAAK,mBAAmBC,EAASC,EAASF,CAAM,EACtCE,EAAQ,OAAS,UAAYF,IAAW,WAClD,KAAK,qBAAqBC,EAASC,EAASF,CAAM,EAGnD,KAAK,yBAAA,EACL,KAAK,eAAe9E,EAAO,MAAO,EAAI,EAC/B,GACR,CAEA,cAAc4E,EAAWC,EAAWC,EAAsC,CACzE,GAAI,CAACD,GAAO,CAACA,EAAI,KAAM,CACtB,QAAQ,KACP,oBAAoBA,EAAI,IAAI,4BAAA,EAE7B,MACD,CAEA,KAAK,WAAWD,CAAG,EAEnB,MAAMK,EAASJ,EAAI,KACbK,EAASD,EAAO,KAAK,QAAQJ,CAAG,EAEtC,GAAIK,IAAW,QAAaA,IAAW,GACtC,OAGD,MAAMC,EAAYL,IAAW,WAAaA,IAAW,OAC/CM,EAAYD,EAAYD,EAASA,EAAS,EAE1CG,EAASJ,EAAO,KAAK,IAAIG,EAAY,CAAC,EACtCE,EAASL,EAAO,KAAK,IAAIG,EAAY,CAAC,EACtCG,EAASV,EAAI,KACbW,EAASX,EAAI,KAUnB,GARI,CAACM,GAAaI,GACjBjG,EAAK,MAAM,QAAQ,OAAOiG,EAAO,IAAI,EACrCjG,EAAK,MAAM,QAAQ,IAAA,EAAM,OAAOiG,EAAO,IAAI,GACjCJ,GAAaK,IACvBlG,EAAK,MAAM,QAAQ,OAAOkG,EAAO,IAAI,EACrClG,EAAK,MAAM,QAAQ,IAAA,EAAM,OAAOkG,EAAO,IAAI,GAGxCZ,EAAI,MAAQ,MACXO,GACCG,GAAQV,EAAI,QAAQK,EAAQK,CAAM,EACtCT,EAAI,QAAQI,EAAQL,CAAG,IAEvBA,EAAI,QAAQK,EAAQJ,CAAG,EACnBQ,GAAQA,EAAO,QAAQJ,EAAQL,CAAG,GAEvCK,EAAO,KAAK,OAAOG,EAAWR,CAAG,EACjCA,EAAI,KAAOK,EACXA,EAAO,KAAOL,EAAI,aACRA,EAAI,MAAQ,SAAU,CAChC,MAAMa,EAASb,EAAI,KAAK,KAAA,EAClBc,EAASd,EAAI,KAAK,SAAA,EAEpBO,GACCM,GAAUH,GAAQG,EAAO,QAAQR,EAAQK,CAAM,EAC/CI,GAAUb,GAAKA,EAAI,QAAQI,EAAQS,CAAM,IAEzCD,GAAUZ,GAAKY,EAAO,QAAQR,EAAQJ,CAAG,EACzCa,GAAUL,GAAQA,EAAO,QAAQJ,EAAQS,CAAM,GAGpDT,EAAO,KAAK,YAAYG,EAAWR,EAAI,IAAI,EAE3C,UAAWtE,KAAOsE,EAAI,KACrBtE,EAAI,KAAO2E,EACP3E,EAAI,OAAMA,EAAI,KAAK,KAAO2E,GAG/BA,EAAO,KAAOS,EAASA,EAAO,KAAO,EACtC,CAEA,KAAK,sBAAsBT,CAAM,CAClC,CAEA,mBACCL,EACAC,EACAC,EACC,CACD,KAAK,WAAWF,CAAG,EAEnB,MAAM1E,EAAUZ,EAAK,MAAM,QAAQ,IAAIuF,EAAI,IAAI,EACzCc,EAAUb,IAAW,OAASA,IAAW,OAE/C,GAAIF,EAAI,OAAS,MAAO,CACvB,MAAMgB,EAAS,IAAItG,EAAK,CAAE,KAAM,SAAU,KAAMuF,EAAI,KAAM,EAC1De,EAAO,KAAK,QAAQhB,CAAG,EACvBA,EAAI,KAAOgB,EACXA,EAAO,KAAOhB,EAAI,KAEd1E,GAAW,GACV4E,IAAW,QAAUA,IAAW,QACnC,KAAK,wBAAwBc,EAAQf,EAAKc,CAAO,EAEjD,KAAK,WAAWd,EAAKe,EAAQD,CAAO,EAGjCb,IAAW,OAASA,IAAW,SAClC,KAAK,wBAAwBc,EAAQf,EAAKc,CAAO,EAEjD,KAAK,WAAWd,EAAKe,EAAQD,CAAO,CAGvC,MAAWf,EAAI,OAAS,WACnB1E,GAAW,GACV4E,IAAW,QAAUA,IAAW,QACnC,KAAK,wBAAwBF,EAAKC,EAAKc,CAAO,EAE9C,KAAK,WAAWd,EAAKD,EAAKe,CAAO,EAG9Bb,IAAW,OAASA,IAAW,SAClC,KAAK,wBAAwBF,EAAKC,EAAKc,CAAO,EAE9C,KAAK,WAAWd,EAAKD,EAAKe,CAAO,EAIrC,CAEA,qBACCf,EACAC,EACAC,EACC,CACD,KAAK,WAAWF,CAAG,EAEnB,MAAM1E,EAAUZ,EAAK,MAAM,QAAQ,IAAIuF,EAAI,IAAI,EACzCc,EAAUb,IAAW,OAASA,IAAW,OAE/C,GAAIF,EAAI,OAAS,MAAO,CACvB,MAAMgB,EAAS,IAAItG,EAAK,CAAE,KAAM,SAAU,KAAMuF,EAAI,KAAM,EAC1De,EAAO,KAAK,QAAQhB,CAAG,EACvBA,EAAI,KAAOgB,EACXA,EAAO,KAAOhB,EAAI,KAEd1E,GAAW,GACV4E,IAAW,OAASA,IAAW,SAClC,KAAK,wBAAwBc,EAAQf,EAAKc,CAAO,EAEjD,KAAK,WAAWd,EAAKe,EAAQD,CAAO,EAGjCb,IAAW,QAAUA,IAAW,QACnC,KAAK,wBAAwBc,EAAQf,EAAKc,CAAO,EAEjD,KAAK,WAAWd,EAAKe,EAAQD,CAAO,CAGvC,MAAWf,EAAI,OAAS,WACnB1E,GAAW,GACV4E,IAAW,OAASA,IAAW,SAClC,KAAK,wBAAwBF,EAAKC,EAAKc,CAAO,EAE9C,KAAK,WAAWd,EAAKD,EAAKe,CAAO,EAG9Bb,IAAW,QAAUA,IAAW,QACnC,KAAK,wBAAwBF,EAAKC,EAAKc,CAAO,EAE9C,KAAK,WAAWd,EAAKD,EAAKe,CAAO,EAIrC,CAEA,WAAWd,EAAWD,EAAWxG,EAAe,CAC/C,MAAMyH,EAAUhB,EAAI,KACpB,GAAIA,GAAO7E,EAAO,MAAO,CACxB,MAAM8F,EAAU9F,EAAO,MAAM,KAAK,KAAA,EAC5B+F,EAAU/F,EAAO,MAAM,KAAK,SAAA,EAE9B5B,GACH4B,EAAO,MAAM,KAAK,aAAa4E,CAAG,EAC9BkB,GAASA,EAAQ,QAAQ9F,EAAO,MAAO4E,CAAG,IAE9C5E,EAAO,MAAM,KAAK,QAAQ4E,CAAG,EACzBmB,GAASnB,EAAI,QAAQ5E,EAAO,MAAO+F,CAAO,GAG/CnB,EAAK,KAAO5E,EAAO,MACnB,KAAK,sBAAsBA,EAAO,KAAK,EACvC,MACD,CAEA,GAAI,CAAC6F,EAAS,CACb,QAAQ,KACP,oBAAoBhB,EAAI,IAAI,8BAAA,EAE7B,MACD,CAEA,MAAMK,EAASW,EAAQ,KAAK,QAAQhB,CAAG,EACvC,GAAIK,IAAW,GAAI,CAClB,QAAQ,KACP,oBAAoBL,EAAI,IAAI,gCAAA,EAE7B,MACD,CAEA,MAAMmB,EAAU1G,EAAK,MAAM,QAAQ,IAAIuG,EAAQ,IAAI,EAC/CG,KAAc,MAAM,QAAQ,IAAIpB,EAAI,KAAM,CAACoB,CAAO,EAEtD,MAAMX,EAASQ,EAAQ,KAAK,IAAIX,EAAS,CAAC,EACpCI,EAASO,EAAQ,KAAK,IAAIX,EAAS,CAAC,EACpCe,EAASpB,EAAI,KACbqB,EAASrB,EAAI,KAEnBD,EAAI,KAAOiB,EAEPzH,GACHyH,EAAQ,KAAK,OAAOX,EAAQN,CAAG,EAE/BC,EAAI,QAAQgB,EAASjB,CAAG,EACpBU,GAAQV,EAAI,QAAQiB,EAASP,CAAM,EAEnCY,IACH5G,EAAK,MAAM,QAAQ,OAAO4G,EAAO,IAAI,EACrC5G,EAAK,MAAM,QAAQ,IAAA,EAAM,OAAO4G,EAAO,IAAI,KAG5CL,EAAQ,KAAK,OAAOX,EAAS,EAAGN,CAAG,EACnCA,EAAI,QAAQiB,EAAShB,CAAG,EACpBQ,GAAQA,EAAO,QAAQQ,EAASjB,CAAG,EAEnCqB,IACH3G,EAAK,MAAM,QAAQ,OAAO2G,EAAO,IAAI,EACrC3G,EAAK,MAAM,QAAQ,IAAA,EAAM,OAAO2G,EAAO,IAAI,IAI7C,KAAK,sBAAsBJ,CAAO,CACnC,CAEA,wBAAwBjB,EAAWC,EAAWzG,EAAe,CAC5D,MAAM+H,EAAO,IAAIpK,EACX6F,EAAO,IAAItC,EAAK,CAAE,KAAM,SAAU,KAAMuF,EAAI,KAAM,EAExD,GAAI,CAACA,GAAO,CAACD,EAAK,CACjB,QAAQ,KACP,oBAAoBC,EAAI,IAAI,8BAAA,EAE7B,MACD,CAEA,GAAIA,IAAQ7E,EAAO,MAAO,CACzB,MAAMoG,EAAM,IAAI9G,EAAK,CAAE,KAAM,MAAO,KAAMuF,EAAK,EAC/C,GAAIA,EAAI,KAAK,KAAA,GAAU,GAAKA,EAAI,KAAK,KAAA,GAAQ,OAAS,SAAU,CAC/D,MAAMvE,EAAMuE,EAAI,KAAK,QAAA,EAErB,GAAI,CAACvE,EAAK,CACT,QAAQ,KACP,oCAAoCuE,EAAI,IAAI,kBAAA,EAE7C,MACD,CAEIzG,GACHgI,EAAI,KAAK,QAAQxB,CAAG,EACpBwB,EAAI,KAAK,QAAQ9F,CAAG,EACpBuE,EAAI,KAAK,QAAQuB,CAAG,EACpB9F,EAAI,QAAQ8F,EAAKxB,CAAG,IAEpBwB,EAAI,KAAK,QAAQ9F,CAAG,EACpB8F,EAAI,KAAK,QAAQxB,CAAG,EACpBA,EAAI,QAAQwB,EAAK9F,CAAG,EACpBuE,EAAI,KAAK,QAAQuB,CAAG,GAErBxB,EAAI,KAAOwB,EACX9F,EAAI,KAAO8F,CACZ,SACCvB,EAAI,KAAK,KAAA,GAAU,GACnBA,EAAI,KAAK,QAAQ,OAAS,MACzB,CACD,MAAMvE,EAAMuE,EAAI,KAAK,KAAA,EAEfiB,EAAUxF,GAAK,KAAK,KAAA,EACpByF,EAAUzF,GAAK,KAAK,SAAA,EAEtBlC,GAAQkC,GACXA,EAAI,KAAK,aAAasE,CAAG,EACrBkB,GAASA,EAAQ,QAAQxF,EAAKsE,CAAG,GAC3BtE,IACVA,EAAI,KAAK,QAAQsE,CAAG,EAChBmB,GAASnB,EAAI,QAAQtE,EAAKyF,CAAO,GAGtCnB,EAAK,KAAOtE,CACb,SAAWuE,EAAI,KAAK,KAAA,EAAS,EAAG,CAC/B,MAAMwB,EAAO,IAAI/G,EAAK,CAAE,KAAM,MAAO,KAAMuF,EAAK,EAC1CyB,EAAO,IAAIhH,EAAK,CAAE,KAAM,MAAO,KAAM+G,EAAM,EAEjD,UAAW/F,KAAOuE,EAAI,KACrByB,EAAK,KAAK,QAAQhG,CAAG,EACrBA,EAAI,KAAOgG,EACPhG,EAAI,OAAMA,EAAI,KAAK,KAAOgG,GAG/B1B,EAAI,KAAOyB,EACXxB,EAAI,KAAK,MAAA,EAELzG,GACHiI,EAAK,KAAK,aAAazB,CAAG,EAC1ByB,EAAK,KAAK,QAAQC,CAAI,EACtBA,EAAK,QAAQD,EAAMzB,CAAG,IAEtByB,EAAK,KAAK,QAAQC,CAAI,EACtBD,EAAK,KAAK,QAAQzB,CAAG,EACrBA,EAAI,QAAQyB,EAAMC,CAAI,GAGvBzB,EAAI,KAAK,QAAQwB,CAAI,CACtB,CAEA,KAAK,sBAAsBxB,CAAG,EAC9B,MACD,CAEAD,EAAI,KAAOC,EAEXjD,EAAK,KAAOiD,EACZjD,EAAK,KAAOiD,EAAI,KAChBjD,EAAK,KAAOiD,EAAI,KAEhB,MAAM0B,EAASjH,EAAK,MAAM,QAAQ,IAAIuF,EAAI,IAAI,EAE9C,UAAWvE,KAAOsB,EAAK,KACtBtB,EAAI,KAAOsB,EACPtB,EAAI,OAAMA,EAAI,KAAK,KAAOsB,GAC9BtC,EAAK,MAAM,QAAQ,IAAIgB,EAAI,KAAMiG,CAAO,EAGzC,UAAWjG,KAAOsE,EAAI,KACrBtE,EAAI,KAAOsE,EACPtE,EAAI,OAAMA,EAAI,KAAK,KAAOsE,GAC9BtF,EAAK,MAAM,QAAQ,IAAIgB,EAAI,KAAMiG,CAAO,EAGzCjH,EAAK,MAAM,QAAQ,IAAIsC,EAAK,KAAM,CAAC2E,CAAO,EAC1CjH,EAAK,MAAM,QAAQ,IAAIsF,EAAI,KAAM,CAAC2B,CAAO,EAErCnI,GACH+H,EAAK,QAAQvB,CAAG,EAChBuB,EAAK,QAAQvE,CAAI,EACjBiD,EAAI,KAAOsB,EACXtB,EAAI,KAAO,MACXjD,EAAK,QAAQiD,EAAKD,CAAG,IAErBuB,EAAK,QAAQvE,CAAI,EACjBuE,EAAK,QAAQvB,CAAG,EAChBC,EAAI,KAAOsB,EACXtB,EAAI,KAAO,MACXD,EAAI,QAAQC,EAAKjD,CAAI,EAEvB,CAEA,8BAA8BgD,EAAW,CACxC,GAAI,CAACA,EAAI,MAAQ,CAACA,EAAI,KAAK,KAAM,CAChC,QAAQ,KAAK,eAAeA,EAAI,IAAI,4BAA4B,EAChE,MACD,CAEA,MAAM4B,EAAU5B,EAAI,KACd6B,EAAU7B,EAAI,KAAK,KAEnB8B,EAAeD,EAAQ,KAAK,QAAQD,CAAO,EAC3CG,EAAWF,EAAQ,KAAK,IAAIC,EAAe,CAAC,EAC5CE,EAAWH,EAAQ,KAAK,IAAIC,EAAe,CAAC,EAC5CG,EAASjC,EAAI,KAAK,KAAA,EAClBkC,EAASlC,EAAI,KAAK,SAAA,EAExB,KAAK,UAAU4B,CAAO,EAEtB,IAAIO,EAAaL,EAEjB,GAAI9B,EAAI,MAAQ,OAAS4B,EAAS,CAC7BG,GAAYE,GAAQA,EAAO,QAAQJ,EAASE,CAAQ,EACpDC,GAAYE,GAAQF,EAAS,QAAQH,EAASK,CAAM,EAExD,UAAWxG,KAAOsE,EAAI,KACrBtE,EAAI,KAAOmG,EACPnG,EAAI,OAAMA,EAAI,KAAK,KAAOmG,GAC9BA,EAAQ,KAAK,OAAOM,EAAYzG,CAAG,EAEnChB,EAAK,MAAM,QAAQ,IAClBgB,EAAI,KACJ,CAAChB,EAAK,MAAM,QAAQ,IAAImH,EAAQ,IAAI,CAAA,EAErCnH,EAAK,MAAM,QAAQ,OAAOgB,EAAI,IAAI,EAClCyG,GAEF,SAAWnC,EAAI,MAAQ,SAAU,CAC5B+B,GAAU/B,EAAI,QAAQ6B,EAASE,CAAQ,EACvCC,GAAUA,EAAS,QAAQH,EAAS7B,CAAG,EAE3C6B,EAAQ,KAAK,OAAOM,EAAYnC,CAAG,EAEnCA,EAAI,KAAO6B,EAEXnH,EAAK,MAAM,QAAQ,IAClBsF,EAAI,KACJ,CAACtF,EAAK,MAAM,QAAQ,IAAImH,EAAQ,IAAI,CAAA,EAGrC,UAAWnG,KAAOsE,EAAI,KACrBtF,EAAK,MAAM,QAAQ,IAClBgB,EAAI,KACJhB,EAAK,MAAM,QAAQ,IAAImH,EAAQ,IAAI,CAAA,EAEpCnH,EAAK,MAAM,QAAQ,OAAOgB,EAAI,IAAI,CAEpC,CACD,CAEA,eAAesE,EAAWoC,EAAe,GAAM,CAC9C,MAAMtF,EAAOkD,EAAI,KACXlF,EAAOkF,EAAI,KACXhB,EAAOgB,EAAI,KASjB,GAPAA,EAAI,KAAO,KACXA,EAAI,KAAO,KACXA,EAAI,KAAO,KAEPlF,MAAW,KAAO,MAClBkE,MAAW,KAAO,MAElB,CAACoD,EACJ,OAAOpC,EAGJlF,GAAQkE,GAAQlE,EAAK,MAAQkE,EAAK,KACrClE,EAAK,KAAK,QAAQgC,EAAMkC,EAAK,IAAI,EACvBlE,GAAQA,EAAK,KACvBA,EAAK,KAAK,KAAO,KACPkE,GAAQA,EAAK,OACvBA,EAAK,KAAK,KAAO,KAEnB,CAEA,WAAWgB,EAAW,CACrB,GAAI,CAACA,EAAI,KAAM,CACd,QAAQ,KAAK,sCAAsC,EACnD,MACD,CAEA,MAAMqC,EAAOrC,GAAK,KACZsC,EAAOD,GAAM,KAInB,GAFA,KAAK,UAAUrC,CAAG,EAEdA,EAAI,OAAS,UAAYqC,EAAK,KAAK,KAAA,IAAW,EAAG,CAEpD,MAAM3G,EAAM2G,EAAK,KAAK,KAAA,EAClB3G,GAAK,KAAK,8BAA8BA,CAAG,CAChD,SAECsE,EAAI,OAAS,OACbqC,EAAM,KAAK,KAAA,IAAW,GACtBC,EAAM,KAAK,KAAA,IAAW,EACrB,CACD,KAAK,UAAUD,CAAI,EACnB,MAAM3G,EAAM4G,GAAM,KAAK,KAAA,EACnB5G,GAAK,KAAK,8BAA8BA,CAAG,CAChD,SAECsE,EAAI,OAAS,OACbqC,EAAM,KAAK,KAAA,IAAW,GACtBC,EAAM,KAAK,KAAA,EAAS,EAEpB,KAAK,UAAUD,CAAI,UAGnBrC,EAAI,OAAS,OACbqC,EAAM,OAASrC,EAAI,MACnBqC,EAAM,KAAK,KAAA,EAAS,EACnB,CACD,MAAM3G,EAAM2G,EAAK,KAAK,KAAA,EAClB3G,IAAK2G,EAAK,KAAO3G,EAAI,KAC1B,CACD,CAEA,UAAUA,EAAW,CACpB,GAAI,CAACA,EAAI,KAAM,CACd,QAAQ,KAAK,sCAAsC,EACnD,MACD,CAEA,MAAMoB,EAAOpB,EAAI,KACX6G,EAAMzF,EAAK,KAAK,QAAQpB,CAAG,EAE3B8G,EAAW1F,EAAK,KAAK,IAAIyF,EAAM,CAAC,EAChCE,EAAW3F,EAAK,KAAK,IAAIyF,EAAM,CAAC,EAChCG,EAAWhH,EAAI,KACfiH,EAAWjH,EAAI,KAErB,GAAI6G,IAAQ,GAAI,CACf,QAAQ,KAAK,wCAAwC,EACrD,MACD,CAEIG,IACHhI,EAAK,MAAM,QAAQ,OAAOgI,EAAS,IAAI,EACvChI,EAAK,MAAM,QAAQ,IAAA,EAAM,OAAOgI,EAAS,IAAI,GAG1CC,IACHjI,EAAK,MAAM,QAAQ,OAAOiI,EAAS,IAAI,EACvCjI,EAAK,MAAM,QAAQ,IAAA,EAAM,OAAOiI,EAAS,IAAI,GAG1CH,GAAYC,EACfD,EAAS,QAAQ1F,EAAM2F,CAAQ,EACrBD,EACVA,EAAS,KAAO,KACNC,IACVA,EAAS,KAAO,MAGjB3F,EAAK,KAAK,SAASyF,CAAG,EAEtB7H,EAAK,MAAM,QAAQ,OAAOgB,EAAI,IAAI,EAClChB,EAAK,MAAM,QAAQ,OAAOgB,EAAI,IAAI,EAClChB,EAAK,MAAM,QAAQ,OAAOgB,EAAI,IAAI,EAClChB,EAAK,MAAM,QAAQ,OAAOgB,EAAI,IAAI,EAE9BA,EAAI,OAAS,UAChBhB,EAAK,MAAM,QAAQ,OAAOgB,EAAI,IAAI,EAG/BA,EAAI,OAAS,OAChBhB,EAAK,MAAM,QAAQ,OAAOgB,EAAI,IAAI,EAGnCA,EAAI,KAAO,KACXA,EAAI,KAAO,KACXA,EAAI,KAAO,IACZ,CAEA,eAAgB,CACfhB,EAAK,MAAM,QAAQ,MAAA,EACnBA,EAAK,MAAM,QAAQ,MAAA,EACnBA,EAAK,MAAM,QAAQ,MAAA,EACnBA,EAAK,MAAM,QAAQ,MAAA,EAEnBA,EAAK,MAAM,QAAQ,IAAA,EAAM,MAAA,EACzBA,EAAK,MAAM,QAAQ,IAAA,EAAM,MAAA,CAC1B,CACD,CAEO,MAAMM,CAAK,CACjB,KAAkB,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EACzC,KAAe,OAAO,WAAA,EACtB,KAAoB,KACpB,KAAoB,KACpB,KAAoB,KAEpB,YACCH,EAAsB,KACtBmE,EAAoB,KACpBlE,EAAoB,KACnB,CACD,KAAK,KAAOD,EACZ,KAAK,KAAOmE,EACZ,KAAK,KAAOlE,EACR,KAAK,OAAM,KAAK,KAAK,KAAO,MAC5B,KAAK,OAAM,KAAK,KAAK,KAAO,KACjC,CAEA,QAAqB,CACpB,MAAO,CACN,QAAS,KAAK,MAAM,MAAQ,GAC5B,QAAS,OACT,QAAS,KAAK,KACd,QAAS,EACT,QAAS,GACT,QAAS,CAAA,CAAC,CAEZ,CACD,CC/9CkC,OAIhC,IAAM,CACP,GAAI,OAAO,OAAW,IAAa,OAEnC,MAAM8H,EAAa,uDACbC,EAAY,mCACZC,EAAY,mCACZC,EAAe,mCAEfC,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAejB,QAAQ,eACP,qCACA,qDAAA,EAED,QAAQ,IAAI,KAAKA,CAAQ,GAAIJ,CAAU,EACvC,QAAQ,IAAI,0CAA2CC,CAAS,EAChE,QAAQ,IACP;AAAA,wDACAC,CAAA,EAED,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAoBC,CAAY,EAC5C,QAAQ,SAAA,EAEJ,OAAO,OAAW,MAEnB,OAAe,mBAAqB,CACrC,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EACA,WAAYE,CAAA,EAGf,GAAA"}
package/dist/core.umd.js CHANGED
@@ -1 +1,57 @@
1
- (function(u,m){typeof exports=="object"&&typeof module<"u"?module.exports=m():typeof define=="function"&&define.amd?define(m):(u=typeof globalThis<"u"?globalThis:u||self,u.layout=m())})(this,function(){"use strict";const u={Row:0,Column:1,Tabset:2,Tab:3};class m{constructor(e,s,t){this.type=e,this.name=null,this.parent=t,this.weight=s,this.children=[],this.dimension=[0,0],this.coordinate=[0,0],this.prev=null,this.next=null}}class y{constructor(e,s,t){this.type=e,this.prev=s,this.next=t,this.name=`${s.name}-${t.name}`,this.dimension=[0,0],this.coordinate=[0,0],s.next=this,t.prev=this}}const E={top:u.Row,left:u.Column,right:u.Column,bottom:u.Row,cover:u.Tab},x={top:0,left:0,right:1,bottom:1,cover:0};class l{static detach(e,s){var h;const t=e.parent;if(!t)return;const n=(h=e.parent)==null?void 0:h.children.indexOf(e),o=t==null?void 0:t.children.length,c=8*100/t.dimension[t.type];if(!s)return l.fixSrc(e);if(n>0&&n<o-1){const r=(e.weight+c)/2,a=t.children[n+1],i=t.children[n-1];a.weight+=r,i.weight+=r,new y(e.type,i,a)}if(n===o-1){const r=t.children[n-1];r.weight+=e.weight+c,r.next=null}if(n===0){const r=t.children[n+1];r.weight+=e.weight+c,r.prev=null}t.children.splice(n,1)}static attach(e,s,t){const n=e.parent;if(!n)return;const o=n.children.indexOf(e);switch(E[t]){case 1-n.type:const c=o+x[t],h=8*100/n.dimension[n.type];s.weight=e.weight=(e.weight-h)/2,s.parent=n,n.children.splice(c,0,s),l.fixBond(s,n.type);break;case n.type:const r=e.weight/2,a=x[t]==0?[s,e]:[e,s],i=new m(1-n.type,e.weight,n);i.children=a,n.children[o]=i,a.forEach(d=>{d.weight=r,d.parent=i}),this.fixBond(i,n.type),this.fixBond(s,n.type),this.fixBond(e,n.type);break;case u.Tab:e.children.push(...s.children),s.children.forEach(d=>{d.parent=e});break}}static getTotalWeight(e){return e.children.reduce((s,t)=>s+t.weight,0)??100}static getTotalNodes(e){return e.children.length}static getSize(e){return e.dimension[e.type]-(this.getTotalNodes(e)-1)*8}}l.createBinaryTree=(f,e)=>{var a;const{range:s}=e,t=[...e.tabs];if(s==1){const i=new m(u.Column,100,f);f.children=[i],l.addTab(i,t);return}const n=[f],o=[];let c=1,h=1;for(;h<s||n.length;){const i=[],d=n.length;for(let w=0;w<d;w++){const g=n.shift(),T=((a=g.parent)==null?void 0:a.children.indexOf(g))??0;if(g.name=`r${o.length}/c${w}/tb${T}`,g&&(i.push(g),h<s&&(g.children[0]=new m(c,50,g),n.push(g.children[0])),h<s)){g.children[1]=new m(c,50,g),n.push(g.children[1]),h++;const b=new y(c,g.children[0],g.children[1]);b.name=`r${o.length}/c${w}/b${T}-${T+1}`}}o.push(i),c=1-c}[...o[o.length-1],...o[o.length-2]].forEach(i=>{l.addTab(i,t)})},l.fixSrc=f=>{const e=f.parent;if(!e)return;const s=e.children.indexOf(f),t=e.children[1-s],n=e.parent,o=n==null?void 0:n.children.indexOf(e);switch(t.type){case u.Tabset:const c=e.weight;n==null||n.children.splice(o,1),n==null||n.children.splice(o,0,t),t.weight=c,t.parent=n,l.fixBond(t,t.type);break;default:if(!n){e.children.splice(s,1);break}const h=t.children.length,r=8*(h-1)*100/n.dimension[t.type];t.children.forEach(d=>{d.weight=(e.weight-r)*d.weight/100});const a=t.children[0],i=t.children[h-1];n.children=[...n.children.slice(0,o),...t.children,...n.children.slice(o+1)],t.children.forEach(d=>{d.parent=n}),l.fixBond(a,t.type),l.fixBond(i,t.type);break}},l.fixBond=(f,e)=>{const s=f.parent;if(!s)return;const t=s.children.indexOf(f),n=s.children.length;t>0&&t<n-1&&(new y(e,s.children[t-1],s.children[t]),new y(e,s.children[t],s.children[t+1])),t===n-1&&(new y(e,s.children[t-1],s.children[t]),s.children[t].next=null),t===0&&(new y(e,s.children[t],s.children[t+1]),s.children[t].prev=null)},l.addTab=(f,e)=>{if(f.children.length!==0)return;f.type=u.Tabset;const s=new m(u.Tab,100,f),t=e.shift();s.name=t,f.children=[s]},l.json=f=>{var e;return{type:f.type,dimension:f.dimension,coordinate:f.coordinate,name:f.name,children:(e=f.children)==null?void 0:e.map(s=>l.json(s))}};class B{constructor(e={}){this.shiftTree=(t,n,o)=>{let c,h;if(this._tabs.forEach(a=>{a.name==n&&(c=a),a.name==t&&(h=a),a.children.forEach(i=>{i.name==n&&(c=i),i.name==t&&(h=i)})}),h==null||c==null||h.parent===null)return;const r=h.parent.children.length;return c.type==u.Tabset&&h.type==u.Tab?(l.detach(h,r>1),l.attach(c,h,o)):c.type==u.Tabset&&h.type==u.Tabset&&(l.detach(h,r>2),l.attach(c,h,o)),this.calculate(this._root,0)},this.createTree=()=>{const{layout:t}=this._settings;if(!t)return l.createBinaryTree(this._root,this._settings),console.log("create tree",JSON.stringify(this.jsonify())),this.updateTree();const n=[t],o=[this._root];for(;n.length;){const c=n.length;for(let h=0;h<c;h++){const r=n.shift(),a=o.shift();r&&r.children.forEach((i,d)=>{n.push(i),o.push(new m(i.type,i.weight,a??null)),a==null||a.children.push(o[o.length-1]),d!=0&&new y(i.type,o[o.length-2],o[o.length-1])})}}return this.updateTree(),this},this.updateTree=(t,n,o)=>{t&&n&&(this._root.dimension=[t,n]);const c=[this._root];for(this._bond=[],this._tabs=[];c.length;){const h=[],r=c.length;for(let a=0;a<r;a++){const i=c.shift(),d=l.getSize(i),w=l.getTotalWeight(i);let g=0,T=0,b=i.children[0];const _=i.dimension,v=i.coordinate;i&&(h.push(i.coordinate),i.type==u.Tabset&&this._tabs.push(i),i.children.forEach((p,$)=>{if(c.push(p),p.dimension=[..._],p.coordinate=[...v],p.weight=p.weight/w*100,$===i.children.length-1)p.dimension[i.type]=d-T,p.weight=100-g;else{p.weight=p.weight/w*100;const j=d*(p.weight/100);p.dimension[i.type]=j,g+=p.weight,T+=p.dimension[i.type]}p.dimension[i.type]=p.dimension[i.type],p.prev&&(p.coordinate[i.type]=b.coordinate[i.type]+b.dimension[i.type]+8,p.prev.dimension=[..._],p.prev.coordinate=[...v],p.prev.dimension[i.type]=8,p.prev.coordinate[i.type]=b.coordinate[i.type]+b.dimension[i.type],p.prev.type=1-i.type,b=p,this._bond.push(p.prev))}))}}return o&&o(),this.getElements()},this.getElements=()=>({tabs:this._tabs.map(t=>l.json(t)),bonds:this._bond.map(t=>l.json(t))}),this.jsonify=()=>l.json(this._root);let s=Object.assign({layout:null,range:1,dimension:[0,0],coordinate:[0,0],tabs:Array.from({length:e.range??1},(t,n)=>`tab-${n+1}`)},e);this._tabs=[],this._bond=[],this._settings=s,this._root=new m(u.Row,100,null),this._root.coordinate=this._settings.coordinate,this._root.dimension=this._settings.dimension,this.createTree()}calculate(e,s=0){s==0&&(this._bond=[],this._tabs=[]);const t=l.getSize(e),n=l.getTotalWeight(e);let o=e.children[0],c=0,h=0;e.type==u.Tabset&&this._tabs.push(e),e.children.forEach((r,a)=>{r.dimension=[...e.dimension],r.coordinate=[...e.coordinate],a===e.children.length-1?(r.dimension[e.type]=t-c,r.weight=100-h):(r.weight=r.weight/n*100,r.dimension[e.type]=t*(r.weight/100),h+=r.weight,c+=r.dimension[e.type]),a!==0&&(r.coordinate[e.type]=o.coordinate[e.type]+o.dimension[e.type]+8,r.prev&&(r.prev.dimension=[...e.dimension],r.prev.coordinate=[...e.coordinate],r.prev.dimension[e.type]=8,r.prev.coordinate[e.type]=o.coordinate[e.type]+o.dimension[e.type],this._bond.push(r.prev)),o=r)}),e.type==u.Tabset&&this._tabs.push(e),e.children.forEach(r=>{r.children.length&&this.calculate(r,s+1)})}}return B});
1
+ (function(I,w){typeof exports=="object"&&typeof module<"u"?w(exports):typeof define=="function"&&define.amd?define(["exports"],w):(I=typeof globalThis<"u"?globalThis:I||self,w((I.dynamix=I.dynamix||{},I.dynamix.layout=I.dynamix.layout||{},I.dynamix.layout.core={})))})(this,function(I){"use strict";class w{buffer;head=0;tail=0;count=0;capacity;constructor(t=16,e=[]){this.capacity=Math.max(t,e.length),this.buffer=new Array(this.capacity),e.forEach(i=>{this.enqueue(i)})}enqueue(t){this.count===this.capacity&&this.resize(),this.buffer[this.tail]=t,this.tail=(this.tail+1)%this.capacity,this.count++}enqueueFront(t){this.count===this.capacity&&this.resize(),this.head=(this.head-1+this.capacity)%this.capacity,this.buffer[this.head]=t,this.count++}insert(t,e){if(t<0||t>this.count)return!1;if(t===0)return this.enqueueFront(e),!0;if(t===this.count)return this.enqueue(e),!0;this.count===this.capacity&&this.resize();const i=t,n=this.count-t;return i<=n?this.shiftLeft(t,e):this.shiftRight(t,e),this.count++,!0}insertArray(t,e){if(t<0||t>this.count)return!1;if(e.length===0)return!0;if(t===0){for(let d=e.length-1;d>=0;d--)this.enqueueFront(e[d]);return!0}if(t===this.count)return e.forEach(d=>this.enqueue(d)),!0;for(;this.count+e.length>this.capacity;)this.resize();const i=t,n=this.count-t,s=e.length;return i<=n?this.shiftLeftArray(t,e):this.shiftRightArray(t,e),this.count+=s,!0}insertQueue(t,e){if(t<0||t>this.count)return!1;if(e.isEmpty())return!0;const i=e.size();if(t===0){const o=e.toArray();for(let h=o.length-1;h>=0;h--)this.enqueueFront(o[h]);return!0}if(t===this.count){for(const o of e)this.enqueue(o);return!0}for(;this.count+i>this.capacity;)this.resize();const n=e.toArray(),s=t,d=this.count-t;return s<=d?this.shiftLeftArray(t,n):this.shiftRightArray(t,n),this.count+=i,!0}push(t){this.enqueue(t)}unshift(t){this.enqueueFront(t)}dequeue(){if(this.count===0)return;const t=this.buffer[this.head];return this.head=(this.head+1)%this.capacity,this.count--,t}dequeueBack(){if(this.count===0)return;this.tail=(this.tail-1+this.capacity)%this.capacity;const t=this.buffer[this.tail];return this.count--,t}indexOf(t){for(let e=0;e<this.count;e++){const i=(this.head+e)%this.capacity;if(this.buffer[i]===t)return e}return-1}remove(t){const e=this.indexOf(t);return e===-1?!1:(this.removeAt(e),!0)}removeAt(t){if(t<0||t>=this.count)return;if(t===0)return this.dequeue();if(t===this.count-1)return this.dequeueBack();const e=(this.head+t)%this.capacity,i=this.buffer[e],n=t,s=this.count-t-1;return n<=s?this.shiftRightForRemoval(t):this.shiftLeftForRemoval(t),this.count--,i}shift(){return this.dequeue()}pop(){return this.dequeueBack()}fifoAdd(t){this.enqueue(t)}fifoRemove(){return this.dequeue()}filoAdd(t){this.enqueue(t)}filoRemove(){return this.dequeueBack()}lifoAdd(t){this.enqueueFront(t)}lifoRemove(){return this.dequeue()}liloAdd(t){this.enqueueFront(t)}liloRemove(){return this.dequeueBack()}get(t){if(t<0||t>=this.count)return;const e=(this.head+t)%this.capacity;return this.buffer[e]}set(t,e){if(t<0||t>=this.count)return!1;const i=(this.head+t)%this.capacity;return this.buffer[i]=e,!0}peek(){return this.count>0?this.buffer[this.head]:void 0}peekBack(){if(this.count===0)return;const t=(this.tail-1+this.capacity)%this.capacity;return this.buffer[t]}front(){return this.peek()}back(){return this.peekBack()}size(){return this.count}getCapacity(){return this.capacity}isEmpty(){return this.count===0}isFull(){return this.count===this.capacity}clear(){this.head=0,this.tail=0,this.count=0}toArray(){const t=[];for(let e=0;e<this.count;e++){const i=(this.head+e)%this.capacity;t.push(this.buffer[i])}return t}*[Symbol.iterator](){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*forward(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*reverse(){for(let t=this.count-1;t>=0;t--){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*entries(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield[t,this.buffer[e]]}}*keys(){for(let t=0;t<this.count;t++)yield t}*values(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}toString(){return`Queue(${this.toArray().join(", ")})`}resize(){const t=this.capacity*2,e=new Array(t);for(let i=0;i<this.count;i++){const n=(this.head+i)%this.capacity;e[i]=this.buffer[n]}this.buffer=e,this.capacity=t,this.head=0,this.tail=this.count}shiftLeft(t,e){this.head=(this.head-1+this.capacity)%this.capacity;for(let n=0;n<t;n++){const s=(this.head+1+n)%this.capacity,d=(this.head+n)%this.capacity;this.buffer[d]=this.buffer[s]}const i=(this.head+t)%this.capacity;this.buffer[i]=e}shiftRight(t,e){for(let n=this.count-1;n>=t;n--){const s=(this.head+n)%this.capacity,d=(this.head+n+1)%this.capacity;this.buffer[d]=this.buffer[s]}const i=(this.head+t)%this.capacity;this.buffer[i]=e,this.tail=(this.tail+1)%this.capacity}shiftRightForRemoval(t){for(let e=t;e>0;e--){const i=(this.head+e-1)%this.capacity,n=(this.head+e)%this.capacity;this.buffer[n]=this.buffer[i]}this.head=(this.head+1)%this.capacity}shiftLeftForRemoval(t){for(let e=t;e<this.count-1;e++){const i=(this.head+e+1)%this.capacity,n=(this.head+e)%this.capacity;this.buffer[n]=this.buffer[i]}this.tail=(this.tail-1+this.capacity)%this.capacity}shiftLeftArray(t,e){const i=e.length;this.head=(this.head-i+this.capacity)%this.capacity;for(let n=0;n<t;n++){const s=(this.head+i+n)%this.capacity,d=(this.head+n)%this.capacity;this.buffer[d]=this.buffer[s]}for(let n=0;n<i;n++){const s=(this.head+t+n)%this.capacity;this.buffer[s]=e[n]}}shiftRightArray(t,e){const i=e.length;for(let n=this.count-1;n>=t;n--){const s=(this.head+n)%this.capacity,d=(this.head+n+i)%this.capacity;this.buffer[d]=this.buffer[s]}for(let n=0;n<i;n++){const s=(this.head+t+n)%this.capacity;this.buffer[s]=e[n]}this.tail=(this.tail+i)%this.capacity}}function g(y,t=(e,i)=>e===i){let e=y;const i=new Set;let n=[];const s=()=>e,d=(f,l=!1)=>{if(l){e=f;return}t(e,f)||(e=f,i.forEach(m=>m(e)),n.forEach(m=>m(e)),n=[])},o=()=>{i.forEach(f=>f(e)),n.forEach(f=>f(e)),n=[]},h=f=>(i.add(f),()=>i.delete(f)),r=()=>new Promise(f=>{n.push(f)});return{get:s,set:d,onChange:h,nextChange:r,triggerChange:o,onChangePromise:f=>{let l=!0;return(async()=>{for(;l;){const p=await r();if(!l)break;f(p)}})(),()=>{l=!1}}}}function E(y,t){if(y.size!==t.size)return!1;for(const[e,i]of y.entries()){const n=t.get(e);if(!n||!T(i,n))return!1}return!0}function T(y,t){if(y.typNode!==t.typNode||y.nodName!==t.nodName||y.uidNode!==t.uidNode||y.nodPart!==t.nodPart)return!1;const e=y.nodDims,i=t.nodDims;return e.x===i.x&&e.y===i.y&&e.w===i.w&&e.h===i.h}class a{static cache={dimMins:new Map,mapDirs:new Map,tabCnts:new Map,mapElem:new Map,tabOpts:g(new Map,E),nodOpts:g(new Map,E),bndOpts:g(new Map,E)};kids=new w;dims={w:0,h:0,x:0,y:0};unId;next=null;prev=null;type="row";name="";part=0;host=null;open="";constructor(t={}){const e={type:"row",host:null,name:"",part:100,dims:{w:0,h:0,x:0,y:0},unId:crypto.randomUUID(),open:""};this.type=t.type??e.type,this.host=t.host??e.host,this.name=t.name??e.name,this.part=t.part??e.part,this.dims=t.dims??e.dims,this.open=t.open??e.open,this.unId=t.unId||e.unId}addBond(t,e=null){if(!e)return;const i=new O(t,this,e);a.cache.mapElem.set(i.unId,i)}getReqDimension(){const t=a.cache.dimMins.get(this.unId),e=a.cache.tabCnts.get(this.unId),i=Math.max(t.minWidth,e.horizontal*c._minW+Math.max(0,e.horizontal-1)*c._bond),n=Math.max(t.minHeight,e.vertical*c._minH+Math.max(0,e.vertical-1)*c._bond);return{width:i,height:n}}calcDimensions(){const t=a.cache.mapDirs.get(this.unId);if(!this.kids)return;let e=0;const i=a.cache.dimMins.get(this.unId)||{minWidth:0,minHeight:0};let n=0;for(const o of this.kids)e+=o.part;if(e===0)return;let s;t?s=this.dims.w-i.minWidth:s=this.dims.h-i.minHeight;let d=s;for(const o of this.kids){const h=a.cache.dimMins.get(o.unId)||{minWidth:0,minHeight:0};if(this.dims.w<i.minWidth)t?(o.dims.w=h.minWidth,o.dims.h=this.dims.h,o.dims.x=this.dims.x+n,o.dims.y=this.dims.y,n+=o.dims.w+c._bond):(o.dims.h=h.minHeight,o.dims.w=this.dims.w,o.dims.y=this.dims.y+n,o.dims.x=this.dims.x,n+=o.dims.h+c._bond);else{const r=o.part/e,u=Math.floor(s*r);if(o===this.kids.peekBack()){t?(o.dims.w=h.minWidth+d,o.dims.h=this.dims.h,o.dims.x=this.dims.x+n,o.dims.y=this.dims.y,n+=o.dims.w+c._bond):(o.dims.h=h.minHeight+d,o.dims.w=this.dims.w,o.dims.y=this.dims.y+n,o.dims.x=this.dims.x,n+=o.dims.h+c._bond);break}t?(o.dims.w=h.minWidth+u,o.dims.h=this.dims.h,o.dims.x=this.dims.x+n,o.dims.y=this.dims.y,n+=o.dims.w+c._bond):(o.dims.h=h.minHeight+u,o.dims.w=this.dims.w,o.dims.y=this.dims.y+n,o.dims.x=this.dims.x,n+=o.dims.h+c._bond),d-=u}o.next&&(t?o.next.dims={w:c._bond,h:o.dims.h,x:o.dims.x+o.dims.w,y:o.dims.y}:o.next.dims={w:o.dims.w,h:c._bond,x:o.dims.x,y:o.dims.y+o.dims.h})}}toJSON(){const t=[];for(const i of this.kids)t.push(i.toJSON());const e={typNode:this.type,nodPart:this.part,nodName:this.name,uidNode:this.unId};return this.open&&(e.nodOpen=this.open),t.length>0&&(e.nodKids=t),e}}class c{static _root;static _tree;static _minW=40;static _minH=40;static _bond=10;static _inst=null;nodeOps;cntdown=null;tabsIds=new Map;constructor(t={}){const e={tabs:[],tree:null,minW:40,minH:40,bond:10,uqid:"dynamix-layout-root",tabsIds:new Map,...t};this.tabsIds=e.tabsIds,e.tree&&(c._tree=e.tree),c._root=new a({unId:e.uqid,name:e.uqid,type:"row"}),this.nodeOps=g(new Map,E),c._minW=e.minW,c._minH=e.minH,c._bond=e.bond;const i=new w(e.tabs.length,e.tabs);c._tree?this.createNodeLayout():this.createBinaryNodeTreeFromQueue(i),c._inst=this}*JSONLayoutIterator(t){const e=new w;for(e.enqueue(t);!e.isEmpty();){const i=e.dequeue();if(i&&(yield i,i.nodKids&&i.nodKids.length>0))for(const n of i.nodKids)e.enqueue(n)}}*NodeLayoutIterator(t){const e=new w;for(e.enqueue(t);!e.isEmpty();){const i=e.dequeue();if(i&&(a.cache.mapElem.set(i.unId,i),yield i,i.kids.size()>0))for(const n of i.kids)e.enqueue(n)}}*NodeLayoutRecursiveIterator(t){for(const e of t.kids)yield*this.NodeLayoutRecursiveIterator(e);yield t}updateChildDirections(t){const e=a.cache.mapDirs.get(t.unId);if(e===void 0){console.warn(`Cannot update child directions for node ${t.unId}; its own direction is not set.`);return}for(const i of t.kids)a.cache.mapDirs.set(i.unId,!e),i.kids.size()>0&&(i.host=t,this.updateChildDirections(i),i.next&&a.cache.mapDirs.set(i.next.unId,!e))}createNodeLayout(t=c._tree){const e=this.JSONLayoutIterator(t),i=this.NodeLayoutIterator(c._root);for(a.cache.mapDirs.set(c._root.unId,!0);;){const n=e.next(),s=i.next();if(n.done||s.done)break;const d=n.value,o=s.value;!d||!o||this.createNodeTreeFromJSONTree(d,o)}this.calcTabsetCountAndMinDim()}createNodeTreeFromJSONTree(t,e){const i=a.cache.mapDirs.get(e.unId);for(const n of t.nodKids||[]){const s=this.createNodeFromJSON(n),d=e.kids.peekBack();s.host=e,s.addBond(s.host,d),e.kids.enqueue(s),a.cache.mapDirs.set(s.unId,!i)}e.type==="tabset"&&a.cache.mapElem.set(e.unId,e),e.type==="tab"&&a.cache.mapElem.set(e.unId,e)}createBinaryNodeTreeFromQueue(t,e=c._root){const i=new w;for(i.enqueue(e),a.cache.mapDirs.set(c._root.unId,!0);!t.isEmpty();){const n=i.dequeue();if(!n)break;const s=a.cache.mapDirs.get(n.unId);if(t.size()==2){const u=t.dequeue(),f=t.dequeue(),l=new a({type:"tabset",host:n}),m=new a({type:"tabset",host:n}),p=new a({type:"tab",host:l,name:u,unId:this.tabsIds.get(u??"")??crypto.randomUUID()}),N=new a({type:"tab",host:m,name:f,unId:this.tabsIds.get(f??"")??crypto.randomUUID()});l.open=p.name,m.open=N.name,l.kids.enqueue(p),m.kids.enqueue(N),n.kids.enqueue(l),n.kids.enqueue(m),m.addBond(n,l),a.cache.mapDirs.set(l.unId,!s),a.cache.mapDirs.set(m.unId,!s),a.cache.mapElem.set(l.unId,l),a.cache.mapElem.set(m.unId,m),a.cache.mapDirs.set(p.unId,s),a.cache.mapDirs.set(N.unId,s),a.cache.mapElem.set(p.unId,p),a.cache.mapElem.set(N.unId,N),console.log(this.tabsIds);break}const d=t.dequeue(),o=new a({type:"tabset",host:n}),h=new a({type:"row",host:n}),r=new a({type:"tab",host:o,name:d,unId:this.tabsIds.get(d??"")??crypto.randomUUID()});o.open=r.name,o.kids.enqueue(r),n.kids.enqueue(o),n.kids.enqueue(h),h.addBond(n,o),a.cache.mapDirs.set(o.unId,!s),a.cache.mapDirs.set(h.unId,!s),a.cache.mapElem.set(o.unId,o),a.cache.mapDirs.set(r.unId,s),a.cache.mapElem.set(r.unId,r),i.enqueue(h)}this.calcTabsetCountAndMinDim()}createNodeFromJSON(t){const e=new a({type:t.typNode,name:t.nodName,unId:t.uidNode,part:t.nodPart,dims:{w:0,h:0,x:0,y:0},open:typeof t.nodOpen=="string"?t.nodOpen:""});return t.typNode==="tab"&&(e.unId=this.tabsIds.get(t.nodName)||t.uidNode),e}calcTabsetCountAndMinDim(t=c._root,e=!0){t===c._root&&e&&(a.cache.tabCnts.clear(),a.cache.dimMins.clear(),a.cache.mapElem.clear(),a.cache.mapElem.clear(),a.cache.mapElem.clear(),a.cache.mapElem.clear(),a.cache.nodOpts.get().clear(),a.cache.bndOpts.get().clear());for(const i of this.NodeLayoutRecursiveIterator(t)){const n=a.cache.tabCnts,s=a.cache.dimMins;a.cache.mapElem.set(i.unId,i);const d=n.set(i.unId,{horizontal:0,vertical:0}).get(i.unId),o=s.set(i.unId,{minWidth:0,minHeight:0}).get(i.unId),h=a.cache.mapDirs.get(i.unId);if(i.type==="tab"&&(a.cache.mapElem.set(i.unId,i),s.set(i.unId,{minWidth:0,minHeight:0})),i.next&&a.cache.mapElem.set(i.next.unId,i.next),i.type==="tabset"&&(a.cache.mapElem.set(i.unId,i),s.set(i.unId,{minWidth:c._minW,minHeight:c._minH}),h?n.set(i.unId,{horizontal:0,vertical:1}):n.set(i.unId,{horizontal:1,vertical:0})),i.type==="row"){for(const r of i.kids){const u=n.get(r.unId),f=s.get(r.unId);u&&(d.horizontal+=u.horizontal,d.vertical+=u.vertical,h?(o.minHeight=Math.max(o.minHeight,f.minHeight),o.minWidth+=f.minWidth):(o.minHeight+=f.minHeight,o.minWidth=Math.max(o.minWidth,f.minWidth)))}h?o.minWidth+=(i.kids.size()-1)*c._bond:o.minHeight+=(i.kids.size()-1)*c._bond}}}calculateRootAdjustment(){const t=c._root.getReqDimension();let e=!1,i=c._root.dims.w,n=c._root.dims.h;return c._root.dims.w<t.width&&(i=t.width,e=!0),c._root.dims.h<t.height&&(n=t.height,e=!0),e&&(c._root.dims.w=i,c._root.dims.h=n),{adjustedW:i,adjustedH:n,wasAdjusted:e}}calcDimensions(t=c._root,e=!1){const i=new Map,n=new Map,s=new Map;t===c._root&&this.calculateRootAdjustment();for(const d of this.NodeLayoutIterator(t)){d.calcDimensions();const o=a.cache.mapDirs.get(d.unId);if(d.type==="tabset"){const h={typNode:d.type,nodName:d.name,uidNode:d.unId,nodPart:d.part,nodOpen:d.open,nodeDir:o,nodKids:Array.from(d.kids).map(r=>{const u={typNode:r.type,nodName:r.name,uidNode:r.unId,nodPart:r.part,nodOpen:d.open===r.name,nodeDir:!o,nodDims:{...d.dims}};return s.set(r.unId,u),u}),nodDims:{...d.dims}};i.set(d.unId,h)}if(d.next&&d.type!=="tab"){const h={typNode:"bond",nodName:d.name,uidNode:d.next.unId,nodeDir:o,nodPart:0,nodDims:{...d.next.dims}};n.set(d.next.unId,h)}}a.cache.nodOpts.set(i,e),a.cache.bndOpts.set(n,e),a.cache.tabOpts.set(s,e)}updateDimension(t,e=!1,i=2){if(c._root.dims=t,e){this.calcDimensions(c._root);return}this.cntdown&&(clearTimeout(this.cntdown),this.cntdown=null),this.cntdown=setTimeout(()=>{this.cntdown=null,this.calcDimensions()},i)}updateSlider(t,e,i=!1,n=2){if(i){this.updateSliderDimension(t,e);return}this.cntdown&&(clearTimeout(this.cntdown),this.cntdown=null),this.cntdown=setTimeout(()=>{this.cntdown=null,this.updateSliderDimension(t,e)},n)}updateSliderDimension(t,e){const i=a.cache.mapElem.get(t);if(!i||!(i instanceof O)){console.warn(`Bond with id ${t} not found or is not a Bond instance`);return}const n=a.cache.mapDirs.get(i.host.unId),s=i.prev,d=i.next,o=i.host;if(!s||!d||!o){console.warn("Missing prev, next, or host node",s,d,o);return}const h=a.cache.dimMins.get(s.unId)||{minWidth:0,minHeight:0},r=a.cache.dimMins.get(d.unId)||{minWidth:0,minHeight:0},u=c._bond/2;if(n){const f=d.dims.x+d.dims.w,l=s.dims.x+h.minWidth+u,m=f-r.minWidth-u,p=Math.max(l,Math.min(m,e.x));i.dims.x=p-u,s.dims.w=i.dims.x-s.dims.x,d.dims.x=p+u,d.dims.w=f-d.dims.x;const N=Math.max(0,s.dims.w-h.minWidth),x=Math.max(0,d.dims.w-r.minWidth),k=N+x,b=s.part+d.part;k>0?(s.part=N/k*b,d.part=x/k*b):(s.part=b/2,d.part=b/2)}else{const f=d.dims.y+d.dims.h,l=s.dims.y+h.minHeight+u,m=f-r.minHeight-u,p=Math.max(l,Math.min(m,e.y));i.dims.y=p-u,s.dims.h=i.dims.y-s.dims.y,d.dims.y=p+u,d.dims.h=f-d.dims.y;const N=Math.max(0,s.dims.h-h.minHeight),x=Math.max(0,d.dims.h-r.minHeight),k=N+x,b=s.part+d.part;k>0?(s.part=N/k*b,d.part=x/k*b):(s.part=b/2,d.part=b/2)}this.calcDimensions(o)}updateTree(t,e,i){const n=a.cache.mapElem.get(t);let s=a.cache.mapElem.get(e);return!n||!(n instanceof a)||!s||!(s instanceof a)?(console.warn(`Source node ${t} not found or is not a Node instance`),!1):n?.type=="tab"&&n.host===s&&s.kids.size()<2?(console.warn("Cannot move to self as it has only one tab"),!1):n?.type=="tabset"&&s?.host===n?(console.warn("Cannot move tabset to self as it is already a child"),!1):!n||!s?(console.warn(`Source or destination node not found: ${t}, ${e}`),!1):n===s?(console.warn("Source and destination nodes are the same, no action taken."),!1):!n.host||!s.host&&s.type!=="row"?(console.warn(`Source node or destination node's host is null: ${n.unId}, ${s.unId}`),!1):s.type==="row"&&i==="contain"?(console.warn(`Cannot move to a row with 'contain' layout: ${s.unId}`),!1):n.type==="row"?!1:(s.type==="tabset"&&i==="contain"&&(s=s.kids.peekBack()||s),s.type==="tab"&&(i==="contain"||i==="left"||i==="right")?this.moveNodeAsTab(n,s,i):s.type==="row"&&i!=="contain"?this.moveRelativeToRoot(n,s,i):s.type==="tabset"&&i!=="contain"&&this.moveRelativeToTabset(n,s,i),this.calcTabsetCountAndMinDim(),this.calcDimensions(c._root,!0),!0)}moveNodeAsTab(t,e,i){if(!e||!e.host){console.warn(`Destination node ${e.unId} has no host, cannot move.`);return}this.removeNode(t);const n=e.host,s=n.kids.indexOf(e);if(s===void 0||s===-1)return;const d=i==="contain"||i==="left",o=d?s:s+1,h=n.kids.get(o+1),r=n.kids.get(o-1),u=e.next,f=e.prev;if(!d&&u?(a.cache.mapElem.delete(u.unId),a.cache.nodOpts.get().delete(u.unId)):d&&f&&(a.cache.mapElem.delete(f.unId),a.cache.nodOpts.get().delete(f.unId)),t.type=="tab")d?(r&&t.addBond(n,r),e.addBond(n,t)):(t.addBond(n,e),h&&h.addBond(n,t)),n.kids.insert(o,t),t.host=n,n.open=t.name;else if(t.type=="tabset"){const l=t.kids.peek(),m=t.kids.peekBack();d?(l&&r&&l.addBond(n,r),m&&e&&e.addBond(n,m)):(l&&e&&l.addBond(n,e),m&&h&&h.addBond(n,m)),n.kids.insertQueue(o,t.kids);for(const p of t.kids)p.host=n,p.next&&(p.next.host=n);n.open=m?m.name:""}this.updateChildDirections(n)}moveRelativeToRoot(t,e,i){this.removeNode(t);const n=a.cache.mapDirs.get(e.unId),s=i==="top"||i==="left";if(t.type==="tab"){const d=new a({type:"tabset",host:e.host});d.kids.enqueue(t),t.host=d,d.open=t.name,n==!1?i==="left"||i==="right"?this.insertNodeWithNewParent(d,e,s):this.insertNode(e,d,s):i==="top"||i==="bottom"?this.insertNodeWithNewParent(d,e,s):this.insertNode(e,d,s)}else t.type==="tabset"&&(n==!1?i==="left"||i==="right"?this.insertNodeWithNewParent(t,e,s):this.insertNode(e,t,s):i==="top"||i==="bottom"?this.insertNodeWithNewParent(t,e,s):this.insertNode(e,t,s))}moveRelativeToTabset(t,e,i){this.removeNode(t);const n=a.cache.mapDirs.get(e.unId),s=i==="top"||i==="left";if(t.type==="tab"){const d=new a({type:"tabset",host:e.host});d.kids.enqueue(t),t.host=d,d.open=t.name,n==!1?i==="top"||i==="bottom"?this.insertNodeWithNewParent(d,e,s):this.insertNode(e,d,s):i==="left"||i==="right"?this.insertNodeWithNewParent(d,e,s):this.insertNode(e,d,s)}else t.type==="tabset"&&(n==!1?i==="top"||i==="bottom"?this.insertNodeWithNewParent(t,e,s):this.insertNode(e,t,s):i==="left"||i==="right"?this.insertNodeWithNewParent(t,e,s):this.insertNode(e,t,s))}insertNode(t,e,i){const n=t.host;if(t==c._root){const f=c._root.kids.peek(),l=c._root.kids.peekBack();i?(c._root.kids.enqueueFront(e),f&&f.addBond(c._root,e)):(c._root.kids.enqueue(e),l&&e.addBond(c._root,l)),e.host=c._root,this.updateChildDirections(c._root);return}if(!n){console.warn(`Destination node ${t.unId} has no host, cannot insert.`);return}const s=n.kids.indexOf(t);if(s===-1){console.warn(`Destination node ${t.unId} not found in its host's kids.`);return}const d=a.cache.mapDirs.get(n.unId);d&&a.cache.mapDirs.set(e.unId,!d);const o=n.kids.get(s+1),h=n.kids.get(s-1),r=t.next,u=t.prev;e.host=n,i?(n.kids.insert(s,e),t.addBond(n,e),h&&e.addBond(n,h),u&&(a.cache.mapElem.delete(u.unId),a.cache.nodOpts.get().delete(u.unId))):(n.kids.insert(s+1,e),e.addBond(n,t),o&&o.addBond(n,e),r&&(a.cache.mapElem.delete(r.unId),a.cache.nodOpts.get().delete(r.unId))),this.updateChildDirections(n)}insertNodeWithNewParent(t,e,i){const n=new w,s=new a({type:"tabset",host:e.host});if(!e||!t){console.warn(`Destination node ${e.unId} has no host, cannot insert.`);return}if(e===c._root){const o=new a({type:"row",host:e});if(e.kids.size()==1&&e.kids.peek()?.type==="tabset"){const h=e.kids.dequeue();if(!h){console.warn(`No kid found in destination node ${e.unId}, cannot insert.`);return}i?(o.kids.enqueue(t),o.kids.enqueue(h),e.kids.enqueue(o),h.addBond(o,t)):(o.kids.enqueue(h),o.kids.enqueue(t),t.addBond(o,h),e.kids.enqueue(o)),t.host=o,h.host=o}else if(e.kids.size()==1&&e.kids.peek()?.type==="row"){const h=e.kids.peek(),r=h?.kids.peek(),u=h?.kids.peekBack();i&&h?(h.kids.enqueueFront(t),r&&r.addBond(h,t)):h&&(h.kids.enqueue(t),u&&t.addBond(h,u)),t.host=h}else if(e.kids.size()>1){const h=new a({type:"row",host:e}),r=new a({type:"row",host:h});for(const u of e.kids)r.kids.enqueue(u),u.host=r,u.next&&(u.next.host=r);t.host=h,e.kids.clear(),i?(h.kids.enqueueFront(t),h.kids.enqueue(r),r.addBond(h,t)):(h.kids.enqueue(r),h.kids.enqueue(t),t.addBond(h,r)),e.kids.enqueue(h)}this.updateChildDirections(e);return}t.host=e,s.host=e,s.kids=e.kids,s.open=e.open;const d=a.cache.mapDirs.get(e.unId);for(const o of s.kids)o.host=s,o.next&&(o.next.host=s),a.cache.mapDirs.set(o.unId,d);for(const o of t.kids)o.host=t,o.next&&(o.next.host=t),a.cache.mapDirs.set(o.unId,d);a.cache.mapDirs.set(s.unId,!d),a.cache.mapDirs.set(t.unId,!d),i?(n.enqueue(t),n.enqueue(s),e.kids=n,e.type="row",s.addBond(e,t)):(n.enqueue(s),n.enqueue(t),e.kids=n,e.type="row",t.addBond(e,s))}moveAdjacentNodeToGrandParent(t){if(!t.host||!t.host.host){console.warn(`Source node ${t.unId} has no host, cannot move.`);return}const e=t.host,i=t.host.host,n=i.kids.indexOf(e),s=i.kids.get(n-1),d=i.kids.get(n+1),o=t.kids.peek(),h=t.kids.peekBack();this.removeKid(e);let r=n;if(t.type=="row"&&e){s&&o&&o.addBond(i,s),d&&h&&d.addBond(i,h);for(const u of t.kids)u.host=i,u.next&&(u.next.host=i),i.kids.insert(r,u),a.cache.mapDirs.set(u.unId,!a.cache.mapDirs.get(i.unId)),a.cache.dimMins.delete(u.unId),r++}else if(t.type=="tabset"){s&&t.addBond(i,s),d&&d.addBond(i,t),i.kids.insert(r,t),t.host=i,a.cache.mapDirs.set(t.unId,!a.cache.mapDirs.get(i.unId));for(const u of t.kids)a.cache.mapDirs.set(u.unId,a.cache.mapDirs.get(i.unId)),a.cache.dimMins.delete(u.unId)}}removeRelation(t,e=!0){const i=t.host,n=t.prev,s=t.next;if(t.host=null,t.next=null,t.prev=null,n&&(n.next=null),s&&(s.prev=null),!e)return t;n&&s&&n.prev&&s.next?n.prev.addBond(i,s.next):n&&n.prev?n.prev.next=null:s&&s.next&&(s.next.prev=null)}removeNode(t){if(!t.host){console.warn("Kid node has no host, cannot remove.");return}const e=t?.host,i=e?.host;if(this.removeKid(t),t.type==="tabset"&&e.kids.size()===1){const n=e.kids.peek();n&&this.moveAdjacentNodeToGrandParent(n)}else if(t.type==="tab"&&e.kids.size()===0&&i.kids.size()===2){this.removeKid(e);const n=i?.kids.peek();n&&this.moveAdjacentNodeToGrandParent(n)}else if(t.type==="tab"&&e.kids.size()===0&&i.kids.size()>2)this.removeKid(e);else if(t.type==="tab"&&e.open===t.name&&e.kids.size()>0){const n=e.kids.peek();n&&(e.open=n.name)}}removeKid(t){if(!t.host){console.warn("Kid node has no host, cannot remove.");return}const e=t.host,i=e.kids.indexOf(t),n=e.kids.get(i+1),s=e.kids.get(i-1),d=t.next,o=t.prev;if(i===-1){console.warn("Kid node not found in its host's kids.");return}d&&(a.cache.mapElem.delete(d.unId),a.cache.nodOpts.get().delete(d.unId)),o&&(a.cache.mapElem.delete(o.unId),a.cache.nodOpts.get().delete(o.unId)),n&&s?n.addBond(e,s):n?n.prev=null:s&&(s.next=null),e.kids.removeAt(i),a.cache.mapElem.delete(t.unId),a.cache.dimMins.delete(t.unId),a.cache.mapDirs.delete(t.unId),a.cache.tabCnts.delete(t.unId),t.type==="tabset"&&a.cache.mapElem.delete(t.unId),t.type==="tab"&&a.cache.mapElem.delete(t.unId),t.host=null,t.next=null,t.prev=null}clearAllCache(){a.cache.dimMins.clear(),a.cache.mapDirs.clear(),a.cache.tabCnts.clear(),a.cache.mapElem.clear(),a.cache.nodOpts.get().clear(),a.cache.bndOpts.get().clear()}}class O{dims={w:0,h:0,x:0,y:0};unId=crypto.randomUUID();next=null;prev=null;host=null;constructor(t=null,e=null,i=null){this.host=t,this.next=e,this.prev=i,this.next&&(this.next.prev=this),this.prev&&(this.prev.next=this)}toJSON(){return{nodName:this.host?.name||"",typNode:"bond",uidNode:this.unId,nodPart:0,nodOpen:"",nodKids:[]}}}(()=>{if(typeof window>"u")return;const y="color: #03A9F4; font-weight: bold; line-height: 1.2;",t="color: #E0E0E0; font-size: 12px;",e="color: #42a5f5; font-size: 12px;",i="color: #9E9E9E; font-size: 10px;",n=`
2
+ ██████╗ ██╗ ██╗ ███╗ ██╗ █████╗ ███╗ ███╗ ██████╗ ██╗ ██╗
3
+ ██╔══██╗╚██╗ ██╔╝ ████╗ ██║ ██╔══██╗ ████╗ ████║ ╚═██╔═╝ ╚██╗██╔╝
4
+ ██║ ██║ ╚████╔╝ ██╔██╗ ██║ ███████║ ██╔████╔██║ ██║ ╚███╔╝
5
+ ██║ ██║ ╚██╔╝ ██║╚██╗██║ ██╔══██║ ██║╚██╔╝██║ ██║ ██╔██╗
6
+ ██████╔╝ ██║ ██║ ╚████║ ██║ ██║ ██║ ╚═╝ ██║ ██████╗ ██╔╝ ██╗
7
+ ╚═════╝ ╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝
8
+ ██╗ █████╗ ██╗ ██╗ ██████╗ ██╗ ██╗████████╗
9
+ ██║ ██╔══██╗ ╚██╗ ██╔╝ ██╔═══██╗ ██║ ██║╚══██╔══╝
10
+ ██║ ███████║ ╚████╔╝ ██║ ██║ ██║ ██║ ██║
11
+ ██║ ██╔══██║ ╚██╔╝ ██║ ██║ ██║ ██║ ██║
12
+ ███████╗ ██║ ██║ ██║ ╚██████╔╝ ╚█████╔╝ ██║
13
+ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚════╝ ╚═╝
14
+ `;console.groupCollapsed("%cDYNAMIX LAYOUT (click to expand)","color: #03A9F4; font-weight: bold; font-size: 14px;"),console.log(`%c${n}`,y),console.log("%c A powerful, dynamic layout system 🚀",t),console.log(`%c ⚡ For docs and more info,
15
+ ⚡ visit: https://github.com/akash-aman/dynamix-layout`,e),console.log(`%cMIT License
16
+
17
+ Copyright (c) 2025 Akash Aman <sir.akashaman@gmail.com> (https://akash.cx)
18
+
19
+ Permission is hereby granted, free of charge, to any person obtaining a copy
20
+ of this software and associated documentation files (the "Software"), to deal
21
+ in the Software without restriction, including without limitation the rights
22
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
23
+ copies of the Software, and to permit persons to whom the Software is
24
+ furnished to do so, subject to the following conditions:
25
+
26
+ The above copyright notice and this permission notice shall be included in all
27
+ copies or substantial portions of the Software.
28
+
29
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
32
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
33
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
34
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
35
+ SOFTWARE.
36
+ `,i),console.groupEnd(),typeof window<"u"&&(window.__DYNAMIX_LAYOUT__={__LICENSE__:`MIT License
37
+
38
+ Copyright (c) 2025 Akash Aman <sir.akashaman@gmail.com> (https://akash.cx)
39
+
40
+ Permission is hereby granted, free of charge, to any person obtaining a copy
41
+ of this software and associated documentation files (the "Software"), to deal
42
+ in the Software without restriction, including without limitation the rights
43
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
44
+ copies of the Software, and to permit persons to whom the Software is
45
+ furnished to do so, subject to the following conditions:
46
+
47
+ The above copyright notice and this permission notice shall be included in all
48
+ copies or substantial portions of the Software.
49
+
50
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
51
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
52
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
53
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
54
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
55
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
56
+ SOFTWARE.
57
+ `,__LAYOUT__:c})})(),I.Bond=O,I.DynamixLayoutCore=c,I.Node=a,I.Queue=w,I.areNodeOptionsEqual=T,I.areNodeOptionsMapEqual=E,I.createReactiveState=g,Object.defineProperty(I,Symbol.toStringTag,{value:"Module"})});
Binary file
Binary file