@pecb-ui/components 1.1.2

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 (56) hide show
  1. package/README.md +556 -0
  2. package/esm2022/lib/components/button/button.component.mjs +171 -0
  3. package/esm2022/lib/components/card/card.component.mjs +182 -0
  4. package/esm2022/lib/components/checkbox/checkbox.component.mjs +126 -0
  5. package/esm2022/lib/components/datepicker/datepicker.component.mjs +349 -0
  6. package/esm2022/lib/components/dropdown/dropdown.component.mjs +329 -0
  7. package/esm2022/lib/components/input/input.component.mjs +321 -0
  8. package/esm2022/lib/components/pagination/pagination.component.mjs +197 -0
  9. package/esm2022/lib/components/radio/radio.component.mjs +147 -0
  10. package/esm2022/lib/components/right-modal/right-modal.component.mjs +234 -0
  11. package/esm2022/lib/components/sidebar/sidebar.component.mjs +155 -0
  12. package/esm2022/lib/components/status/status.component.mjs +50 -0
  13. package/esm2022/lib/components/tab/tab.component.mjs +151 -0
  14. package/esm2022/lib/components/table/table.component.mjs +503 -0
  15. package/esm2022/lib/components/toggle/toggle.component.mjs +126 -0
  16. package/esm2022/lib/pecb-components.module.mjs +118 -0
  17. package/esm2022/lib/services/loading.service.mjs +182 -0
  18. package/esm2022/lib/services/notification.service.mjs +144 -0
  19. package/esm2022/lib/services/theme.service.mjs +232 -0
  20. package/esm2022/lib/shared/interfaces/component.interfaces.mjs +2 -0
  21. package/esm2022/lib/shared/types/common.types.mjs +6 -0
  22. package/esm2022/lib/shared/utils/accessibility.utils.mjs +223 -0
  23. package/esm2022/lib/shared/utils/dom.utils.mjs +240 -0
  24. package/esm2022/lib/shared/utils/error.utils.mjs +277 -0
  25. package/esm2022/lib/shared/utils/string.utils.mjs +204 -0
  26. package/esm2022/pecb-ui-components.mjs +5 -0
  27. package/esm2022/public-api.mjs +53 -0
  28. package/fesm2022/pecb-ui-components.mjs +4587 -0
  29. package/fesm2022/pecb-ui-components.mjs.map +1 -0
  30. package/index.d.ts +5 -0
  31. package/lib/components/button/button.component.d.ts +130 -0
  32. package/lib/components/card/card.component.d.ts +140 -0
  33. package/lib/components/checkbox/checkbox.component.d.ts +74 -0
  34. package/lib/components/datepicker/datepicker.component.d.ts +155 -0
  35. package/lib/components/dropdown/dropdown.component.d.ts +144 -0
  36. package/lib/components/input/input.component.d.ts +215 -0
  37. package/lib/components/pagination/pagination.component.d.ts +53 -0
  38. package/lib/components/radio/radio.component.d.ts +93 -0
  39. package/lib/components/right-modal/right-modal.component.d.ts +137 -0
  40. package/lib/components/sidebar/sidebar.component.d.ts +97 -0
  41. package/lib/components/status/status.component.d.ts +19 -0
  42. package/lib/components/tab/tab.component.d.ts +102 -0
  43. package/lib/components/table/table.component.d.ts +403 -0
  44. package/lib/components/toggle/toggle.component.d.ts +74 -0
  45. package/lib/pecb-components.module.d.ts +37 -0
  46. package/lib/services/loading.service.d.ts +129 -0
  47. package/lib/services/notification.service.d.ts +136 -0
  48. package/lib/services/theme.service.d.ts +142 -0
  49. package/lib/shared/interfaces/component.interfaces.d.ts +283 -0
  50. package/lib/shared/types/common.types.d.ts +86 -0
  51. package/lib/shared/utils/accessibility.utils.d.ts +167 -0
  52. package/lib/shared/utils/dom.utils.d.ts +108 -0
  53. package/lib/shared/utils/error.utils.d.ts +191 -0
  54. package/lib/shared/utils/string.utils.d.ts +144 -0
  55. package/package.json +61 -0
  56. package/public-api.d.ts +24 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pecb-ui-components.mjs","sources":["../../../projects/ui-components/src/lib/shared/utils/dom.utils.ts","../../../projects/ui-components/src/lib/components/button/button.component.ts","../../../projects/ui-components/src/lib/components/button/button.component.html","../../../projects/ui-components/src/lib/components/card/card.component.ts","../../../projects/ui-components/src/lib/components/card/card.component.html","../../../projects/ui-components/src/lib/components/status/status.component.ts","../../../projects/ui-components/src/lib/components/status/status.component.html","../../../projects/ui-components/src/lib/components/pagination/pagination.component.ts","../../../projects/ui-components/src/lib/components/pagination/pagination.component.html","../../../projects/ui-components/src/lib/components/table/table.component.ts","../../../projects/ui-components/src/lib/components/table/table.component.html","../../../projects/ui-components/src/lib/components/tab/tab.component.ts","../../../projects/ui-components/src/lib/components/tab/tab.component.html","../../../projects/ui-components/src/lib/components/datepicker/datepicker.component.ts","../../../projects/ui-components/src/lib/components/datepicker/datepicker.component.html","../../../projects/ui-components/src/lib/components/input/input.component.ts","../../../projects/ui-components/src/lib/components/input/input.component.html","../../../projects/ui-components/src/lib/components/radio/radio.component.ts","../../../projects/ui-components/src/lib/components/radio/radio.component.html","../../../projects/ui-components/src/lib/components/checkbox/checkbox.component.ts","../../../projects/ui-components/src/lib/components/checkbox/checkbox.component.html","../../../projects/ui-components/src/lib/components/toggle/toggle.component.ts","../../../projects/ui-components/src/lib/components/toggle/toggle.component.html","../../../projects/ui-components/src/lib/components/dropdown/dropdown.component.ts","../../../projects/ui-components/src/lib/components/dropdown/dropdown.component.html","../../../projects/ui-components/src/lib/components/right-modal/right-modal.component.ts","../../../projects/ui-components/src/lib/components/right-modal/right-modal.component.html","../../../projects/ui-components/src/lib/components/sidebar/sidebar.component.ts","../../../projects/ui-components/src/lib/components/sidebar/sidebar.component.html","../../../projects/ui-components/src/lib/pecb-components.module.ts","../../../projects/ui-components/src/lib/services/notification.service.ts","../../../projects/ui-components/src/lib/services/theme.service.ts","../../../projects/ui-components/src/lib/services/loading.service.ts","../../../projects/ui-components/src/lib/shared/types/common.types.ts","../../../projects/ui-components/src/lib/shared/utils/string.utils.ts","../../../projects/ui-components/src/lib/shared/utils/accessibility.utils.ts","../../../projects/ui-components/src/lib/shared/utils/error.utils.ts","../../../projects/ui-components/src/public-api.ts","../../../projects/ui-components/src/pecb-ui-components.ts"],"sourcesContent":["/**\r\n * DOM utility functions for PECB UI Components\r\n * @module utils/dom\r\n */\r\n\r\n/**\r\n * Check if code is running in a browser environment\r\n * @returns True if running in browser\r\n */\r\nexport function isBrowser(): boolean {\r\n return typeof window !== 'undefined' && typeof document !== 'undefined';\r\n}\r\n\r\n/**\r\n * Generate a unique ID for DOM elements\r\n * @param prefix - Optional prefix for the ID\r\n * @returns A unique ID string\r\n *\r\n * @example\r\n * generateUniqueId('btn') // 'btn-a1b2c3d4'\r\n */\r\nexport function generateUniqueId(prefix = 'pecb'): string {\r\n const random = Math.random().toString(36).substring(2, 9);\r\n return `${prefix}-${random}`;\r\n}\r\n\r\n/**\r\n * Check if an element matches a CSS selector\r\n * @param element - The element to check\r\n * @param selector - The CSS selector\r\n * @returns True if the element matches\r\n */\r\nexport function matchesSelector(element: Element, selector: string): boolean {\r\n return element.matches(selector);\r\n}\r\n\r\n/**\r\n * Find the closest ancestor matching a selector\r\n * @param element - Starting element\r\n * @param selector - CSS selector to match\r\n * @returns The matching ancestor or null\r\n */\r\nexport function closestElement<T extends Element>(element: Element, selector: string): T | null {\r\n return element.closest(selector) as T | null;\r\n}\r\n\r\n/**\r\n * Check if an element is visible in the viewport\r\n * @param element - The element to check\r\n * @param partial - Whether partial visibility counts\r\n * @returns True if visible\r\n */\r\nexport function isElementVisible(element: Element, partial = true): boolean {\r\n if (!isBrowser()) return false;\r\n\r\n const rect = element.getBoundingClientRect();\r\n const windowHeight = window.innerHeight || document.documentElement.clientHeight;\r\n const windowWidth = window.innerWidth || document.documentElement.clientWidth;\r\n\r\n if (partial) {\r\n return (\r\n rect.top < windowHeight &&\r\n rect.bottom > 0 &&\r\n rect.left < windowWidth &&\r\n rect.right > 0\r\n );\r\n }\r\n\r\n return (\r\n rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n rect.bottom <= windowHeight &&\r\n rect.right <= windowWidth\r\n );\r\n}\r\n\r\n/**\r\n * Get all focusable elements within a container\r\n * @param container - The container element\r\n * @returns Array of focusable elements\r\n */\r\nexport function getFocusableElements(container: Element): HTMLElement[] {\r\n const focusableSelectors = [\r\n 'a[href]',\r\n 'area[href]',\r\n 'button:not([disabled])',\r\n 'input:not([disabled]):not([type=\"hidden\"])',\r\n 'select:not([disabled])',\r\n 'textarea:not([disabled])',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n '[contenteditable=\"true\"]'\r\n ].join(',');\r\n\r\n return Array.from(container.querySelectorAll<HTMLElement>(focusableSelectors));\r\n}\r\n\r\n/**\r\n * Trap focus within a container (useful for modals)\r\n * @param container - The container to trap focus in\r\n * @returns Cleanup function to remove the trap\r\n */\r\nexport function trapFocus(container: HTMLElement): () => void {\r\n const focusableElements = getFocusableElements(container);\r\n const firstElement = focusableElements[0];\r\n const lastElement = focusableElements[focusableElements.length - 1];\r\n\r\n const handleKeyDown = (event: KeyboardEvent): void => {\r\n if (event.key !== 'Tab') return;\r\n\r\n if (event.shiftKey) {\r\n if (document.activeElement === firstElement) {\r\n event.preventDefault();\r\n lastElement?.focus();\r\n }\r\n } else {\r\n if (document.activeElement === lastElement) {\r\n event.preventDefault();\r\n firstElement?.focus();\r\n }\r\n }\r\n };\r\n\r\n container.addEventListener('keydown', handleKeyDown);\r\n firstElement?.focus();\r\n\r\n return () => {\r\n container.removeEventListener('keydown', handleKeyDown);\r\n };\r\n}\r\n\r\n/**\r\n * Scroll an element into view smoothly\r\n * @param element - The element to scroll to\r\n * @param options - Scroll options\r\n */\r\nexport function scrollIntoView(\r\n element: Element,\r\n options: ScrollIntoViewOptions = { behavior: 'smooth', block: 'nearest' }\r\n): void {\r\n element.scrollIntoView(options);\r\n}\r\n\r\n/**\r\n * Get the scroll parent of an element\r\n * @param element - The element to find scroll parent for\r\n * @returns The scroll parent element\r\n */\r\nexport function getScrollParent(element: Element): Element | null {\r\n if (!isBrowser()) return null;\r\n\r\n let parent: Element | null = element.parentElement;\r\n\r\n while (parent) {\r\n const style = getComputedStyle(parent);\r\n const overflow = style.overflow + style.overflowY + style.overflowX;\r\n\r\n if (/auto|scroll|overlay/.test(overflow)) {\r\n return parent;\r\n }\r\n\r\n parent = parent.parentElement;\r\n }\r\n\r\n return document.scrollingElement || document.documentElement;\r\n}\r\n\r\n/**\r\n * Disable body scroll (useful for modals)\r\n * @returns Cleanup function to re-enable scroll\r\n */\r\nexport function disableBodyScroll(): () => void {\r\n if (!isBrowser()) return () => {};\r\n\r\n const scrollY = window.scrollY;\r\n const body = document.body;\r\n const originalStyles = {\r\n position: body.style.position,\r\n top: body.style.top,\r\n width: body.style.width,\r\n overflow: body.style.overflow\r\n };\r\n\r\n body.style.position = 'fixed';\r\n body.style.top = `-${scrollY}px`;\r\n body.style.width = '100%';\r\n body.style.overflow = 'hidden';\r\n\r\n return () => {\r\n body.style.position = originalStyles.position;\r\n body.style.top = originalStyles.top;\r\n body.style.width = originalStyles.width;\r\n body.style.overflow = originalStyles.overflow;\r\n window.scrollTo(0, scrollY);\r\n };\r\n}\r\n\r\n/**\r\n * Copy text to clipboard\r\n * @param text - The text to copy\r\n * @returns Promise that resolves when copied\r\n */\r\nexport async function copyToClipboard(text: string): Promise<void> {\r\n if (!isBrowser()) {\r\n throw new Error('Clipboard API not available in this environment');\r\n }\r\n\r\n if (navigator.clipboard && navigator.clipboard.writeText) {\r\n await navigator.clipboard.writeText(text);\r\n } else {\r\n // Fallback for older browsers\r\n const textArea = document.createElement('textarea');\r\n textArea.value = text;\r\n textArea.style.position = 'fixed';\r\n textArea.style.left = '-9999px';\r\n textArea.style.top = '-9999px';\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n document.execCommand('copy');\r\n document.body.removeChild(textArea);\r\n }\r\n}\r\n\r\n/**\r\n * Check if an element has a specific CSS class\r\n * @param element - The element to check\r\n * @param className - The class name\r\n * @returns True if the element has the class\r\n */\r\nexport function hasClass(element: Element, className: string): boolean {\r\n return element.classList.contains(className);\r\n}\r\n\r\n/**\r\n * Add CSS class(es) to an element\r\n * @param element - The element to modify\r\n * @param classNames - Class name(s) to add\r\n */\r\nexport function addClass(element: Element, ...classNames: string[]): void {\r\n element.classList.add(...classNames);\r\n}\r\n\r\n/**\r\n * Remove CSS class(es) from an element\r\n * @param element - The element to modify\r\n * @param classNames - Class name(s) to remove\r\n */\r\nexport function removeClass(element: Element, ...classNames: string[]): void {\r\n element.classList.remove(...classNames);\r\n}\r\n\r\n/**\r\n * Toggle a CSS class on an element\r\n * @param element - The element to modify\r\n * @param className - The class name to toggle\r\n * @param force - Optional force add (true) or remove (false)\r\n * @returns True if the class is now present\r\n */\r\nexport function toggleClass(element: Element, className: string, force?: boolean): boolean {\r\n return element.classList.toggle(className, force);\r\n}\r\n\r\n/**\r\n * Get computed CSS property value\r\n * @param element - The element to check\r\n * @param property - CSS property name\r\n * @returns The computed value\r\n */\r\nexport function getComputedStyleValue(element: Element, property: string): string {\r\n if (!isBrowser()) return '';\r\n return getComputedStyle(element).getPropertyValue(property);\r\n}\r\n","import { Component, Input, Output, EventEmitter, HostBinding } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type ButtonVariant =\r\n | 'primary'\r\n | 'primary-outline'\r\n | 'primary-2'\r\n | 'primary-2-outline'\r\n | 'neutral'\r\n | 'neutral-outline'\r\n | 'secondary'\r\n | 'text'\r\n | 'destructive'\r\n | 'destructive-outline';\r\nexport type ButtonSize = 'sm' | 'md' | 'lg';\r\nexport type ButtonIconStyle = 'none' | 'leading' | 'trailing' | 'icon-only';\r\n\r\n/**\r\n * A professional button component with multiple variants and sizes.\r\n * Fully accessible with WCAG 2.1 AA compliance.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-button variant=\"primary\" size=\"md\" (clicked)=\"handleClick()\">\r\n * Click me\r\n * </pecb-button>\r\n *\r\n * <!-- With leading icon -->\r\n * <pecb-button variant=\"primary\" iconStyle=\"leading\" icon=\"+\">\r\n * Add Item\r\n * </pecb-button>\r\n *\r\n * <!-- Icon only button -->\r\n * <pecb-button variant=\"secondary\" iconStyle=\"icon-only\" icon=\"+\" ariaLabel=\"Add item\"></pecb-button>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-button',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './button.component.html',\r\n styleUrls: ['./button.component.scss']\r\n})\r\nexport class ButtonComponent {\r\n /**\r\n * Unique ID for the button element\r\n */\r\n @Input() id: string = generateUniqueId('btn');\r\n\r\n /**\r\n * The visual style variant of the button\r\n */\r\n @Input() variant: ButtonVariant = 'primary';\r\n\r\n /**\r\n * The size of the button\r\n */\r\n @Input() size: ButtonSize = 'md';\r\n\r\n /**\r\n * Icon placement style\r\n */\r\n @Input() iconStyle: ButtonIconStyle = 'none';\r\n\r\n /**\r\n * Icon to display (used with iconStyle)\r\n */\r\n @Input() icon?: string;\r\n\r\n /**\r\n * Whether the button is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Whether the button should take full width\r\n */\r\n @Input() fullWidth = false;\r\n\r\n /**\r\n * Whether the button is in loading state\r\n */\r\n @Input() loading = false;\r\n\r\n /**\r\n * Button type attribute\r\n */\r\n @Input() type: 'button' | 'submit' | 'reset' = 'button';\r\n\r\n // --- ARIA Accessibility Properties ---\r\n\r\n /**\r\n * Accessible label for the button (required for icon-only buttons)\r\n */\r\n @Input() ariaLabel?: string;\r\n\r\n /**\r\n * ID of element that labels this button\r\n */\r\n @Input() ariaLabelledBy?: string;\r\n\r\n /**\r\n * ID of element that describes this button\r\n */\r\n @Input() ariaDescribedBy?: string;\r\n\r\n /**\r\n * Indicates the button controls an expandable element\r\n */\r\n @Input() ariaExpanded?: boolean;\r\n\r\n /**\r\n * Indicates the pressed state for toggle buttons\r\n */\r\n @Input() ariaPressed?: boolean;\r\n\r\n /**\r\n * Indicates the button opens a popup (menu, listbox, dialog, etc.)\r\n */\r\n @Input() ariaHasPopup?: boolean | 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog';\r\n\r\n /**\r\n * ID of the element controlled by this button\r\n */\r\n @Input() ariaControls?: string;\r\n\r\n /**\r\n * Event emitted when the button is clicked\r\n */\r\n @Output() clicked = new EventEmitter<MouseEvent>();\r\n\r\n /**\r\n * Host binding for the component's ID\r\n */\r\n @HostBinding('attr.id') get hostId(): null {\r\n return null; // ID is on the button element, not the host\r\n }\r\n\r\n /**\r\n * Get CSS classes for the button\r\n */\r\n get buttonClasses(): string[] {\r\n return [\r\n 'pecb-button',\r\n `pecb-button--${this.variant}`,\r\n `pecb-button--${this.size}`,\r\n this.iconStyle !== 'none' ? `pecb-button--icon-${this.iconStyle}` : '',\r\n this.fullWidth ? 'pecb-button--full-width' : '',\r\n this.loading ? 'pecb-button--loading' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Check if we should show leading icon\r\n */\r\n get showLeadingIcon(): boolean {\r\n return this.iconStyle === 'leading' && !!this.icon && !this.loading;\r\n }\r\n\r\n /**\r\n * Check if we should show trailing icon\r\n */\r\n get showTrailingIcon(): boolean {\r\n return this.iconStyle === 'trailing' && !!this.icon && !this.loading;\r\n }\r\n\r\n /**\r\n * Check if this is icon-only button\r\n */\r\n get isIconOnly(): boolean {\r\n return this.iconStyle === 'icon-only';\r\n }\r\n\r\n /**\r\n * Get the loading announcement text for screen readers\r\n */\r\n get loadingText(): string {\r\n return 'Loading, please wait';\r\n }\r\n\r\n /**\r\n * Handle button click\r\n */\r\n onClick(event: MouseEvent): void {\r\n if (!this.disabled && !this.loading) {\r\n this.clicked.emit(event);\r\n }\r\n }\r\n\r\n /**\r\n * Handle keyboard events for accessibility\r\n */\r\n onKeyDown(event: KeyboardEvent): void {\r\n // Allow Enter and Space to trigger click\r\n if ((event.key === 'Enter' || event.key === ' ') && !this.disabled && !this.loading) {\r\n event.preventDefault();\r\n this.clicked.emit(event as unknown as MouseEvent);\r\n }\r\n }\r\n}\r\n","<button\r\n [id]=\"id\"\r\n [type]=\"type\"\r\n [disabled]=\"disabled || loading\"\r\n [class]=\"buttonClasses.join(' ')\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy\"\r\n [attr.aria-describedby]=\"ariaDescribedBy\"\r\n [attr.aria-expanded]=\"ariaExpanded !== undefined ? ariaExpanded : null\"\r\n [attr.aria-pressed]=\"ariaPressed !== undefined ? ariaPressed : null\"\r\n [attr.aria-haspopup]=\"ariaHasPopup\"\r\n [attr.aria-controls]=\"ariaControls\"\r\n [attr.aria-busy]=\"loading ? true : null\"\r\n [attr.aria-disabled]=\"disabled ? true : null\"\r\n (click)=\"onClick($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n>\r\n <span class=\"pecb-button__content\">\r\n <!-- Loading spinner with screen reader announcement -->\r\n <span *ngIf=\"loading\" class=\"pecb-button__spinner\" aria-hidden=\"true\"></span>\r\n <span *ngIf=\"loading\" class=\"pecb-button__sr-only\">{{ loadingText }}</span>\r\n\r\n <!-- Leading icon -->\r\n <span\r\n *ngIf=\"showLeadingIcon\"\r\n class=\"pecb-button__icon pecb-button__icon--leading\"\r\n aria-hidden=\"true\"\r\n >\r\n {{ icon }}\r\n </span>\r\n\r\n <!-- Icon only -->\r\n <span\r\n *ngIf=\"isIconOnly && icon && !loading\"\r\n class=\"pecb-button__icon\"\r\n aria-hidden=\"true\"\r\n >\r\n {{ icon }}\r\n </span>\r\n\r\n <!-- Button text content (hidden for icon-only) -->\r\n <span *ngIf=\"!isIconOnly\" class=\"pecb-button__text\">\r\n <ng-content></ng-content>\r\n </span>\r\n\r\n <!-- Trailing icon -->\r\n <span\r\n *ngIf=\"showTrailingIcon\"\r\n class=\"pecb-button__icon pecb-button__icon--trailing\"\r\n aria-hidden=\"true\"\r\n >\r\n {{ icon }}\r\n </span>\r\n </span>\r\n</button>\r\n","import { Component, Input } from '@angular/core';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type CardElevation = 'none' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Semantic role for the card component\r\n */\r\nexport type CardRole = 'article' | 'region' | 'group' | 'listitem' | 'none';\r\n\r\n/**\r\n * A professional card component for displaying content in a contained format.\r\n * Fully accessible with WCAG 2.1 AA compliance.\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Basic card -->\r\n * <pecb-card elevation=\"md\">\r\n * <pecb-card-header>\r\n * <h3>Card Title</h3>\r\n * </pecb-card-header>\r\n * <pecb-card-body>\r\n * <p>Card content goes here</p>\r\n * </pecb-card-body>\r\n * </pecb-card>\r\n *\r\n * <!-- Accessible card with region role -->\r\n * <pecb-card role=\"region\" ariaLabel=\"Product Information\">\r\n * <pecb-card-body>\r\n * <p>Product details...</p>\r\n * </pecb-card-body>\r\n * </pecb-card>\r\n *\r\n * <!-- Card as article -->\r\n * <pecb-card role=\"article\" ariaLabelledBy=\"article-title\">\r\n * <pecb-card-header>\r\n * <h2 id=\"article-title\">Article Headline</h2>\r\n * </pecb-card-header>\r\n * <pecb-card-body>\r\n * <p>Article content...</p>\r\n * </pecb-card-body>\r\n * </pecb-card>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-card',\r\n standalone: true,\r\n templateUrl: './card.component.html',\r\n styleUrls: ['./card.component.scss']\r\n})\r\nexport class CardComponent {\r\n /**\r\n * Unique ID for the card element\r\n */\r\n @Input() id: string = generateUniqueId('card');\r\n\r\n /**\r\n * The elevation level (shadow depth) of the card\r\n */\r\n @Input() elevation: CardElevation = 'md';\r\n\r\n /**\r\n * Whether the card should be hoverable with elevation change\r\n */\r\n @Input() hoverable = false;\r\n\r\n /**\r\n * Whether to add padding to the card\r\n */\r\n @Input() noPadding = false;\r\n\r\n // --- ARIA Accessibility Properties ---\r\n\r\n /**\r\n * Semantic role for the card (article, region, group, listitem, or none)\r\n * Use 'article' for self-contained content, 'region' for significant sections\r\n */\r\n @Input() role: CardRole = 'none';\r\n\r\n /**\r\n * Accessible label for the card\r\n */\r\n @Input() ariaLabel?: string;\r\n\r\n /**\r\n * ID of element that labels this card\r\n */\r\n @Input() ariaLabelledBy?: string;\r\n\r\n /**\r\n * ID of element that describes this card\r\n */\r\n @Input() ariaDescribedBy?: string;\r\n\r\n /**\r\n * Get CSS classes for the card\r\n */\r\n get cardClasses(): string[] {\r\n return [\r\n 'pecb-card',\r\n `pecb-card--elevation-${this.elevation}`,\r\n this.hoverable ? 'pecb-card--hoverable' : '',\r\n this.noPadding ? 'pecb-card--no-padding' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Get the role attribute value\r\n */\r\n get roleAttribute(): string | null {\r\n return this.role !== 'none' ? this.role : null;\r\n }\r\n}\r\n\r\n/**\r\n * Card header component for displaying title and actions.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-card-header>\r\n * <h3>Card Title</h3>\r\n * </pecb-card-header>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-card-header',\r\n standalone: true,\r\n template: `\r\n <div class=\"pecb-card__header\" role=\"heading\" [attr.aria-level]=\"headingLevel\">\r\n <ng-content></ng-content>\r\n </div>\r\n `,\r\n styleUrls: ['./card.component.scss']\r\n})\r\nexport class CardHeaderComponent {\r\n /**\r\n * Heading level for accessibility (1-6)\r\n * Only used if the header content doesn't contain a heading element\r\n */\r\n @Input() headingLevel: number | null = null;\r\n}\r\n\r\n/**\r\n * Card body component for main content.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-card-body>\r\n * <p>Card content goes here</p>\r\n * </pecb-card-body>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-card-body',\r\n standalone: true,\r\n template: '<div class=\"pecb-card__body\"><ng-content></ng-content></div>',\r\n styleUrls: ['./card.component.scss']\r\n})\r\nexport class CardBodyComponent {}\r\n\r\n/**\r\n * Card footer component for actions and additional information.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-card-footer>\r\n * <button>Action</button>\r\n * </pecb-card-footer>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-card-footer',\r\n standalone: true,\r\n template: '<div class=\"pecb-card__footer\"><ng-content></ng-content></div>',\r\n styleUrls: ['./card.component.scss']\r\n})\r\nexport class CardFooterComponent {}\r\n","<div\r\n [id]=\"id\"\r\n [class]=\"cardClasses.join(' ')\"\r\n [attr.role]=\"roleAttribute\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy\"\r\n [attr.aria-describedby]=\"ariaDescribedBy\"\r\n>\r\n <ng-content></ng-content>\r\n</div>\r\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport type StatusType = 'warning' | 'action' | 'success' | 'error' | 'different' | 'disabled' | 'neutral';\r\nexport type StatusVariant = 'accent' | 'filled' | 'outline' | 'custom';\r\nexport type StatusSize = 'sm' | 'md' | 'lg';\r\n\r\n@Component({\r\n selector: 'pecb-status',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './status.component.html',\r\n styleUrls: ['./status.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class StatusComponent {\r\n private _id = `status-${Math.random().toString(36).substring(2, 9)}`;\r\n\r\n @Input() type: StatusType = 'neutral';\r\n @Input() variant: StatusVariant = 'filled';\r\n @Input() size: StatusSize = 'md';\r\n @Input() ariaLabel?: string;\r\n\r\n /** Text content to display (alternative to ng-content, useful for dynamic components) */\r\n @Input() text?: string;\r\n\r\n /** Custom CSS class(es) to add to the status element */\r\n @Input() customClass?: string;\r\n\r\n get id(): string {\r\n return this._id;\r\n }\r\n\r\n get statusClasses(): string[] {\r\n const classes = [\r\n 'pecb-status',\r\n `pecb-status--${this.size}`\r\n ];\r\n\r\n // Only add type and variant classes if not using custom variant\r\n if (this.variant !== 'custom') {\r\n classes.push(`pecb-status--${this.type}`);\r\n classes.push(`pecb-status--${this.variant}`);\r\n }\r\n\r\n // Add custom class if provided\r\n if (this.customClass) {\r\n classes.push(...this.customClass.split(' ').filter(c => c.trim()));\r\n }\r\n\r\n return classes;\r\n }\r\n}\r\n","<span\r\n [id]=\"id\"\r\n [ngClass]=\"statusClasses\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n role=\"status\"\r\n>\r\n <ng-content></ng-content>{{ text }}\r\n</span>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n OnChanges,\r\n SimpleChanges,\r\n HostListener,\r\n ElementRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nexport type PaginationSize = 'sm' | 'md' | 'lg';\r\nexport type PaginationVariant = 'full' | 'compact' | 'minimal' | 'centered';\r\n\r\nexport interface PageChangeEvent {\r\n page: number;\r\n pageSize: number;\r\n startIndex: number;\r\n endIndex: number;\r\n}\r\n\r\n@Component({\r\n selector: 'pecb-pagination',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './pagination.component.html',\r\n styleUrls: ['./pagination.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PaginationComponent implements OnChanges {\r\n @Input() totalItems = 0;\r\n @Input() pageSize = 10;\r\n @Input() currentPage = 1;\r\n @Input() pageSizeOptions: number[] = [10, 25, 50, 75];\r\n @Input() size: PaginationSize = 'md';\r\n @Input() variant: PaginationVariant = 'full';\r\n @Input() showPageSizeSelector = true;\r\n @Input() showItemsInfo = true;\r\n @Input() maxVisiblePages = 3;\r\n @Input() disabled = false;\r\n\r\n @Input('aria-label') ariaLabel = 'Pagination';\r\n\r\n @Output() pageChange = new EventEmitter<PageChangeEvent>();\r\n @Output() pageSizeChange = new EventEmitter<number>();\r\n\r\n totalPages = 0;\r\n visiblePages: (number | string)[] = [];\r\n isDropdownOpen = false;\r\n\r\n constructor(private elementRef: ElementRef) {}\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (this.isDropdownOpen && !this.elementRef.nativeElement.contains(event.target)) {\r\n this.isDropdownOpen = false;\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['totalItems'] || changes['pageSize'] || changes['currentPage']) {\r\n this.calculateTotalPages();\r\n this.updateVisiblePages();\r\n }\r\n }\r\n\r\n get containerClasses(): string[] {\r\n return [\r\n 'pecb-pagination',\r\n `pecb-pagination--${this.size}`,\r\n `pecb-pagination--${this.variant}`,\r\n this.disabled ? 'pecb-pagination--disabled' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n get showPages(): boolean {\r\n return this.variant === 'full' || this.variant === 'compact';\r\n }\r\n\r\n get showPageSize(): boolean {\r\n return this.variant === 'full' && this.showPageSizeSelector;\r\n }\r\n\r\n get itemsInfoText(): string {\r\n if (this.variant === 'minimal' || this.variant === 'centered') {\r\n return `Showing ${this.startIndex}-${this.endIndex} of ${this.totalItems}`;\r\n }\r\n return `${this.startIndex}-${this.endIndex} of ${this.totalItems} items`;\r\n }\r\n\r\n get startIndex(): number {\r\n if (this.totalItems === 0) return 0;\r\n return (this.currentPage - 1) * this.pageSize + 1;\r\n }\r\n\r\n get endIndex(): number {\r\n return Math.min(this.currentPage * this.pageSize, this.totalItems);\r\n }\r\n\r\n get canGoPrevious(): boolean {\r\n return this.currentPage > 1 && !this.disabled;\r\n }\r\n\r\n get canGoNext(): boolean {\r\n return this.currentPage < this.totalPages && !this.disabled;\r\n }\r\n\r\n private calculateTotalPages(): void {\r\n this.totalPages = Math.ceil(this.totalItems / this.pageSize);\r\n if (this.currentPage > this.totalPages && this.totalPages > 0) {\r\n this.goToPage(this.totalPages);\r\n }\r\n }\r\n\r\n private updateVisiblePages(): void {\r\n const pages: (number | string)[] = [];\r\n\r\n if (this.totalPages <= this.maxVisiblePages + 2) {\r\n for (let i = 1; i <= this.totalPages; i++) {\r\n pages.push(i);\r\n }\r\n } else {\r\n pages.push(1);\r\n\r\n if (this.currentPage <= this.maxVisiblePages) {\r\n for (let i = 2; i <= this.maxVisiblePages + 1; i++) {\r\n pages.push(i);\r\n }\r\n pages.push('...');\r\n pages.push(this.totalPages);\r\n } else if (this.currentPage >= this.totalPages - this.maxVisiblePages + 1) {\r\n pages.push('...');\r\n for (let i = this.totalPages - this.maxVisiblePages; i <= this.totalPages; i++) {\r\n pages.push(i);\r\n }\r\n } else {\r\n pages.push('...');\r\n for (let i = this.currentPage - 1; i <= this.currentPage + 1; i++) {\r\n pages.push(i);\r\n }\r\n pages.push('...');\r\n pages.push(this.totalPages);\r\n }\r\n }\r\n\r\n this.visiblePages = pages;\r\n }\r\n\r\n goToPage(page: number): void {\r\n if (this.disabled || page < 1 || page > this.totalPages || page === this.currentPage) {\r\n return;\r\n }\r\n\r\n this.currentPage = page;\r\n this.updateVisiblePages();\r\n this.emitPageChange();\r\n }\r\n\r\n goToPrevious(): void {\r\n if (this.canGoPrevious) {\r\n this.goToPage(this.currentPage - 1);\r\n }\r\n }\r\n\r\n goToNext(): void {\r\n if (this.canGoNext) {\r\n this.goToPage(this.currentPage + 1);\r\n }\r\n }\r\n\r\n onPageSizeChange(newSize: number): void {\r\n if (this.disabled) return;\r\n\r\n this.pageSize = newSize;\r\n this.currentPage = 1;\r\n this.calculateTotalPages();\r\n this.updateVisiblePages();\r\n this.isDropdownOpen = false;\r\n this.pageSizeChange.emit(newSize);\r\n this.emitPageChange();\r\n }\r\n\r\n toggleDropdown(): void {\r\n if (!this.disabled) {\r\n this.isDropdownOpen = !this.isDropdownOpen;\r\n }\r\n }\r\n\r\n closeDropdown(): void {\r\n this.isDropdownOpen = false;\r\n }\r\n\r\n private emitPageChange(): void {\r\n this.pageChange.emit({\r\n page: this.currentPage,\r\n pageSize: this.pageSize,\r\n startIndex: this.startIndex,\r\n endIndex: this.endIndex\r\n });\r\n }\r\n\r\n isNumber(value: number | string): boolean {\r\n return typeof value === 'number';\r\n }\r\n\r\n trackByPage(index: number, page: number | string): number | string {\r\n return typeof page === 'number' ? page : `ellipsis-${index}`;\r\n }\r\n}","<nav\r\n [class]=\"containerClasses.join(' ')\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n role=\"navigation\"\r\n>\r\n <!-- V4: Centered variant - prev button on left -->\r\n <button\r\n *ngIf=\"variant === 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--prev pecb-pagination__nav-button--bordered\"\r\n [disabled]=\"!canGoPrevious\"\r\n [attr.aria-label]=\"'Go to previous page'\"\r\n (click)=\"goToPrevious()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M10 12L6 8L10 4\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <!-- Info section (V1, V2, V3, V4) -->\r\n <div class=\"pecb-pagination__info\" *ngIf=\"showItemsInfo || showPageSize\">\r\n <span *ngIf=\"showItemsInfo\" class=\"pecb-pagination__items-text\">\r\n {{ itemsInfoText }}\r\n </span>\r\n\r\n <!-- Page size dropdown (V1 only) -->\r\n <div *ngIf=\"showPageSize\" class=\"pecb-pagination__page-size\">\r\n <span class=\"pecb-pagination__page-size-label\">Items per page:</span>\r\n <div class=\"pecb-pagination__dropdown\">\r\n <button\r\n type=\"button\"\r\n class=\"pecb-pagination__dropdown-trigger\"\r\n [class.pecb-pagination__dropdown-trigger--open]=\"isDropdownOpen\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n aria-haspopup=\"listbox\"\r\n (click)=\"toggleDropdown()\"\r\n >\r\n <span>{{ pageSize }}</span>\r\n <svg\r\n class=\"pecb-pagination__dropdown-icon\"\r\n [class.pecb-pagination__dropdown-icon--open]=\"isDropdownOpen\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M4 6L8 10L12 6\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <ul\r\n *ngIf=\"isDropdownOpen\"\r\n class=\"pecb-pagination__dropdown-menu\"\r\n role=\"listbox\"\r\n [attr.aria-label]=\"'Select items per page'\"\r\n >\r\n <li\r\n *ngFor=\"let option of pageSizeOptions\"\r\n class=\"pecb-pagination__dropdown-item\"\r\n [class.pecb-pagination__dropdown-item--selected]=\"option === pageSize\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"option === pageSize\"\r\n (click)=\"onPageSizeChange(option)\"\r\n >\r\n {{ option }}\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Controls section -->\r\n <div class=\"pecb-pagination__controls\">\r\n <!-- Previous button (V1, V2, V3) -->\r\n <button\r\n *ngIf=\"variant !== 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--prev\"\r\n [class.pecb-pagination__nav-button--bordered]=\"variant === 'minimal'\"\r\n [disabled]=\"!canGoPrevious\"\r\n [attr.aria-label]=\"'Go to previous page'\"\r\n (click)=\"goToPrevious()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M10 12L6 8L10 4\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <!-- Page numbers (V1, V2) -->\r\n <div *ngIf=\"showPages\" class=\"pecb-pagination__pages\" role=\"group\" aria-label=\"Page navigation\">\r\n <ng-container *ngFor=\"let page of visiblePages; trackBy: trackByPage\">\r\n <button\r\n *ngIf=\"isNumber(page)\"\r\n type=\"button\"\r\n class=\"pecb-pagination__page-button\"\r\n [class.pecb-pagination__page-button--active]=\"page === currentPage\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"'Page ' + page\"\r\n [attr.aria-current]=\"page === currentPage ? 'page' : null\"\r\n (click)=\"goToPage(+page)\"\r\n >\r\n {{ page }}\r\n </button>\r\n <span\r\n *ngIf=\"!isNumber(page)\"\r\n class=\"pecb-pagination__ellipsis\"\r\n aria-hidden=\"true\"\r\n >\r\n {{ page }}\r\n </span>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Next button (V1, V2, V3) -->\r\n <button\r\n *ngIf=\"variant !== 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--next\"\r\n [class.pecb-pagination__nav-button--bordered]=\"variant === 'minimal'\"\r\n [disabled]=\"!canGoNext\"\r\n [attr.aria-label]=\"'Go to next page'\"\r\n (click)=\"goToNext()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M6 4L10 8L6 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <!-- V4: Centered variant - next button on right -->\r\n <button\r\n *ngIf=\"variant === 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--next pecb-pagination__nav-button--bordered\"\r\n [disabled]=\"!canGoNext\"\r\n [attr.aria-label]=\"'Go to next page'\"\r\n (click)=\"goToNext()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M6 4L10 8L6 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n</nav>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ContentChild,\r\n TemplateRef,\r\n Type,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { PageChangeEvent, PaginationComponent } from '../pagination/pagination.component';\r\nimport { StatusComponent } from '../status/status.component';\r\n\r\n/**\r\n * Defines the available table sizes\r\n */\r\nexport type TableSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * Defines the available table variants\r\n */\r\nexport type TableVariant = 'default' | 'striped' | 'bordered';\r\n\r\n/**\r\n * Defines built-in column types\r\n */\r\nexport type PecbTableColumnType = 'text' | 'status' | 'action' | 'user' | 'custom';\r\n\r\n/**\r\n * Defines built-in component names for columns\r\n */\r\nexport type PecbTableColumnComponent = 'status' | 'action' | 'user';\r\n\r\n/**\r\n * Action button definition for action columns\r\n */\r\nexport interface TableAction {\r\n /** Unique identifier for the action */\r\n id: string;\r\n /** Icon name or type */\r\n icon: 'view' | 'edit' | 'delete' | 'download' | 'copy' | 'custom';\r\n /** Tooltip/title text */\r\n tooltip?: string;\r\n /** Custom icon SVG (when icon is 'custom') */\r\n customIcon?: string;\r\n /** Whether the action is disabled */\r\n disabled?: boolean;\r\n /** Variant for styling (e.g., 'danger' for delete) */\r\n variant?: 'default' | 'danger';\r\n /** Click handler for this specific action */\r\n action?: (row: any, index: number) => void;\r\n}\r\n\r\n/**\r\n * Status mapping configuration\r\n */\r\nexport interface TableStatusConfig {\r\n /** Map of value to status type */\r\n typeMap?: Record<string, string>;\r\n /** Status variant */\r\n variant?: 'accent' | 'filled' | 'outline';\r\n /** Status size */\r\n size?: 'sm' | 'md' | 'lg';\r\n}\r\n\r\n/**\r\n * User cell configuration\r\n */\r\nexport interface TableUserConfig {\r\n /** Key for the avatar/image URL */\r\n avatarKey?: string;\r\n /** Key for the name */\r\n nameKey?: string;\r\n /** Key for the secondary text (e.g., email) */\r\n secondaryKey?: string;\r\n}\r\n\r\n/**\r\n * Column definition for the table\r\n */\r\nexport interface PecbTableColumn {\r\n /** Unique key for the column, used to access data */\r\n key: string;\r\n /** Display label for the column header */\r\n label: string;\r\n /** Width of the column (e.g., '200px', '20%', 'auto') */\r\n width?: string;\r\n /** Alignment of the column content */\r\n align?: 'left' | 'center' | 'right';\r\n /** Whether the column is sortable */\r\n sortable?: boolean;\r\n /** Custom template reference for cell content */\r\n cellTemplate?: TemplateRef<any>;\r\n /** Custom template reference for header content */\r\n headerTemplate?: TemplateRef<any>;\r\n /** CSS class to apply to the column */\r\n cssClass?: string;\r\n /** Built-in column type (deprecated, use 'component' instead) */\r\n type?: PecbTableColumnType;\r\n /** Built-in component to render: 'status', 'action', 'user' */\r\n component?: PecbTableColumnComponent;\r\n /** Dynamic component class to render in the cell (e.g., StatusComponent) */\r\n dynamicComponent?: Type<any>;\r\n /** Inputs to pass to the dynamic component */\r\n componentInputs?: Record<string, any>;\r\n /** Function to generate dynamic inputs based on row data */\r\n componentInputsFn?: (row: any, value: any, index: number) => Record<string, any>;\r\n /** Action buttons configuration (when component is 'action') */\r\n actions?: TableAction[];\r\n /** Status configuration (when component is 'status') */\r\n statusConfig?: TableStatusConfig;\r\n /** User cell configuration (when component is 'user') */\r\n userConfig?: TableUserConfig;\r\n}\r\n\r\n/**\r\n * Sort event emitted when a sortable column is clicked\r\n */\r\nexport interface TableSortEvent {\r\n /** Column key that was sorted */\r\n column: string;\r\n /** Sort direction */\r\n direction: 'asc' | 'desc' | null;\r\n}\r\n\r\n/**\r\n * Row action event emitted when an action button is clicked\r\n */\r\nexport interface TableRowActionEvent {\r\n /** Type of action performed */\r\n action: string;\r\n /** Row data for the action */\r\n row: any;\r\n /** Row index */\r\n index: number;\r\n}\r\n\r\n/**\r\n * Row selection event emitted when rows are selected/deselected\r\n */\r\nexport interface TableSelectionEvent {\r\n /** Selected rows data */\r\n selectedRows: any[];\r\n /** Selected row indices */\r\n selectedIndices: number[];\r\n}\r\n\r\n/**\r\n * Table component for displaying tabular data with pagination support.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-table\r\n * [columns]=\"columns\"\r\n * [data]=\"tableData\"\r\n * [showPagination]=\"true\"\r\n * [totalItems]=\"500\"\r\n * [pageSize]=\"15\"\r\n * (pageChange)=\"onPageChange($event)\"\r\n * (rowAction)=\"onRowAction($event)\">\r\n * </pecb-table>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'pecb-table',\r\n standalone: true,\r\n imports: [CommonModule, PaginationComponent, StatusComponent],\r\n templateUrl: './table.component.html',\r\n styleUrls: ['./table.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TableComponent {\r\n constructor(private sanitizer: DomSanitizer) {}\r\n\r\n /**\r\n * Column definitions for the table\r\n */\r\n @Input() columns: PecbTableColumn[] = [];\r\n\r\n /**\r\n * Data array to display in the table\r\n */\r\n @Input() data: any[] = [];\r\n\r\n /**\r\n * Size variant of the table\r\n * @default 'md'\r\n */\r\n @Input() size: TableSize = 'md';\r\n\r\n /**\r\n * Visual variant of the table\r\n * @default 'default'\r\n */\r\n @Input() variant: TableVariant = 'default';\r\n\r\n /**\r\n * Whether to show the table header\r\n * @default true\r\n */\r\n @Input() showHeader = true;\r\n\r\n /**\r\n * Whether to enable row hover effect\r\n * @default true\r\n */\r\n @Input() hoverable = true;\r\n\r\n /**\r\n * Whether to show pagination\r\n * @default true\r\n */\r\n @Input() showPagination = true;\r\n\r\n /**\r\n * Total number of items for pagination\r\n */\r\n @Input() totalItems = 0;\r\n\r\n /**\r\n * Current page number (1-based)\r\n * @default 1\r\n */\r\n @Input() currentPage = 1;\r\n\r\n /**\r\n * Number of items per page\r\n * @default 15\r\n */\r\n @Input() pageSize = 15;\r\n\r\n /**\r\n * Available page size options\r\n */\r\n @Input() pageSizeOptions: number[] = [10, 15, 25, 50];\r\n\r\n /**\r\n * Whether to show page size selector in pagination\r\n * @default true\r\n */\r\n @Input() showPageSizeSelector = true;\r\n\r\n /**\r\n * Pagination variant\r\n * @default 'full'\r\n */\r\n @Input() paginationVariant: 'full' | 'compact' | 'minimal' | 'centered' = 'full';\r\n\r\n /**\r\n * Message to display when there is no data\r\n */\r\n @Input() emptyMessage = 'There are no entries yet.';\r\n\r\n /**\r\n * Whether to show loading state\r\n * @default false\r\n */\r\n @Input() loading = false;\r\n\r\n /**\r\n * Whether to enable row selection\r\n * @default false\r\n */\r\n @Input() selectable = false;\r\n\r\n /**\r\n * Currently selected row indices\r\n */\r\n @Input() selectedIndices: number[] = [];\r\n\r\n /**\r\n * Whether the table has a fixed header\r\n * @default false\r\n */\r\n @Input() stickyHeader = false;\r\n\r\n /**\r\n * Maximum height of the table body (enables scrolling)\r\n */\r\n @Input() maxHeight?: string;\r\n\r\n /**\r\n * Column key currently being sorted\r\n */\r\n @Input() sortColumn?: string;\r\n\r\n /**\r\n * Current sort direction\r\n */\r\n @Input() sortDirection: 'asc' | 'desc' | null = null;\r\n\r\n /**\r\n * ARIA label for the table\r\n */\r\n @Input('aria-label') ariaLabel = 'Data table';\r\n\r\n /**\r\n * Emitted when a page change occurs\r\n */\r\n @Output() pageChange = new EventEmitter<PageChangeEvent>();\r\n\r\n /**\r\n * Emitted when page size changes\r\n */\r\n @Output() pageSizeChange = new EventEmitter<number>();\r\n\r\n /**\r\n * Emitted when a row is clicked\r\n */\r\n @Output() rowClick = new EventEmitter<{ row: any; index: number }>();\r\n\r\n /**\r\n * Emitted when a row action is triggered\r\n */\r\n @Output() rowAction = new EventEmitter<TableRowActionEvent>();\r\n\r\n /**\r\n * Emitted when sorting changes\r\n */\r\n @Output() sortChange = new EventEmitter<TableSortEvent>();\r\n\r\n /**\r\n * Emitted when row selection changes\r\n */\r\n @Output() selectionChange = new EventEmitter<TableSelectionEvent>();\r\n\r\n /**\r\n * Custom template for empty state\r\n */\r\n @ContentChild('emptyTemplate') emptyTemplate?: TemplateRef<any>;\r\n\r\n /**\r\n * Custom template for loading state\r\n */\r\n @ContentChild('loadingTemplate') loadingTemplate?: TemplateRef<any>;\r\n\r\n /**\r\n * Gets the CSS classes for the table container\r\n */\r\n get containerClasses(): string {\r\n const classes = ['pecb-table-container'];\r\n\r\n if (this.stickyHeader) {\r\n classes.push('pecb-table-container--sticky');\r\n }\r\n\r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Gets the CSS classes for the pagination container\r\n */\r\n get paginationClasses(): string {\r\n const classes = ['pecb-table__pagination'];\r\n\r\n if (this.paginationVariant === 'full' || this.paginationVariant === 'compact') {\r\n classes.push('pecb-table__pagination--bordered');\r\n }\r\n\r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Gets the CSS classes for the table element\r\n */\r\n get tableClasses(): string {\r\n const classes = ['pecb-table', `pecb-table--${this.size}`, `pecb-table--${this.variant}`];\r\n\r\n if (this.hoverable) {\r\n classes.push('pecb-table--hoverable');\r\n }\r\n\r\n if (this.selectable) {\r\n classes.push('pecb-table--selectable');\r\n }\r\n\r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Gets the value from a row for a given column key\r\n * Supports nested keys like 'user.name'\r\n */\r\n getCellValue(row: any, key: string): any {\r\n if (!row || !key) return '';\r\n\r\n const keys = key.split('.');\r\n let value = row;\r\n\r\n for (const k of keys) {\r\n if (value === null || value === undefined) return '';\r\n value = value[k];\r\n }\r\n\r\n return value ?? '';\r\n }\r\n\r\n /**\r\n * Gets the alignment class for a column\r\n */\r\n getAlignmentClass(column: PecbTableColumn): string {\r\n if (!column.align || column.align === 'left') return '';\r\n return `pecb-table__cell--${column.align}`;\r\n }\r\n\r\n /**\r\n * Handles row click events\r\n */\r\n onRowClick(row: any, index: number): void {\r\n if (this.selectable) {\r\n this.toggleRowSelection(index);\r\n }\r\n this.rowClick.emit({ row, index });\r\n }\r\n\r\n /**\r\n * Handles row action button clicks\r\n */\r\n onRowAction(action: string, row: any, index: number, event: Event): void {\r\n event.stopPropagation();\r\n this.rowAction.emit({ action, row, index });\r\n }\r\n\r\n /**\r\n * Handles column header click for sorting\r\n */\r\n onHeaderClick(column: PecbTableColumn): void {\r\n if (!column.sortable) return;\r\n\r\n let newDirection: 'asc' | 'desc' | null = 'asc';\r\n\r\n if (this.sortColumn === column.key) {\r\n if (this.sortDirection === 'asc') {\r\n newDirection = 'desc';\r\n } else if (this.sortDirection === 'desc') {\r\n newDirection = null;\r\n }\r\n }\r\n\r\n this.sortColumn = newDirection ? column.key : undefined;\r\n this.sortDirection = newDirection;\r\n\r\n this.sortChange.emit({\r\n column: column.key,\r\n direction: newDirection,\r\n });\r\n }\r\n\r\n /**\r\n * Toggles row selection\r\n */\r\n toggleRowSelection(index: number): void {\r\n const newSelection = [...this.selectedIndices];\r\n const existingIndex = newSelection.indexOf(index);\r\n\r\n if (existingIndex > -1) {\r\n newSelection.splice(existingIndex, 1);\r\n } else {\r\n newSelection.push(index);\r\n }\r\n\r\n this.selectedIndices = newSelection;\r\n this.emitSelectionChange();\r\n }\r\n\r\n /**\r\n * Toggles all rows selection\r\n */\r\n toggleAllSelection(): void {\r\n if (this.isAllSelected()) {\r\n this.selectedIndices = [];\r\n } else {\r\n this.selectedIndices = this.data.map((_, index) => index);\r\n }\r\n this.emitSelectionChange();\r\n }\r\n\r\n /**\r\n * Checks if a row is selected\r\n */\r\n isRowSelected(index: number): boolean {\r\n return this.selectedIndices.includes(index);\r\n }\r\n\r\n /**\r\n * Checks if all rows are selected\r\n */\r\n isAllSelected(): boolean {\r\n return this.data.length > 0 && this.selectedIndices.length === this.data.length;\r\n }\r\n\r\n /**\r\n * Checks if some rows are selected (for indeterminate state)\r\n */\r\n isSomeSelected(): boolean {\r\n return this.selectedIndices.length > 0 && this.selectedIndices.length < this.data.length;\r\n }\r\n\r\n /**\r\n * Handles page change from pagination component\r\n */\r\n onPageChange(event: PageChangeEvent): void {\r\n this.currentPage = event.page;\r\n this.pageChange.emit(event);\r\n }\r\n\r\n /**\r\n * Handles page size change from pagination component\r\n */\r\n onPageSizeChange(newSize: number): void {\r\n this.pageSize = newSize;\r\n this.currentPage = 1;\r\n this.pageSizeChange.emit(newSize);\r\n }\r\n\r\n /**\r\n * Gets the sort icon state for a column\r\n */\r\n getSortState(column: PecbTableColumn): 'asc' | 'desc' | 'none' {\r\n if (!column.sortable) return 'none';\r\n if (this.sortColumn !== column.key) return 'none';\r\n return this.sortDirection || 'none';\r\n }\r\n\r\n /**\r\n * Tracks rows by index for ngFor performance\r\n */\r\n trackByIndex(index: number): number {\r\n return index;\r\n }\r\n\r\n /**\r\n * Tracks columns by key for ngFor performance\r\n */\r\n trackByKey(_: number, column: PecbTableColumn): string {\r\n return column.key;\r\n }\r\n\r\n /**\r\n * Gets the effective column type (supports both 'type' and 'component' properties)\r\n */\r\n getColumnType(column: PecbTableColumn): string {\r\n return column.component || column.type || 'text';\r\n }\r\n\r\n /**\r\n * Gets the status type for a value based on column config\r\n */\r\n getStatusType(value: any, column: PecbTableColumn): any {\r\n const config = column.statusConfig;\r\n if (config?.typeMap && value in config.typeMap) {\r\n return config.typeMap[value];\r\n }\r\n // Default mappings\r\n const defaultMap: Record<string, string> = {\r\n 'Pending': 'warning',\r\n 'pending': 'warning',\r\n 'Inactive': 'error',\r\n 'inactive': 'error',\r\n 'Approved': 'success',\r\n 'approved': 'success',\r\n 'Active': 'success',\r\n 'active': 'success',\r\n 'Disabled': 'disabled',\r\n 'disabled': 'disabled',\r\n };\r\n return defaultMap[value] || 'neutral';\r\n }\r\n\r\n /**\r\n * Gets the status variant for a column\r\n */\r\n getStatusVariant(column: PecbTableColumn): any {\r\n return column.statusConfig?.variant || 'filled';\r\n }\r\n\r\n /**\r\n * Gets the status size for a column\r\n */\r\n getStatusSize(column: PecbTableColumn): any {\r\n return column.statusConfig?.size || 'sm';\r\n }\r\n\r\n /**\r\n * Gets user display data from row\r\n */\r\n getUserData(row: any, column: PecbTableColumn): { avatar: string; name: string; secondary: string } {\r\n const config = column.userConfig || {};\r\n return {\r\n avatar: row[config.avatarKey || 'avatar'] || '',\r\n name: row[config.nameKey || column.key] || '',\r\n secondary: row[config.secondaryKey || 'email'] || '',\r\n };\r\n }\r\n\r\n /**\r\n * Gets default actions if none specified\r\n */\r\n getActions(column: PecbTableColumn): TableAction[] {\r\n if (column.actions && column.actions.length > 0) {\r\n return column.actions;\r\n }\r\n // Default actions\r\n return [\r\n { id: 'view', icon: 'view', tooltip: 'View' },\r\n { id: 'edit', icon: 'edit', tooltip: 'Edit' },\r\n { id: 'delete', icon: 'delete', tooltip: 'Delete', variant: 'danger' },\r\n ];\r\n }\r\n\r\n /**\r\n * Handles action button click\r\n */\r\n onActionClick(action: TableAction, row: any, index: number, event: Event): void {\r\n event.stopPropagation();\r\n\r\n // Call individual action callback if provided\r\n if (action.action) {\r\n action.action(row, index);\r\n }\r\n\r\n // Always emit the rowAction event\r\n this.rowAction.emit({ action: action.id, row, index });\r\n }\r\n\r\n /**\r\n * Gets the inputs for a dynamic component\r\n * Combines static componentInputs with row-specific data from componentInputsFn\r\n */\r\n getDynamicComponentInputs(row: any, column: PecbTableColumn, index: number): Record<string, any> {\r\n const value = this.getCellValue(row, column.key);\r\n const staticInputs = column.componentInputs || {};\r\n\r\n if (column.componentInputsFn) {\r\n const dynamicInputs = column.componentInputsFn(row, value, index);\r\n return { ...staticInputs, ...dynamicInputs };\r\n }\r\n\r\n return staticInputs;\r\n }\r\n\r\n /**\r\n * Checks if column has a dynamic component\r\n */\r\n hasDynamicComponent(column: PecbTableColumn): boolean {\r\n return !!column.dynamicComponent;\r\n }\r\n\r\n /**\r\n * Sanitizes custom icon SVG for safe rendering\r\n */\r\n getSafeIcon(iconSvg: string | undefined): SafeHtml {\r\n if (!iconSvg) return '';\r\n return this.sanitizer.bypassSecurityTrustHtml(iconSvg);\r\n }\r\n\r\n private emitSelectionChange(): void {\r\n const selectedRows = this.selectedIndices.map(index => this.data[index]);\r\n this.selectionChange.emit({\r\n selectedRows,\r\n selectedIndices: this.selectedIndices,\r\n });\r\n }\r\n}\r\n","<div class=\"pecb-table-wrapper\">\r\n <div [class]=\"containerClasses\" [style.maxHeight]=\"maxHeight\">\r\n <!-- Loading State -->\r\n <div *ngIf=\"loading\" class=\"pecb-table__loading\">\r\n <ng-container *ngIf=\"loadingTemplate; else defaultLoading\">\r\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-template #defaultLoading>\r\n <div class=\"pecb-table__loading-spinner\">\r\n <svg class=\"pecb-table__spinner-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-dasharray=\"31.4 31.4\" />\r\n </svg>\r\n <span>Loading...</span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Table -->\r\n <table\r\n *ngIf=\"!loading\"\r\n [class]=\"tableClasses\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n role=\"table\">\r\n\r\n <!-- Table Header -->\r\n <thead *ngIf=\"showHeader\" class=\"pecb-table__head\" [class.pecb-table__head--sticky]=\"stickyHeader\">\r\n <tr class=\"pecb-table__row pecb-table__row--header\" role=\"row\">\r\n <!-- Selection Checkbox Column -->\r\n <th\r\n *ngIf=\"selectable\"\r\n class=\"pecb-table__cell pecb-table__cell--header pecb-table__cell--checkbox\"\r\n role=\"columnheader\"\r\n scope=\"col\">\r\n <label class=\"pecb-table__checkbox-wrapper\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"pecb-table__checkbox\"\r\n [checked]=\"isAllSelected()\"\r\n [indeterminate]=\"isSomeSelected()\"\r\n (change)=\"toggleAllSelection()\"\r\n aria-label=\"Select all rows\" />\r\n <span class=\"pecb-table__checkbox-custom\"></span>\r\n </label>\r\n </th>\r\n\r\n <!-- Data Columns -->\r\n <th\r\n *ngFor=\"let column of columns; trackBy: trackByKey\"\r\n class=\"pecb-table__cell pecb-table__cell--header\"\r\n [class.pecb-table__cell--sortable]=\"column.sortable\"\r\n [class]=\"getAlignmentClass(column)\"\r\n [ngClass]=\"column.cssClass\"\r\n [style.width]=\"column.width\"\r\n [attr.aria-sort]=\"column.sortable ? (sortColumn === column.key ? (sortDirection === 'asc' ? 'ascending' : 'descending') : 'none') : null\"\r\n role=\"columnheader\"\r\n scope=\"col\"\r\n (click)=\"onHeaderClick(column)\"\r\n (keydown.enter)=\"onHeaderClick(column)\"\r\n (keydown.space)=\"onHeaderClick(column); $event.preventDefault()\"\r\n [attr.tabindex]=\"column.sortable ? 0 : null\">\r\n <div class=\"pecb-table__header-content\">\r\n <ng-container *ngIf=\"column.headerTemplate; else defaultHeader\">\r\n <ng-container *ngTemplateOutlet=\"column.headerTemplate; context: { $implicit: column }\"></ng-container>\r\n </ng-container>\r\n <ng-template #defaultHeader>\r\n <span class=\"pecb-table__header-text\">{{ column.label }}</span>\r\n </ng-template>\r\n\r\n <!-- Sort Icon -->\r\n <span *ngIf=\"column.sortable\" class=\"pecb-table__sort-icon\" [attr.data-sort]=\"getSortState(column)\">\r\n <svg *ngIf=\"getSortState(column) === 'none'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3L12 7H4L8 3Z\" fill=\"currentColor\" opacity=\"0.4\"/>\r\n <path d=\"M8 13L4 9H12L8 13Z\" fill=\"currentColor\" opacity=\"0.4\"/>\r\n </svg>\r\n <svg *ngIf=\"getSortState(column) === 'asc'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3L12 7H4L8 3Z\" fill=\"currentColor\"/>\r\n <path d=\"M8 13L4 9H12L8 13Z\" fill=\"currentColor\" opacity=\"0.4\"/>\r\n </svg>\r\n <svg *ngIf=\"getSortState(column) === 'desc'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3L12 7H4L8 3Z\" fill=\"currentColor\" opacity=\"0.4\"/>\r\n <path d=\"M8 13L4 9H12L8 13Z\" fill=\"currentColor\"/>\r\n </svg>\r\n </span>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <!-- Table Body -->\r\n <tbody class=\"pecb-table__body\">\r\n <!-- Empty State -->\r\n <tr *ngIf=\"data.length === 0\" class=\"pecb-table__row pecb-table__row--empty\">\r\n <td\r\n [attr.colspan]=\"selectable ? columns.length + 1 : columns.length\"\r\n class=\"pecb-table__cell pecb-table__cell--empty\">\r\n <ng-container *ngIf=\"emptyTemplate; else defaultEmpty\">\r\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\r\n </ng-container>\r\n <ng-template #defaultEmpty>\r\n <div class=\"pecb-table__empty-content\">\r\n <span class=\"pecb-table__empty-message\">{{ emptyMessage }}</span>\r\n </div>\r\n </ng-template>\r\n </td>\r\n </tr>\r\n\r\n <!-- Data Rows -->\r\n <tr\r\n *ngFor=\"let row of data; let i = index; trackBy: trackByIndex\"\r\n class=\"pecb-table__row pecb-table__row--data\"\r\n [class.pecb-table__row--selected]=\"isRowSelected(i)\"\r\n role=\"row\"\r\n (click)=\"onRowClick(row, i)\"\r\n [attr.tabindex]=\"0\"\r\n (keydown.enter)=\"onRowClick(row, i)\">\r\n\r\n <!-- Selection Checkbox -->\r\n <td\r\n *ngIf=\"selectable\"\r\n class=\"pecb-table__cell pecb-table__cell--checkbox\"\r\n role=\"cell\"\r\n (click)=\"$event.stopPropagation()\">\r\n <label class=\"pecb-table__checkbox-wrapper\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"pecb-table__checkbox\"\r\n [checked]=\"isRowSelected(i)\"\r\n (change)=\"toggleRowSelection(i)\"\r\n [attr.aria-label]=\"'Select row ' + (i + 1)\" />\r\n <span class=\"pecb-table__checkbox-custom\"></span>\r\n </label>\r\n </td>\r\n\r\n <!-- Data Cells -->\r\n <td\r\n *ngFor=\"let column of columns; trackBy: trackByKey\"\r\n class=\"pecb-table__cell\"\r\n [class]=\"getAlignmentClass(column)\"\r\n [ngClass]=\"column.cssClass\"\r\n role=\"cell\">\r\n\r\n <!-- Custom Template -->\r\n <ng-container *ngIf=\"column.cellTemplate\">\r\n <ng-container *ngTemplateOutlet=\"column.cellTemplate; context: { $implicit: getCellValue(row, column.key), row: row, column: column, index: i }\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Dynamic Component - renders any component passed via dynamicComponent -->\r\n <ng-container *ngIf=\"!column.cellTemplate && hasDynamicComponent(column)\">\r\n <ng-container\r\n *ngComponentOutlet=\"column.dynamicComponent!; inputs: getDynamicComponentInputs(row, column, i)\">\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Status Component - renders pecb-status -->\r\n <ng-container *ngIf=\"!column.cellTemplate && !hasDynamicComponent(column) && getColumnType(column) === 'status'\">\r\n <pecb-status\r\n [type]=\"getStatusType(getCellValue(row, column.key), column)\"\r\n [variant]=\"getStatusVariant(column)\"\r\n [size]=\"getStatusSize(column)\">\r\n {{ getCellValue(row, column.key) }}\r\n </pecb-status>\r\n </ng-container>\r\n\r\n <!-- User Component - renders avatar + name + email -->\r\n <ng-container *ngIf=\"!column.cellTemplate && !hasDynamicComponent(column) && getColumnType(column) === 'user'\">\r\n <div class=\"pecb-table__user-cell\">\r\n <img\r\n *ngIf=\"getUserData(row, column).avatar\"\r\n [src]=\"getUserData(row, column).avatar\"\r\n alt=\"\"\r\n class=\"pecb-table__user-avatar\">\r\n <div class=\"pecb-table__user-info\">\r\n <div class=\"pecb-table__user-name\">{{ getUserData(row, column).name }}</div>\r\n <div *ngIf=\"getUserData(row, column).secondary\" class=\"pecb-table__user-secondary\">\r\n {{ getUserData(row, column).secondary }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Action Component - renders action buttons with icons -->\r\n <ng-container *ngIf=\"!column.cellTemplate && !hasDynamicComponent(column) && getColumnType(column) === 'action'\">\r\n <div class=\"pecb-table__action-buttons\">\r\n <button\r\n *ngFor=\"let action of getActions(column)\"\r\n class=\"pecb-table__action-btn\"\r\n [class.pecb-table__action-btn--danger]=\"action.variant === 'danger'\"\r\n [title]=\"action.tooltip || action.id\"\r\n [disabled]=\"action.disabled\"\r\n (click)=\"onActionClick(action, row, i, $event)\">\r\n <!-- View Icon -->\r\n <svg *ngIf=\"action.icon === 'view'\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n <!-- Edit Icon -->\r\n <svg *ngIf=\"action.icon === 'edit'\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path>\r\n <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"></path>\r\n </svg>\r\n <!-- Delete Icon -->\r\n <svg *ngIf=\"action.icon === 'delete'\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"3 6 5 6 21 6\"></polyline>\r\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"></path>\r\n </svg>\r\n <!-- Download Icon -->\r\n <svg *ngIf=\"action.icon === 'download'\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\r\n <polyline points=\"7 10 12 15 17 10\"></polyline>\r\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\r\n </svg>\r\n <!-- Copy Icon -->\r\n <svg *ngIf=\"action.icon === 'copy'\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\r\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\r\n </svg>\r\n <!-- Custom Icon (SVG string) -->\r\n <span *ngIf=\"action.icon === 'custom' && action.customIcon\" class=\"pecb-table__custom-icon\" [innerHTML]=\"getSafeIcon(action.customIcon)\"></span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Default Text -->\r\n <ng-container *ngIf=\"!column.cellTemplate && !hasDynamicComponent(column) && getColumnType(column) === 'text'\">\r\n {{ getCellValue(row, column.key) }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <!-- Pagination (outside table container) -->\r\n <div *ngIf=\"showPagination && !loading && data.length > 0\" [class]=\"paginationClasses\">\r\n <pecb-pagination\r\n [totalItems]=\"totalItems\"\r\n [pageSize]=\"pageSize\"\r\n [currentPage]=\"currentPage\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n [showPageSizeSelector]=\"showPageSizeSelector\"\r\n [variant]=\"paginationVariant\"\r\n size=\"md\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\">\r\n </pecb-pagination>\r\n </div>\r\n</div>\r\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type TabStyle = 'rounded' | 'line';\r\nexport type TabSize = 'sm' | 'md';\r\n\r\n/**\r\n * A professional tab component with multiple styles and sizes.\r\n * Fully accessible with WCAG 2.1 AA compliance.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-tab\r\n * label=\"Tab Name\"\r\n * [active]=\"true\"\r\n * style=\"rounded\"\r\n * size=\"md\"\r\n * (clicked)=\"handleClick()\"\r\n * ></pecb-tab>\r\n *\r\n * <!-- With badge number and close button -->\r\n * <pecb-tab\r\n * label=\"Tab Name\"\r\n * [icon]=\"10\"\r\n * [closable]=\"true\"\r\n * [active]=\"true\"\r\n * (closed)=\"handleClose()\"\r\n * ></pecb-tab>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-tab',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './tab.component.html',\r\n styleUrls: ['./tab.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class TabComponent {\r\n /**\r\n * Unique ID for the tab element\r\n */\r\n @Input() id: string = generateUniqueId('tab');\r\n\r\n /**\r\n * The visual style of the tab\r\n */\r\n @Input() style: TabStyle = 'rounded';\r\n\r\n /**\r\n * The size of the tab\r\n */\r\n @Input() size: TabSize = 'md';\r\n\r\n /**\r\n * Label text to display\r\n */\r\n @Input() label = 'Tab Name';\r\n\r\n /**\r\n * Optional badge number to display after the label\r\n */\r\n @Input() icon?: number;\r\n\r\n /**\r\n * Whether the tab is in active state\r\n */\r\n @Input() active = false;\r\n\r\n /**\r\n * Whether the tab is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Whether to show close button\r\n */\r\n @Input() closable = true;\r\n\r\n // --- ARIA Accessibility Properties ---\r\n\r\n /**\r\n * Accessible label for the tab\r\n */\r\n @Input() ariaLabel?: string;\r\n\r\n /**\r\n * ID of the tab panel this tab controls\r\n */\r\n @Input() ariaControls?: string;\r\n\r\n /**\r\n * Indicates if the tab panel is selected\r\n */\r\n @Input() ariaSelected?: boolean;\r\n\r\n /**\r\n * Event emitted when the tab is clicked\r\n */\r\n @Output() clicked = new EventEmitter<string>();\r\n\r\n /**\r\n * Event emitted when the close button is clicked\r\n */\r\n @Output() closed = new EventEmitter<string>();\r\n\r\n /**\r\n * Get CSS classes for the tab\r\n */\r\n get tabClasses(): string[] {\r\n return [\r\n 'pecb-tab',\r\n `pecb-tab--${this.style}`,\r\n `pecb-tab--${this.size}`,\r\n this.active ? 'pecb-tab--active' : '',\r\n this.disabled ? 'pecb-tab--disabled' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Handle tab click\r\n */\r\n onClick(event: MouseEvent): void {\r\n if (!this.disabled) {\r\n event.stopPropagation();\r\n this.clicked.emit(this.id);\r\n }\r\n }\r\n\r\n /**\r\n * Handle close button click\r\n */\r\n onClose(event: MouseEvent): void {\r\n if (!this.disabled) {\r\n event.stopPropagation();\r\n this.closed.emit(this.id);\r\n }\r\n }\r\n\r\n /**\r\n * Handle keyboard events for accessibility\r\n */\r\n onKeyDown(event: KeyboardEvent): void {\r\n if (this.disabled) return;\r\n\r\n // Handle Enter/Space for tab selection\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n this.clicked.emit(this.id);\r\n }\r\n\r\n // Handle Delete/Backspace for close (if closable)\r\n if (this.closable && (event.key === 'Delete' || event.key === 'Backspace')) {\r\n event.preventDefault();\r\n this.closed.emit(this.id);\r\n }\r\n }\r\n}\r\n","<div\r\n [id]=\"id\"\r\n [class]=\"tabClasses.join(' ')\"\r\n role=\"tab\"\r\n [attr.aria-label]=\"ariaLabel || label\"\r\n [attr.aria-controls]=\"ariaControls\"\r\n [attr.aria-selected]=\"ariaSelected !== undefined ? ariaSelected : active\"\r\n [attr.aria-disabled]=\"disabled\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\"\r\n (click)=\"onClick($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n>\r\n <span class=\"pecb-tab__content\">\r\n <!-- Label -->\r\n <span class=\"pecb-tab__label\">{{ label }}</span>\r\n\r\n <!-- Icon/Badge -->\r\n <span *ngIf=\"icon\" class=\"pecb-tab__icon\" aria-hidden=\"true\">\r\n {{ icon }}\r\n </span>\r\n\r\n <!-- Close button -->\r\n <button\r\n *ngIf=\"closable\"\r\n type=\"button\"\r\n class=\"pecb-tab__close\"\r\n [attr.aria-label]=\"'Close ' + label\"\r\n [disabled]=\"disabled\"\r\n (click)=\"onClose($event)\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </span>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n HostListener,\r\n ElementRef,\r\n ViewChild,\r\n forwardRef,\r\n ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type DatepickerSize = 'sm' | 'md' | 'lg';\r\n\r\ninterface CalendarDay {\r\n date: Date;\r\n day: number;\r\n isCurrentMonth: boolean;\r\n isSelected: boolean;\r\n isToday: boolean;\r\n}\r\n\r\n/**\r\n * A professional datepicker component with calendar dropdown.\r\n * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-datepicker\r\n * label=\"Date\"\r\n * placeholder=\"Choose Date\"\r\n * [(ngModel)]=\"selectedDate\"\r\n * ></pecb-datepicker>\r\n *\r\n * <!-- With custom configuration -->\r\n * <pecb-datepicker\r\n * label=\"Birth Date\"\r\n * [required]=\"true\"\r\n * size=\"lg\"\r\n * (dateChange)=\"handleDateChange($event)\"\r\n * ></pecb-datepicker>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-datepicker',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './datepicker.component.html',\r\n styleUrls: ['./datepicker.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DatepickerComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class DatepickerComponent implements ControlValueAccessor {\r\n @ViewChild('inputElement') inputElement?: ElementRef<HTMLInputElement>;\r\n\r\n /**\r\n * Unique ID for the datepicker element\r\n */\r\n @Input() id: string = generateUniqueId('datepicker');\r\n\r\n /**\r\n * Label text to display above the input\r\n */\r\n @Input() label?: string;\r\n\r\n /**\r\n * Placeholder text for the input\r\n */\r\n @Input() placeholder = 'Choose Date';\r\n\r\n /**\r\n * The size of the datepicker\r\n */\r\n @Input() size: DatepickerSize = 'md';\r\n\r\n /**\r\n * Whether the field is required\r\n */\r\n @Input() required = false;\r\n\r\n /**\r\n * Whether the datepicker is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Date format for display (default: MM/DD/YYYY)\r\n */\r\n @Input() dateFormat = 'MM/DD/YYYY';\r\n\r\n /**\r\n * Minimum selectable date\r\n */\r\n @Input() minDate?: Date;\r\n\r\n /**\r\n * Maximum selectable date\r\n */\r\n @Input() maxDate?: Date;\r\n\r\n /**\r\n * Event emitted when date is selected\r\n */\r\n @Output() dateChange = new EventEmitter<Date | null>();\r\n\r\n /**\r\n * Event emitted when calendar is opened\r\n */\r\n @Output() opened = new EventEmitter<void>();\r\n\r\n /**\r\n * Event emitted when calendar is closed\r\n */\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n // Internal state\r\n selectedDate: Date | null = null;\r\n isCalendarOpen = false;\r\n currentMonth: Date = new Date();\r\n calendarDays: CalendarDay[] = [];\r\n weekDays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\r\n monthNames = [\r\n 'January', 'February', 'March', 'April', 'May', 'June',\r\n 'July', 'August', 'September', 'October', 'November', 'December'\r\n ];\r\n\r\n // ControlValueAccessor\r\n private onChange: (value: Date | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private cdr: ChangeDetectorRef\r\n ) {\r\n this.generateCalendar();\r\n }\r\n\r\n /**\r\n * Get CSS classes for the datepicker wrapper\r\n */\r\n get wrapperClasses(): string[] {\r\n return [\r\n 'pecb-datepicker',\r\n `pecb-datepicker--${this.size}`,\r\n this.disabled ? 'pecb-datepicker--disabled' : '',\r\n this.isCalendarOpen ? 'pecb-datepicker--open' : '',\r\n this.selectedDate ? 'pecb-datepicker--has-value' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Get formatted display value\r\n */\r\n get displayValue(): string {\r\n if (!this.selectedDate) return '';\r\n return this.formatDate(this.selectedDate);\r\n }\r\n\r\n /**\r\n * Get current month and year display\r\n */\r\n get monthYearDisplay(): string {\r\n return `${this.monthNames[this.currentMonth.getMonth()]} ${this.currentMonth.getFullYear()}`;\r\n }\r\n\r\n /**\r\n * Toggle calendar dropdown\r\n */\r\n toggleCalendar(): void {\r\n if (this.disabled) return;\r\n\r\n this.isCalendarOpen = !this.isCalendarOpen;\r\n\r\n if (this.isCalendarOpen) {\r\n this.opened.emit();\r\n // Set current month to selected date's month or current month\r\n if (this.selectedDate) {\r\n this.currentMonth = new Date(this.selectedDate.getFullYear(), this.selectedDate.getMonth(), 1);\r\n }\r\n this.generateCalendar();\r\n } else {\r\n this.closed.emit();\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Close calendar\r\n */\r\n closeCalendar(): void {\r\n if (this.isCalendarOpen) {\r\n this.isCalendarOpen = false;\r\n this.closed.emit();\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * Navigate to previous month\r\n */\r\n previousMonth(): void {\r\n this.currentMonth = new Date(\r\n this.currentMonth.getFullYear(),\r\n this.currentMonth.getMonth() - 1,\r\n 1\r\n );\r\n this.generateCalendar();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Navigate to next month\r\n */\r\n nextMonth(): void {\r\n this.currentMonth = new Date(\r\n this.currentMonth.getFullYear(),\r\n this.currentMonth.getMonth() + 1,\r\n 1\r\n );\r\n this.generateCalendar();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Select a date\r\n */\r\n selectDate(day: CalendarDay): void {\r\n if (this.disabled) return;\r\n if (!day.isCurrentMonth) return;\r\n if (this.minDate && day.date < this.minDate) return;\r\n if (this.maxDate && day.date > this.maxDate) return;\r\n\r\n this.selectedDate = day.date;\r\n this.onChange(this.selectedDate);\r\n this.onTouched();\r\n this.dateChange.emit(this.selectedDate);\r\n this.generateCalendar();\r\n this.closeCalendar();\r\n }\r\n\r\n /**\r\n * Generate calendar days\r\n */\r\n private generateCalendar(): void {\r\n const year = this.currentMonth.getFullYear();\r\n const month = this.currentMonth.getMonth();\r\n\r\n // First day of the month\r\n const firstDay = new Date(year, month, 1);\r\n const startingDayOfWeek = firstDay.getDay();\r\n\r\n // Last day of the month\r\n const lastDay = new Date(year, month + 1, 0);\r\n const daysInMonth = lastDay.getDate();\r\n\r\n // Previous month\r\n const prevMonth = new Date(year, month, 0);\r\n const daysInPrevMonth = prevMonth.getDate();\r\n\r\n const days: CalendarDay[] = [];\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n // Previous month days\r\n for (let i = startingDayOfWeek - 1; i >= 0; i--) {\r\n const date = new Date(year, month - 1, daysInPrevMonth - i);\r\n days.push({\r\n date,\r\n day: daysInPrevMonth - i,\r\n isCurrentMonth: false,\r\n isSelected: false,\r\n isToday: false\r\n });\r\n }\r\n\r\n // Current month days\r\n for (let day = 1; day <= daysInMonth; day++) {\r\n const date = new Date(year, month, day);\r\n date.setHours(0, 0, 0, 0);\r\n\r\n const isSelected = this.selectedDate ?\r\n date.getTime() === new Date(this.selectedDate).setHours(0, 0, 0, 0) :\r\n false;\r\n\r\n const isToday = date.getTime() === today.getTime();\r\n\r\n days.push({\r\n date,\r\n day,\r\n isCurrentMonth: true,\r\n isSelected,\r\n isToday\r\n });\r\n }\r\n\r\n // Next month days\r\n const remainingDays = 42 - days.length; // 6 rows * 7 days\r\n for (let day = 1; day <= remainingDays; day++) {\r\n const date = new Date(year, month + 1, day);\r\n days.push({\r\n date,\r\n day,\r\n isCurrentMonth: false,\r\n isSelected: false,\r\n isToday: false\r\n });\r\n }\r\n\r\n this.calendarDays = days;\r\n }\r\n\r\n /**\r\n * Format date for display\r\n */\r\n private formatDate(date: Date): string {\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const year = date.getFullYear();\r\n\r\n return this.dateFormat\r\n .replace('MM', month)\r\n .replace('DD', day)\r\n .replace('YYYY', String(year));\r\n }\r\n\r\n /**\r\n * Listen for clicks outside to close calendar\r\n */\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (!this.elementRef.nativeElement.contains(event.target)) {\r\n this.closeCalendar();\r\n }\r\n }\r\n\r\n /**\r\n * Handle keyboard navigation\r\n */\r\n onKeyDown(event: KeyboardEvent): void {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n this.toggleCalendar();\r\n } else if (event.key === 'Escape') {\r\n this.closeCalendar();\r\n }\r\n }\r\n\r\n /**\r\n * Clear selected date\r\n */\r\n clearDate(event: MouseEvent): void {\r\n event.stopPropagation();\r\n if (this.disabled) return;\r\n\r\n this.selectedDate = null;\r\n this.onChange(null);\r\n this.onTouched();\r\n this.dateChange.emit(null);\r\n this.generateCalendar();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: Date | null): void {\r\n this.selectedDate = value;\r\n if (value) {\r\n this.currentMonth = new Date(value.getFullYear(), value.getMonth(), 1);\r\n }\r\n this.generateCalendar();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: Date | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div [class]=\"wrapperClasses.join(' ')\">\r\n <!-- Input Field -->\r\n <div class=\"pecb-datepicker__input-wrapper\">\r\n <!-- Input -->\r\n <input\r\n #inputElement\r\n [id]=\"id\"\r\n type=\"text\"\r\n class=\"pecb-datepicker__input\"\r\n [value]=\"displayValue\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label || placeholder\"\r\n [attr.aria-required]=\"required\"\r\n readonly\r\n (click)=\"toggleCalendar()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n />\r\n\r\n <!-- Floating Label -->\r\n <label\r\n *ngIf=\"label\"\r\n [attr.for]=\"id\"\r\n class=\"pecb-datepicker__label\"\r\n >\r\n {{ label }}<span *ngIf=\"required\" class=\"pecb-datepicker__required\">*</span>\r\n </label>\r\n\r\n <!-- Clear Button (shown when has value) -->\r\n <button\r\n *ngIf=\"selectedDate && !disabled\"\r\n type=\"button\"\r\n class=\"pecb-datepicker__icon pecb-datepicker__icon--clear\"\r\n [attr.aria-label]=\"'Clear date'\"\r\n (click)=\"clearDate($event)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 0C3.6 0 0 3.6 0 8C0 12.4 3.6 16 8 16C12.4 16 16 12.4 16 8C16 3.6 12.4 0 8 0ZM11.5 10.1L10.1 11.5L8 9.4L5.9 11.5L4.5 10.1L6.6 8L4.5 5.9L5.9 4.5L8 6.6L10.1 4.5L11.5 5.9L9.4 8L11.5 10.1Z\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Right Icon (Calendar) -->\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__icon pecb-datepicker__icon--right\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"'Open calendar'\"\r\n (click)=\"toggleCalendar()\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11 2V1H10V2H6V1H5V2H2V15H14V2H11ZM13 14H3V6H13V14ZM13 5H3V3H5V4H6V3H10V4H11V3H13V5Z\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <!-- Calendar Dropdown -->\r\n <div\r\n *ngIf=\"isCalendarOpen\"\r\n class=\"pecb-datepicker__calendar\"\r\n role=\"dialog\"\r\n aria-modal=\"false\"\r\n [attr.aria-label]=\"'Choose date'\"\r\n >\r\n <!-- Calendar Header -->\r\n <div class=\"pecb-datepicker__calendar-header\">\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__nav-button\"\r\n aria-label=\"Previous month\"\r\n (click)=\"previousMonth()\"\r\n >\r\n «\r\n </button>\r\n\r\n <span class=\"pecb-datepicker__month-year\">{{ monthYearDisplay }}</span>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__nav-button\"\r\n aria-label=\"Next month\"\r\n (click)=\"nextMonth()\"\r\n >\r\n »\r\n </button>\r\n </div>\r\n\r\n <!-- Calendar Grid -->\r\n <div class=\"pecb-datepicker__calendar-body\">\r\n <!-- Week Days -->\r\n <div class=\"pecb-datepicker__weekdays\">\r\n <div\r\n *ngFor=\"let day of weekDays\"\r\n class=\"pecb-datepicker__weekday\"\r\n >\r\n {{ day }}\r\n </div>\r\n </div>\r\n\r\n <!-- Days Grid -->\r\n <div class=\"pecb-datepicker__days\">\r\n <button\r\n *ngFor=\"let day of calendarDays\"\r\n type=\"button\"\r\n class=\"pecb-datepicker__day\"\r\n [class.pecb-datepicker__day--other-month]=\"!day.isCurrentMonth\"\r\n [class.pecb-datepicker__day--selected]=\"day.isSelected\"\r\n [class.pecb-datepicker__day--today]=\"day.isToday\"\r\n [attr.aria-label]=\"day.date.toDateString()\"\r\n [attr.aria-selected]=\"day.isSelected\"\r\n (click)=\"selectDate(day)\"\r\n >\r\n {{ day.day }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n forwardRef,\r\n ViewChild,\r\n ElementRef,\r\n ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type InputType = 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search';\r\nexport type InputSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * A professional input component with floating label and multiple types.\r\n * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-input\r\n * label=\"Email\"\r\n * type=\"email\"\r\n * placeholder=\"Enter your email\"\r\n * [(ngModel)]=\"email\"\r\n * ></pecb-input>\r\n *\r\n * <!-- With predefined icon -->\r\n * <pecb-input\r\n * label=\"Email\"\r\n * type=\"email\"\r\n * icon=\"email\"\r\n * iconPosition=\"left\"\r\n * ></pecb-input>\r\n *\r\n * <!-- With custom SVG icon -->\r\n * <pecb-input\r\n * label=\"Phone\"\r\n * type=\"tel\"\r\n * [icon]=\"'<svg>...</svg>'\"\r\n * iconPosition=\"left\"\r\n * ></pecb-input>\r\n *\r\n * <!-- With error state -->\r\n * <pecb-input\r\n * label=\"Password\"\r\n * type=\"password\"\r\n * [error]=\"true\"\r\n * errorMessage=\"Password is required\"\r\n * ></pecb-input>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-input',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './input.component.html',\r\n styleUrls: ['./input.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InputComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class InputComponent implements ControlValueAccessor {\r\n @ViewChild('inputElement') inputElement?: ElementRef<HTMLInputElement>;\r\n\r\n /**\r\n * Unique ID for the input element\r\n */\r\n @Input() id: string = generateUniqueId('input');\r\n\r\n /**\r\n * Input type\r\n */\r\n @Input() type: InputType = 'text';\r\n\r\n /**\r\n * Label text to display\r\n */\r\n @Input() label?: string;\r\n\r\n /**\r\n * Placeholder text (shown when label is not present)\r\n */\r\n @Input() placeholder = '';\r\n\r\n /**\r\n * The size of the input\r\n */\r\n @Input() size: InputSize = 'md';\r\n\r\n /**\r\n * Whether the field is required\r\n */\r\n @Input() required = false;\r\n\r\n /**\r\n * Whether the input is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Whether the input is readonly\r\n */\r\n @Input() readonly = false;\r\n\r\n /**\r\n * Whether to show error state\r\n */\r\n @Input() error = false;\r\n\r\n /**\r\n * Error message to display\r\n */\r\n @Input() errorMessage?: string;\r\n\r\n /**\r\n * Helper text to display below input\r\n */\r\n @Input() helperText?: string;\r\n\r\n /**\r\n * Icon to display - can be a predefined name ('email', 'search', 'user') or custom SVG string\r\n */\r\n @Input() icon?: string;\r\n\r\n /**\r\n * Icon position (left or right)\r\n */\r\n @Input() iconPosition: 'left' | 'right' = 'left';\r\n\r\n /**\r\n * Left icon name or HTML (deprecated - use icon with iconPosition instead)\r\n */\r\n @Input() leftIcon?: string;\r\n\r\n /**\r\n * Right icon name or HTML (deprecated - use icon with iconPosition instead)\r\n */\r\n @Input() rightIcon?: string;\r\n\r\n /**\r\n * Whether to show clear button\r\n */\r\n @Input() clearable = false;\r\n\r\n /**\r\n * Maximum length of input\r\n */\r\n @Input() maxLength?: number;\r\n\r\n /**\r\n * Minimum value (for number type)\r\n */\r\n @Input() min?: number;\r\n\r\n /**\r\n * Maximum value (for number type)\r\n */\r\n @Input() max?: number;\r\n\r\n /**\r\n * Step value (for number type)\r\n */\r\n @Input() step?: number;\r\n\r\n /**\r\n * Autocomplete attribute\r\n */\r\n @Input() autocomplete?: string;\r\n\r\n /**\r\n * Event emitted when value changes\r\n */\r\n @Output() valueChange = new EventEmitter<string>();\r\n\r\n /**\r\n * Event emitted on blur\r\n */\r\n @Output() blurred = new EventEmitter<void>();\r\n\r\n /**\r\n * Event emitted on focus\r\n */\r\n @Output() focused = new EventEmitter<void>();\r\n\r\n /**\r\n * Event emitted when clear button is clicked\r\n */\r\n @Output() cleared = new EventEmitter<void>();\r\n\r\n // Internal state\r\n value: string = '';\r\n isFocused = false;\r\n showPassword = false;\r\n\r\n // ControlValueAccessor\r\n private onChange: (value: string) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor(\r\n private cdr: ChangeDetectorRef,\r\n private sanitizer: DomSanitizer\r\n ) {}\r\n\r\n /**\r\n * Get CSS classes for the input wrapper\r\n */\r\n get wrapperClasses(): string[] {\r\n return [\r\n 'pecb-input',\r\n `pecb-input--${this.size}`,\r\n this.disabled ? 'pecb-input--disabled' : '',\r\n this.error ? 'pecb-input--error' : '',\r\n this.readonly ? 'pecb-input--readonly' : '',\r\n this.isFocused ? 'pecb-input--focused' : '',\r\n this.value ? 'pecb-input--has-value' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Get the actual input type (handles password visibility toggle)\r\n */\r\n get inputType(): string {\r\n if (this.type === 'password' && this.showPassword) {\r\n return 'text';\r\n }\r\n return this.type;\r\n }\r\n\r\n /**\r\n * Check if clear button should be shown\r\n */\r\n get showClearButton(): boolean {\r\n return this.clearable && !!this.value && !this.disabled && !this.readonly;\r\n }\r\n\r\n /**\r\n * Check if password toggle should be shown\r\n */\r\n get showPasswordToggle(): boolean {\r\n return this.type === 'password' && !!this.value && !this.disabled && !this.readonly;\r\n }\r\n\r\n /**\r\n * Get computed left icon\r\n */\r\n get computedLeftIcon(): string | undefined {\r\n // New API takes precedence\r\n if (this.icon && this.iconPosition === 'left') {\r\n return this.icon;\r\n }\r\n // Fallback to old API\r\n return this.leftIcon;\r\n }\r\n\r\n /**\r\n * Get computed right icon\r\n */\r\n get computedRightIcon(): string | undefined {\r\n // New API takes precedence\r\n if (this.icon && this.iconPosition === 'right') {\r\n return this.icon;\r\n }\r\n // Fallback to old API\r\n return this.rightIcon;\r\n }\r\n\r\n /**\r\n * Handle input change\r\n */\r\n onInput(event: Event): void {\r\n const target = event.target as HTMLInputElement;\r\n this.value = target.value;\r\n this.onChange(this.value);\r\n this.valueChange.emit(this.value);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Handle focus event\r\n */\r\n onFocus(): void {\r\n this.isFocused = true;\r\n this.focused.emit();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Handle blur event\r\n */\r\n onBlur(): void {\r\n this.isFocused = false;\r\n this.onTouched();\r\n this.blurred.emit();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Clear input value\r\n */\r\n clearValue(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.value = '';\r\n this.onChange(this.value);\r\n this.valueChange.emit(this.value);\r\n this.cleared.emit();\r\n this.inputElement?.nativeElement.focus();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Toggle password visibility\r\n */\r\n togglePasswordVisibility(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.showPassword = !this.showPassword;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Focus the input\r\n */\r\n focus(): void {\r\n this.inputElement?.nativeElement.focus();\r\n }\r\n\r\n /**\r\n * Sanitize custom icon HTML/SVG\r\n */\r\n sanitizeIcon(icon: string | undefined): SafeHtml {\r\n if (!icon) return '';\r\n return this.sanitizer.bypassSecurityTrustHtml(icon);\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: string): void {\r\n this.value = value || '';\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div [class]=\"wrapperClasses.join(' ')\">\r\n <!-- Input Wrapper -->\r\n <div class=\"pecb-input__wrapper\">\r\n <!-- Left Icon -->\r\n <span\r\n *ngIf=\"computedLeftIcon\"\r\n class=\"pecb-input__icon pecb-input__icon--left\"\r\n aria-hidden=\"true\"\r\n >\r\n <ng-container [ngSwitch]=\"computedLeftIcon\">\r\n <svg *ngSwitchCase=\"'email'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M2 3H14C14.55 3 15 3.45 15 4V12C15 12.55 14.55 13 14 13H2C1.45 13 1 12.55 1 12V4C1 3.45 1.45 3 2 3ZM8 8.5L2.5 5V11.5H13.5V5L8 8.5ZM8 7L13.5 3.5H2.5L8 7Z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'search'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'user'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 8C10.21 8 12 6.21 12 4C12 1.79 10.21 0 8 0C5.79 0 4 1.79 4 4C4 6.21 5.79 8 8 8ZM8 10C5.33 10 0 11.34 0 14V16H16V14C16 11.34 10.67 10 8 10Z\"/>\r\n </svg>\r\n <span *ngSwitchDefault [innerHTML]=\"sanitizeIcon(computedLeftIcon)\"></span>\r\n </ng-container>\r\n </span>\r\n\r\n <!-- Input -->\r\n <input\r\n #inputElement\r\n [id]=\"id\"\r\n [type]=\"inputType\"\r\n class=\"pecb-input__field\"\r\n [value]=\"value\"\r\n [disabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n [required]=\"required\"\r\n [attr.maxlength]=\"maxLength\"\r\n [attr.min]=\"min\"\r\n [attr.max]=\"max\"\r\n [attr.step]=\"step\"\r\n [attr.autocomplete]=\"autocomplete\"\r\n [attr.aria-label]=\"label || placeholder\"\r\n [attr.aria-required]=\"required\"\r\n [attr.aria-invalid]=\"error\"\r\n [attr.aria-describedby]=\"helperText || errorMessage ? id + '-description' : null\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n />\r\n\r\n <!-- Floating Label -->\r\n <label\r\n *ngIf=\"label\"\r\n [attr.for]=\"id\"\r\n class=\"pecb-input__label\"\r\n >\r\n {{ label }}<span *ngIf=\"required\" class=\"pecb-input__required\">*</span>\r\n </label>\r\n\r\n <!-- Clear Button -->\r\n <button\r\n *ngIf=\"showClearButton\"\r\n type=\"button\"\r\n class=\"pecb-input__icon pecb-input__icon--clear\"\r\n [attr.aria-label]=\"'Clear input'\"\r\n (click)=\"clearValue($event)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 0C3.6 0 0 3.6 0 8C0 12.4 3.6 16 8 16C12.4 16 16 12.4 16 8C16 3.6 12.4 0 8 0ZM11.5 10.1L10.1 11.5L8 9.4L5.9 11.5L4.5 10.1L6.6 8L4.5 5.9L5.9 4.5L8 6.6L10.1 4.5L11.5 5.9L9.4 8L11.5 10.1Z\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Password Toggle -->\r\n <button\r\n *ngIf=\"showPasswordToggle\"\r\n type=\"button\"\r\n class=\"pecb-input__icon pecb-input__icon--password\"\r\n [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\"\r\n (click)=\"togglePasswordVisibility($event)\"\r\n >\r\n <svg *ngIf=\"!showPassword\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 3C4.5 3 1.5 5.5 0 8C1.5 10.5 4.5 13 8 13C11.5 13 14.5 10.5 16 8C14.5 5.5 11.5 3 8 3ZM8 11C6.34 11 5 9.66 5 8C5 6.34 6.34 5 8 5C9.66 5 11 6.34 11 8C11 9.66 9.66 11 8 11ZM8 6.5C7.17 6.5 6.5 7.17 6.5 8C6.5 8.83 7.17 9.5 8 9.5C8.83 9.5 9.5 8.83 9.5 8C9.5 7.17 8.83 6.5 8 6.5Z\"/>\r\n </svg>\r\n <svg *ngIf=\"showPassword\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 3C11.5 3 14.5 5.5 16 8C15.4 9.1 14.5 10 13.5 10.7L11.9 9.1C12.3 8.8 12.5 8.4 12.5 8C12.5 6.62 11.38 5.5 10 5.5C9.6 5.5 9.2 5.7 8.9 5.9L7.3 4.3C7.5 4.1 7.7 4 8 4C8 4 8 4 8 3ZM1.3 2.3L3 4C1.8 4.9 0.8 6.1 0 8C1.5 10.5 4.5 13 8 13C9.3 13 10.5 12.6 11.6 12L13.7 14.1L15.1 12.7L2.7 0.3L1.3 2.3ZM5.5 6.8L7.2 8.5C7.1 8.6 7 8.8 7 9C7 9.83 7.67 10.5 8.5 10.5C8.7 10.5 8.9 10.4 9 10.3L10.7 12C9.9 12.3 9 12.5 8 12.5C4.5 12.5 1.5 10 0 7.5C0.7 6.4 1.6 5.4 2.7 4.8L5.5 6.8Z\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Right Icon -->\r\n <span\r\n *ngIf=\"computedRightIcon && !showClearButton && !showPasswordToggle\"\r\n class=\"pecb-input__icon pecb-input__icon--right\"\r\n aria-hidden=\"true\"\r\n >\r\n <ng-container [ngSwitch]=\"computedRightIcon\">\r\n <svg *ngSwitchCase=\"'email'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M2 3H14C14.55 3 15 3.45 15 4V12C15 12.55 14.55 13 14 13H2C1.45 13 1 12.55 1 12V4C1 3.45 1.45 3 2 3ZM8 8.5L2.5 5V11.5H13.5V5L8 8.5ZM8 7L13.5 3.5H2.5L8 7Z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'search'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'user'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 8C10.21 8 12 6.21 12 4C12 1.79 10.21 0 8 0C5.79 0 4 1.79 4 4C4 6.21 5.79 8 8 8ZM8 10C5.33 10 0 11.34 0 14V16H16V14C16 11.34 10.67 10 8 10Z\"/>\r\n </svg>\r\n <span *ngSwitchDefault [innerHTML]=\"sanitizeIcon(computedRightIcon)\"></span>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <!-- Helper Text / Error Message -->\r\n <div\r\n *ngIf=\"helperText || errorMessage\"\r\n [id]=\"id + '-description'\"\r\n class=\"pecb-input__description\"\r\n [class.pecb-input__description--error]=\"error && errorMessage\"\r\n >\r\n <span *ngIf=\"error && errorMessage\">{{ errorMessage }}</span>\r\n <span *ngIf=\"!error && helperText\">{{ helperText }}</span>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n forwardRef,\r\n ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type RadioVariant = 'dot' | 'filled';\r\nexport type RadioLabelPosition = 'right' | 'left';\r\n\r\n/**\r\n * A professional radio button component with label and description support.\r\n * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Default variant with inner dot -->\r\n * <pecb-radio\r\n * label=\"Option 1\"\r\n * description=\"This is a description\"\r\n * [(ngModel)]=\"selectedValue\"\r\n * value=\"option1\"\r\n * ></pecb-radio>\r\n *\r\n * <!-- Filled variant -->\r\n * <pecb-radio\r\n * label=\"Option 1\"\r\n * variant=\"filled\"\r\n * [(ngModel)]=\"selectedValue\"\r\n * value=\"option1\"\r\n * ></pecb-radio>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-radio',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './radio.component.html',\r\n styleUrls: ['./radio.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RadioComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class RadioComponent implements ControlValueAccessor {\r\n /**\r\n * Unique ID for the radio element\r\n */\r\n @Input() id: string = generateUniqueId('radio');\r\n\r\n /**\r\n * Name attribute for the radio group\r\n */\r\n @Input() name?: string;\r\n\r\n /**\r\n * Value of this radio button\r\n */\r\n @Input() value: unknown;\r\n\r\n /**\r\n * Visual variant of the radio button\r\n */\r\n @Input() variant: RadioVariant = 'dot';\r\n\r\n /**\r\n * Label text to display\r\n */\r\n @Input() label?: string;\r\n\r\n /**\r\n * Description text to display below label\r\n */\r\n @Input() description?: string;\r\n\r\n /**\r\n * Position of the label relative to the radio control.\r\n * 'right' (default): [radio] Title Description\r\n * 'left': Title Description [radio]\r\n */\r\n @Input() labelPosition: RadioLabelPosition = 'right';\r\n\r\n /**\r\n * Whether the radio is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Event emitted when selection changes\r\n */\r\n @Output() selectionChange = new EventEmitter<unknown>();\r\n\r\n // Internal state\r\n checked = false;\r\n\r\n // ControlValueAccessor\r\n private onChange: (value: unknown) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n /**\r\n * Get CSS classes for the radio wrapper\r\n */\r\n get wrapperClasses(): string[] {\r\n return [\r\n 'pecb-radio',\r\n `pecb-radio--${this.variant}`,\r\n this.disabled ? 'pecb-radio--disabled' : '',\r\n this.checked ? 'pecb-radio--checked' : '',\r\n this.labelPosition === 'left' ? 'pecb-radio--label-left' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Handle radio selection\r\n */\r\n onRadioChange(event: Event): void {\r\n if (this.disabled) return;\r\n\r\n const checked = (event.target as HTMLInputElement).checked;\r\n if (checked) {\r\n this.checked = true;\r\n this.onChange(this.value);\r\n this.selectionChange.emit(this.value);\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * Handle blur event\r\n */\r\n onBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: unknown): void {\r\n this.checked = value === this.value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div [class]=\"wrapperClasses.join(' ')\">\r\n <label [attr.for]=\"id\" class=\"pecb-radio__label\">\r\n <input\r\n [id]=\"id\"\r\n type=\"radio\"\r\n class=\"pecb-radio__input\"\r\n [name]=\"name\"\r\n [value]=\"value\"\r\n [checked]=\"checked\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label\"\r\n [attr.aria-describedby]=\"description ? id + '-description' : null\"\r\n (change)=\"onRadioChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <span *ngIf=\"labelPosition === 'left' && (label || description)\" class=\"pecb-radio__content\">\r\n <span *ngIf=\"label\" class=\"pecb-radio__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-radio__description\">{{ description }}</span>\r\n </span>\r\n <span class=\"pecb-radio__control\"></span>\r\n <span *ngIf=\"labelPosition === 'right' && (label || description)\" class=\"pecb-radio__content\">\r\n <span *ngIf=\"label\" class=\"pecb-radio__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-radio__description\">{{ description }}</span>\r\n </span>\r\n </label>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n forwardRef,\r\n ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type CheckboxLabelPosition = 'right' | 'left';\r\n\r\n/**\r\n * A professional checkbox component with label and description support.\r\n * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-checkbox\r\n * label=\"Accept terms\"\r\n * description=\"I agree to the terms and conditions\"\r\n * [(ngModel)]=\"accepted\"\r\n * ></pecb-checkbox>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-checkbox',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './checkbox.component.html',\r\n styleUrls: ['./checkbox.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CheckboxComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class CheckboxComponent implements ControlValueAccessor {\r\n /**\r\n * Unique ID for the checkbox element\r\n */\r\n @Input() id: string = generateUniqueId('checkbox');\r\n\r\n /**\r\n * Name attribute for the checkbox\r\n */\r\n @Input() name?: string;\r\n\r\n /**\r\n * Label text to display\r\n */\r\n @Input() label?: string;\r\n\r\n /**\r\n * Description text to display below label\r\n */\r\n @Input() description?: string;\r\n\r\n /**\r\n * Position of the label relative to the checkbox control.\r\n * 'right' (default): [checkbox] Title Description\r\n * 'left': Title Description [checkbox]\r\n */\r\n @Input() labelPosition: CheckboxLabelPosition = 'right';\r\n\r\n /**\r\n * Whether the checkbox is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Event emitted when checked state changes\r\n */\r\n @Output() checkedChange = new EventEmitter<boolean>();\r\n\r\n // Internal state\r\n checked = false;\r\n\r\n // ControlValueAccessor\r\n private onChange: (value: boolean) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n /**\r\n * Get CSS classes for the checkbox wrapper\r\n */\r\n get wrapperClasses(): string[] {\r\n return [\r\n 'pecb-checkbox',\r\n this.disabled ? 'pecb-checkbox--disabled' : '',\r\n this.checked ? 'pecb-checkbox--checked' : '',\r\n this.labelPosition === 'left' ? 'pecb-checkbox--label-left' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Handle checkbox change\r\n */\r\n onCheckboxChange(event: Event): void {\r\n if (this.disabled) return;\r\n\r\n const checked = (event.target as HTMLInputElement).checked;\r\n this.checked = checked;\r\n this.onChange(this.checked);\r\n this.checkedChange.emit(this.checked);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Handle blur event\r\n */\r\n onBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: boolean): void {\r\n this.checked = !!value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: boolean) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div [class]=\"wrapperClasses.join(' ')\">\r\n <label [attr.for]=\"id\" class=\"pecb-checkbox__label\">\r\n <input\r\n [id]=\"id\"\r\n type=\"checkbox\"\r\n class=\"pecb-checkbox__input\"\r\n [name]=\"name\"\r\n [checked]=\"checked\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label\"\r\n [attr.aria-describedby]=\"description ? id + '-description' : null\"\r\n (change)=\"onCheckboxChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <span *ngIf=\"labelPosition === 'left' && (label || description)\" class=\"pecb-checkbox__content\">\r\n <span *ngIf=\"label\" class=\"pecb-checkbox__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-checkbox__description\">{{ description }}</span>\r\n </span>\r\n <span class=\"pecb-checkbox__control\">\r\n <svg class=\"pecb-checkbox__icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <span *ngIf=\"labelPosition === 'right' && (label || description)\" class=\"pecb-checkbox__content\">\r\n <span *ngIf=\"label\" class=\"pecb-checkbox__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-checkbox__description\">{{ description }}</span>\r\n </span>\r\n </label>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n forwardRef,\r\n ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport type ToggleLabelPosition = 'right' | 'left';\r\n\r\n/**\r\n * A professional toggle/switch component with label and description support.\r\n * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-toggle\r\n * label=\"Enable notifications\"\r\n * description=\"Receive email notifications\"\r\n * [(ngModel)]=\"notificationsEnabled\"\r\n * ></pecb-toggle>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-toggle',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './toggle.component.html',\r\n styleUrls: ['./toggle.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => ToggleComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class ToggleComponent implements ControlValueAccessor {\r\n /**\r\n * Unique ID for the toggle element\r\n */\r\n @Input() id: string = generateUniqueId('toggle');\r\n\r\n /**\r\n * Name attribute for the toggle\r\n */\r\n @Input() name?: string;\r\n\r\n /**\r\n * Label text to display\r\n */\r\n @Input() label?: string;\r\n\r\n /**\r\n * Description text to display below label\r\n */\r\n @Input() description?: string;\r\n\r\n /**\r\n * Position of the label relative to the toggle control.\r\n * 'right' (default): [toggle] Title Description\r\n * 'left': Title Description [toggle]\r\n */\r\n @Input() labelPosition: ToggleLabelPosition = 'right';\r\n\r\n /**\r\n * Whether the toggle is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Event emitted when toggle state changes\r\n */\r\n @Output() toggleChange = new EventEmitter<boolean>();\r\n\r\n // Internal state\r\n checked = false;\r\n\r\n // ControlValueAccessor\r\n private onChange: (value: boolean) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n /**\r\n * Get CSS classes for the toggle wrapper\r\n */\r\n get wrapperClasses(): string[] {\r\n return [\r\n 'pecb-toggle',\r\n this.disabled ? 'pecb-toggle--disabled' : '',\r\n this.checked ? 'pecb-toggle--checked' : '',\r\n this.labelPosition === 'left' ? 'pecb-toggle--label-left' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Handle toggle change\r\n */\r\n onToggleChange(event: Event): void {\r\n if (this.disabled) return;\r\n\r\n const checked = (event.target as HTMLInputElement).checked;\r\n this.checked = checked;\r\n this.onChange(this.checked);\r\n this.toggleChange.emit(this.checked);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Handle blur event\r\n */\r\n onBlur(): void {\r\n this.onTouched();\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: boolean): void {\r\n this.checked = !!value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: boolean) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div [class]=\"wrapperClasses.join(' ')\">\r\n <label [attr.for]=\"id\" class=\"pecb-toggle__label\">\r\n <input\r\n [id]=\"id\"\r\n type=\"checkbox\"\r\n role=\"switch\"\r\n class=\"pecb-toggle__input\"\r\n [name]=\"name\"\r\n [checked]=\"checked\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label\"\r\n [attr.aria-describedby]=\"description ? id + '-description' : null\"\r\n [attr.aria-checked]=\"checked\"\r\n (change)=\"onToggleChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <span *ngIf=\"labelPosition === 'left' && (label || description)\" class=\"pecb-toggle__content\">\r\n <span *ngIf=\"label\" class=\"pecb-toggle__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-toggle__description\">{{ description }}</span>\r\n </span>\r\n <span class=\"pecb-toggle__control\">\r\n <span class=\"pecb-toggle__thumb\"></span>\r\n </span>\r\n <span *ngIf=\"labelPosition === 'right' && (label || description)\" class=\"pecb-toggle__content\">\r\n <span *ngIf=\"label\" class=\"pecb-toggle__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-toggle__description\">{{ description }}</span>\r\n </span>\r\n </label>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n forwardRef,\r\n ChangeDetectorRef,\r\n HostListener,\r\n ElementRef,\r\n ViewChild\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { generateUniqueId } from '../../shared/utils/dom.utils';\r\n\r\nexport interface DropdownOption {\r\n label: string;\r\n value: unknown;\r\n disabled?: boolean;\r\n}\r\n\r\nexport type DropdownSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * A professional dropdown/select component with multi-select and search support.\r\n * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Single select -->\r\n * <pecb-dropdown\r\n * label=\"Select option\"\r\n * [options]=\"options\"\r\n * [(ngModel)]=\"selectedValue\"\r\n * ></pecb-dropdown>\r\n *\r\n * <!-- Multi-select with search -->\r\n * <pecb-dropdown\r\n * label=\"Select multiple\"\r\n * [options]=\"options\"\r\n * [multiple]=\"true\"\r\n * [searchable]=\"true\"\r\n * [(ngModel)]=\"selectedValues\"\r\n * ></pecb-dropdown>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-dropdown',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './dropdown.component.html',\r\n styleUrls: ['./dropdown.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DropdownComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class DropdownComponent implements ControlValueAccessor {\r\n @ViewChild('searchInput') searchInput?: ElementRef<HTMLInputElement>;\r\n\r\n /**\r\n * Unique ID for the dropdown element\r\n */\r\n @Input() id: string = generateUniqueId('dropdown');\r\n\r\n /**\r\n * Label text to display\r\n */\r\n @Input() label?: string;\r\n\r\n /**\r\n * The size of the dropdown\r\n */\r\n @Input() size: DropdownSize = 'md';\r\n\r\n /**\r\n * List of options\r\n */\r\n @Input() options: DropdownOption[] = [];\r\n\r\n /**\r\n * Whether multiple selection is enabled\r\n */\r\n @Input() multiple = false;\r\n\r\n /**\r\n * Whether search is enabled\r\n */\r\n @Input() searchable = false;\r\n\r\n /**\r\n * Maximum height for dropdown panel (in pixels)\r\n */\r\n @Input() maxHeight = 300;\r\n\r\n /**\r\n * Whether the dropdown is disabled\r\n */\r\n @Input() disabled = false;\r\n\r\n /**\r\n * Whether the field is required\r\n */\r\n @Input() required = false;\r\n\r\n /**\r\n * Whether to show error state\r\n */\r\n @Input() error = false;\r\n\r\n /**\r\n * Error message to display\r\n */\r\n @Input() errorMessage?: string;\r\n\r\n /**\r\n * Helper text to display below dropdown\r\n */\r\n @Input() helperText?: string;\r\n\r\n /**\r\n * Event emitted when selection changes\r\n */\r\n @Output() selectionChange = new EventEmitter<unknown | unknown[]>();\r\n\r\n // Internal state\r\n isOpen = false;\r\n searchQuery = '';\r\n selectedValues: unknown[] = [];\r\n focusedIndex = -1;\r\n\r\n // ControlValueAccessor\r\n private onChange: (value: unknown) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n constructor(\r\n private cdr: ChangeDetectorRef,\r\n private elementRef: ElementRef\r\n ) {}\r\n\r\n /**\r\n * Get CSS classes for the dropdown wrapper\r\n */\r\n get wrapperClasses(): string[] {\r\n return [\r\n 'pecb-dropdown',\r\n `pecb-dropdown--${this.size}`,\r\n this.disabled ? 'pecb-dropdown--disabled' : '',\r\n this.error ? 'pecb-dropdown--error' : '',\r\n this.isOpen ? 'pecb-dropdown--open' : '',\r\n this.hasValue ? 'pecb-dropdown--has-value' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Check if dropdown has value\r\n */\r\n get hasValue(): boolean {\r\n return this.multiple ? this.selectedValues.length > 0 : this.selectedValues.length > 0;\r\n }\r\n\r\n /**\r\n * Get filtered options based on search query\r\n */\r\n get filteredOptions(): DropdownOption[] {\r\n if (!this.searchQuery) {\r\n return this.options;\r\n }\r\n const query = this.searchQuery.toLowerCase();\r\n return this.options.filter(option =>\r\n option.label.toLowerCase().includes(query)\r\n );\r\n }\r\n\r\n /**\r\n * Get display text for selected value(s)\r\n */\r\n get displayText(): string {\r\n if (!this.hasValue) {\r\n return '';\r\n }\r\n\r\n if (this.multiple) {\r\n const selectedOptions = this.options.filter(opt =>\r\n this.selectedValues.includes(opt.value)\r\n );\r\n return selectedOptions.map(opt => opt.label).join(', ');\r\n } else {\r\n const selectedOption = this.options.find(opt =>\r\n opt.value === this.selectedValues[0]\r\n );\r\n return selectedOption?.label || '';\r\n }\r\n }\r\n\r\n /**\r\n * Toggle dropdown open/close\r\n */\r\n toggleDropdown(): void {\r\n if (this.disabled) return;\r\n\r\n this.isOpen = !this.isOpen;\r\n\r\n if (this.isOpen) {\r\n this.onTouched();\r\n this.focusedIndex = -1;\r\n\r\n // Focus search input if searchable\r\n if (this.searchable) {\r\n setTimeout(() => {\r\n this.searchInput?.nativeElement.focus();\r\n }, 0);\r\n }\r\n } else {\r\n this.searchQuery = '';\r\n }\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Select an option\r\n */\r\n selectOption(option: DropdownOption): void {\r\n if (option.disabled) return;\r\n\r\n if (this.multiple) {\r\n const index = this.selectedValues.indexOf(option.value);\r\n if (index > -1) {\r\n this.selectedValues.splice(index, 1);\r\n } else {\r\n this.selectedValues.push(option.value);\r\n }\r\n this.onChange([...this.selectedValues]);\r\n this.selectionChange.emit([...this.selectedValues]);\r\n } else {\r\n this.selectedValues = [option.value];\r\n this.onChange(option.value);\r\n this.selectionChange.emit(option.value);\r\n this.isOpen = false;\r\n this.searchQuery = '';\r\n }\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Check if option is selected\r\n */\r\n isSelected(option: DropdownOption): boolean {\r\n return this.selectedValues.includes(option.value);\r\n }\r\n\r\n /**\r\n * Handle search input\r\n */\r\n onSearchInput(event: Event): void {\r\n const target = event.target as HTMLInputElement;\r\n this.searchQuery = target.value;\r\n this.focusedIndex = -1;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Handle keyboard navigation\r\n */\r\n onKeyDown(event: KeyboardEvent): void {\r\n if (this.disabled) return;\r\n\r\n const filteredOptions = this.filteredOptions;\r\n\r\n switch (event.key) {\r\n case 'Enter':\r\n case ' ':\r\n if (!this.isOpen) {\r\n event.preventDefault();\r\n this.toggleDropdown();\r\n } else if (this.focusedIndex >= 0 && this.focusedIndex < filteredOptions.length) {\r\n event.preventDefault();\r\n this.selectOption(filteredOptions[this.focusedIndex]);\r\n }\r\n break;\r\n\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n if (!this.isOpen) {\r\n this.toggleDropdown();\r\n } else {\r\n this.focusedIndex = Math.min(this.focusedIndex + 1, filteredOptions.length - 1);\r\n this.cdr.markForCheck();\r\n }\r\n break;\r\n\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n if (this.isOpen) {\r\n this.focusedIndex = Math.max(this.focusedIndex - 1, 0);\r\n this.cdr.markForCheck();\r\n }\r\n break;\r\n\r\n case 'Escape':\r\n if (this.isOpen) {\r\n event.preventDefault();\r\n this.isOpen = false;\r\n this.searchQuery = '';\r\n this.cdr.markForCheck();\r\n }\r\n break;\r\n\r\n case 'Tab':\r\n if (this.isOpen) {\r\n this.isOpen = false;\r\n this.searchQuery = '';\r\n this.cdr.markForCheck();\r\n }\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Close dropdown when clicking outside\r\n */\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n if (!this.elementRef.nativeElement.contains(event.target)) {\r\n if (this.isOpen) {\r\n this.isOpen = false;\r\n this.searchQuery = '';\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: unknown): void {\r\n if (this.multiple) {\r\n this.selectedValues = Array.isArray(value) ? value : [];\r\n } else {\r\n this.selectedValues = value != null ? [value] : [];\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: unknown) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div [class]=\"wrapperClasses.join(' ')\">\r\n <!-- Dropdown Trigger -->\r\n <div\r\n class=\"pecb-dropdown__trigger\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\"\r\n [attr.aria-label]=\"label\"\r\n [attr.aria-expanded]=\"isOpen\"\r\n [attr.aria-haspopup]=\"true\"\r\n [attr.aria-disabled]=\"disabled\"\r\n (click)=\"toggleDropdown()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n >\r\n <span class=\"pecb-dropdown__value\">{{ displayText }}</span>\r\n\r\n <!-- Floating Label -->\r\n <label\r\n *ngIf=\"label\"\r\n [attr.for]=\"id\"\r\n class=\"pecb-dropdown__label\"\r\n >\r\n {{ label }}<span *ngIf=\"required\" class=\"pecb-dropdown__required\">*</span>\r\n </label>\r\n\r\n <!-- Dropdown Arrow -->\r\n <span class=\"pecb-dropdown__arrow\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"currentColor\">\r\n <path d=\"M6 8L2 4H10L6 8Z\"/>\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n <!-- Dropdown Panel -->\r\n <div\r\n *ngIf=\"isOpen\"\r\n class=\"pecb-dropdown__panel\"\r\n [style.max-height.px]=\"maxHeight\"\r\n >\r\n <!-- Search Input -->\r\n <div *ngIf=\"searchable\" class=\"pecb-dropdown__search\">\r\n <svg class=\"pecb-dropdown__search-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\"/>\r\n </svg>\r\n <input\r\n #searchInput\r\n type=\"text\"\r\n class=\"pecb-dropdown__search-input\"\r\n placeholder=\"Search\"\r\n [value]=\"searchQuery\"\r\n (input)=\"onSearchInput($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n />\r\n </div>\r\n\r\n <!-- Options List -->\r\n <div class=\"pecb-dropdown__options\">\r\n <div\r\n *ngFor=\"let option of filteredOptions; let i = index\"\r\n class=\"pecb-dropdown__option\"\r\n [class.pecb-dropdown__option--selected]=\"isSelected(option)\"\r\n [class.pecb-dropdown__option--disabled]=\"option.disabled\"\r\n [class.pecb-dropdown__option--focused]=\"i === focusedIndex\"\r\n (click)=\"selectOption(option)\"\r\n >\r\n <!-- Checkbox for multi-select -->\r\n <span *ngIf=\"multiple\" class=\"pecb-dropdown__checkbox\">\r\n <span class=\"pecb-dropdown__checkbox-control\" [class.pecb-dropdown__checkbox-control--checked]=\"isSelected(option)\">\r\n <svg *ngIf=\"isSelected(option)\" class=\"pecb-dropdown__checkbox-icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n </span>\r\n\r\n <!-- Option Label -->\r\n <span class=\"pecb-dropdown__option-label\">{{ option.label }}</span>\r\n </div>\r\n\r\n <!-- No results message -->\r\n <div *ngIf=\"filteredOptions.length === 0\" class=\"pecb-dropdown__no-results\">\r\n No results found\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Helper Text / Error Message -->\r\n <div\r\n *ngIf=\"helperText || errorMessage\"\r\n [id]=\"id + '-description'\"\r\n class=\"pecb-dropdown__description\"\r\n [class.pecb-dropdown__description--error]=\"error && errorMessage\"\r\n >\r\n <span *ngIf=\"error && errorMessage\">{{ errorMessage }}</span>\r\n <span *ngIf=\"!error && helperText\">{{ helperText }}</span>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n Directive,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectionStrategy,\r\n ElementRef,\r\n ViewChild,\r\n AfterViewInit\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { generateUniqueId, trapFocus, disableBodyScroll } from '../../shared/utils/dom.utils';\r\n\r\nexport type RightModalSize = 'sm' | 'md' | 'lg';\r\n\r\n/**\r\n * A right-side sliding modal/drawer component.\r\n * Slides in from the right edge of the screen with backdrop overlay.\r\n * Fully accessible with WCAG 2.1 AA compliance.\r\n *\r\n * @example\r\n * ```html\r\n * <pecb-right-modal\r\n * [isOpen]=\"isModalOpen\"\r\n * (closed)=\"onModalClose()\"\r\n * ariaLabel=\"Exam Details\"\r\n * >\r\n * <div pecbRightModalHeader>\r\n * <h2>Exam Details</h2>\r\n * </div>\r\n * <div pecbRightModalContent>\r\n * <p>Modal content goes here</p>\r\n * </div>\r\n * <div pecbRightModalFooter>\r\n * <button>Action</button>\r\n * </div>\r\n * </pecb-right-modal>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-right-modal',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './right-modal.component.html',\r\n styleUrls: ['./right-modal.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class RightModalComponent implements OnInit, OnDestroy, AfterViewInit {\r\n /**\r\n * Unique ID for the modal element\r\n */\r\n @Input() id: string = generateUniqueId('right-modal');\r\n\r\n /**\r\n * Whether the modal is open\r\n */\r\n @Input() isOpen = false;\r\n\r\n /**\r\n * Size of the modal panel\r\n */\r\n @Input() size: RightModalSize = 'md';\r\n\r\n /**\r\n * Whether clicking the backdrop closes the modal\r\n */\r\n @Input() closeOnBackdropClick = true;\r\n\r\n /**\r\n * Whether pressing Escape closes the modal\r\n */\r\n @Input() closeOnEscape = true;\r\n\r\n /**\r\n * Whether to show the close button\r\n */\r\n @Input() showCloseButton = true;\r\n\r\n // --- ARIA Accessibility Properties ---\r\n\r\n /**\r\n * Accessible label for the modal\r\n */\r\n @Input() ariaLabel?: string;\r\n\r\n /**\r\n * ID of element that labels this modal\r\n */\r\n @Input() ariaLabelledBy?: string;\r\n\r\n /**\r\n * ID of element that describes this modal\r\n */\r\n @Input() ariaDescribedBy?: string;\r\n\r\n /**\r\n * Emitted when the modal is closed\r\n */\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n /**\r\n * Emitted when the modal is opened\r\n */\r\n @Output() opened = new EventEmitter<void>();\r\n\r\n @ViewChild('modalPanel') modalPanel!: ElementRef<HTMLElement>;\r\n\r\n private cleanupFocusTrap: (() => void) | null = null;\r\n private cleanupBodyScroll: (() => void) | null = null;\r\n private previousActiveElement: Element | null = null;\r\n\r\n ngOnInit(): void {\r\n if (this.isOpen) {\r\n this.onOpen();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (this.isOpen && this.modalPanel) {\r\n this.setupFocusTrap();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.cleanup();\r\n }\r\n\r\n /**\r\n * Get CSS classes for the modal container\r\n */\r\n get modalClasses(): string[] {\r\n return [\r\n 'pecb-right-modal',\r\n this.isOpen ? 'pecb-right-modal--open' : ''\r\n ].filter(Boolean);\r\n }\r\n\r\n /**\r\n * Get CSS classes for the modal panel\r\n */\r\n get panelClasses(): string[] {\r\n return [\r\n 'pecb-right-modal__panel',\r\n `pecb-right-modal__panel--${this.size}`\r\n ];\r\n }\r\n\r\n /**\r\n * Handle backdrop click\r\n */\r\n onBackdropClick(event: MouseEvent): void {\r\n if (this.closeOnBackdropClick && event.target === event.currentTarget) {\r\n this.close();\r\n }\r\n }\r\n\r\n /**\r\n * Handle keyboard events\r\n */\r\n onKeydown(event: KeyboardEvent): void {\r\n if (this.closeOnEscape && event.key === 'Escape') {\r\n event.preventDefault();\r\n this.close();\r\n }\r\n }\r\n\r\n /**\r\n * Close the modal\r\n */\r\n close(): void {\r\n this.cleanup();\r\n this.closed.emit();\r\n }\r\n\r\n /**\r\n * Called when modal opens\r\n */\r\n private onOpen(): void {\r\n this.previousActiveElement = document.activeElement;\r\n this.cleanupBodyScroll = disableBodyScroll();\r\n this.opened.emit();\r\n }\r\n\r\n /**\r\n * Setup focus trap after view is ready\r\n */\r\n private setupFocusTrap(): void {\r\n if (this.modalPanel?.nativeElement) {\r\n this.cleanupFocusTrap = trapFocus(this.modalPanel.nativeElement);\r\n }\r\n }\r\n\r\n /**\r\n * Cleanup resources\r\n */\r\n private cleanup(): void {\r\n if (this.cleanupFocusTrap) {\r\n this.cleanupFocusTrap();\r\n this.cleanupFocusTrap = null;\r\n }\r\n if (this.cleanupBodyScroll) {\r\n this.cleanupBodyScroll();\r\n this.cleanupBodyScroll = null;\r\n }\r\n if (this.previousActiveElement instanceof HTMLElement) {\r\n this.previousActiveElement.focus();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Header directive for right modal\r\n */\r\n@Directive({\r\n selector: '[pecbRightModalHeader]',\r\n standalone: true,\r\n host: { class: 'pecb-right-modal__header' }\r\n})\r\nexport class RightModalHeaderDirective {}\r\n\r\n/**\r\n * Content directive for right modal\r\n */\r\n@Directive({\r\n selector: '[pecbRightModalContent]',\r\n standalone: true,\r\n host: { class: 'pecb-right-modal__content' }\r\n})\r\nexport class RightModalContentDirective {}\r\n\r\n/**\r\n * Footer directive for right modal\r\n */\r\n@Directive({\r\n selector: '[pecbRightModalFooter]',\r\n standalone: true,\r\n host: { class: 'pecb-right-modal__footer' }\r\n})\r\nexport class RightModalFooterDirective {}","<div\r\n *ngIf=\"isOpen\"\r\n [id]=\"id\"\r\n [class]=\"modalClasses.join(' ')\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy\"\r\n [attr.aria-describedby]=\"ariaDescribedBy\"\r\n (click)=\"onBackdropClick($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n>\r\n <div\r\n #modalPanel\r\n [class]=\"panelClasses.join(' ')\"\r\n tabindex=\"-1\"\r\n >\r\n <button\r\n *ngIf=\"showCloseButton\"\r\n type=\"button\"\r\n class=\"pecb-right-modal__close-btn\"\r\n aria-label=\"Close modal\"\r\n (click)=\"close()\"\r\n >\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ng-content select=\"[pecbRightModalHeader]\"></ng-content>\r\n <ng-content select=\"[pecbRightModalContent]\"></ng-content>\r\n <ng-content></ng-content>\r\n <ng-content select=\"[pecbRightModalFooter]\"></ng-content>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\n\r\nexport interface SidebarMenuItem {\r\n id: string;\r\n label: string;\r\n icon?: string;\r\n route?: string;\r\n active?: boolean;\r\n children?: SidebarMenuItem[];\r\n expanded?: boolean;\r\n}\r\n\r\nexport interface SidebarSection {\r\n id: string;\r\n title?: string;\r\n items: SidebarMenuItem[];\r\n}\r\n\r\n/**\r\n * A professional sidebar navigation component with collapsible sections and nested items.\r\n * Perfect for application navigation with hierarchical menu structures.\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Basic sidebar -->\r\n * <pecb-sidebar\r\n * [sections]=\"menuSections\"\r\n * (itemClick)=\"onMenuItemClick($event)\"\r\n * ></pecb-sidebar>\r\n *\r\n * <!-- With logo header -->\r\n * <pecb-sidebar\r\n * [sections]=\"menuSections\"\r\n * [showHeader]=\"true\"\r\n * [sidebarLogo]=\"logoSvg\"\r\n * ></pecb-sidebar>\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Component({\r\n selector: 'pecb-sidebar',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './sidebar.component.html',\r\n styleUrls: ['./sidebar.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SidebarComponent {\r\n constructor(private sanitizer: DomSanitizer) {}\r\n\r\n /**\r\n * Array of sidebar sections with menu items\r\n */\r\n @Input() sections: SidebarSection[] = [];\r\n\r\n /**\r\n * Whether to show the header section\r\n */\r\n @Input() showHeader = true;\r\n\r\n /**\r\n * Sidebar logo as an SVG string. Rendered in the header area.\r\n */\r\n @Input() sidebarLogo?: string;\r\n\r\n /**\r\n * Whether to show the footer section\r\n */\r\n @Input() showFooter = false;\r\n\r\n /**\r\n * Whether the sidebar is collapsed\r\n */\r\n @Input() collapsed = false;\r\n\r\n /**\r\n * Event emitted when a menu item is clicked\r\n */\r\n @Output() itemClick = new EventEmitter<SidebarMenuItem>();\r\n\r\n /**\r\n * Event emitted when the sidebar collapse state changes\r\n */\r\n @Output() collapseChange = new EventEmitter<boolean>();\r\n\r\n /**\r\n * Handle menu item click\r\n */\r\n onItemClick(item: SidebarMenuItem, event: Event): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n // Check if this is a top-level item\r\n const isTopLevel = this.sections.some(section =>\r\n section.items.includes(item)\r\n );\r\n\r\n if (isTopLevel) {\r\n // Collapse all other top-level items\r\n this.sections.forEach(section => {\r\n section.items.forEach(sectionItem => {\r\n if (sectionItem !== item && sectionItem.expanded) {\r\n sectionItem.expanded = false;\r\n }\r\n });\r\n });\r\n }\r\n\r\n if (item.children && item.children.length > 0) {\r\n item.expanded = !item.expanded;\r\n }\r\n\r\n // Always emit the click event, even for items with children\r\n this.itemClick.emit(item);\r\n }\r\n\r\n /**\r\n * Toggle sidebar collapse state\r\n */\r\n toggleCollapse(): void {\r\n this.collapsed = !this.collapsed;\r\n this.collapseChange.emit(this.collapsed);\r\n }\r\n\r\n /**\r\n * Sanitize icon SVG HTML to prevent Angular from stripping SVG elements\r\n */\r\n getSafeIcon(icon: string): SafeHtml {\r\n return this.sanitizer.bypassSecurityTrustHtml(icon);\r\n }\r\n\r\n /**\r\n * TrackBy for sections\r\n */\r\n trackBySection(_index: number, section: SidebarSection): string {\r\n return section.id;\r\n }\r\n\r\n /**\r\n * TrackBy for menu items\r\n */\r\n trackByItem(_index: number, item: SidebarMenuItem): string {\r\n return item.id;\r\n }\r\n\r\n /**\r\n * Get CSS classes for a menu item\r\n */\r\n getItemClasses(item: SidebarMenuItem, isChild = false, isNested = false): string[] {\r\n const classes = [\r\n isChild ? 'pecb-sidebar__subitem' : 'pecb-sidebar__item'\r\n ];\r\n\r\n if (isNested) {\r\n classes.push('pecb-sidebar__subitem--nested');\r\n }\r\n\r\n if (item.active) {\r\n classes.push(isChild ? 'pecb-sidebar__subitem--active' : 'pecb-sidebar__item--active');\r\n }\r\n\r\n if (item.children && item.children.length > 0) {\r\n if (!isChild) {\r\n classes.push('pecb-sidebar__item--has-children');\r\n if (item.expanded) {\r\n classes.push('pecb-sidebar__item--expanded');\r\n }\r\n } else if (isChild && !isNested) {\r\n // Second-level items with children\r\n if (item.expanded) {\r\n classes.push('pecb-sidebar__item--expanded');\r\n }\r\n }\r\n }\r\n\r\n return classes;\r\n }\r\n}\r\n","<aside class=\"pecb-sidebar\" [class.pecb-sidebar--collapsed]=\"collapsed\">\r\n <!-- Collapse Toggle Button -->\r\n <button\r\n class=\"pecb-sidebar__toggle\"\r\n [class.pecb-sidebar__toggle--collapsed]=\"collapsed\"\r\n (click)=\"toggleCollapse()\"\r\n [attr.aria-label]=\"collapsed ? 'Expand sidebar' : 'Collapse sidebar'\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Header Section -->\r\n <div *ngIf=\"showHeader\" class=\"pecb-sidebar__header\">\r\n <ng-content select=\"[sidebar-header]\"></ng-content>\r\n <div *ngIf=\"sidebarLogo\" class=\"pecb-sidebar__header-content\">\r\n <span class=\"pecb-sidebar__logo\" [innerHTML]=\"getSafeIcon(sidebarLogo)\"></span>\r\n </div>\r\n </div>\r\n\r\n <!-- Navigation Sections -->\r\n <nav class=\"pecb-sidebar__nav\">\r\n <div *ngFor=\"let section of sections; trackBy: trackBySection\" class=\"pecb-sidebar__section\">\r\n <!-- Section Title -->\r\n <div *ngIf=\"section.title\" class=\"pecb-sidebar__section-title\">\r\n {{ section.title }}\r\n </div>\r\n\r\n <!-- Menu Items -->\r\n <ul class=\"pecb-sidebar__menu\">\r\n <li *ngFor=\"let item of section.items; trackBy: trackByItem\">\r\n <!-- Parent Item -->\r\n <a\r\n [class]=\"getItemClasses(item).join(' ')\"\r\n [attr.href]=\"item.route || '#'\"\r\n (click)=\"onItemClick(item, $event)\"\r\n >\r\n <span *ngIf=\"item.icon\" class=\"pecb-sidebar__icon\" [innerHTML]=\"getSafeIcon(item.icon)\"></span>\r\n <span class=\"pecb-sidebar__label\">{{ item.label }}</span>\r\n </a>\r\n\r\n <!-- Child Items -->\r\n <ul\r\n *ngIf=\"item.children && item.children.length > 0 && !collapsed\"\r\n class=\"pecb-sidebar__submenu\"\r\n [class.pecb-sidebar__submenu--open]=\"item.expanded\"\r\n >\r\n <li *ngFor=\"let child of item.children; trackBy: trackByItem\">\r\n <a\r\n [class]=\"getItemClasses(child, true, false).join(' ')\"\r\n [attr.href]=\"child.route || '#'\"\r\n (click)=\"onItemClick(child, $event)\"\r\n >\r\n <span *ngIf=\"child.icon\" class=\"pecb-sidebar__icon\" [innerHTML]=\"getSafeIcon(child.icon)\"></span>\r\n <span class=\"pecb-sidebar__label\">{{ child.label }}</span>\r\n <span\r\n *ngIf=\"child.children && child.children.length > 0\"\r\n class=\"pecb-sidebar__arrow\"\r\n [class.pecb-sidebar__arrow--expanded]=\"child.expanded\"\r\n >\r\n <!-- Minus icon (expanded) -->\r\n <svg *ngIf=\"child.expanded\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 8h8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n <!-- Plus icon (collapsed) -->\r\n <svg *ngIf=\"!child.expanded\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 4v8M4 8h8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </span>\r\n </a>\r\n\r\n <!-- Nested Child Items (Third Level) -->\r\n <ul\r\n *ngIf=\"child.children && child.children.length > 0\"\r\n class=\"pecb-sidebar__submenu\"\r\n [class.pecb-sidebar__submenu--open]=\"child.expanded\"\r\n >\r\n <li *ngFor=\"let nestedChild of child.children; trackBy: trackByItem\">\r\n <a\r\n [class]=\"getItemClasses(nestedChild, true, true).join(' ')\"\r\n [attr.href]=\"nestedChild.route || '#'\"\r\n (click)=\"onItemClick(nestedChild, $event)\"\r\n >\r\n <span class=\"pecb-sidebar__label\">{{ nestedChild.label }}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </div>\r\n </nav>\r\n\r\n <!-- Footer Section -->\r\n <div *ngIf=\"showFooter\" class=\"pecb-sidebar__footer\">\r\n <ng-content select=\"[sidebar-footer]\"></ng-content>\r\n </div>\r\n</aside>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { ButtonComponent } from './components/button/button.component';\r\nimport {\r\n CardComponent,\r\n CardHeaderComponent,\r\n CardBodyComponent,\r\n CardFooterComponent\r\n} from './components/card/card.component';\r\nimport { StatusComponent } from './components/status/status.component';\r\nimport { PaginationComponent } from './components/pagination/pagination.component';\r\nimport { TableComponent } from './components/table/table.component';\r\nimport { TabComponent } from './components/tab/tab.component';\r\nimport { DatepickerComponent } from './components/datepicker/datepicker.component';\r\nimport { InputComponent } from './components/input/input.component';\r\nimport { RadioComponent } from './components/radio/radio.component';\r\nimport { CheckboxComponent } from './components/checkbox/checkbox.component';\r\nimport { ToggleComponent } from './components/toggle/toggle.component';\r\nimport { DropdownComponent } from './components/dropdown/dropdown.component';\r\nimport {\r\n RightModalComponent,\r\n RightModalHeaderDirective,\r\n RightModalContentDirective,\r\n RightModalFooterDirective\r\n} from './components/right-modal/right-modal.component';\r\nimport { SidebarComponent } from './components/sidebar/sidebar.component';\r\n\r\nconst COMPONENTS = [\r\n ButtonComponent,\r\n CardComponent,\r\n CardHeaderComponent,\r\n CardBodyComponent,\r\n CardFooterComponent,\r\n StatusComponent,\r\n PaginationComponent,\r\n TableComponent,\r\n TabComponent,\r\n DatepickerComponent,\r\n InputComponent,\r\n RadioComponent,\r\n CheckboxComponent,\r\n ToggleComponent,\r\n DropdownComponent,\r\n RightModalComponent,\r\n RightModalHeaderDirective,\r\n RightModalContentDirective,\r\n RightModalFooterDirective,\r\n SidebarComponent\r\n];\r\n\r\n/**\r\n * PECB UI Components Module\r\n *\r\n * A professional Angular components library with TypeScript and SCSS.\r\n * Import this module to use all PECB UI components in your application.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { PecbComponentsModule } from '@pecb-ui/components';\r\n *\r\n * @NgModule({\r\n * imports: [PecbComponentsModule]\r\n * })\r\n * export class AppModule { }\r\n * ```\r\n */\r\n@NgModule({\r\n imports: [CommonModule, ...COMPONENTS],\r\n exports: COMPONENTS\r\n})\r\nexport class PecbComponentsModule {}\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject, Observable } from 'rxjs';\r\n\r\n/**\r\n * Notification types supported by the service\r\n */\r\nexport type NotificationType = 'success' | 'error' | 'warning' | 'info';\r\n\r\n/**\r\n * Notification position on screen\r\n */\r\nexport type NotificationPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center';\r\n\r\n/**\r\n * Notification configuration options\r\n */\r\nexport interface NotificationConfig {\r\n /** Notification message */\r\n message: string;\r\n /** Notification title (optional) */\r\n title?: string;\r\n /** Type of notification */\r\n type: NotificationType;\r\n /** Duration in milliseconds (0 for persistent) */\r\n duration?: number;\r\n /** Whether the notification can be dismissed */\r\n dismissible?: boolean;\r\n /** Position on screen */\r\n position?: NotificationPosition;\r\n /** Custom CSS class */\r\n customClass?: string;\r\n /** Unique identifier */\r\n id?: string;\r\n}\r\n\r\n/**\r\n * Notification object with all properties\r\n */\r\nexport interface Notification extends Required<Omit<NotificationConfig, 'title' | 'customClass'>> {\r\n title?: string;\r\n customClass?: string;\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * A stateless, injectable notification service for displaying toast notifications.\r\n *\r\n * This service provides a reactive way to manage notifications across the application.\r\n * It uses RxJS Subjects to emit notification events that can be consumed by notification\r\n * display components.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { NotificationService } from '@pecb-ui/components';\r\n *\r\n * @Component({...})\r\n * export class MyComponent {\r\n * constructor(private notificationService: NotificationService) {}\r\n *\r\n * showSuccess(): void {\r\n * this.notificationService.success('Operation completed successfully!');\r\n * }\r\n *\r\n * showError(): void {\r\n * this.notificationService.error('An error occurred', 'Error Title');\r\n * }\r\n * }\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NotificationService {\r\n private readonly notificationSubject = new Subject<Notification>();\r\n private readonly dismissSubject = new Subject<string>();\r\n private readonly clearSubject = new Subject<void>();\r\n\r\n /** Default duration for notifications in milliseconds */\r\n private readonly defaultDuration = 5000;\r\n /** Default position for notifications */\r\n private readonly defaultPosition: NotificationPosition = 'top-right';\r\n\r\n /**\r\n * Observable stream of notifications\r\n */\r\n get notifications$(): Observable<Notification> {\r\n return this.notificationSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Observable stream of dismissed notification IDs\r\n */\r\n get dismiss$(): Observable<string> {\r\n return this.dismissSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Observable stream for clear all events\r\n */\r\n get clear$(): Observable<void> {\r\n return this.clearSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Show a success notification\r\n * @param message - The notification message\r\n * @param title - Optional title\r\n * @param config - Optional additional configuration\r\n */\r\n success(message: string, title?: string, config?: Partial<NotificationConfig>): string {\r\n return this.show({ ...config, message, title, type: 'success' });\r\n }\r\n\r\n /**\r\n * Show an error notification\r\n * @param message - The notification message\r\n * @param title - Optional title\r\n * @param config - Optional additional configuration\r\n */\r\n error(message: string, title?: string, config?: Partial<NotificationConfig>): string {\r\n return this.show({ ...config, message, title, type: 'error' });\r\n }\r\n\r\n /**\r\n * Show a warning notification\r\n * @param message - The notification message\r\n * @param title - Optional title\r\n * @param config - Optional additional configuration\r\n */\r\n warning(message: string, title?: string, config?: Partial<NotificationConfig>): string {\r\n return this.show({ ...config, message, title, type: 'warning' });\r\n }\r\n\r\n /**\r\n * Show an info notification\r\n * @param message - The notification message\r\n * @param title - Optional title\r\n * @param config - Optional additional configuration\r\n */\r\n info(message: string, title?: string, config?: Partial<NotificationConfig>): string {\r\n return this.show({ ...config, message, title, type: 'info' });\r\n }\r\n\r\n /**\r\n * Show a notification with custom configuration\r\n * @param config - Full notification configuration\r\n * @returns The notification ID\r\n */\r\n show(config: NotificationConfig): string {\r\n const id = config.id || this.generateId();\r\n\r\n const notification: Notification = {\r\n id,\r\n message: config.message,\r\n title: config.title,\r\n type: config.type,\r\n duration: config.duration ?? this.defaultDuration,\r\n dismissible: config.dismissible ?? true,\r\n position: config.position ?? this.defaultPosition,\r\n customClass: config.customClass,\r\n timestamp: new Date()\r\n };\r\n\r\n this.notificationSubject.next(notification);\r\n return id;\r\n }\r\n\r\n /**\r\n * Dismiss a specific notification by ID\r\n * @param id - The notification ID to dismiss\r\n */\r\n dismiss(id: string): void {\r\n this.dismissSubject.next(id);\r\n }\r\n\r\n /**\r\n * Clear all notifications\r\n */\r\n clearAll(): void {\r\n this.clearSubject.next();\r\n }\r\n\r\n /**\r\n * Generate a unique notification ID\r\n */\r\n private generateId(): string {\r\n return `notification-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\r\n }\r\n}\r\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\n/**\r\n * Available theme modes\r\n */\r\nexport type ThemeMode = 'light' | 'dark' | 'system';\r\n\r\n/**\r\n * Theme configuration interface\r\n */\r\nexport interface ThemeConfig {\r\n /** Current theme mode */\r\n mode: ThemeMode;\r\n /** Resolved theme (light or dark, never system) */\r\n resolvedTheme: 'light' | 'dark';\r\n /** CSS class to apply to the document */\r\n cssClass: string;\r\n}\r\n\r\n/**\r\n * Custom theme variables that can be overridden\r\n */\r\nexport interface ThemeVariables {\r\n /** Primary color */\r\n primaryColor?: string;\r\n /** Secondary color */\r\n secondaryColor?: string;\r\n /** Background color */\r\n backgroundColor?: string;\r\n /** Text color */\r\n textColor?: string;\r\n /** Border radius */\r\n borderRadius?: string;\r\n /** Font family */\r\n fontFamily?: string;\r\n /** Custom CSS variables */\r\n [key: string]: string | undefined;\r\n}\r\n\r\n/**\r\n * Storage key for persisting theme preference\r\n */\r\nconst THEME_STORAGE_KEY = 'pecb-ui-theme';\r\n\r\n/**\r\n * A stateless, injectable theme service for managing application themes.\r\n *\r\n * This service provides reactive theme management with support for light/dark modes,\r\n * system preference detection, and custom CSS variable overrides.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { ThemeService } from '@pecb-ui/components';\r\n *\r\n * @Component({...})\r\n * export class MyComponent {\r\n * constructor(private themeService: ThemeService) {}\r\n *\r\n * toggleTheme(): void {\r\n * this.themeService.toggleTheme();\r\n * }\r\n *\r\n * setDarkMode(): void {\r\n * this.themeService.setTheme('dark');\r\n * }\r\n * }\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ThemeService {\r\n private readonly themeSubject: BehaviorSubject<ThemeConfig>;\r\n private readonly isBrowser: boolean;\r\n private mediaQuery: MediaQueryList | null = null;\r\n\r\n constructor(@Inject(PLATFORM_ID) platformId: object) {\r\n this.isBrowser = isPlatformBrowser(platformId);\r\n\r\n const initialTheme = this.getInitialTheme();\r\n this.themeSubject = new BehaviorSubject<ThemeConfig>(this.createThemeConfig(initialTheme));\r\n\r\n if (this.isBrowser) {\r\n this.setupSystemThemeListener();\r\n this.applyTheme(this.themeSubject.value);\r\n }\r\n }\r\n\r\n /**\r\n * Observable stream of theme configuration changes\r\n */\r\n get theme$(): Observable<ThemeConfig> {\r\n return this.themeSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Get the current theme configuration\r\n */\r\n get currentTheme(): ThemeConfig {\r\n return this.themeSubject.value;\r\n }\r\n\r\n /**\r\n * Get the current theme mode\r\n */\r\n get currentMode(): ThemeMode {\r\n return this.themeSubject.value.mode;\r\n }\r\n\r\n /**\r\n * Check if the current resolved theme is dark\r\n */\r\n get isDarkMode(): boolean {\r\n return this.themeSubject.value.resolvedTheme === 'dark';\r\n }\r\n\r\n /**\r\n * Set the theme mode\r\n * @param mode - The theme mode to set (light, dark, or system)\r\n */\r\n setTheme(mode: ThemeMode): void {\r\n const config = this.createThemeConfig(mode);\r\n this.themeSubject.next(config);\r\n this.persistTheme(mode);\r\n\r\n if (this.isBrowser) {\r\n this.applyTheme(config);\r\n }\r\n }\r\n\r\n /**\r\n * Toggle between light and dark themes\r\n * If currently using system preference, switches to the opposite of the resolved theme\r\n */\r\n toggleTheme(): void {\r\n const current = this.themeSubject.value;\r\n const newMode: ThemeMode = current.resolvedTheme === 'light' ? 'dark' : 'light';\r\n this.setTheme(newMode);\r\n }\r\n\r\n /**\r\n * Reset to system preference\r\n */\r\n useSystemTheme(): void {\r\n this.setTheme('system');\r\n }\r\n\r\n /**\r\n * Apply custom CSS variables to the document\r\n * @param variables - Object containing CSS variable overrides\r\n */\r\n setCustomVariables(variables: ThemeVariables): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n const root = document.documentElement;\r\n Object.entries(variables).forEach(([key, value]) => {\r\n if (value !== undefined) {\r\n const cssVarName = this.toCssVariableName(key);\r\n root.style.setProperty(cssVarName, value);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Remove custom CSS variables from the document\r\n * @param variableNames - Array of variable names to remove\r\n */\r\n removeCustomVariables(variableNames: string[]): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n const root = document.documentElement;\r\n variableNames.forEach(name => {\r\n const cssVarName = this.toCssVariableName(name);\r\n root.style.removeProperty(cssVarName);\r\n });\r\n }\r\n\r\n /**\r\n * Get the initial theme from storage or system preference\r\n */\r\n private getInitialTheme(): ThemeMode {\r\n if (!this.isBrowser) {\r\n return 'light';\r\n }\r\n\r\n const stored = localStorage.getItem(THEME_STORAGE_KEY);\r\n if (stored && ['light', 'dark', 'system'].includes(stored)) {\r\n return stored as ThemeMode;\r\n }\r\n\r\n return 'system';\r\n }\r\n\r\n /**\r\n * Create a theme configuration object\r\n */\r\n private createThemeConfig(mode: ThemeMode): ThemeConfig {\r\n const resolvedTheme = this.resolveTheme(mode);\r\n return {\r\n mode,\r\n resolvedTheme,\r\n cssClass: `pecb-theme-${resolvedTheme}`\r\n };\r\n }\r\n\r\n /**\r\n * Resolve the actual theme from mode (handles 'system' mode)\r\n */\r\n private resolveTheme(mode: ThemeMode): 'light' | 'dark' {\r\n if (mode === 'system') {\r\n return this.getSystemPreference();\r\n }\r\n return mode;\r\n }\r\n\r\n /**\r\n * Get the system color scheme preference\r\n */\r\n private getSystemPreference(): 'light' | 'dark' {\r\n if (!this.isBrowser) {\r\n return 'light';\r\n }\r\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\r\n }\r\n\r\n /**\r\n * Setup listener for system theme changes\r\n */\r\n private setupSystemThemeListener(): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n this.mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n\r\n const listener = (): void => {\r\n if (this.themeSubject.value.mode === 'system') {\r\n const config = this.createThemeConfig('system');\r\n this.themeSubject.next(config);\r\n this.applyTheme(config);\r\n }\r\n };\r\n\r\n // Use addEventListener for modern browsers\r\n if (this.mediaQuery.addEventListener) {\r\n this.mediaQuery.addEventListener('change', listener);\r\n }\r\n }\r\n\r\n /**\r\n * Apply the theme to the document\r\n */\r\n private applyTheme(config: ThemeConfig): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n\r\n const root = document.documentElement;\r\n\r\n // Remove existing theme classes\r\n root.classList.remove('pecb-theme-light', 'pecb-theme-dark');\r\n\r\n // Add new theme class\r\n root.classList.add(config.cssClass);\r\n\r\n // Set data attribute for CSS selectors\r\n root.setAttribute('data-pecb-theme', config.resolvedTheme);\r\n }\r\n\r\n /**\r\n * Persist theme preference to storage\r\n */\r\n private persistTheme(mode: ThemeMode): void {\r\n if (!this.isBrowser) {\r\n return;\r\n }\r\n localStorage.setItem(THEME_STORAGE_KEY, mode);\r\n }\r\n\r\n /**\r\n * Convert camelCase property name to CSS variable name\r\n */\r\n private toCssVariableName(name: string): string {\r\n const kebabCase = name.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n return `--pecb-${kebabCase}`;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n/**\r\n * Loading state for a specific operation\r\n */\r\nexport interface LoadingState {\r\n /** Unique identifier for the loading operation */\r\n id: string;\r\n /** Whether this operation is currently loading */\r\n isLoading: boolean;\r\n /** Optional message to display */\r\n message?: string;\r\n /** Optional progress percentage (0-100) */\r\n progress?: number;\r\n}\r\n\r\n/**\r\n * A stateless, injectable loading service for managing loading states.\r\n *\r\n * This service provides a centralized way to track loading states across\r\n * the application, supporting multiple concurrent loading operations with\r\n * individual tracking capabilities.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { LoadingService } from '@pecb-ui/components';\r\n *\r\n * @Component({...})\r\n * export class MyComponent {\r\n * isLoading$ = this.loadingService.isLoading$('my-operation');\r\n *\r\n * constructor(private loadingService: LoadingService) {}\r\n *\r\n * async loadData(): Promise<void> {\r\n * this.loadingService.start('my-operation', 'Loading data...');\r\n * try {\r\n * await this.fetchData();\r\n * } finally {\r\n * this.loadingService.stop('my-operation');\r\n * }\r\n * }\r\n * }\r\n * ```\r\n *\r\n * @publicApi\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LoadingService {\r\n private readonly loadingStates = new Map<string, LoadingState>();\r\n private readonly statesSubject = new BehaviorSubject<Map<string, LoadingState>>(new Map());\r\n\r\n /** Default loading operation ID */\r\n private readonly defaultId = 'global';\r\n\r\n /**\r\n * Observable of all loading states\r\n */\r\n get states$(): Observable<Map<string, LoadingState>> {\r\n return this.statesSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Observable that emits true when any loading operation is active\r\n */\r\n get isAnyLoading$(): Observable<boolean> {\r\n return this.statesSubject.pipe(\r\n map(states => Array.from(states.values()).some(state => state.isLoading))\r\n );\r\n }\r\n\r\n /**\r\n * Get observable for a specific loading operation\r\n * @param id - The loading operation identifier\r\n */\r\n isLoading$(id: string = this.defaultId): Observable<boolean> {\r\n return this.statesSubject.pipe(\r\n map(states => states.get(id)?.isLoading ?? false)\r\n );\r\n }\r\n\r\n /**\r\n * Get observable for loading state with message\r\n * @param id - The loading operation identifier\r\n */\r\n getState$(id: string = this.defaultId): Observable<LoadingState | undefined> {\r\n return this.statesSubject.pipe(\r\n map(states => states.get(id))\r\n );\r\n }\r\n\r\n /**\r\n * Check if a specific operation is currently loading (synchronous)\r\n * @param id - The loading operation identifier\r\n */\r\n isLoading(id: string = this.defaultId): boolean {\r\n return this.loadingStates.get(id)?.isLoading ?? false;\r\n }\r\n\r\n /**\r\n * Check if any operation is currently loading (synchronous)\r\n */\r\n isAnyLoading(): boolean {\r\n return Array.from(this.loadingStates.values()).some(state => state.isLoading);\r\n }\r\n\r\n /**\r\n * Start a loading operation\r\n * @param id - The loading operation identifier\r\n * @param message - Optional message to display\r\n */\r\n start(id: string = this.defaultId, message?: string): void {\r\n this.updateState(id, { isLoading: true, message, progress: undefined });\r\n }\r\n\r\n /**\r\n * Stop a loading operation\r\n * @param id - The loading operation identifier\r\n */\r\n stop(id: string = this.defaultId): void {\r\n this.updateState(id, { isLoading: false, message: undefined, progress: undefined });\r\n }\r\n\r\n /**\r\n * Update progress for a loading operation\r\n * @param id - The loading operation identifier\r\n * @param progress - Progress percentage (0-100)\r\n * @param message - Optional updated message\r\n */\r\n setProgress(id: string, progress: number, message?: string): void {\r\n const currentState = this.loadingStates.get(id);\r\n if (currentState) {\r\n this.updateState(id, {\r\n isLoading: true,\r\n progress: Math.min(100, Math.max(0, progress)),\r\n message: message ?? currentState.message\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Update the message for a loading operation\r\n * @param id - The loading operation identifier\r\n * @param message - New message to display\r\n */\r\n setMessage(id: string, message: string): void {\r\n const currentState = this.loadingStates.get(id);\r\n if (currentState) {\r\n this.updateState(id, { ...currentState, id, message });\r\n }\r\n }\r\n\r\n /**\r\n * Stop all loading operations\r\n */\r\n stopAll(): void {\r\n this.loadingStates.clear();\r\n this.statesSubject.next(new Map());\r\n }\r\n\r\n /**\r\n * Remove a loading state completely\r\n * @param id - The loading operation identifier\r\n */\r\n remove(id: string): void {\r\n this.loadingStates.delete(id);\r\n this.emitStates();\r\n }\r\n\r\n /**\r\n * Execute an async operation with automatic loading state management\r\n * @param id - The loading operation identifier\r\n * @param operation - The async operation to execute\r\n * @param message - Optional loading message\r\n * @returns The result of the operation\r\n */\r\n async withLoading<T>(\r\n id: string,\r\n operation: () => Promise<T>,\r\n message?: string\r\n ): Promise<T> {\r\n this.start(id, message);\r\n try {\r\n return await operation();\r\n } finally {\r\n this.stop(id);\r\n }\r\n }\r\n\r\n /**\r\n * Update a loading state\r\n */\r\n private updateState(id: string, partialState: Partial<LoadingState> & { isLoading: boolean }): void {\r\n const state: LoadingState = {\r\n id,\r\n isLoading: partialState.isLoading,\r\n message: partialState.message,\r\n progress: partialState.progress\r\n };\r\n\r\n this.loadingStates.set(id, state);\r\n this.emitStates();\r\n }\r\n\r\n /**\r\n * Emit current states to subscribers\r\n */\r\n private emitStates(): void {\r\n this.statesSubject.next(new Map(this.loadingStates));\r\n }\r\n}\r\n","/**\r\n * Common type definitions for PECB UI Components\r\n * @module types\r\n */\r\n\r\n/**\r\n * Standard size variants used across components\r\n */\r\nexport type Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Standard component size mapping\r\n */\r\nexport type ComponentSize = 'small' | 'medium' | 'large';\r\n\r\n/**\r\n * Semantic color variants\r\n */\r\nexport type ColorVariant = 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info';\r\n\r\n/**\r\n * Extended color variants including neutral options\r\n */\r\nexport type ExtendedColorVariant = ColorVariant | 'neutral' | 'muted';\r\n\r\n/**\r\n * Component state variants\r\n */\r\nexport type StateVariant = 'default' | 'hover' | 'active' | 'focus' | 'disabled';\r\n\r\n/**\r\n * Position options for overlays and popups\r\n */\r\nexport type Position =\r\n | 'top'\r\n | 'top-start'\r\n | 'top-end'\r\n | 'bottom'\r\n | 'bottom-start'\r\n | 'bottom-end'\r\n | 'left'\r\n | 'left-start'\r\n | 'left-end'\r\n | 'right'\r\n | 'right-start'\r\n | 'right-end';\r\n\r\n/**\r\n * Alignment options\r\n */\r\nexport type Alignment = 'start' | 'center' | 'end' | 'stretch';\r\n\r\n/**\r\n * Direction options for layouts\r\n */\r\nexport type Direction = 'horizontal' | 'vertical';\r\n\r\n/**\r\n * Orientation alias for direction\r\n */\r\nexport type Orientation = 'horizontal' | 'vertical';\r\n\r\n/**\r\n * Spacing scale values\r\n */\r\nexport type SpacingScale = 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\n\r\n/**\r\n * Border radius scale values\r\n */\r\nexport type RadiusScale = 'none' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\r\n\r\n/**\r\n * Shadow elevation levels\r\n */\r\nexport type ElevationLevel = 'none' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Animation timing presets\r\n */\r\nexport type AnimationTiming = 'instant' | 'fast' | 'normal' | 'slow';\r\n\r\n/**\r\n * Breakpoint names\r\n */\r\nexport type Breakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\n\r\n/**\r\n * Form validation state\r\n */\r\nexport type ValidationState = 'valid' | 'invalid' | 'pending' | 'pristine';\r\n\r\n/**\r\n * Generic callback function type\r\n */\r\nexport type Callback<T = void> = () => T;\r\n\r\n/**\r\n * Generic event handler type\r\n */\r\nexport type EventHandler<T = Event> = (event: T) => void;\r\n\r\n/**\r\n * Make specific properties required\r\n */\r\nexport type RequireProps<T, K extends keyof T> = T & Required<Pick<T, K>>;\r\n\r\n/**\r\n * Make specific properties optional\r\n */\r\nexport type OptionalProps<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\r\n\r\n/**\r\n * Extract non-nullable type\r\n */\r\nexport type NonNullableProps<T> = {\r\n [K in keyof T]: NonNullable<T[K]>;\r\n};\r\n","/**\r\n * String utility functions for PECB UI Components\r\n * @module utils/string\r\n */\r\n\r\n/**\r\n * Convert a string to kebab-case\r\n * @param str - The string to convert\r\n * @returns The kebab-case string\r\n *\r\n * @example\r\n * toKebabCase('myComponentName') // 'my-component-name'\r\n * toKebabCase('MyComponentName') // 'my-component-name'\r\n */\r\nexport function toKebabCase(str: string): string {\r\n return str\r\n .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n .replace(/[\\s_]+/g, '-')\r\n .toLowerCase();\r\n}\r\n\r\n/**\r\n * Convert a string to camelCase\r\n * @param str - The string to convert\r\n * @returns The camelCase string\r\n *\r\n * @example\r\n * toCamelCase('my-component-name') // 'myComponentName'\r\n * toCamelCase('my_component_name') // 'myComponentName'\r\n */\r\nexport function toCamelCase(str: string): string {\r\n return str\r\n .replace(/[-_\\s]+(.)?/g, (_, char) => (char ? char.toUpperCase() : ''))\r\n .replace(/^[A-Z]/, char => char.toLowerCase());\r\n}\r\n\r\n/**\r\n * Convert a string to PascalCase\r\n * @param str - The string to convert\r\n * @returns The PascalCase string\r\n *\r\n * @example\r\n * toPascalCase('my-component-name') // 'MyComponentName'\r\n */\r\nexport function toPascalCase(str: string): string {\r\n const camel = toCamelCase(str);\r\n return camel.charAt(0).toUpperCase() + camel.slice(1);\r\n}\r\n\r\n/**\r\n * Convert a string to snake_case\r\n * @param str - The string to convert\r\n * @returns The snake_case string\r\n *\r\n * @example\r\n * toSnakeCase('myComponentName') // 'my_component_name'\r\n */\r\nexport function toSnakeCase(str: string): string {\r\n return toKebabCase(str).replace(/-/g, '_');\r\n}\r\n\r\n/**\r\n * Capitalize the first letter of a string\r\n * @param str - The string to capitalize\r\n * @returns The capitalized string\r\n *\r\n * @example\r\n * capitalize('hello world') // 'Hello world'\r\n */\r\nexport function capitalize(str: string): string {\r\n if (!str) return str;\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\n/**\r\n * Truncate a string to a specified length\r\n * @param str - The string to truncate\r\n * @param maxLength - Maximum length\r\n * @param suffix - Suffix to append when truncated (default: '...')\r\n * @returns The truncated string\r\n *\r\n * @example\r\n * truncate('Hello World', 8) // 'Hello...'\r\n * truncate('Hello World', 8, '…') // 'Hello W…'\r\n */\r\nexport function truncate(str: string, maxLength: number, suffix = '...'): string {\r\n if (!str || str.length <= maxLength) return str;\r\n return str.slice(0, maxLength - suffix.length) + suffix;\r\n}\r\n\r\n/**\r\n * Check if a string is empty or contains only whitespace\r\n * @param str - The string to check\r\n * @returns True if the string is empty or whitespace\r\n *\r\n * @example\r\n * isBlank('') // true\r\n * isBlank(' ') // true\r\n * isBlank('hello') // false\r\n */\r\nexport function isBlank(str: string | null | undefined): boolean {\r\n return !str || str.trim().length === 0;\r\n}\r\n\r\n/**\r\n * Check if a string is not empty and contains non-whitespace characters\r\n * @param str - The string to check\r\n * @returns True if the string is not empty\r\n */\r\nexport function isNotBlank(str: string | null | undefined): str is string {\r\n return !isBlank(str);\r\n}\r\n\r\n/**\r\n * Generate a slug from a string (URL-friendly)\r\n * @param str - The string to convert\r\n * @returns URL-friendly slug\r\n *\r\n * @example\r\n * slugify('Hello World!') // 'hello-world'\r\n * slugify('Café Latte') // 'cafe-latte'\r\n */\r\nexport function slugify(str: string): string {\r\n return str\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '') // Remove diacritics\r\n .replace(/[^a-z0-9\\s-]/g, '') // Remove non-alphanumeric\r\n .replace(/[\\s_]+/g, '-') // Replace spaces with hyphens\r\n .replace(/-+/g, '-') // Remove consecutive hyphens\r\n .replace(/^-|-$/g, ''); // Trim hyphens from ends\r\n}\r\n\r\n/**\r\n * Escape HTML special characters\r\n * @param str - The string to escape\r\n * @returns The escaped string\r\n *\r\n * @example\r\n * escapeHtml('<script>alert(\"XSS\")</script>') // '&lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;'\r\n */\r\nexport function escapeHtml(str: string): string {\r\n const htmlEscapes: Record<string, string> = {\r\n '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n '\"': '&quot;',\r\n \"'\": '&#39;'\r\n };\r\n return str.replace(/[&<>\"']/g, char => htmlEscapes[char]);\r\n}\r\n\r\n/**\r\n * Strip HTML tags from a string\r\n * @param str - The string containing HTML\r\n * @returns The string without HTML tags\r\n *\r\n * @example\r\n * stripHtml('<p>Hello <strong>World</strong></p>') // 'Hello World'\r\n */\r\nexport function stripHtml(str: string): string {\r\n return str.replace(/<[^>]*>/g, '');\r\n}\r\n\r\n/**\r\n * Generate initials from a name\r\n * @param name - The name to extract initials from\r\n * @param maxLength - Maximum number of initials (default: 2)\r\n * @returns The initials in uppercase\r\n *\r\n * @example\r\n * getInitials('John Doe') // 'JD'\r\n * getInitials('John Michael Doe', 3) // 'JMD'\r\n */\r\nexport function getInitials(name: string, maxLength = 2): string {\r\n if (!name) return '';\r\n\r\n return name\r\n .split(/\\s+/)\r\n .filter(Boolean)\r\n .slice(0, maxLength)\r\n .map(word => word.charAt(0).toUpperCase())\r\n .join('');\r\n}\r\n\r\n/**\r\n * Pluralize a word based on count\r\n * @param count - The count to check\r\n * @param singular - Singular form\r\n * @param plural - Plural form (optional, defaults to singular + 's')\r\n * @returns The appropriate form of the word\r\n *\r\n * @example\r\n * pluralize(1, 'item') // 'item'\r\n * pluralize(5, 'item') // 'items'\r\n * pluralize(2, 'child', 'children') // 'children'\r\n */\r\nexport function pluralize(count: number, singular: string, plural?: string): string {\r\n return count === 1 ? singular : (plural ?? `${singular}s`);\r\n}\r\n\r\n/**\r\n * Format a number as a string with count and pluralized label\r\n * @param count - The count\r\n * @param singular - Singular form of the label\r\n * @param plural - Plural form (optional)\r\n * @returns Formatted string like \"5 items\"\r\n *\r\n * @example\r\n * formatCount(1, 'item') // '1 item'\r\n * formatCount(5, 'item') // '5 items'\r\n */\r\nexport function formatCount(count: number, singular: string, plural?: string): string {\r\n return `${count} ${pluralize(count, singular, plural)}`;\r\n}\r\n","/**\r\n * Accessibility utility functions for PECB UI Components\r\n * Helps ensure WCAG 2.1 compliance\r\n * @module utils/accessibility\r\n */\r\n\r\nimport { generateUniqueId } from './dom.utils';\r\n\r\n/**\r\n * ARIA live region politeness levels\r\n */\r\nexport type AriaLive = 'off' | 'polite' | 'assertive';\r\n\r\n/**\r\n * ARIA roles commonly used in components\r\n */\r\nexport type AriaRole =\r\n | 'alert'\r\n | 'alertdialog'\r\n | 'button'\r\n | 'checkbox'\r\n | 'combobox'\r\n | 'dialog'\r\n | 'grid'\r\n | 'gridcell'\r\n | 'link'\r\n | 'listbox'\r\n | 'menu'\r\n | 'menubar'\r\n | 'menuitem'\r\n | 'menuitemcheckbox'\r\n | 'menuitemradio'\r\n | 'option'\r\n | 'progressbar'\r\n | 'radio'\r\n | 'radiogroup'\r\n | 'scrollbar'\r\n | 'searchbox'\r\n | 'slider'\r\n | 'spinbutton'\r\n | 'status'\r\n | 'switch'\r\n | 'tab'\r\n | 'tablist'\r\n | 'tabpanel'\r\n | 'textbox'\r\n | 'tooltip'\r\n | 'tree'\r\n | 'treegrid'\r\n | 'treeitem';\r\n\r\n/**\r\n * Standard ARIA attributes interface for components\r\n */\r\nexport interface AriaAttributes {\r\n role?: AriaRole;\r\n 'aria-label'?: string;\r\n 'aria-labelledby'?: string;\r\n 'aria-describedby'?: string;\r\n 'aria-expanded'?: boolean;\r\n 'aria-selected'?: boolean;\r\n 'aria-checked'?: boolean | 'mixed';\r\n 'aria-disabled'?: boolean;\r\n 'aria-hidden'?: boolean;\r\n 'aria-invalid'?: boolean;\r\n 'aria-required'?: boolean;\r\n 'aria-readonly'?: boolean;\r\n 'aria-pressed'?: boolean | 'mixed';\r\n 'aria-current'?: boolean | 'page' | 'step' | 'location' | 'date' | 'time';\r\n 'aria-haspopup'?: boolean | 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog';\r\n 'aria-controls'?: string;\r\n 'aria-owns'?: string;\r\n 'aria-live'?: AriaLive;\r\n 'aria-atomic'?: boolean;\r\n 'aria-busy'?: boolean;\r\n 'aria-valuemin'?: number;\r\n 'aria-valuemax'?: number;\r\n 'aria-valuenow'?: number;\r\n 'aria-valuetext'?: string;\r\n 'aria-orientation'?: 'horizontal' | 'vertical';\r\n 'aria-activedescendant'?: string;\r\n 'aria-autocomplete'?: 'none' | 'inline' | 'list' | 'both';\r\n 'aria-multiselectable'?: boolean;\r\n 'aria-sort'?: 'none' | 'ascending' | 'descending' | 'other';\r\n 'aria-level'?: number;\r\n 'aria-setsize'?: number;\r\n 'aria-posinset'?: number;\r\n tabindex?: number;\r\n}\r\n\r\n/**\r\n * Generate ARIA attributes for a button component\r\n * @param options - Button accessibility options\r\n * @returns ARIA attributes object\r\n */\r\nexport function getButtonAriaAttributes(options: {\r\n label?: string;\r\n pressed?: boolean;\r\n expanded?: boolean;\r\n disabled?: boolean;\r\n controls?: string;\r\n haspopup?: AriaAttributes['aria-haspopup'];\r\n describedby?: string;\r\n}): AriaAttributes {\r\n const attrs: AriaAttributes = {};\r\n\r\n if (options.label) {\r\n attrs['aria-label'] = options.label;\r\n }\r\n if (options.pressed !== undefined) {\r\n attrs['aria-pressed'] = options.pressed;\r\n }\r\n if (options.expanded !== undefined) {\r\n attrs['aria-expanded'] = options.expanded;\r\n }\r\n if (options.disabled) {\r\n attrs['aria-disabled'] = true;\r\n }\r\n if (options.controls) {\r\n attrs['aria-controls'] = options.controls;\r\n }\r\n if (options.haspopup) {\r\n attrs['aria-haspopup'] = options.haspopup;\r\n }\r\n if (options.describedby) {\r\n attrs['aria-describedby'] = options.describedby;\r\n }\r\n\r\n return attrs;\r\n}\r\n\r\n/**\r\n * Generate ARIA attributes for a dialog/modal component\r\n * @param options - Dialog accessibility options\r\n * @returns ARIA attributes object\r\n */\r\nexport function getDialogAriaAttributes(options: {\r\n labelledby?: string;\r\n describedby?: string;\r\n modal?: boolean;\r\n}): AriaAttributes {\r\n return {\r\n role: 'dialog',\r\n 'aria-labelledby': options.labelledby,\r\n 'aria-describedby': options.describedby,\r\n 'aria-modal': options.modal\r\n } as AriaAttributes;\r\n}\r\n\r\n/**\r\n * Generate ARIA attributes for a form input\r\n * @param options - Input accessibility options\r\n * @returns ARIA attributes object\r\n */\r\nexport function getInputAriaAttributes(options: {\r\n label?: string;\r\n labelledby?: string;\r\n describedby?: string;\r\n invalid?: boolean;\r\n required?: boolean;\r\n readonly?: boolean;\r\n disabled?: boolean;\r\n errorId?: string;\r\n helperId?: string;\r\n}): AriaAttributes {\r\n const attrs: AriaAttributes = {};\r\n\r\n if (options.label) {\r\n attrs['aria-label'] = options.label;\r\n }\r\n if (options.labelledby) {\r\n attrs['aria-labelledby'] = options.labelledby;\r\n }\r\n\r\n // Build aria-describedby from multiple sources\r\n const describedbyParts: string[] = [];\r\n if (options.describedby) {\r\n describedbyParts.push(options.describedby);\r\n }\r\n if (options.invalid && options.errorId) {\r\n describedbyParts.push(options.errorId);\r\n }\r\n if (options.helperId) {\r\n describedbyParts.push(options.helperId);\r\n }\r\n if (describedbyParts.length > 0) {\r\n attrs['aria-describedby'] = describedbyParts.join(' ');\r\n }\r\n\r\n if (options.invalid !== undefined) {\r\n attrs['aria-invalid'] = options.invalid;\r\n }\r\n if (options.required) {\r\n attrs['aria-required'] = true;\r\n }\r\n if (options.readonly) {\r\n attrs['aria-readonly'] = true;\r\n }\r\n if (options.disabled) {\r\n attrs['aria-disabled'] = true;\r\n }\r\n\r\n return attrs;\r\n}\r\n\r\n/**\r\n * Generate ARIA attributes for a progress bar\r\n * @param options - Progress accessibility options\r\n * @returns ARIA attributes object\r\n */\r\nexport function getProgressAriaAttributes(options: {\r\n value: number;\r\n min?: number;\r\n max?: number;\r\n label?: string;\r\n valueText?: string;\r\n}): AriaAttributes {\r\n return {\r\n role: 'progressbar',\r\n 'aria-valuenow': options.value,\r\n 'aria-valuemin': options.min ?? 0,\r\n 'aria-valuemax': options.max ?? 100,\r\n 'aria-label': options.label,\r\n 'aria-valuetext': options.valueText ?? `${options.value}%`\r\n };\r\n}\r\n\r\n/**\r\n * Generate ARIA attributes for a tab component\r\n * @param options - Tab accessibility options\r\n * @returns ARIA attributes for tab and tabpanel\r\n */\r\nexport function getTabAriaAttributes(options: {\r\n tabId: string;\r\n panelId: string;\r\n selected: boolean;\r\n disabled?: boolean;\r\n}): { tab: AriaAttributes; panel: AriaAttributes } {\r\n return {\r\n tab: {\r\n role: 'tab',\r\n 'aria-selected': options.selected,\r\n 'aria-controls': options.panelId,\r\n 'aria-disabled': options.disabled,\r\n tabindex: options.selected ? 0 : -1\r\n },\r\n panel: {\r\n role: 'tabpanel',\r\n 'aria-labelledby': options.tabId,\r\n 'aria-hidden': !options.selected,\r\n tabindex: 0\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Generate ARIA attributes for a listbox option\r\n * @param options - Option accessibility options\r\n * @returns ARIA attributes object\r\n */\r\nexport function getOptionAriaAttributes(options: {\r\n selected: boolean;\r\n disabled?: boolean;\r\n setsize?: number;\r\n posinset?: number;\r\n}): AriaAttributes {\r\n return {\r\n role: 'option',\r\n 'aria-selected': options.selected,\r\n 'aria-disabled': options.disabled,\r\n 'aria-setsize': options.setsize,\r\n 'aria-posinset': options.posinset\r\n };\r\n}\r\n\r\n/**\r\n * Generate linked IDs for label and input association\r\n * @param baseName - Base name for generating IDs\r\n * @returns Object with inputId, labelId, errorId, and helperId\r\n */\r\nexport function generateLinkedIds(baseName?: string): {\r\n inputId: string;\r\n labelId: string;\r\n errorId: string;\r\n helperId: string;\r\n} {\r\n const base = baseName || generateUniqueId('input');\r\n return {\r\n inputId: base,\r\n labelId: `${base}-label`,\r\n errorId: `${base}-error`,\r\n helperId: `${base}-helper`\r\n };\r\n}\r\n\r\n/**\r\n * Create a visually hidden element for screen readers\r\n * @returns CSS styles for visually hidden content\r\n */\r\nexport function getVisuallyHiddenStyles(): Record<string, string> {\r\n return {\r\n position: 'absolute',\r\n width: '1px',\r\n height: '1px',\r\n padding: '0',\r\n margin: '-1px',\r\n overflow: 'hidden',\r\n clip: 'rect(0, 0, 0, 0)',\r\n whiteSpace: 'nowrap',\r\n border: '0'\r\n };\r\n}\r\n\r\n/**\r\n * Check if the user has enabled reduced motion preference\r\n * @returns True if user prefers reduced motion\r\n */\r\nexport function prefersReducedMotion(): boolean {\r\n if (typeof window === 'undefined') return false;\r\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n}\r\n\r\n/**\r\n * Check if the user has enabled high contrast mode\r\n * @returns True if high contrast mode is enabled\r\n */\r\nexport function prefersHighContrast(): boolean {\r\n if (typeof window === 'undefined') return false;\r\n return window.matchMedia('(prefers-contrast: more)').matches;\r\n}\r\n\r\n/**\r\n * Announce a message to screen readers using aria-live regions\r\n * @param message - The message to announce\r\n * @param politeness - The urgency level (polite or assertive)\r\n */\r\nexport function announceToScreenReader(\r\n message: string,\r\n politeness: 'polite' | 'assertive' = 'polite'\r\n): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n const announcement = document.createElement('div');\r\n announcement.setAttribute('role', 'status');\r\n announcement.setAttribute('aria-live', politeness);\r\n announcement.setAttribute('aria-atomic', 'true');\r\n Object.assign(announcement.style, getVisuallyHiddenStyles());\r\n\r\n document.body.appendChild(announcement);\r\n\r\n // Delay slightly to ensure screen readers pick up the change\r\n setTimeout(() => {\r\n announcement.textContent = message;\r\n }, 100);\r\n\r\n // Clean up after announcement is read\r\n setTimeout(() => {\r\n document.body.removeChild(announcement);\r\n }, 1000);\r\n}\r\n\r\n/**\r\n * Get the appropriate aria-current value for navigation items\r\n * @param isActive - Whether the item is active/current\r\n * @param type - The type of current indicator\r\n * @returns The aria-current value or undefined\r\n */\r\nexport function getAriaCurrent(\r\n isActive: boolean,\r\n type: 'page' | 'step' | 'location' | 'date' | 'time' = 'page'\r\n): AriaAttributes['aria-current'] {\r\n return isActive ? type : undefined;\r\n}\r\n","/**\r\n * Error handling utility functions for PECB UI Components\r\n * Provides standardized error handling patterns\r\n * @module utils/error\r\n */\r\n\r\n/**\r\n * Error severity levels\r\n */\r\nexport type ErrorSeverity = 'info' | 'warning' | 'error' | 'critical';\r\n\r\n/**\r\n * Error categories for classification\r\n */\r\nexport type ErrorCategory =\r\n | 'validation'\r\n | 'network'\r\n | 'authentication'\r\n | 'authorization'\r\n | 'configuration'\r\n | 'runtime'\r\n | 'unknown';\r\n\r\n/**\r\n * Standard error interface for PECB components\r\n */\r\nexport interface PecbError {\r\n /** Unique error code */\r\n code: string;\r\n /** Human-readable error message */\r\n message: string;\r\n /** Error severity level */\r\n severity: ErrorSeverity;\r\n /** Error category */\r\n category: ErrorCategory;\r\n /** Original error if wrapping another error */\r\n originalError?: Error;\r\n /** Additional context data */\r\n context?: Record<string, unknown>;\r\n /** Timestamp when error occurred */\r\n timestamp: Date;\r\n /** Suggested recovery action */\r\n recoveryAction?: string;\r\n /** Whether the error is recoverable */\r\n recoverable: boolean;\r\n}\r\n\r\n/**\r\n * Validation error details\r\n */\r\nexport interface ValidationError {\r\n /** Field name that failed validation */\r\n field: string;\r\n /** Validation rule that failed */\r\n rule: string;\r\n /** Error message */\r\n message: string;\r\n /** Expected value or format */\r\n expected?: string;\r\n /** Actual value received */\r\n actual?: unknown;\r\n}\r\n\r\n/**\r\n * Error factory options\r\n */\r\nexport interface ErrorOptions {\r\n code?: string;\r\n severity?: ErrorSeverity;\r\n category?: ErrorCategory;\r\n context?: Record<string, unknown>;\r\n recoveryAction?: string;\r\n recoverable?: boolean;\r\n originalError?: Error;\r\n}\r\n\r\n/**\r\n * Create a standardized PECB error\r\n * @param message - Error message\r\n * @param options - Additional error options\r\n * @returns A standardized PecbError object\r\n *\r\n * @example\r\n * const error = createError('Invalid input', {\r\n * code: 'VALIDATION_001',\r\n * category: 'validation',\r\n * severity: 'warning',\r\n * recoverable: true\r\n * });\r\n */\r\nexport function createError(message: string, options: ErrorOptions = {}): PecbError {\r\n return {\r\n code: options.code ?? 'PECB_ERROR',\r\n message,\r\n severity: options.severity ?? 'error',\r\n category: options.category ?? 'unknown',\r\n originalError: options.originalError,\r\n context: options.context,\r\n timestamp: new Date(),\r\n recoveryAction: options.recoveryAction,\r\n recoverable: options.recoverable ?? false\r\n };\r\n}\r\n\r\n/**\r\n * Create a validation error\r\n * @param field - Field name that failed validation\r\n * @param rule - Validation rule that failed\r\n * @param message - Error message\r\n * @returns A ValidationError object\r\n *\r\n * @example\r\n * const error = createValidationError('email', 'format', 'Invalid email format');\r\n */\r\nexport function createValidationError(\r\n field: string,\r\n rule: string,\r\n message: string,\r\n details?: { expected?: string; actual?: unknown }\r\n): ValidationError {\r\n return {\r\n field,\r\n rule,\r\n message,\r\n expected: details?.expected,\r\n actual: details?.actual\r\n };\r\n}\r\n\r\n/**\r\n * Wrap an unknown error in a PecbError\r\n * @param error - The error to wrap\r\n * @param options - Additional options\r\n * @returns A standardized PecbError\r\n *\r\n * @example\r\n * try {\r\n * await riskyOperation();\r\n * } catch (e) {\r\n * const error = wrapError(e, { category: 'network' });\r\n * handleError(error);\r\n * }\r\n */\r\nexport function wrapError(error: unknown, options: ErrorOptions = {}): PecbError {\r\n if (isPecbError(error)) {\r\n return error;\r\n }\r\n\r\n let message = 'An unknown error occurred';\r\n let originalError: Error | undefined;\r\n\r\n if (error instanceof Error) {\r\n message = error.message;\r\n originalError = error;\r\n } else if (typeof error === 'string') {\r\n message = error;\r\n } else if (error && typeof error === 'object' && 'message' in error) {\r\n message = String((error as { message: unknown }).message);\r\n }\r\n\r\n return createError(message, {\r\n ...options,\r\n originalError\r\n });\r\n}\r\n\r\n/**\r\n * Type guard to check if an object is a PecbError\r\n * @param error - The object to check\r\n * @returns True if the object is a PecbError\r\n */\r\nexport function isPecbError(error: unknown): error is PecbError {\r\n return (\r\n error !== null &&\r\n typeof error === 'object' &&\r\n 'code' in error &&\r\n 'message' in error &&\r\n 'severity' in error &&\r\n 'category' in error &&\r\n 'timestamp' in error\r\n );\r\n}\r\n\r\n/**\r\n * Type guard to check if an error is recoverable\r\n * @param error - The error to check\r\n * @returns True if the error is recoverable\r\n */\r\nexport function isRecoverableError(error: PecbError): boolean {\r\n return error.recoverable;\r\n}\r\n\r\n/**\r\n * Format an error for display to users\r\n * @param error - The error to format\r\n * @param includeCode - Whether to include the error code\r\n * @returns Formatted error message\r\n */\r\nexport function formatErrorMessage(error: PecbError, includeCode = false): string {\r\n if (includeCode) {\r\n return `[${error.code}] ${error.message}`;\r\n }\r\n return error.message;\r\n}\r\n\r\n/**\r\n * Format an error for logging\r\n * @param error - The error to format\r\n * @returns Formatted error string for logging\r\n */\r\nexport function formatErrorForLog(error: PecbError): string {\r\n const parts = [\r\n `[${error.timestamp.toISOString()}]`,\r\n `[${error.severity.toUpperCase()}]`,\r\n `[${error.code}]`,\r\n error.message\r\n ];\r\n\r\n if (error.context) {\r\n parts.push(`Context: ${JSON.stringify(error.context)}`);\r\n }\r\n\r\n if (error.originalError?.stack) {\r\n parts.push(`Stack: ${error.originalError.stack}`);\r\n }\r\n\r\n return parts.join(' ');\r\n}\r\n\r\n/**\r\n * Create a network error\r\n * @param message - Error message\r\n * @param statusCode - HTTP status code if applicable\r\n * @param originalError - Original error\r\n * @returns A network category PecbError\r\n */\r\nexport function createNetworkError(\r\n message: string,\r\n statusCode?: number,\r\n originalError?: Error\r\n): PecbError {\r\n return createError(message, {\r\n code: statusCode ? `NETWORK_${statusCode}` : 'NETWORK_ERROR',\r\n category: 'network',\r\n severity: 'error',\r\n context: statusCode ? { statusCode } : undefined,\r\n recoverable: true,\r\n recoveryAction: 'Please check your connection and try again',\r\n originalError\r\n });\r\n}\r\n\r\n/**\r\n * Create an authentication error\r\n * @param message - Error message\r\n * @param originalError - Original error\r\n * @returns An authentication category PecbError\r\n */\r\nexport function createAuthError(message: string, originalError?: Error): PecbError {\r\n return createError(message, {\r\n code: 'AUTH_ERROR',\r\n category: 'authentication',\r\n severity: 'error',\r\n recoverable: true,\r\n recoveryAction: 'Please sign in again',\r\n originalError\r\n });\r\n}\r\n\r\n/**\r\n * Create an authorization error\r\n * @param message - Error message\r\n * @param resource - The resource that access was denied to\r\n * @returns An authorization category PecbError\r\n */\r\nexport function createAuthorizationError(message: string, resource?: string): PecbError {\r\n return createError(message, {\r\n code: 'AUTHZ_ERROR',\r\n category: 'authorization',\r\n severity: 'warning',\r\n context: resource ? { resource } : undefined,\r\n recoverable: false,\r\n recoveryAction: 'Contact an administrator for access'\r\n });\r\n}\r\n\r\n/**\r\n * Create a configuration error\r\n * @param message - Error message\r\n * @param configKey - The configuration key that is invalid\r\n * @returns A configuration category PecbError\r\n */\r\nexport function createConfigError(message: string, configKey?: string): PecbError {\r\n return createError(message, {\r\n code: 'CONFIG_ERROR',\r\n category: 'configuration',\r\n severity: 'critical',\r\n context: configKey ? { configKey } : undefined,\r\n recoverable: false,\r\n recoveryAction: 'Check your configuration settings'\r\n });\r\n}\r\n\r\n/**\r\n * Error handler type\r\n */\r\nexport type ErrorHandler = (error: PecbError) => void;\r\n\r\n/**\r\n * Global error handler registry\r\n */\r\nconst errorHandlers: Map<ErrorCategory, ErrorHandler[]> = new Map();\r\n\r\n/**\r\n * Register an error handler for a category\r\n * @param category - The error category to handle\r\n * @param handler - The handler function\r\n * @returns Cleanup function to unregister\r\n */\r\nexport function registerErrorHandler(category: ErrorCategory, handler: ErrorHandler): () => void {\r\n const handlers = errorHandlers.get(category) ?? [];\r\n handlers.push(handler);\r\n errorHandlers.set(category, handlers);\r\n\r\n return () => {\r\n const currentHandlers = errorHandlers.get(category);\r\n if (currentHandlers) {\r\n const index = currentHandlers.indexOf(handler);\r\n if (index > -1) {\r\n currentHandlers.splice(index, 1);\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Handle an error by invoking registered handlers\r\n * @param error - The error to handle\r\n */\r\nexport function handleError(error: PecbError): void {\r\n const handlers = errorHandlers.get(error.category) ?? [];\r\n const globalHandlers = errorHandlers.get('unknown') ?? [];\r\n\r\n [...handlers, ...globalHandlers].forEach(handler => {\r\n try {\r\n handler(error);\r\n } catch (e) {\r\n console.error('Error in error handler:', e);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Try to execute an operation and return a result or error\r\n * @param operation - The operation to execute\r\n * @param errorOptions - Options for error wrapping\r\n * @returns A tuple of [result, null] or [null, error]\r\n */\r\nexport async function tryAsync<T>(\r\n operation: () => Promise<T>,\r\n errorOptions?: ErrorOptions\r\n): Promise<[T, null] | [null, PecbError]> {\r\n try {\r\n const result = await operation();\r\n return [result, null];\r\n } catch (e) {\r\n return [null, wrapError(e, errorOptions)];\r\n }\r\n}\r\n\r\n/**\r\n * Synchronous version of tryAsync\r\n * @param operation - The operation to execute\r\n * @param errorOptions - Options for error wrapping\r\n * @returns A tuple of [result, null] or [null, error]\r\n */\r\nexport function trySync<T>(\r\n operation: () => T,\r\n errorOptions?: ErrorOptions\r\n): [T, null] | [null, PecbError] {\r\n try {\r\n const result = operation();\r\n return [result, null];\r\n } catch (e) {\r\n return [null, wrapError(e, errorOptions)];\r\n }\r\n}\r\n","/*\r\n * Public API Surface of @pecb-ui/components\r\n *\r\n * This file defines the public API of the library.\r\n * Only exports from this file will be accessible to consumers.\r\n */\r\n\r\n// =============================================================================\r\n// MODULE\r\n// =============================================================================\r\nexport * from './lib/pecb-components.module';\r\n\r\n// =============================================================================\r\n// COMPONENTS\r\n// =============================================================================\r\nexport * from './lib/components/button/button.component';\r\nexport * from './lib/components/card/card.component';\r\nexport * from './lib/components/status/status.component';\r\nexport * from './lib/components/pagination/pagination.component';\r\nexport * from './lib/components/table/table.component';\r\nexport * from './lib/components/tab/tab.component';\r\nexport * from './lib/components/datepicker/datepicker.component';\r\nexport * from './lib/components/input/input.component';\r\nexport * from './lib/components/radio/radio.component';\r\nexport * from './lib/components/checkbox/checkbox.component';\r\nexport * from './lib/components/toggle/toggle.component';\r\nexport * from './lib/components/dropdown/dropdown.component';\r\nexport * from './lib/components/right-modal/right-modal.component';\r\nexport * from './lib/components/sidebar/sidebar.component';\r\n\r\n// =============================================================================\r\n// SERVICES\r\n// =============================================================================\r\nexport * from './lib/services/notification.service';\r\nexport * from './lib/services/theme.service';\r\nexport * from './lib/services/loading.service';\r\n\r\n// =============================================================================\r\n// SHARED TYPES\r\n// =============================================================================\r\nexport * from './lib/shared/types/common.types';\r\n\r\n// =============================================================================\r\n// SHARED INTERFACES\r\n// =============================================================================\r\nexport * from './lib/shared/interfaces/component.interfaces';\r\n\r\n// =============================================================================\r\n// SHARED UTILITIES\r\n// =============================================================================\r\n\r\n// String utilities\r\nexport {\r\n toKebabCase,\r\n toCamelCase,\r\n toPascalCase,\r\n toSnakeCase,\r\n capitalize,\r\n truncate,\r\n isBlank,\r\n isNotBlank,\r\n slugify,\r\n escapeHtml,\r\n stripHtml,\r\n getInitials,\r\n pluralize,\r\n formatCount\r\n} from './lib/shared/utils/string.utils';\r\n\r\n// DOM utilities\r\nexport {\r\n isBrowser,\r\n generateUniqueId,\r\n matchesSelector,\r\n closestElement,\r\n isElementVisible,\r\n getFocusableElements,\r\n trapFocus,\r\n scrollIntoView,\r\n getScrollParent,\r\n disableBodyScroll,\r\n copyToClipboard,\r\n hasClass,\r\n addClass,\r\n removeClass,\r\n toggleClass,\r\n getComputedStyleValue\r\n} from './lib/shared/utils/dom.utils';\r\n\r\n// Accessibility utilities\r\nexport {\r\n AriaLive,\r\n AriaRole,\r\n AriaAttributes,\r\n getButtonAriaAttributes,\r\n getDialogAriaAttributes,\r\n getInputAriaAttributes,\r\n getProgressAriaAttributes,\r\n getTabAriaAttributes,\r\n getOptionAriaAttributes,\r\n generateLinkedIds,\r\n getVisuallyHiddenStyles,\r\n prefersReducedMotion,\r\n prefersHighContrast,\r\n announceToScreenReader,\r\n getAriaCurrent\r\n} from './lib/shared/utils/accessibility.utils';\r\n\r\n// Error handling utilities\r\nexport {\r\n ErrorSeverity,\r\n ErrorCategory,\r\n PecbError,\r\n ValidationError,\r\n ErrorOptions,\r\n ErrorHandler,\r\n createError,\r\n createValidationError,\r\n wrapError,\r\n isPecbError,\r\n isRecoverableError,\r\n formatErrorMessage,\r\n formatErrorForLog,\r\n createNetworkError,\r\n createAuthError,\r\n createAuthorizationError,\r\n createConfigError,\r\n registerErrorHandler,\r\n handleError,\r\n tryAsync,\r\n trySync\r\n} from './lib/shared/utils/error.utils';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2"],"mappings":";;;;;;;;;AAAA;;;AAGG;AAEH;;;AAGG;SACa,SAAS,GAAA;IACvB,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,QAAQ,KAAK,WAAW;AACzE;AAEA;;;;;;;AAOG;AACG,SAAU,gBAAgB,CAAC,MAAM,GAAG,MAAM,EAAA;AAC9C,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AACzD,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,EAAE;AAC9B;AAEA;;;;;AAKG;AACG,SAAU,eAAe,CAAC,OAAgB,EAAE,QAAgB,EAAA;AAChE,IAAA,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;AAClC;AAEA;;;;;AAKG;AACG,SAAU,cAAc,CAAoB,OAAgB,EAAE,QAAgB,EAAA;AAClF,IAAA,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAa;AAC9C;AAEA;;;;;AAKG;SACa,gBAAgB,CAAC,OAAgB,EAAE,OAAO,GAAG,IAAI,EAAA;IAC/D,IAAI,CAAC,SAAS,EAAE;AAAE,QAAA,OAAO,KAAK;AAE9B,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE;IAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,eAAe,CAAC,YAAY;IAChF,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,IAAI,QAAQ,CAAC,eAAe,CAAC,WAAW;IAE7E,IAAI,OAAO,EAAE;AACX,QAAA,QACE,IAAI,CAAC,GAAG,GAAG,YAAY;YACvB,IAAI,CAAC,MAAM,GAAG,CAAC;YACf,IAAI,CAAC,IAAI,GAAG,WAAW;AACvB,YAAA,IAAI,CAAC,KAAK,GAAG,CAAC;IAElB;AAEA,IAAA,QACE,IAAI,CAAC,GAAG,IAAI,CAAC;QACb,IAAI,CAAC,IAAI,IAAI,CAAC;QACd,IAAI,CAAC,MAAM,IAAI,YAAY;AAC3B,QAAA,IAAI,CAAC,KAAK,IAAI,WAAW;AAE7B;AAEA;;;;AAIG;AACG,SAAU,oBAAoB,CAAC,SAAkB,EAAA;AACrD,IAAA,MAAM,kBAAkB,GAAG;QACzB,SAAS;QACT,YAAY;QACZ,wBAAwB;QACxB,4CAA4C;QAC5C,wBAAwB;QACxB,0BAA0B;QAC1B,iCAAiC;QACjC;AACD,KAAA,CAAC,IAAI,CAAC,GAAG,CAAC;IAEX,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAc,kBAAkB,CAAC,CAAC;AAChF;AAEA;;;;AAIG;AACG,SAAU,SAAS,CAAC,SAAsB,EAAA;AAC9C,IAAA,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,SAAS,CAAC;AACzD,IAAA,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;AAEnE,IAAA,MAAM,aAAa,GAAG,CAAC,KAAoB,KAAU;AACnD,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK;YAAE;AAEzB,QAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,QAAQ,CAAC,aAAa,KAAK,YAAY,EAAE;gBAC3C,KAAK,CAAC,cAAc,EAAE;gBACtB,WAAW,EAAE,KAAK,EAAE;YACtB;QACF;aAAO;AACL,YAAA,IAAI,QAAQ,CAAC,aAAa,KAAK,WAAW,EAAE;gBAC1C,KAAK,CAAC,cAAc,EAAE;gBACtB,YAAY,EAAE,KAAK,EAAE;YACvB;QACF;AACF,IAAA,CAAC;AAED,IAAA,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC;IACpD,YAAY,EAAE,KAAK,EAAE;AAErB,IAAA,OAAO,MAAK;AACV,QAAA,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC;AACzD,IAAA,CAAC;AACH;AAEA;;;;AAIG;AACG,SAAU,cAAc,CAC5B,OAAgB,EAChB,OAAA,GAAiC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAAA;AAEzE,IAAA,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC;AACjC;AAEA;;;;AAIG;AACG,SAAU,eAAe,CAAC,OAAgB,EAAA;IAC9C,IAAI,CAAC,SAAS,EAAE;AAAE,QAAA,OAAO,IAAI;AAE7B,IAAA,IAAI,MAAM,GAAmB,OAAO,CAAC,aAAa;IAElD,OAAO,MAAM,EAAE;AACb,QAAA,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC;AACtC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;AAEnE,QAAA,IAAI,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACxC,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,MAAM,GAAG,MAAM,CAAC,aAAa;IAC/B;AAEA,IAAA,OAAO,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,CAAC,eAAe;AAC9D;AAEA;;;AAGG;SACa,iBAAiB,GAAA;IAC/B,IAAI,CAAC,SAAS,EAAE;AAAE,QAAA,OAAO,MAAK,EAAE,CAAC;AAEjC,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;AAC9B,IAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI;AAC1B,IAAA,MAAM,cAAc,GAAG;AACrB,QAAA,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;AAC7B,QAAA,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG;AACnB,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;AACvB,QAAA,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;KACtB;AAED,IAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;IAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,CAAA,EAAI,OAAO,IAAI;AAChC,IAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACzB,IAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ;AAE9B,IAAA,OAAO,MAAK;QACV,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ;QAC7C,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,cAAc,CAAC,GAAG;QACnC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK;QACvC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ;AAC7C,QAAA,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;AAC7B,IAAA,CAAC;AACH;AAEA;;;;AAIG;AACI,eAAe,eAAe,CAAC,IAAY,EAAA;AAChD,IAAA,IAAI,CAAC,SAAS,EAAE,EAAE;AAChB,QAAA,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC;IACpE;IAEA,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE;QACxD,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;IAC3C;SAAO;;QAEL,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC;AACnD,QAAA,QAAQ,CAAC,KAAK,GAAG,IAAI;AACrB,QAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;AACjC,QAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS;AAC/B,QAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS;AAC9B,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QACnC,QAAQ,CAAC,KAAK,EAAE;QAChB,QAAQ,CAAC,MAAM,EAAE;AACjB,QAAA,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;AAC5B,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IACrC;AACF;AAEA;;;;;AAKG;AACG,SAAU,QAAQ,CAAC,OAAgB,EAAE,SAAiB,EAAA;IAC1D,OAAO,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC9C;AAEA;;;;AAIG;SACa,QAAQ,CAAC,OAAgB,EAAE,GAAG,UAAoB,EAAA;IAChE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;AACtC;AAEA;;;;AAIG;SACa,WAAW,CAAC,OAAgB,EAAE,GAAG,UAAoB,EAAA;IACnE,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;AACzC;AAEA;;;;;;AAMG;SACa,WAAW,CAAC,OAAgB,EAAE,SAAiB,EAAE,KAAe,EAAA;IAC9E,OAAO,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC;AACnD;AAEA;;;;;AAKG;AACG,SAAU,qBAAqB,CAAC,OAAgB,EAAE,QAAgB,EAAA;IACtE,IAAI,CAAC,SAAS,EAAE;AAAE,QAAA,OAAO,EAAE;IAC3B,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AAC7D;;AC7PA;;;;;;;;;;;;;;;;;;;;AAoBG;MAQU,eAAe,CAAA;AAP5B,IAAA,WAAA,GAAA;AAQE;;AAEG;AACM,QAAA,IAAA,CAAA,EAAE,GAAW,gBAAgB,CAAC,KAAK,CAAC;AAE7C;;AAEG;QACM,IAAA,CAAA,OAAO,GAAkB,SAAS;AAE3C;;AAEG;QACM,IAAA,CAAA,IAAI,GAAe,IAAI;AAEhC;;AAEG;QACM,IAAA,CAAA,SAAS,GAAoB,MAAM;AAO5C;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK;AAEzB;;AAEG;QACM,IAAA,CAAA,SAAS,GAAG,KAAK;AAE1B;;AAEG;QACM,IAAA,CAAA,OAAO,GAAG,KAAK;AAExB;;AAEG;QACM,IAAA,CAAA,IAAI,GAAkC,QAAQ;AAuCvD;;AAEG;AACO,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAc;AAsEnD,IAAA;AApEC;;AAEG;AACH,IAAA,IAA4B,MAAM,GAAA;QAChC,OAAO,IAAI,CAAC;IACd;AAEA;;AAEG;AACH,IAAA,IAAI,aAAa,GAAA;QACf,OAAO;YACL,aAAa;YACb,CAAA,aAAA,EAAgB,IAAI,CAAC,OAAO,CAAA,CAAE;YAC9B,CAAA,aAAA,EAAgB,IAAI,CAAC,IAAI,CAAA,CAAE;AAC3B,YAAA,IAAI,CAAC,SAAS,KAAK,MAAM,GAAG,CAAA,kBAAA,EAAqB,IAAI,CAAC,SAAS,CAAA,CAAE,GAAG,EAAE;YACtE,IAAI,CAAC,SAAS,GAAG,yBAAyB,GAAG,EAAE;YAC/C,IAAI,CAAC,OAAO,GAAG,sBAAsB,GAAG;AACzC,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA;;AAEG;AACH,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;IACrE;AAEA;;AAEG;AACH,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;IACtE;AAEA;;AAEG;AACH,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,SAAS,KAAK,WAAW;IACvC;AAEA;;AAEG;AACH,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,sBAAsB;IAC/B;AAEA;;AAEG;AACH,IAAA,OAAO,CAAC,KAAiB,EAAA;QACvB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1B;IACF;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,KAAoB,EAAA;;QAE5B,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACnF,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAA8B,CAAC;QACnD;IACF;+GA3JW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9C5B,uxDAuDA,EAAA,MAAA,EAAA,CAAA,6jJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDbY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIX,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,uxDAAA,EAAA,MAAA,EAAA,CAAA,6jJAAA,CAAA,EAAA;8BAQd,EAAE,EAAA,CAAA;sBAAV;gBAKQ,OAAO,EAAA,CAAA;sBAAf;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBAKQ,OAAO,EAAA,CAAA;sBAAf;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAOQ,SAAS,EAAA,CAAA;sBAAjB;gBAKQ,cAAc,EAAA,CAAA;sBAAtB;gBAKQ,eAAe,EAAA,CAAA;sBAAvB;gBAKQ,YAAY,EAAA,CAAA;sBAApB;gBAKQ,WAAW,EAAA,CAAA;sBAAnB;gBAKQ,YAAY,EAAA,CAAA;sBAApB;gBAKQ,YAAY,EAAA,CAAA;sBAApB;gBAKS,OAAO,EAAA,CAAA;sBAAhB;gBAK2B,MAAM,EAAA,CAAA;sBAAjC,WAAW;uBAAC,SAAS;;;AE/HxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCG;MAOU,aAAa,CAAA;AAN1B,IAAA,WAAA,GAAA;AAOE;;AAEG;AACM,QAAA,IAAA,CAAA,EAAE,GAAW,gBAAgB,CAAC,MAAM,CAAC;AAE9C;;AAEG;QACM,IAAA,CAAA,SAAS,GAAkB,IAAI;AAExC;;AAEG;QACM,IAAA,CAAA,SAAS,GAAG,KAAK;AAE1B;;AAEG;QACM,IAAA,CAAA,SAAS,GAAG,KAAK;;AAI1B;;;AAGG;QACM,IAAA,CAAA,IAAI,GAAa,MAAM;AAmCjC,IAAA;AAlBC;;AAEG;AACH,IAAA,IAAI,WAAW,GAAA;QACb,OAAO;YACL,WAAW;YACX,CAAA,qBAAA,EAAwB,IAAI,CAAC,SAAS,CAAA,CAAE;YACxC,IAAI,CAAC,SAAS,GAAG,sBAAsB,GAAG,EAAE;YAC5C,IAAI,CAAC,SAAS,GAAG,uBAAuB,GAAG;AAC5C,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA;;AAEG;AACH,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI;IAChD;+GA7DW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,+QCpD1B,wRAUA,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA,CAAA,CAAA;;4FD0Ca,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,cACT,IAAI,EAAA,QAAA,EAAA,wRAAA,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA;8BAQP,EAAE,EAAA,CAAA;sBAAV;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBAQQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBAKQ,cAAc,EAAA,CAAA;sBAAtB;gBAKQ,eAAe,EAAA,CAAA;sBAAvB;;AAsBH;;;;;;;;;;;AAWG;MAWU,mBAAmB,CAAA;AAVhC,IAAA,WAAA,GAAA;AAWE;;;AAGG;QACM,IAAA,CAAA,YAAY,GAAkB,IAAI;AAC5C,IAAA;+GANY,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAPpB,CAAA;;;;AAIT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA,CAAA,CAAA;;4FAGU,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAV/B,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,QAAA,EACN,CAAA;;;;AAIT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA;8BAQQ,YAAY,EAAA,CAAA;sBAApB;;AAGH;;;;;;;;;;;AAWG;MAOU,iBAAiB,CAAA;+GAAjB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,0EAHlB,8DAA8D,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA,CAAA,CAAA;;4FAG7D,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;+BACE,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,QAAA,EACN,8DAA8D,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA;;AAK1E;;;;;;;;;;;AAWG;MAOU,mBAAmB,CAAA;+GAAnB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,4EAHpB,gEAAgE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA,CAAA,CAAA;;4FAG/D,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,QAAA,EACN,gEAAgE,EAAA,MAAA,EAAA,CAAA,woDAAA,CAAA,EAAA;;;MEtK/D,eAAe,CAAA;AAR5B,IAAA,WAAA,GAAA;AASU,QAAA,IAAA,CAAA,GAAG,GAAG,CAAA,OAAA,EAAU,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QAE3D,IAAA,CAAA,IAAI,GAAe,SAAS;QAC5B,IAAA,CAAA,OAAO,GAAkB,QAAQ;QACjC,IAAA,CAAA,IAAI,GAAe,IAAI;AAgCjC,IAAA;AAvBC,IAAA,IAAI,EAAE,GAAA;QACJ,OAAO,IAAI,CAAC,GAAG;IACjB;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,OAAO,GAAG;YACd,aAAa;YACb,CAAA,aAAA,EAAgB,IAAI,CAAC,IAAI,CAAA;SAC1B;;AAGD,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAA,aAAA,EAAgB,IAAI,CAAC,IAAI,CAAA,CAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAA,aAAA,EAAgB,IAAI,CAAC,OAAO,CAAA,CAAE,CAAC;QAC9C;;AAGA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE;AAEA,QAAA,OAAO,OAAO;IAChB;+GApCW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECf5B,gLAQA,EAAA,MAAA,EAAA,CAAA,4yEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDEY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKX,eAAe,EAAA,UAAA,EAAA,CAAA;kBAR3B,SAAS;+BACE,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,gLAAA,EAAA,MAAA,EAAA,CAAA,4yEAAA,CAAA,EAAA;8BAKtC,IAAI,EAAA,CAAA;sBAAZ;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,WAAW,EAAA,CAAA;sBAAnB;;;MEIU,mBAAmB,CAAA;AAqB9B,IAAA,WAAA,CAAoB,UAAsB,EAAA;QAAtB,IAAA,CAAA,UAAU,GAAV,UAAU;QApBrB,IAAA,CAAA,UAAU,GAAG,CAAC;QACd,IAAA,CAAA,QAAQ,GAAG,EAAE;QACb,IAAA,CAAA,WAAW,GAAG,CAAC;QACf,IAAA,CAAA,eAAe,GAAa,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5C,IAAA,CAAA,IAAI,GAAmB,IAAI;QAC3B,IAAA,CAAA,OAAO,GAAsB,MAAM;QACnC,IAAA,CAAA,oBAAoB,GAAG,IAAI;QAC3B,IAAA,CAAA,aAAa,GAAG,IAAI;QACpB,IAAA,CAAA,eAAe,GAAG,CAAC;QACnB,IAAA,CAAA,QAAQ,GAAG,KAAK;QAEJ,IAAA,CAAA,SAAS,GAAG,YAAY;AAEnC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAmB;AAChD,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,YAAY,EAAU;QAErD,IAAA,CAAA,UAAU,GAAG,CAAC;QACd,IAAA,CAAA,YAAY,GAAwB,EAAE;QACtC,IAAA,CAAA,cAAc,GAAG,KAAK;IAEuB;AAG7C,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AAChF,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;QAC7B;IACF;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,EAAE;YAC1E,IAAI,CAAC,mBAAmB,EAAE;YAC1B,IAAI,CAAC,kBAAkB,EAAE;QAC3B;IACF;AAEA,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO;YACL,iBAAiB;YACjB,CAAA,iBAAA,EAAoB,IAAI,CAAC,IAAI,CAAA,CAAE;YAC/B,CAAA,iBAAA,EAAoB,IAAI,CAAC,OAAO,CAAA,CAAE;YAClC,IAAI,CAAC,QAAQ,GAAG,2BAA2B,GAAG;AAC/C,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;IAC9D;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,oBAAoB;IAC7D;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE;AAC7D,YAAA,OAAO,CAAA,QAAA,EAAW,IAAI,CAAC,UAAU,CAAA,CAAA,EAAI,IAAI,CAAC,QAAQ,CAAA,IAAA,EAAO,IAAI,CAAC,UAAU,EAAE;QAC5E;AACA,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,UAAU,CAAA,CAAA,EAAI,IAAI,CAAC,QAAQ,CAAA,IAAA,EAAO,IAAI,CAAC,UAAU,QAAQ;IAC1E;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;AACnC,QAAA,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC;IACnD;AAEA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;IACpE;AAEA,IAAA,IAAI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;IAC/C;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ;IAC7D;IAEQ,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC5D,QAAA,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE;AAC7D,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;QAChC;IACF;IAEQ,kBAAkB,GAAA;QACxB,MAAM,KAAK,GAAwB,EAAE;QAErC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE;AAC/C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;AACzC,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACf;QACF;aAAO;AACL,YAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAEb,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,eAAe,EAAE;AAC5C,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAClD,oBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACf;AACA,gBAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AACjB,gBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;YAC7B;AAAO,iBAAA,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE;AACzE,gBAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;gBACjB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;AAC9E,oBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACf;YACF;iBAAO;AACL,gBAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;gBACjB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACjE,oBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACf;AACA,gBAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;AACjB,gBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;YAC7B;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;IAC3B;AAEA,IAAA,QAAQ,CAAC,IAAY,EAAA;QACnB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE;YACpF;QACF;AAEA,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QACvB,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,cAAc,EAAE;IACvB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrC;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrC;IACF;AAEA,IAAA,gBAAgB,CAAC,OAAe,EAAA;QAC9B,IAAI,IAAI,CAAC,QAAQ;YAAE;AAEnB,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;AACvB,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;QACpB,IAAI,CAAC,mBAAmB,EAAE;QAC1B,IAAI,CAAC,kBAAkB,EAAE;AACzB,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,cAAc,EAAE;IACvB;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,cAAc;QAC5C;IACF;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;IAC7B;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,QAAQ,EAAE,IAAI,CAAC;AAChB,SAAA,CAAC;IACJ;AAEA,IAAA,QAAQ,CAAC,KAAsB,EAAA;AAC7B,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ;IAClC;IAEA,WAAW,CAAC,KAAa,EAAE,IAAqB,EAAA;AAC9C,QAAA,OAAO,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAG,CAAA,SAAA,EAAY,KAAK,EAAE;IAC9D;+GAlLW,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,CAAA,YAAA,EAAA,WAAA,CAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/BhC,++MAsMA,EAAA,MAAA,EAAA,CAAA,gpLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED5KY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAR/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,++MAAA,EAAA,MAAA,EAAA,CAAA,gpLAAA,CAAA,EAAA;+EAGtC,UAAU,EAAA,CAAA;sBAAlB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,eAAe,EAAA,CAAA;sBAAvB;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,oBAAoB,EAAA,CAAA;sBAA5B;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBACQ,eAAe,EAAA,CAAA;sBAAvB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBAEoB,SAAS,EAAA,CAAA;sBAA7B,KAAK;uBAAC,YAAY;gBAET,UAAU,EAAA,CAAA;sBAAnB;gBACS,cAAc,EAAA,CAAA;sBAAvB;gBASD,eAAe,EAAA,CAAA;sBADd,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;;;AE+F5C;;;;;;;;;;;;;;;AAeG;MASU,cAAc,CAAA;AACzB,IAAA,WAAA,CAAoB,SAAuB,EAAA;QAAvB,IAAA,CAAA,SAAS,GAAT,SAAS;AAE7B;;AAEG;QACM,IAAA,CAAA,OAAO,GAAsB,EAAE;AAExC;;AAEG;QACM,IAAA,CAAA,IAAI,GAAU,EAAE;AAEzB;;;AAGG;QACM,IAAA,CAAA,IAAI,GAAc,IAAI;AAE/B;;;AAGG;QACM,IAAA,CAAA,OAAO,GAAiB,SAAS;AAE1C;;;AAGG;QACM,IAAA,CAAA,UAAU,GAAG,IAAI;AAE1B;;;AAGG;QACM,IAAA,CAAA,SAAS,GAAG,IAAI;AAEzB;;;AAGG;QACM,IAAA,CAAA,cAAc,GAAG,IAAI;AAE9B;;AAEG;QACM,IAAA,CAAA,UAAU,GAAG,CAAC;AAEvB;;;AAGG;QACM,IAAA,CAAA,WAAW,GAAG,CAAC;AAExB;;;AAGG;QACM,IAAA,CAAA,QAAQ,GAAG,EAAE;AAEtB;;AAEG;QACM,IAAA,CAAA,eAAe,GAAa,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AAErD;;;AAGG;QACM,IAAA,CAAA,oBAAoB,GAAG,IAAI;AAEpC;;;AAGG;QACM,IAAA,CAAA,iBAAiB,GAAgD,MAAM;AAEhF;;AAEG;QACM,IAAA,CAAA,YAAY,GAAG,2BAA2B;AAEnD;;;AAGG;QACM,IAAA,CAAA,OAAO,GAAG,KAAK;AAExB;;;AAGG;QACM,IAAA,CAAA,UAAU,GAAG,KAAK;AAE3B;;AAEG;QACM,IAAA,CAAA,eAAe,GAAa,EAAE;AAEvC;;;AAGG;QACM,IAAA,CAAA,YAAY,GAAG,KAAK;AAY7B;;AAEG;QACM,IAAA,CAAA,aAAa,GAA0B,IAAI;AAEpD;;AAEG;QACkB,IAAA,CAAA,SAAS,GAAG,YAAY;AAE7C;;AAEG;AACO,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAmB;AAE1D;;AAEG;AACO,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,YAAY,EAAU;AAErD;;AAEG;AACO,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,YAAY,EAA+B;AAEpE;;AAEG;AACO,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,YAAY,EAAuB;AAE7D;;AAEG;AACO,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAkB;AAEzD;;AAEG;AACO,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAuB;IAxJrB;AAoK9C;;AAEG;AACH,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,MAAM,OAAO,GAAG,CAAC,sBAAsB,CAAC;AAExC,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC;QAC9C;AAEA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1B;AAEA;;AAEG;AACH,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,MAAM,OAAO,GAAG,CAAC,wBAAwB,CAAC;AAE1C,QAAA,IAAI,IAAI,CAAC,iBAAiB,KAAK,MAAM,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,EAAE;AAC7E,YAAA,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC;QAClD;AAEA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1B;AAEA;;AAEG;AACH,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,eAAe,IAAI,CAAC,IAAI,CAAA,CAAE,EAAE,CAAA,YAAA,EAAe,IAAI,CAAC,OAAO,CAAA,CAAE,CAAC;AAEzF,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC;QACvC;AAEA,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC;QACxC;AAEA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1B;AAEA;;;AAGG;IACH,YAAY,CAAC,GAAQ,EAAE,GAAW,EAAA;AAChC,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,EAAE;QAE3B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;QAC3B,IAAI,KAAK,GAAG,GAAG;AAEf,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;AAAE,gBAAA,OAAO,EAAE;AACpD,YAAA,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;QAClB;QAEA,OAAO,KAAK,IAAI,EAAE;IACpB;AAEA;;AAEG;AACH,IAAA,iBAAiB,CAAC,MAAuB,EAAA;QACvC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM;AAAE,YAAA,OAAO,EAAE;AACvD,QAAA,OAAO,CAAA,kBAAA,EAAqB,MAAM,CAAC,KAAK,EAAE;IAC5C;AAEA;;AAEG;IACH,UAAU,CAAC,GAAQ,EAAE,KAAa,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAChC;QACA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACpC;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,MAAc,EAAE,GAAQ,EAAE,KAAa,EAAE,KAAY,EAAA;QAC/D,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IAC7C;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,MAAuB,EAAA;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE;QAEtB,IAAI,YAAY,GAA0B,KAAK;QAE/C,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,GAAG,EAAE;AAClC,YAAA,IAAI,IAAI,CAAC,aAAa,KAAK,KAAK,EAAE;gBAChC,YAAY,GAAG,MAAM;YACvB;AAAO,iBAAA,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM,EAAE;gBACxC,YAAY,GAAG,IAAI;YACrB;QACF;AAEA,QAAA,IAAI,CAAC,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC,GAAG,GAAG,SAAS;AACvD,QAAA,IAAI,CAAC,aAAa,GAAG,YAAY;AAEjC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACnB,MAAM,EAAE,MAAM,CAAC,GAAG;AAClB,YAAA,SAAS,EAAE,YAAY;AACxB,SAAA,CAAC;IACJ;AAEA;;AAEG;AACH,IAAA,kBAAkB,CAAC,KAAa,EAAA;QAC9B,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;QAC9C,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC;AAEjD,QAAA,IAAI,aAAa,GAAG,CAAC,CAAC,EAAE;AACtB,YAAA,YAAY,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QACvC;aAAO;AACL,YAAA,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1B;AAEA,QAAA,IAAI,CAAC,eAAe,GAAG,YAAY;QACnC,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA;;AAEG;IACH,kBAAkB,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AACxB,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;QAC3B;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,CAAC;QAC3D;QACA,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC7C;AAEA;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;IACjF;AAEA;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM;IAC1F;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,KAAsB,EAAA;AACjC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI;AAC7B,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,OAAe,EAAA;AAC9B,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;AACvB,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;AACpB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;IACnC;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,MAAuB,EAAA;QAClC,IAAI,CAAC,MAAM,CAAC,QAAQ;AAAE,YAAA,OAAO,MAAM;AACnC,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,GAAG;AAAE,YAAA,OAAO,MAAM;AACjD,QAAA,OAAO,IAAI,CAAC,aAAa,IAAI,MAAM;IACrC;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,OAAO,KAAK;IACd;AAEA;;AAEG;IACH,UAAU,CAAC,CAAS,EAAE,MAAuB,EAAA;QAC3C,OAAO,MAAM,CAAC,GAAG;IACnB;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,MAAuB,EAAA;QACnC,OAAO,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM;IAClD;AAEA;;AAEG;IACH,aAAa,CAAC,KAAU,EAAE,MAAuB,EAAA;AAC/C,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY;QAClC,IAAI,MAAM,EAAE,OAAO,IAAI,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE;AAC9C,YAAA,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9B;;AAEA,QAAA,MAAM,UAAU,GAA2B;AACzC,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,UAAU,EAAE,OAAO;AACnB,YAAA,UAAU,EAAE,OAAO;AACnB,YAAA,UAAU,EAAE,SAAS;AACrB,YAAA,UAAU,EAAE,SAAS;AACrB,YAAA,QAAQ,EAAE,SAAS;AACnB,YAAA,QAAQ,EAAE,SAAS;AACnB,YAAA,UAAU,EAAE,UAAU;AACtB,YAAA,UAAU,EAAE,UAAU;SACvB;AACD,QAAA,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,SAAS;IACvC;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,MAAuB,EAAA;AACtC,QAAA,OAAO,MAAM,CAAC,YAAY,EAAE,OAAO,IAAI,QAAQ;IACjD;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,MAAuB,EAAA;AACnC,QAAA,OAAO,MAAM,CAAC,YAAY,EAAE,IAAI,IAAI,IAAI;IAC1C;AAEA;;AAEG;IACH,WAAW,CAAC,GAAQ,EAAE,MAAuB,EAAA;AAC3C,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE;QACtC,OAAO;YACL,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE;AAC/C,YAAA,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE;YAC7C,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,OAAO,CAAC,IAAI,EAAE;SACrD;IACH;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,MAAuB,EAAA;AAChC,QAAA,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/C,OAAO,MAAM,CAAC,OAAO;QACvB;;QAEA,OAAO;YACL,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;YAC7C,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;AAC7C,YAAA,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;SACvE;IACH;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,MAAmB,EAAE,GAAQ,EAAE,KAAa,EAAE,KAAY,EAAA;QACtE,KAAK,CAAC,eAAe,EAAE;;AAGvB,QAAA,IAAI,MAAM,CAAC,MAAM,EAAE;AACjB,YAAA,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;QAC3B;;AAGA,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACxD;AAEA;;;AAGG;AACH,IAAA,yBAAyB,CAAC,GAAQ,EAAE,MAAuB,EAAE,KAAa,EAAA;AACxE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAChD,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,IAAI,EAAE;AAEjD,QAAA,IAAI,MAAM,CAAC,iBAAiB,EAAE;AAC5B,YAAA,MAAM,aAAa,GAAG,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC;AACjE,YAAA,OAAO,EAAE,GAAG,YAAY,EAAE,GAAG,aAAa,EAAE;QAC9C;AAEA,QAAA,OAAO,YAAY;IACrB;AAEA;;AAEG;AACH,IAAA,mBAAmB,CAAC,MAAuB,EAAA;AACzC,QAAA,OAAO,CAAC,CAAC,MAAM,CAAC,gBAAgB;IAClC;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,OAA2B,EAAA;AACrC,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,EAAE;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,OAAO,CAAC;IACxD;IAEQ,mBAAmB,GAAA;AACzB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxE,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YACxB,YAAY;YACZ,eAAe,EAAE,IAAI,CAAC,eAAe;AACtC,SAAA,CAAC;IACJ;+GA3eW,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,8jCC7K3B,g7YAuPA,EAAA,MAAA,EAAA,CAAA,uuMAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/EY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,kCAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,sRAAE,eAAe,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKjD,cAAc,EAAA,UAAA,EAAA,CAAA;kBAR1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,EAAE,eAAe,CAAC,EAAA,eAAA,EAG5C,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,g7YAAA,EAAA,MAAA,EAAA,CAAA,uuMAAA,CAAA,EAAA;mFAQtC,OAAO,EAAA,CAAA;sBAAf;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAMQ,IAAI,EAAA,CAAA;sBAAZ;gBAMQ,OAAO,EAAA,CAAA;sBAAf;gBAMQ,UAAU,EAAA,CAAA;sBAAlB;gBAMQ,SAAS,EAAA,CAAA;sBAAjB;gBAMQ,cAAc,EAAA,CAAA;sBAAtB;gBAKQ,UAAU,EAAA,CAAA;sBAAlB;gBAMQ,WAAW,EAAA,CAAA;sBAAnB;gBAMQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKQ,eAAe,EAAA,CAAA;sBAAvB;gBAMQ,oBAAoB,EAAA,CAAA;sBAA5B;gBAMQ,iBAAiB,EAAA,CAAA;sBAAzB;gBAKQ,YAAY,EAAA,CAAA;sBAApB;gBAMQ,OAAO,EAAA,CAAA;sBAAf;gBAMQ,UAAU,EAAA,CAAA;sBAAlB;gBAKQ,eAAe,EAAA,CAAA;sBAAvB;gBAMQ,YAAY,EAAA,CAAA;sBAApB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBAKQ,UAAU,EAAA,CAAA;sBAAlB;gBAKQ,aAAa,EAAA,CAAA;sBAArB;gBAKoB,SAAS,EAAA,CAAA;sBAA7B,KAAK;uBAAC,YAAY;gBAKT,UAAU,EAAA,CAAA;sBAAnB;gBAKS,cAAc,EAAA,CAAA;sBAAvB;gBAKS,QAAQ,EAAA,CAAA;sBAAjB;gBAKS,SAAS,EAAA,CAAA;sBAAlB;gBAKS,UAAU,EAAA,CAAA;sBAAnB;gBAKS,eAAe,EAAA,CAAA;sBAAxB;gBAK8B,aAAa,EAAA,CAAA;sBAA3C,YAAY;uBAAC,eAAe;gBAKI,eAAe,EAAA,CAAA;sBAA/C,YAAY;uBAAC,iBAAiB;;;AEzUjC;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;MASU,YAAY,CAAA;AARzB,IAAA,WAAA,GAAA;AASE;;AAEG;AACM,QAAA,IAAA,CAAA,EAAE,GAAW,gBAAgB,CAAC,KAAK,CAAC;AAE7C;;AAEG;QACM,IAAA,CAAA,KAAK,GAAa,SAAS;AAEpC;;AAEG;QACM,IAAA,CAAA,IAAI,GAAY,IAAI;AAE7B;;AAEG;QACM,IAAA,CAAA,KAAK,GAAG,UAAU;AAO3B;;AAEG;QACM,IAAA,CAAA,MAAM,GAAG,KAAK;AAEvB;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK;AAEzB;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,IAAI;AAmBxB;;AAEG;AACO,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAU;AAE9C;;AAEG;AACO,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAU;AAqD9C,IAAA;AAnDC;;AAEG;AACH,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO;YACL,UAAU;YACV,CAAA,UAAA,EAAa,IAAI,CAAC,KAAK,CAAA,CAAE;YACzB,CAAA,UAAA,EAAa,IAAI,CAAC,IAAI,CAAA,CAAE;YACxB,IAAI,CAAC,MAAM,GAAG,kBAAkB,GAAG,EAAE;YACrC,IAAI,CAAC,QAAQ,GAAG,oBAAoB,GAAG;AACxC,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA;;AAEG;AACH,IAAA,OAAO,CAAC,KAAiB,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,KAAK,CAAC,eAAe,EAAE;YACvB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B;IACF;AAEA;;AAEG;AACH,IAAA,OAAO,CAAC,KAAiB,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,KAAK,CAAC,eAAe,EAAE;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B;IACF;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,IAAI,IAAI,CAAC,QAAQ;YAAE;;AAGnB,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B;;AAGA,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,CAAC,EAAE;YAC1E,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B;IACF;+GAtHW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzCzB,igCAkCA,EAAA,MAAA,EAAA,CAAA,y0HAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDEY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKX,YAAY,EAAA,UAAA,EAAA,CAAA;kBARxB,SAAS;+BACE,UAAU,EAAA,UAAA,EACR,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,igCAAA,EAAA,MAAA,EAAA,CAAA,y0HAAA,CAAA,EAAA;8BAMtC,EAAE,EAAA,CAAA;sBAAV;gBAKQ,KAAK,EAAA,CAAA;sBAAb;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,KAAK,EAAA,CAAA;sBAAb;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,MAAM,EAAA,CAAA;sBAAd;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAOQ,SAAS,EAAA,CAAA;sBAAjB;gBAKQ,YAAY,EAAA,CAAA;sBAApB;gBAKQ,YAAY,EAAA,CAAA;sBAApB;gBAKS,OAAO,EAAA,CAAA;sBAAhB;gBAKS,MAAM,EAAA,CAAA;sBAAf;;;AEjFH;;;;;;;;;;;;;;;;;;;;;;AAsBG;MAgBU,mBAAmB,CAAA;IA8E9B,WAAA,CACU,UAAsB,EACtB,GAAsB,EAAA;QADtB,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,GAAG,GAAH,GAAG;AA7Eb;;AAEG;AACM,QAAA,IAAA,CAAA,EAAE,GAAW,gBAAgB,CAAC,YAAY,CAAC;AAOpD;;AAEG;QACM,IAAA,CAAA,WAAW,GAAG,aAAa;AAEpC;;AAEG;QACM,IAAA,CAAA,IAAI,GAAmB,IAAI;AAEpC;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK;AAEzB;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK;AAEzB;;AAEG;QACM,IAAA,CAAA,UAAU,GAAG,YAAY;AAYlC;;AAEG;AACO,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAe;AAEtD;;AAEG;AACO,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AAE3C;;AAEG;AACO,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;;QAG3C,IAAA,CAAA,YAAY,GAAgB,IAAI;QAChC,IAAA,CAAA,cAAc,GAAG,KAAK;AACtB,QAAA,IAAA,CAAA,YAAY,GAAS,IAAI,IAAI,EAAE;QAC/B,IAAA,CAAA,YAAY,GAAkB,EAAE;AAChC,QAAA,IAAA,CAAA,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AACrD,QAAA,IAAA,CAAA,UAAU,GAAG;YACX,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;YACtD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE;SACvD;;AAGO,QAAA,IAAA,CAAA,QAAQ,GAAiC,MAAK,EAAE,CAAC;AACjD,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;QAMtC,IAAI,CAAC,gBAAgB,EAAE;IACzB;AAEA;;AAEG;AACH,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,iBAAiB;YACjB,CAAA,iBAAA,EAAoB,IAAI,CAAC,IAAI,CAAA,CAAE;YAC/B,IAAI,CAAC,QAAQ,GAAG,2BAA2B,GAAG,EAAE;YAChD,IAAI,CAAC,cAAc,GAAG,uBAAuB,GAAG,EAAE;YAClD,IAAI,CAAC,YAAY,GAAG,4BAA4B,GAAG;AACpD,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA;;AAEG;AACH,IAAA,IAAI,YAAY,GAAA;QACd,IAAI,CAAC,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,EAAE;QACjC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;IAC3C;AAEA;;AAEG;AACH,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,CAAA,EAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE;IAC9F;AAEA;;AAEG;IACH,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,QAAQ;YAAE;AAEnB,QAAA,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,cAAc;AAE1C,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;AAElB,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAChG;YACA,IAAI,CAAC,gBAAgB,EAAE;QACzB;aAAO;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QACpB;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AAClB,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;AAEA;;AAEG;IACH,aAAa,GAAA;QACX,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,CAC1B,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAC/B,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,EAChC,CAAC,CACF;QACD,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA;;AAEG;IACH,SAAS,GAAA;QACP,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,CAC1B,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAC/B,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,EAChC,CAAC,CACF;QACD,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,GAAgB,EAAA;QACzB,IAAI,IAAI,CAAC,QAAQ;YAAE;QACnB,IAAI,CAAC,GAAG,CAAC,cAAc;YAAE;QACzB,IAAI,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO;YAAE;QAC7C,IAAI,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO;YAAE;AAE7C,QAAA,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,IAAI;AAC5B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;QAChC,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,aAAa,EAAE;IACtB;AAEA;;AAEG;IACK,gBAAgB,GAAA;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;;QAG1C,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACzC,QAAA,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,EAAE;;AAG3C,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;AAC5C,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE;;QAGrC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1C,QAAA,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,EAAE;QAE3C,MAAM,IAAI,GAAkB,EAAE;AAC9B,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;QACxB,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;;AAG1B,QAAA,KAAK,IAAI,CAAC,GAAG,iBAAiB,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAC/C,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,eAAe,GAAG,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI;gBACJ,GAAG,EAAE,eAAe,GAAG,CAAC;AACxB,gBAAA,cAAc,EAAE,KAAK;AACrB,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,OAAO,EAAE;AACV,aAAA,CAAC;QACJ;;AAGA,QAAA,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,WAAW,EAAE,GAAG,EAAE,EAAE;YAC3C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;YACvC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAEzB,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY;gBAClC,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACnE,gBAAA,KAAK;YAEP,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE;YAElD,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI;gBACJ,GAAG;AACH,gBAAA,cAAc,EAAE,IAAI;gBACpB,UAAU;gBACV;AACD,aAAA,CAAC;QACJ;;QAGA,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;AACvC,QAAA,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,aAAa,EAAE,GAAG,EAAE,EAAE;AAC7C,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI;gBACJ,GAAG;AACH,gBAAA,cAAc,EAAE,KAAK;AACrB,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,OAAO,EAAE;AACV,aAAA,CAAC;QACJ;AAEA,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;IAC1B;AAEA;;AAEG;AACK,IAAA,UAAU,CAAC,IAAU,EAAA;AAC3B,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAC1D,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACnD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAE/B,OAAO,IAAI,CAAC;AACT,aAAA,OAAO,CAAC,IAAI,EAAE,KAAK;AACnB,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG;aACjB,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAClC;AAEA;;AAEG;AAEH,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YACzD,IAAI,CAAC,aAAa,EAAE;QACtB;IACF;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,KAAoB,EAAA;AAC5B,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,cAAc,EAAE;QACvB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YACjC,IAAI,CAAC,aAAa,EAAE;QACtB;IACF;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,KAAiB,EAAA;QACzB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,IAAI,CAAC,QAAQ;YAAE;AAEnB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;;AAGA,IAAA,UAAU,CAAC,KAAkB,EAAA;AAC3B,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;QACzB,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxE;QACA,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA,IAAA,gBAAgB,CAAC,EAAgC,EAAA;AAC/C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;+GA3UW,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,EAAA,EAAA,SAAA,EARnB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,mBAAmB,CAAC;AAClD,gBAAA,KAAK,EAAE;AACR;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9DH,swHAoHA,2/ODhEY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAf/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,yBAAyB,CAAC;AAClD,4BAAA,KAAK,EAAE;AACR;AACF,qBAAA,EAAA,QAAA,EAAA,swHAAA,EAAA,MAAA,EAAA,CAAA,o8OAAA,CAAA,EAAA;+GAG0B,YAAY,EAAA,CAAA;sBAAtC,SAAS;uBAAC,cAAc;gBAKhB,EAAE,EAAA,CAAA;sBAAV;gBAKQ,KAAK,EAAA,CAAA;sBAAb;gBAKQ,WAAW,EAAA,CAAA;sBAAnB;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKQ,UAAU,EAAA,CAAA;sBAAlB;gBAKQ,OAAO,EAAA,CAAA;sBAAf;gBAKQ,OAAO,EAAA,CAAA;sBAAf;gBAKS,UAAU,EAAA,CAAA;sBAAnB;gBAKS,MAAM,EAAA,CAAA;sBAAf;gBAKS,MAAM,EAAA,CAAA;sBAAf;gBAwND,eAAe,EAAA,CAAA;sBADd,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;;;AEjU5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCG;MAgBU,cAAc,CAAA;IAyIzB,WAAA,CACU,GAAsB,EACtB,SAAuB,EAAA;QADvB,IAAA,CAAA,GAAG,GAAH,GAAG;QACH,IAAA,CAAA,SAAS,GAAT,SAAS;AAxInB;;AAEG;AACM,QAAA,IAAA,CAAA,EAAE,GAAW,gBAAgB,CAAC,OAAO,CAAC;AAE/C;;AAEG;QACM,IAAA,CAAA,IAAI,GAAc,MAAM;AAOjC;;AAEG;QACM,IAAA,CAAA,WAAW,GAAG,EAAE;AAEzB;;AAEG;QACM,IAAA,CAAA,IAAI,GAAc,IAAI;AAE/B;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK;AAEzB;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK;AAEzB;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK;AAEzB;;AAEG;QACM,IAAA,CAAA,KAAK,GAAG,KAAK;AAiBtB;;AAEG;QACM,IAAA,CAAA,YAAY,GAAqB,MAAM;AAYhD;;AAEG;QACM,IAAA,CAAA,SAAS,GAAG,KAAK;AA2B1B;;AAEG;AACO,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAU;AAElD;;AAEG;AACO,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;AAE5C;;AAEG;AACO,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;AAE5C;;AAEG;AACO,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;;QAG5C,IAAA,CAAA,KAAK,GAAW,EAAE;QAClB,IAAA,CAAA,SAAS,GAAG,KAAK;QACjB,IAAA,CAAA,YAAY,GAAG,KAAK;;AAGZ,QAAA,IAAA,CAAA,QAAQ,GAA4B,MAAK,EAAE,CAAC;AAC5C,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;IAKrC;AAEH;;AAEG;AACH,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,YAAY;YACZ,CAAA,YAAA,EAAe,IAAI,CAAC,IAAI,CAAA,CAAE;YAC1B,IAAI,CAAC,QAAQ,GAAG,sBAAsB,GAAG,EAAE;YAC3C,IAAI,CAAC,KAAK,GAAG,mBAAmB,GAAG,EAAE;YACrC,IAAI,CAAC,QAAQ,GAAG,sBAAsB,GAAG,EAAE;YAC3C,IAAI,CAAC,SAAS,GAAG,qBAAqB,GAAG,EAAE;YAC3C,IAAI,CAAC,KAAK,GAAG,uBAAuB,GAAG;AACxC,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA;;AAEG;AACH,IAAA,IAAI,SAAS,GAAA;QACX,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE;AACjD,YAAA,OAAO,MAAM;QACf;QACA,OAAO,IAAI,CAAC,IAAI;IAClB;AAEA;;AAEG;AACH,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ;IAC3E;AAEA;;AAEG;AACH,IAAA,IAAI,kBAAkB,GAAA;QACpB,OAAO,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ;IACrF;AAEA;;AAEG;AACH,IAAA,IAAI,gBAAgB,GAAA;;QAElB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,EAAE;YAC7C,OAAO,IAAI,CAAC,IAAI;QAClB;;QAEA,OAAO,IAAI,CAAC,QAAQ;IACtB;AAEA;;AAEG;AACH,IAAA,IAAI,iBAAiB,GAAA;;QAEnB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,EAAE;YAC9C,OAAO,IAAI,CAAC,IAAI;QAClB;;QAEA,OAAO,IAAI,CAAC,SAAS;IACvB;AAEA;;AAEG;AACH,IAAA,OAAO,CAAC,KAAY,EAAA;AAClB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;AAC/C,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AACjC,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA;;AAEG;IACH,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACnB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA;;AAEG;IACH,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;QACtB,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACnB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,KAAiB,EAAA;QAC1B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AACf,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AACjC,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACnB,QAAA,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,KAAK,EAAE;AACxC,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA;;AAEG;AACH,IAAA,wBAAwB,CAAC,KAAiB,EAAA;QACxC,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY;AACtC,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA;;AAEG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,KAAK,EAAE;IAC1C;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,IAAwB,EAAA;AACnC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC;IACrD;;AAGA,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;AACxB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA,IAAA,gBAAgB,CAAC,EAA2B,EAAA;AAC1C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;+GAjSW,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,IAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,GAAA,EAAA,KAAA,EAAA,GAAA,EAAA,KAAA,EAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EARd;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,cAAc,CAAC;AAC7C,gBAAA,KAAK,EAAE;AACR;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxEH,slMAqHA,4mMDvDY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYX,cAAc,EAAA,UAAA,EAAA,CAAA;kBAf1B,SAAS;+BACE,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,oBAAoB,CAAC;AAC7C,4BAAA,KAAK,EAAE;AACR;AACF,qBAAA,EAAA,QAAA,EAAA,slMAAA,EAAA,MAAA,EAAA,CAAA,qjMAAA,CAAA,EAAA;mHAG0B,YAAY,EAAA,CAAA;sBAAtC,SAAS;uBAAC,cAAc;gBAKhB,EAAE,EAAA,CAAA;sBAAV;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,KAAK,EAAA,CAAA;sBAAb;gBAKQ,WAAW,EAAA,CAAA;sBAAnB;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKQ,KAAK,EAAA,CAAA;sBAAb;gBAKQ,YAAY,EAAA,CAAA;sBAApB;gBAKQ,UAAU,EAAA,CAAA;sBAAlB;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,YAAY,EAAA,CAAA;sBAApB;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBAKQ,GAAG,EAAA,CAAA;sBAAX;gBAKQ,GAAG,EAAA,CAAA;sBAAX;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,YAAY,EAAA,CAAA;sBAApB;gBAKS,WAAW,EAAA,CAAA;sBAApB;gBAKS,OAAO,EAAA,CAAA;sBAAhB;gBAKS,OAAO,EAAA,CAAA;sBAAhB;gBAKS,OAAO,EAAA,CAAA;sBAAhB;;;AExLH;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;MAgBU,cAAc,CAAA;AAuDzB,IAAA,WAAA,CAAoB,GAAsB,EAAA;QAAtB,IAAA,CAAA,GAAG,GAAH,GAAG;AAtDvB;;AAEG;AACM,QAAA,IAAA,CAAA,EAAE,GAAW,gBAAgB,CAAC,OAAO,CAAC;AAY/C;;AAEG;QACM,IAAA,CAAA,OAAO,GAAiB,KAAK;AAYtC;;;;AAIG;QACM,IAAA,CAAA,aAAa,GAAuB,OAAO;AAEpD;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK;AAEzB;;AAEG;AACO,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAW;;QAGvD,IAAA,CAAA,OAAO,GAAG,KAAK;;AAGP,QAAA,IAAA,CAAA,QAAQ,GAA6B,MAAK,EAAE,CAAC;AAC7C,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;IAEK;AAE7C;;AAEG;AACH,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,YAAY;YACZ,CAAA,YAAA,EAAe,IAAI,CAAC,OAAO,CAAA,CAAE;YAC7B,IAAI,CAAC,QAAQ,GAAG,sBAAsB,GAAG,EAAE;YAC3C,IAAI,CAAC,OAAO,GAAG,qBAAqB,GAAG,EAAE;YACzC,IAAI,CAAC,aAAa,KAAK,MAAM,GAAG,wBAAwB,GAAG;AAC5D,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,KAAY,EAAA;QACxB,IAAI,IAAI,CAAC,QAAQ;YAAE;AAEnB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;QAC1D,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YACzB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AACrC,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;AAEA;;AAEG;IACH,MAAM,GAAA;QACJ,IAAI,CAAC,SAAS,EAAE;IAClB;;AAGA,IAAA,UAAU,CAAC,KAAc,EAAA;QACvB,IAAI,CAAC,OAAO,GAAG,KAAK,KAAK,IAAI,CAAC,KAAK;AACnC,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA,IAAA,gBAAgB,CAAC,EAA4B,EAAA;AAC3C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;+GA7GW,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,SAAA,EARd;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,cAAc,CAAC;AAC7C,gBAAA,KAAK,EAAE;AACR;SACF,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtDH,qtCA0BA,i2FDkBY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYX,cAAc,EAAA,UAAA,EAAA,CAAA;kBAf1B,SAAS;+BACE,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,oBAAoB,CAAC;AAC7C,4BAAA,KAAK,EAAE;AACR;AACF,qBAAA,EAAA,QAAA,EAAA,qtCAAA,EAAA,MAAA,EAAA,CAAA,0yFAAA,CAAA,EAAA;sFAMQ,EAAE,EAAA,CAAA;sBAAV;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,KAAK,EAAA,CAAA;sBAAb;gBAKQ,OAAO,EAAA,CAAA;sBAAf;gBAKQ,KAAK,EAAA,CAAA;sBAAb;gBAKQ,WAAW,EAAA,CAAA;sBAAnB;gBAOQ,aAAa,EAAA,CAAA;sBAArB;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKS,eAAe,EAAA,CAAA;sBAAxB;;;AEvFH;;;;;;;;;;;;;;AAcG;MAgBU,iBAAiB,CAAA;AA6C5B,IAAA,WAAA,CAAoB,GAAsB,EAAA;QAAtB,IAAA,CAAA,GAAG,GAAH,GAAG;AA5CvB;;AAEG;AACM,QAAA,IAAA,CAAA,EAAE,GAAW,gBAAgB,CAAC,UAAU,CAAC;AAiBlD;;;;AAIG;QACM,IAAA,CAAA,aAAa,GAA0B,OAAO;AAEvD;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK;AAEzB;;AAEG;AACO,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,YAAY,EAAW;;QAGrD,IAAA,CAAA,OAAO,GAAG,KAAK;;AAGP,QAAA,IAAA,CAAA,QAAQ,GAA6B,MAAK,EAAE,CAAC;AAC7C,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;IAEK;AAE7C;;AAEG;AACH,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,eAAe;YACf,IAAI,CAAC,QAAQ,GAAG,yBAAyB,GAAG,EAAE;YAC9C,IAAI,CAAC,OAAO,GAAG,wBAAwB,GAAG,EAAE;YAC5C,IAAI,CAAC,aAAa,KAAK,MAAM,GAAG,2BAA2B,GAAG;AAC/D,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,KAAY,EAAA;QAC3B,IAAI,IAAI,CAAC,QAAQ;YAAE;AAEnB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAC1D,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACrC,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA;;AAEG;IACH,MAAM,GAAA;QACJ,IAAI,CAAC,SAAS,EAAE;IAClB;;AAGA,IAAA,UAAU,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK;AACtB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA,IAAA,gBAAgB,CAAC,EAA4B,EAAA;AAC3C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;+GAhGW,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,SAAA,EARjB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,iBAAiB,CAAC;AAChD,gBAAA,KAAK,EAAE;AACR;SACF,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3CH,w+CA6BA,uiEDIY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYX,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAf7B,SAAS;+BACE,eAAe,EAAA,UAAA,EACb,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,uBAAuB,CAAC;AAChD,4BAAA,KAAK,EAAE;AACR;AACF,qBAAA,EAAA,QAAA,EAAA,w+CAAA,EAAA,MAAA,EAAA,CAAA,g/DAAA,CAAA,EAAA;sFAMQ,EAAE,EAAA,CAAA;sBAAV;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,KAAK,EAAA,CAAA;sBAAb;gBAKQ,WAAW,EAAA,CAAA;sBAAnB;gBAOQ,aAAa,EAAA,CAAA;sBAArB;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKS,aAAa,EAAA,CAAA;sBAAtB;;;AElEH;;;;;;;;;;;;;;AAcG;MAgBU,eAAe,CAAA;AA6C1B,IAAA,WAAA,CAAoB,GAAsB,EAAA;QAAtB,IAAA,CAAA,GAAG,GAAH,GAAG;AA5CvB;;AAEG;AACM,QAAA,IAAA,CAAA,EAAE,GAAW,gBAAgB,CAAC,QAAQ,CAAC;AAiBhD;;;;AAIG;QACM,IAAA,CAAA,aAAa,GAAwB,OAAO;AAErD;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK;AAEzB;;AAEG;AACO,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAW;;QAGpD,IAAA,CAAA,OAAO,GAAG,KAAK;;AAGP,QAAA,IAAA,CAAA,QAAQ,GAA6B,MAAK,EAAE,CAAC;AAC7C,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;IAEK;AAE7C;;AAEG;AACH,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,aAAa;YACb,IAAI,CAAC,QAAQ,GAAG,uBAAuB,GAAG,EAAE;YAC5C,IAAI,CAAC,OAAO,GAAG,sBAAsB,GAAG,EAAE;YAC1C,IAAI,CAAC,aAAa,KAAK,MAAM,GAAG,yBAAyB,GAAG;AAC7D,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA;;AAEG;AACH,IAAA,cAAc,CAAC,KAAY,EAAA;QACzB,IAAI,IAAI,CAAC,QAAQ;YAAE;AAEnB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAC1D,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACpC,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA;;AAEG;IACH,MAAM,GAAA;QACJ,IAAI,CAAC,SAAS,EAAE;IAClB;;AAGA,IAAA,UAAU,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK;AACtB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA,IAAA,gBAAgB,CAAC,EAA4B,EAAA;AAC3C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;+GAhGW,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,SAAA,EARf;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,eAAe,CAAC;AAC9C,gBAAA,KAAK,EAAE;AACR;SACF,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3CH,q0CA6BA,0oEDIY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYX,eAAe,EAAA,UAAA,EAAA,CAAA;kBAf3B,SAAS;+BACE,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,qBAAqB,CAAC;AAC9C,4BAAA,KAAK,EAAE;AACR;AACF,qBAAA,EAAA,QAAA,EAAA,q0CAAA,EAAA,MAAA,EAAA,CAAA,mlEAAA,CAAA,EAAA;sFAMQ,EAAE,EAAA,CAAA;sBAAV;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,KAAK,EAAA,CAAA;sBAAb;gBAKQ,WAAW,EAAA,CAAA;sBAAnB;gBAOQ,aAAa,EAAA,CAAA;sBAArB;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKS,YAAY,EAAA,CAAA;sBAArB;;;AEzDH;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;MAgBU,iBAAiB,CAAA;IA8E5B,WAAA,CACU,GAAsB,EACtB,UAAsB,EAAA;QADtB,IAAA,CAAA,GAAG,GAAH,GAAG;QACH,IAAA,CAAA,UAAU,GAAV,UAAU;AA7EpB;;AAEG;AACM,QAAA,IAAA,CAAA,EAAE,GAAW,gBAAgB,CAAC,UAAU,CAAC;AAOlD;;AAEG;QACM,IAAA,CAAA,IAAI,GAAiB,IAAI;AAElC;;AAEG;QACM,IAAA,CAAA,OAAO,GAAqB,EAAE;AAEvC;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK;AAEzB;;AAEG;QACM,IAAA,CAAA,UAAU,GAAG,KAAK;AAE3B;;AAEG;QACM,IAAA,CAAA,SAAS,GAAG,GAAG;AAExB;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK;AAEzB;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK;AAEzB;;AAEG;QACM,IAAA,CAAA,KAAK,GAAG,KAAK;AAYtB;;AAEG;AACO,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,YAAY,EAAuB;;QAGnE,IAAA,CAAA,MAAM,GAAG,KAAK;QACd,IAAA,CAAA,WAAW,GAAG,EAAE;QAChB,IAAA,CAAA,cAAc,GAAc,EAAE;QAC9B,IAAA,CAAA,YAAY,GAAG,CAAC,CAAC;;AAGT,QAAA,IAAA,CAAA,QAAQ,GAA6B,MAAK,EAAE,CAAC;AAC7C,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;IAKrC;AAEH;;AAEG;AACH,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO;YACL,eAAe;YACf,CAAA,eAAA,EAAkB,IAAI,CAAC,IAAI,CAAA,CAAE;YAC7B,IAAI,CAAC,QAAQ,GAAG,yBAAyB,GAAG,EAAE;YAC9C,IAAI,CAAC,KAAK,GAAG,sBAAsB,GAAG,EAAE;YACxC,IAAI,CAAC,MAAM,GAAG,qBAAqB,GAAG,EAAE;YACxC,IAAI,CAAC,QAAQ,GAAG,0BAA0B,GAAG;AAC9C,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA;;AAEG;AACH,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;IACxF;AAEA;;AAEG;AACH,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,OAAO,IAAI,CAAC,OAAO;QACrB;QACA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAC/B,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC3C;IACH;AAEA;;AAEG;AACH,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAC7C,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CACxC;AACD,YAAA,OAAO,eAAe,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACzD;aAAO;YACL,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAC1C,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CACrC;AACD,YAAA,OAAO,cAAc,EAAE,KAAK,IAAI,EAAE;QACpC;IACF;AAEA;;AAEG;IACH,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,QAAQ;YAAE;AAEnB,QAAA,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM;AAE1B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;;AAGtB,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,UAAU,CAAC,MAAK;AACd,oBAAA,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,EAAE;gBACzC,CAAC,EAAE,CAAC,CAAC;YACP;QACF;aAAO;AACL,YAAA,IAAI,CAAC,WAAW,GAAG,EAAE;QACvB;AAEA,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,MAAsB,EAAA;QACjC,IAAI,MAAM,CAAC,QAAQ;YAAE;AAErB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AACvD,YAAA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;gBACd,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACtC;iBAAO;gBACL,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACxC;YACA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;AACvC,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;QACrD;aAAO;YACL,IAAI,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;AACpC,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;YAC3B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AACvC,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,YAAA,IAAI,CAAC,WAAW,GAAG,EAAE;QACvB;AAEA,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,MAAsB,EAAA;QAC/B,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;IACnD;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,KAAY,EAAA;AACxB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;AAC/C,QAAA,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK;AAC/B,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;AACtB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,IAAI,IAAI,CAAC,QAAQ;YAAE;AAEnB,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe;AAE5C,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,GAAG;AACN,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;oBAChB,KAAK,CAAC,cAAc,EAAE;oBACtB,IAAI,CAAC,cAAc,EAAE;gBACvB;AAAO,qBAAA,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC,MAAM,EAAE;oBAC/E,KAAK,CAAC,cAAc,EAAE;oBACtB,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACvD;gBACA;AAEF,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;oBAChB,IAAI,CAAC,cAAc,EAAE;gBACvB;qBAAO;AACL,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/E,oBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;gBACzB;gBACA;AAEF,YAAA,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC,CAAC;AACtD,oBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;gBACzB;gBACA;AAEF,YAAA,KAAK,QAAQ;AACX,gBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;oBACf,KAAK,CAAC,cAAc,EAAE;AACtB,oBAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,oBAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACrB,oBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;gBACzB;gBACA;AAEF,YAAA,KAAK,KAAK;AACR,gBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,oBAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,oBAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACrB,oBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;gBACzB;gBACA;;IAEN;AAEA;;AAEG;AAEH,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AACzD,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,gBAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,gBAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACrB,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;YACzB;QACF;IACF;;AAGA,IAAA,UAAU,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;QACzD;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE;QACpD;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA,IAAA,gBAAgB,CAAC,EAA4B,EAAA;AAC3C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;+GA1SW,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,EAAA,EAAA,SAAA,EARjB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,iBAAiB,CAAC;AAChD,gBAAA,KAAK,EAAE;AACR;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9DH,yoHA8FA,8pND1CY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAYX,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAf7B,SAAS;+BACE,eAAe,EAAA,UAAA,EACb,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,uBAAuB,CAAC;AAChD,4BAAA,KAAK,EAAE;AACR;AACF,qBAAA,EAAA,QAAA,EAAA,yoHAAA,EAAA,MAAA,EAAA,CAAA,umNAAA,CAAA,EAAA;+GAGyB,WAAW,EAAA,CAAA;sBAApC,SAAS;uBAAC,aAAa;gBAKf,EAAE,EAAA,CAAA;sBAAV;gBAKQ,KAAK,EAAA,CAAA;sBAAb;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,OAAO,EAAA,CAAA;sBAAf;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKQ,UAAU,EAAA,CAAA;sBAAlB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKQ,QAAQ,EAAA,CAAA;sBAAhB;gBAKQ,KAAK,EAAA,CAAA;sBAAb;gBAKQ,YAAY,EAAA,CAAA;sBAApB;gBAKQ,UAAU,EAAA,CAAA;sBAAlB;gBAKS,eAAe,EAAA,CAAA;sBAAxB;gBAyMD,eAAe,EAAA,CAAA;sBADd,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;;;AExT5C;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;MASU,mBAAmB,CAAA;AARhC,IAAA,WAAA,GAAA;AASE;;AAEG;AACM,QAAA,IAAA,CAAA,EAAE,GAAW,gBAAgB,CAAC,aAAa,CAAC;AAErD;;AAEG;QACM,IAAA,CAAA,MAAM,GAAG,KAAK;AAEvB;;AAEG;QACM,IAAA,CAAA,IAAI,GAAmB,IAAI;AAEpC;;AAEG;QACM,IAAA,CAAA,oBAAoB,GAAG,IAAI;AAEpC;;AAEG;QACM,IAAA,CAAA,aAAa,GAAG,IAAI;AAE7B;;AAEG;QACM,IAAA,CAAA,eAAe,GAAG,IAAI;AAmB/B;;AAEG;AACO,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AAE3C;;AAEG;AACO,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;QAInC,IAAA,CAAA,gBAAgB,GAAwB,IAAI;QAC5C,IAAA,CAAA,iBAAiB,GAAwB,IAAI;QAC7C,IAAA,CAAA,qBAAqB,GAAmB,IAAI;AAmGrD,IAAA;IAjGC,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,MAAM,EAAE;QACf;IACF;IAEA,eAAe,GAAA;QACb,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE;YAClC,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,OAAO,EAAE;IAChB;AAEA;;AAEG;AACH,IAAA,IAAI,YAAY,GAAA;QACd,OAAO;YACL,kBAAkB;YAClB,IAAI,CAAC,MAAM,GAAG,wBAAwB,GAAG;AAC1C,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;IACnB;AAEA;;AAEG;AACH,IAAA,IAAI,YAAY,GAAA;QACd,OAAO;YACL,yBAAyB;YACzB,CAAA,yBAAA,EAA4B,IAAI,CAAC,IAAI,CAAA;SACtC;IACH;AAEA;;AAEG;AACH,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,oBAAoB,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,EAAE;YACrE,IAAI,CAAC,KAAK,EAAE;QACd;IACF;AAEA;;AAEG;AACH,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAChD,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,KAAK,EAAE;QACd;IACF;AAEA;;AAEG;IACH,KAAK,GAAA;QACH,IAAI,CAAC,OAAO,EAAE;AACd,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;AAEA;;AAEG;IACK,MAAM,GAAA;AACZ,QAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,aAAa;AACnD,QAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,EAAE;AAC5C,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;AAEA;;AAEG;IACK,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE;YAClC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAClE;IACF;AAEA;;AAEG;IACK,OAAO,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B;AACA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,IAAI,CAAC,iBAAiB,EAAE;AACxB,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC/B;AACA,QAAA,IAAI,IAAI,CAAC,qBAAqB,YAAY,WAAW,EAAE;AACrD,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE;QACpC;IACF;+GAhKW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpDhC,21CAgDA,EAAA,MAAA,EAAA,CAAA,ywEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDDY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAR/B,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,21CAAA,EAAA,MAAA,EAAA,CAAA,ywEAAA,CAAA,EAAA;8BAMtC,EAAE,EAAA,CAAA;sBAAV;gBAKQ,MAAM,EAAA,CAAA;sBAAd;gBAKQ,IAAI,EAAA,CAAA;sBAAZ;gBAKQ,oBAAoB,EAAA,CAAA;sBAA5B;gBAKQ,aAAa,EAAA,CAAA;sBAArB;gBAKQ,eAAe,EAAA,CAAA;sBAAvB;gBAOQ,SAAS,EAAA,CAAA;sBAAjB;gBAKQ,cAAc,EAAA,CAAA;sBAAtB;gBAKQ,eAAe,EAAA,CAAA;sBAAvB;gBAKS,MAAM,EAAA,CAAA;sBAAf;gBAKS,MAAM,EAAA,CAAA;sBAAf;gBAEwB,UAAU,EAAA,CAAA;sBAAlC,SAAS;uBAAC,YAAY;;AAyGzB;;AAEG;MAMU,yBAAyB,CAAA;+GAAzB,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,0BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBALrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,0BAA0B;AAC1C,iBAAA;;AAGD;;AAEG;MAMU,0BAA0B,CAAA;+GAA1B,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,2BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBALtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,yBAAyB;AACnC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,2BAA2B;AAC3C,iBAAA;;AAGD;;AAEG;MAMU,yBAAyB,CAAA;+GAAzB,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,0BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBALrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,0BAA0B;AAC1C,iBAAA;;;AExND;;;;;;;;;;;;;;;;;;;;;AAqBG;MASU,gBAAgB,CAAA;AAC3B,IAAA,WAAA,CAAoB,SAAuB,EAAA;QAAvB,IAAA,CAAA,SAAS,GAAT,SAAS;AAE7B;;AAEG;QACM,IAAA,CAAA,QAAQ,GAAqB,EAAE;AAExC;;AAEG;QACM,IAAA,CAAA,UAAU,GAAG,IAAI;AAO1B;;AAEG;QACM,IAAA,CAAA,UAAU,GAAG,KAAK;AAE3B;;AAEG;QACM,IAAA,CAAA,SAAS,GAAG,KAAK;AAE1B;;AAEG;AACO,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,YAAY,EAAmB;AAEzD;;AAEG;AACO,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,YAAY,EAAW;IAnCR;AAqC9C;;AAEG;IACH,WAAW,CAAC,IAAqB,EAAE,KAAY,EAAA;QAC7C,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;;QAGvB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAC3C,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAC7B;QAED,IAAI,UAAU,EAAE;;AAEd,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,IAAG;AAC9B,gBAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,IAAG;oBAClC,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,CAAC,QAAQ,EAAE;AAChD,wBAAA,WAAW,CAAC,QAAQ,GAAG,KAAK;oBAC9B;AACF,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ;QAChC;;AAGA,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;AAEA;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,SAAS;QAChC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;IAC1C;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,IAAY,EAAA;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC;IACrD;AAEA;;AAEG;IACH,cAAc,CAAC,MAAc,EAAE,OAAuB,EAAA;QACpD,OAAO,OAAO,CAAC,EAAE;IACnB;AAEA;;AAEG;IACH,WAAW,CAAC,MAAc,EAAE,IAAqB,EAAA;QAC/C,OAAO,IAAI,CAAC,EAAE;IAChB;AAEA;;AAEG;IACH,cAAc,CAAC,IAAqB,EAAE,OAAO,GAAG,KAAK,EAAE,QAAQ,GAAG,KAAK,EAAA;AACrE,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,OAAO,GAAG,uBAAuB,GAAG;SACrC;QAED,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC;QAC/C;AAEA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,+BAA+B,GAAG,4BAA4B,CAAC;QACxF;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7C,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC;AAChD,gBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,oBAAA,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC;gBAC9C;YACF;AAAO,iBAAA,IAAI,OAAO,IAAI,CAAC,QAAQ,EAAE;;AAE/B,gBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,oBAAA,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC;gBAC9C;YACF;QACF;AAEA,QAAA,OAAO,OAAO;IAChB;+GAjIW,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,IAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxD7B,2jJAoGA,EAAA,MAAA,EAAA,CAAA,4zMAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjDY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAKX,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAR5B,SAAS;+BACE,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,2jJAAA,EAAA,MAAA,EAAA,CAAA,4zMAAA,CAAA,EAAA;mFAQtC,QAAQ,EAAA,CAAA;sBAAhB;gBAKQ,UAAU,EAAA,CAAA;sBAAlB;gBAKQ,WAAW,EAAA,CAAA;sBAAnB;gBAKQ,UAAU,EAAA,CAAA;sBAAlB;gBAKQ,SAAS,EAAA,CAAA;sBAAjB;gBAKS,SAAS,EAAA,CAAA;sBAAlB;gBAKS,cAAc,EAAA,CAAA;sBAAvB;;;AEhEH,MAAM,UAAU,GAAG;IACjB,eAAe;IACf,aAAa;IACb,mBAAmB;IACnB,iBAAiB;IACjB,mBAAmB;IACnB,eAAe;IACf,mBAAmB;IACnB,cAAc;IACd,YAAY;IACZ,mBAAmB;IACnB,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,eAAe;IACf,iBAAiB;IACjB,mBAAmB;IACnB,yBAAyB;IACzB,0BAA0B;IAC1B,yBAAyB;IACzB;CACD;AAED;;;;;;;;;;;;;;;AAeG;MAKU,oBAAoB,CAAA;+GAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;gHAApB,oBAAoB,EAAA,OAAA,EAAA,CAHrB,YAAY,EAvCtB,eAAe;YACf,aAAa;YACb,mBAAmB;YACnB,iBAAiB;YACjB,mBAAmB;YACnB,eAAe;YACf,mBAAmB;YACnB,cAAc;YACd,YAAY;YACZ,mBAAmB;YACnB,cAAc;YACd,cAAc;YACd,iBAAiB;YACjB,eAAe;YACf,iBAAiB;YACjB,mBAAmB;YACnB,yBAAyB;YACzB,0BAA0B;YAC1B,yBAAyB;AACzB,YAAA,gBAAgB,aAnBhB,eAAe;YACf,aAAa;YACb,mBAAmB;YACnB,iBAAiB;YACjB,mBAAmB;YACnB,eAAe;YACf,mBAAmB;YACnB,cAAc;YACd,YAAY;YACZ,mBAAmB;YACnB,cAAc;YACd,cAAc;YACd,iBAAiB;YACjB,eAAe;YACf,iBAAiB;YACjB,mBAAmB;YACnB,yBAAyB;YACzB,0BAA0B;YAC1B,yBAAyB;YACzB,gBAAgB,CAAA,EAAA,CAAA,CAAA;gHAuBL,oBAAoB,EAAA,OAAA,EAAA,CAHrB,YAAY,EAvCtB,eAAe;YAKf,eAAe;YACf,mBAAmB;YACnB,cAAc;YACd,YAAY;YACZ,mBAAmB;YACnB,cAAc;YACd,cAAc;YACd,iBAAiB;YACjB,eAAe;YACf,iBAAiB;YACjB,mBAAmB;YAInB,gBAAgB,CAAA,EAAA,CAAA,CAAA;;4FAuBL,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,GAAG,UAAU,CAAC;AACtC,oBAAA,OAAO,EAAE;AACV,iBAAA;;;AC1BD;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BG;MAIU,mBAAmB,CAAA;AAHhC,IAAA,WAAA,GAAA;AAImB,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,OAAO,EAAgB;AACjD,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,OAAO,EAAU;AACtC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;;QAGlC,IAAA,CAAA,eAAe,GAAG,IAAI;;QAEtB,IAAA,CAAA,eAAe,GAAyB,WAAW;AA4GrE,IAAA;AA1GC;;AAEG;AACH,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE;IAChD;AAEA;;AAEG;AACH,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;IAC3C;AAEA;;AAEG;AACH,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;AAEA;;;;;AAKG;AACH,IAAA,OAAO,CAAC,OAAe,EAAE,KAAc,EAAE,MAAoC,EAAA;AAC3E,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAClE;AAEA;;;;;AAKG;AACH,IAAA,KAAK,CAAC,OAAe,EAAE,KAAc,EAAE,MAAoC,EAAA;AACzE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAChE;AAEA;;;;;AAKG;AACH,IAAA,OAAO,CAAC,OAAe,EAAE,KAAc,EAAE,MAAoC,EAAA;AAC3E,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAClE;AAEA;;;;;AAKG;AACH,IAAA,IAAI,CAAC,OAAe,EAAE,KAAc,EAAE,MAAoC,EAAA;AACxE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC/D;AAEA;;;;AAIG;AACH,IAAA,IAAI,CAAC,MAA0B,EAAA;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;AAEzC,QAAA,MAAM,YAAY,GAAiB;YACjC,EAAE;YACF,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,YAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe;AACjD,YAAA,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;AACvC,YAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe;YACjD,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,SAAS,EAAE,IAAI,IAAI;SACpB;AAED,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC;AAC3C,QAAA,OAAO,EAAE;IACX;AAEA;;;AAGG;AACH,IAAA,OAAO,CAAC,EAAU,EAAA;AAChB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9B;AAEA;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;AAEA;;AAEG;IACK,UAAU,GAAA;QAChB,OAAO,CAAA,aAAA,EAAgB,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAE;IACnF;+GAnHW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;AChCD;;AAEG;AACH,MAAM,iBAAiB,GAAG,eAAe;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;MAIU,YAAY,CAAA;AAKvB,IAAA,WAAA,CAAiC,UAAkB,EAAA;QAF3C,IAAA,CAAA,UAAU,GAA0B,IAAI;AAG9C,QAAA,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC,UAAU,CAAC;AAE9C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE;AAC3C,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,eAAe,CAAc,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;AAE1F,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,wBAAwB,EAAE;YAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QAC1C;IACF;AAEA;;AAEG;AACH,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;AAEA;;AAEG;AACH,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK;IAChC;AAEA;;AAEG;AACH,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI;IACrC;AAEA;;AAEG;AACH,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,aAAa,KAAK,MAAM;IACzD;AAEA;;;AAGG;AACH,IAAA,QAAQ,CAAC,IAAe,EAAA;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC3C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAEvB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QACzB;IACF;AAEA;;;AAGG;IACH,WAAW,GAAA;AACT,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;AACvC,QAAA,MAAM,OAAO,GAAc,OAAO,CAAC,aAAa,KAAK,OAAO,GAAG,MAAM,GAAG,OAAO;AAC/E,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;IACxB;AAEA;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACzB;AAEA;;;AAGG;AACH,IAAA,kBAAkB,CAAC,SAAyB,EAAA;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe;AACrC,QAAA,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AACjD,YAAA,IAAI,KAAK,KAAK,SAAS,EAAE;gBACvB,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;gBAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC;YAC3C;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;AACH,IAAA,qBAAqB,CAAC,aAAuB,EAAA;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe;AACrC,QAAA,aAAa,CAAC,OAAO,CAAC,IAAI,IAAG;YAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC/C,YAAA,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC;AACvC,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACK,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,OAAO,OAAO;QAChB;QAEA,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC;AACtD,QAAA,IAAI,MAAM,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC1D,YAAA,OAAO,MAAmB;QAC5B;AAEA,QAAA,OAAO,QAAQ;IACjB;AAEA;;AAEG;AACK,IAAA,iBAAiB,CAAC,IAAe,EAAA;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QAC7C,OAAO;YACL,IAAI;YACJ,aAAa;YACb,QAAQ,EAAE,CAAA,WAAA,EAAc,aAAa,CAAA;SACtC;IACH;AAEA;;AAEG;AACK,IAAA,YAAY,CAAC,IAAe,EAAA;AAClC,QAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC,mBAAmB,EAAE;QACnC;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;IACK,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,YAAA,OAAO,OAAO;QAChB;AACA,QAAA,OAAO,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO;IACrF;AAEA;;AAEG;IACK,wBAAwB,GAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;QAEA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC;QAEnE,MAAM,QAAQ,GAAG,MAAW;YAC1B,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;AAC/C,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,gBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YACzB;AACF,QAAA,CAAC;;AAGD,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE;YACpC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACtD;IACF;AAEA;;AAEG;AACK,IAAA,UAAU,CAAC,MAAmB,EAAA;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe;;QAGrC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;;QAG5D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;;QAGnC,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,aAAa,CAAC;IAC5D;AAEA;;AAEG;AACK,IAAA,YAAY,CAAC,IAAe,EAAA;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;AACA,QAAA,YAAY,CAAC,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC;IAC/C;AAEA;;AAEG;AACK,IAAA,iBAAiB,CAAC,IAAY,EAAA;AACpC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE;QAC/D,OAAO,CAAA,OAAA,EAAU,SAAS,CAAA,CAAE;IAC9B;AA1NW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,kBAKH,WAAW,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AALpB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA,CAAA;;4FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;0BAMc,MAAM;2BAAC,WAAW;;;AC9DjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;MAIU,cAAc,CAAA;AAH3B,IAAA,WAAA,GAAA;AAImB,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,GAAG,EAAwB;QAC/C,IAAA,CAAA,aAAa,GAAG,IAAI,eAAe,CAA4B,IAAI,GAAG,EAAE,CAAC;;QAGzE,IAAA,CAAA,SAAS,GAAG,QAAQ;AA6JtC,IAAA;AA3JC;;AAEG;AACH,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;IAC1C;AAEA;;AAEG;AACH,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAC5B,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAC1E;IACH;AAEA;;;AAGG;AACH,IAAA,UAAU,CAAC,EAAA,GAAa,IAAI,CAAC,SAAS,EAAA;QACpC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAC5B,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,IAAI,KAAK,CAAC,CAClD;IACH;AAEA;;;AAGG;AACH,IAAA,SAAS,CAAC,EAAA,GAAa,IAAI,CAAC,SAAS,EAAA;QACnC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAC5B,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAC9B;IACH;AAEA;;;AAGG;AACH,IAAA,SAAS,CAAC,EAAA,GAAa,IAAI,CAAC,SAAS,EAAA;AACnC,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,IAAI,KAAK;IACvD;AAEA;;AAEG;IACH,YAAY,GAAA;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,CAAC;IAC/E;AAEA;;;;AAIG;AACH,IAAA,KAAK,CAAC,EAAA,GAAa,IAAI,CAAC,SAAS,EAAE,OAAgB,EAAA;AACjD,QAAA,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACzE;AAEA;;;AAGG;AACH,IAAA,IAAI,CAAC,EAAA,GAAa,IAAI,CAAC,SAAS,EAAA;AAC9B,QAAA,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACrF;AAEA;;;;;AAKG;AACH,IAAA,WAAW,CAAC,EAAU,EAAE,QAAgB,EAAE,OAAgB,EAAA;QACxD,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE;AACnB,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC9C,gBAAA,OAAO,EAAE,OAAO,IAAI,YAAY,CAAC;AAClC,aAAA,CAAC;QACJ;IACF;AAEA;;;;AAIG;IACH,UAAU,CAAC,EAAU,EAAE,OAAe,EAAA;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;QACxD;IACF;AAEA;;AAEG;IACH,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;QAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACpC;AAEA;;;AAGG;AACH,IAAA,MAAM,CAAC,EAAU,EAAA;AACf,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,EAAE;IACnB;AAEA;;;;;;AAMG;AACH,IAAA,MAAM,WAAW,CACf,EAAU,EACV,SAA2B,EAC3B,OAAgB,EAAA;AAEhB,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC;AACvB,QAAA,IAAI;YACF,OAAO,MAAM,SAAS,EAAE;QAC1B;gBAAU;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACf;IACF;AAEA;;AAEG;IACK,WAAW,CAAC,EAAU,EAAE,YAA4D,EAAA;AAC1F,QAAA,MAAM,KAAK,GAAiB;YAC1B,EAAE;YACF,SAAS,EAAE,YAAY,CAAC,SAAS;YACjC,OAAO,EAAE,YAAY,CAAC,OAAO;YAC7B,QAAQ,EAAE,YAAY,CAAC;SACxB;QAED,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC;QACjC,IAAI,CAAC,UAAU,EAAE;IACnB;AAEA;;AAEG;IACK,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACtD;+GAjKW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;AClDD;;;AAGG;;ACHH;;;AAGG;AAEH;;;;;;;;AAQG;AACG,SAAU,WAAW,CAAC,GAAW,EAAA;AACrC,IAAA,OAAO;AACJ,SAAA,OAAO,CAAC,iBAAiB,EAAE,OAAO;AAClC,SAAA,OAAO,CAAC,SAAS,EAAE,GAAG;AACtB,SAAA,WAAW,EAAE;AAClB;AAEA;;;;;;;;AAQG;AACG,SAAU,WAAW,CAAC,GAAW,EAAA;AACrC,IAAA,OAAO;SACJ,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;AACrE,SAAA,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;AAClD;AAEA;;;;;;;AAOG;AACG,SAAU,YAAY,CAAC,GAAW,EAAA;AACtC,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC;AAC9B,IAAA,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACvD;AAEA;;;;;;;AAOG;AACG,SAAU,WAAW,CAAC,GAAW,EAAA;IACrC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAC5C;AAEA;;;;;;;AAOG;AACG,SAAU,UAAU,CAAC,GAAW,EAAA;AACpC,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,GAAG;AACpB,IAAA,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD;AAEA;;;;;;;;;;AAUG;AACG,SAAU,QAAQ,CAAC,GAAW,EAAE,SAAiB,EAAE,MAAM,GAAG,KAAK,EAAA;AACrE,IAAA,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,SAAS;AAAE,QAAA,OAAO,GAAG;AAC/C,IAAA,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM;AACzD;AAEA;;;;;;;;;AASG;AACG,SAAU,OAAO,CAAC,GAA8B,EAAA;IACpD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;AACxC;AAEA;;;;AAIG;AACG,SAAU,UAAU,CAAC,GAA8B,EAAA;AACvD,IAAA,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;AACtB;AAEA;;;;;;;;AAQG;AACG,SAAU,OAAO,CAAC,GAAW,EAAA;AACjC,IAAA,OAAO;AACJ,SAAA,WAAW;SACX,SAAS,CAAC,KAAK;AACf,SAAA,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;AAC/B,SAAA,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;AAC5B,SAAA,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;AACvB,SAAA,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AACnB,SAAA,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B;AAEA;;;;;;;AAOG;AACG,SAAU,UAAU,CAAC,GAAW,EAAA;AACpC,IAAA,MAAM,WAAW,GAA2B;AAC1C,QAAA,GAAG,EAAE,OAAO;AACZ,QAAA,GAAG,EAAE,MAAM;AACX,QAAA,GAAG,EAAE,MAAM;AACX,QAAA,GAAG,EAAE,QAAQ;AACb,QAAA,GAAG,EAAE;KACN;AACD,IAAA,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;AAC3D;AAEA;;;;;;;AAOG;AACG,SAAU,SAAS,CAAC,GAAW,EAAA;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;AACpC;AAEA;;;;;;;;;AASG;SACa,WAAW,CAAC,IAAY,EAAE,SAAS,GAAG,CAAC,EAAA;AACrD,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,EAAE;AAEpB,IAAA,OAAO;SACJ,KAAK,CAAC,KAAK;SACX,MAAM,CAAC,OAAO;AACd,SAAA,KAAK,CAAC,CAAC,EAAE,SAAS;AAClB,SAAA,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;SACxC,IAAI,CAAC,EAAE,CAAC;AACb;AAEA;;;;;;;;;;;AAWG;SACa,SAAS,CAAC,KAAa,EAAE,QAAgB,EAAE,MAAe,EAAA;AACxE,IAAA,OAAO,KAAK,KAAK,CAAC,GAAG,QAAQ,IAAI,MAAM,IAAI,GAAG,QAAQ,CAAA,CAAA,CAAG,CAAC;AAC5D;AAEA;;;;;;;;;;AAUG;SACa,WAAW,CAAC,KAAa,EAAE,QAAgB,EAAE,MAAe,EAAA;AAC1E,IAAA,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA,CAAE;AACzD;;ACtNA;;;;AAIG;AAsFH;;;;AAIG;AACG,SAAU,uBAAuB,CAAC,OAQvC,EAAA;IACC,MAAM,KAAK,GAAmB,EAAE;AAEhC,IAAA,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,QAAA,KAAK,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,KAAK;IACrC;AACA,IAAA,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE;AACjC,QAAA,KAAK,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,OAAO;IACzC;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE;AAClC,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,QAAQ;IAC3C;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,IAAI;IAC/B;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,QAAQ;IAC3C;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,QAAQ;IAC3C;AACA,IAAA,IAAI,OAAO,CAAC,WAAW,EAAE;AACvB,QAAA,KAAK,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,WAAW;IACjD;AAEA,IAAA,OAAO,KAAK;AACd;AAEA;;;;AAIG;AACG,SAAU,uBAAuB,CAAC,OAIvC,EAAA;IACC,OAAO;AACL,QAAA,IAAI,EAAE,QAAQ;QACd,iBAAiB,EAAE,OAAO,CAAC,UAAU;QACrC,kBAAkB,EAAE,OAAO,CAAC,WAAW;QACvC,YAAY,EAAE,OAAO,CAAC;KACL;AACrB;AAEA;;;;AAIG;AACG,SAAU,sBAAsB,CAAC,OAUtC,EAAA;IACC,MAAM,KAAK,GAAmB,EAAE;AAEhC,IAAA,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,QAAA,KAAK,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,KAAK;IACrC;AACA,IAAA,IAAI,OAAO,CAAC,UAAU,EAAE;AACtB,QAAA,KAAK,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,UAAU;IAC/C;;IAGA,MAAM,gBAAgB,GAAa,EAAE;AACrC,IAAA,IAAI,OAAO,CAAC,WAAW,EAAE;AACvB,QAAA,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5C;IACA,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE;AACtC,QAAA,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IACxC;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IACzC;AACA,IAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/B,KAAK,CAAC,kBAAkB,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;IACxD;AAEA,IAAA,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE;AACjC,QAAA,KAAK,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,OAAO;IACzC;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,IAAI;IAC/B;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,IAAI;IAC/B;AACA,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,IAAI;IAC/B;AAEA,IAAA,OAAO,KAAK;AACd;AAEA;;;;AAIG;AACG,SAAU,yBAAyB,CAAC,OAMzC,EAAA;IACC,OAAO;AACL,QAAA,IAAI,EAAE,aAAa;QACnB,eAAe,EAAE,OAAO,CAAC,KAAK;AAC9B,QAAA,eAAe,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;AACjC,QAAA,eAAe,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG;QACnC,YAAY,EAAE,OAAO,CAAC,KAAK;QAC3B,gBAAgB,EAAE,OAAO,CAAC,SAAS,IAAI,CAAA,EAAG,OAAO,CAAC,KAAK,CAAA,CAAA;KACxD;AACH;AAEA;;;;AAIG;AACG,SAAU,oBAAoB,CAAC,OAKpC,EAAA;IACC,OAAO;AACL,QAAA,GAAG,EAAE;AACH,YAAA,IAAI,EAAE,KAAK;YACX,eAAe,EAAE,OAAO,CAAC,QAAQ;YACjC,eAAe,EAAE,OAAO,CAAC,OAAO;YAChC,eAAe,EAAE,OAAO,CAAC,QAAQ;AACjC,YAAA,QAAQ,EAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC;AACnC,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,UAAU;YAChB,iBAAiB,EAAE,OAAO,CAAC,KAAK;AAChC,YAAA,aAAa,EAAE,CAAC,OAAO,CAAC,QAAQ;AAChC,YAAA,QAAQ,EAAE;AACX;KACF;AACH;AAEA;;;;AAIG;AACG,SAAU,uBAAuB,CAAC,OAKvC,EAAA;IACC,OAAO;AACL,QAAA,IAAI,EAAE,QAAQ;QACd,eAAe,EAAE,OAAO,CAAC,QAAQ;QACjC,eAAe,EAAE,OAAO,CAAC,QAAQ;QACjC,cAAc,EAAE,OAAO,CAAC,OAAO;QAC/B,eAAe,EAAE,OAAO,CAAC;KAC1B;AACH;AAEA;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,QAAiB,EAAA;IAMjD,MAAM,IAAI,GAAG,QAAQ,IAAI,gBAAgB,CAAC,OAAO,CAAC;IAClD,OAAO;AACL,QAAA,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,CAAA,EAAG,IAAI,CAAA,MAAA,CAAQ;QACxB,OAAO,EAAE,CAAA,EAAG,IAAI,CAAA,MAAA,CAAQ;QACxB,QAAQ,EAAE,CAAA,EAAG,IAAI,CAAA,OAAA;KAClB;AACH;AAEA;;;AAGG;SACa,uBAAuB,GAAA;IACrC,OAAO;AACL,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,KAAK,EAAE,KAAK;AACZ,QAAA,MAAM,EAAE,KAAK;AACb,QAAA,OAAO,EAAE,GAAG;AACZ,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,IAAI,EAAE,kBAAkB;AACxB,QAAA,UAAU,EAAE,QAAQ;AACpB,QAAA,MAAM,EAAE;KACT;AACH;AAEA;;;AAGG;SACa,oBAAoB,GAAA;IAClC,IAAI,OAAO,MAAM,KAAK,WAAW;AAAE,QAAA,OAAO,KAAK;IAC/C,OAAO,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC,OAAO;AACtE;AAEA;;;AAGG;SACa,mBAAmB,GAAA;IACjC,IAAI,OAAO,MAAM,KAAK,WAAW;AAAE,QAAA,OAAO,KAAK;IAC/C,OAAO,MAAM,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC,OAAO;AAC9D;AAEA;;;;AAIG;SACa,sBAAsB,CACpC,OAAe,EACf,aAAqC,QAAQ,EAAA;IAE7C,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE;IAErC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAClD,IAAA,YAAY,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;AAC3C,IAAA,YAAY,CAAC,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC;AAClD,IAAA,YAAY,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;IAChD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,uBAAuB,EAAE,CAAC;AAE5D,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;;IAGvC,UAAU,CAAC,MAAK;AACd,QAAA,YAAY,CAAC,WAAW,GAAG,OAAO;IACpC,CAAC,EAAE,GAAG,CAAC;;IAGP,UAAU,CAAC,MAAK;AACd,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;IACzC,CAAC,EAAE,IAAI,CAAC;AACV;AAEA;;;;;AAKG;SACa,cAAc,CAC5B,QAAiB,EACjB,OAAuD,MAAM,EAAA;IAE7D,OAAO,QAAQ,GAAG,IAAI,GAAG,SAAS;AACpC;;ACpXA;;;;AAIG;AAwEH;;;;;;;;;;;;;AAaG;SACa,WAAW,CAAC,OAAe,EAAE,UAAwB,EAAE,EAAA;IACrE,OAAO;AACL,QAAA,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,YAAY;QAClC,OAAO;AACP,QAAA,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO;AACrC,QAAA,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,SAAS;QACvC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,cAAc,EAAE,OAAO,CAAC,cAAc;AACtC,QAAA,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI;KACrC;AACH;AAEA;;;;;;;;;AASG;AACG,SAAU,qBAAqB,CACnC,KAAa,EACb,IAAY,EACZ,OAAe,EACf,OAAiD,EAAA;IAEjD,OAAO;QACL,KAAK;QACL,IAAI;QACJ,OAAO;QACP,QAAQ,EAAE,OAAO,EAAE,QAAQ;QAC3B,MAAM,EAAE,OAAO,EAAE;KAClB;AACH;AAEA;;;;;;;;;;;;;AAaG;SACa,SAAS,CAAC,KAAc,EAAE,UAAwB,EAAE,EAAA;AAClE,IAAA,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE;AACtB,QAAA,OAAO,KAAK;IACd;IAEA,IAAI,OAAO,GAAG,2BAA2B;AACzC,IAAA,IAAI,aAAgC;AAEpC,IAAA,IAAI,KAAK,YAAY,KAAK,EAAE;AAC1B,QAAA,OAAO,GAAG,KAAK,CAAC,OAAO;QACvB,aAAa,GAAG,KAAK;IACvB;AAAO,SAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QACpC,OAAO,GAAG,KAAK;IACjB;SAAO,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE;AACnE,QAAA,OAAO,GAAG,MAAM,CAAE,KAA8B,CAAC,OAAO,CAAC;IAC3D;IAEA,OAAO,WAAW,CAAC,OAAO,EAAE;AAC1B,QAAA,GAAG,OAAO;QACV;AACD,KAAA,CAAC;AACJ;AAEA;;;;AAIG;AACG,SAAU,WAAW,CAAC,KAAc,EAAA;IACxC,QACE,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;AACzB,QAAA,MAAM,IAAI,KAAK;AACf,QAAA,SAAS,IAAI,KAAK;AAClB,QAAA,UAAU,IAAI,KAAK;AACnB,QAAA,UAAU,IAAI,KAAK;QACnB,WAAW,IAAI,KAAK;AAExB;AAEA;;;;AAIG;AACG,SAAU,kBAAkB,CAAC,KAAgB,EAAA;IACjD,OAAO,KAAK,CAAC,WAAW;AAC1B;AAEA;;;;;AAKG;SACa,kBAAkB,CAAC,KAAgB,EAAE,WAAW,GAAG,KAAK,EAAA;IACtE,IAAI,WAAW,EAAE;QACf,OAAO,CAAA,CAAA,EAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,CAAA,CAAE;IAC3C;IACA,OAAO,KAAK,CAAC,OAAO;AACtB;AAEA;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,KAAgB,EAAA;AAChD,IAAA,MAAM,KAAK,GAAG;AACZ,QAAA,CAAA,CAAA,EAAI,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA,CAAA,CAAG;AACpC,QAAA,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA,CAAA,CAAG;QACnC,CAAA,CAAA,EAAI,KAAK,CAAC,IAAI,CAAA,CAAA,CAAG;AACjB,QAAA,KAAK,CAAC;KACP;AAED,IAAA,IAAI,KAAK,CAAC,OAAO,EAAE;AACjB,QAAA,KAAK,CAAC,IAAI,CAAC,CAAA,SAAA,EAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA,CAAE,CAAC;IACzD;AAEA,IAAA,IAAI,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE;QAC9B,KAAK,CAAC,IAAI,CAAC,CAAA,OAAA,EAAU,KAAK,CAAC,aAAa,CAAC,KAAK,CAAA,CAAE,CAAC;IACnD;AAEA,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;AACxB;AAEA;;;;;;AAMG;SACa,kBAAkB,CAChC,OAAe,EACf,UAAmB,EACnB,aAAqB,EAAA;IAErB,OAAO,WAAW,CAAC,OAAO,EAAE;QAC1B,IAAI,EAAE,UAAU,GAAG,CAAA,QAAA,EAAW,UAAU,CAAA,CAAE,GAAG,eAAe;AAC5D,QAAA,QAAQ,EAAE,SAAS;AACnB,QAAA,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,UAAU,GAAG,EAAE,UAAU,EAAE,GAAG,SAAS;AAChD,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,cAAc,EAAE,4CAA4C;QAC5D;AACD,KAAA,CAAC;AACJ;AAEA;;;;;AAKG;AACG,SAAU,eAAe,CAAC,OAAe,EAAE,aAAqB,EAAA;IACpE,OAAO,WAAW,CAAC,OAAO,EAAE;AAC1B,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,QAAQ,EAAE,gBAAgB;AAC1B,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,cAAc,EAAE,sBAAsB;QACtC;AACD,KAAA,CAAC;AACJ;AAEA;;;;;AAKG;AACG,SAAU,wBAAwB,CAAC,OAAe,EAAE,QAAiB,EAAA;IACzE,OAAO,WAAW,CAAC,OAAO,EAAE;AAC1B,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,QAAQ,EAAE,eAAe;AACzB,QAAA,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,QAAQ,GAAG,EAAE,QAAQ,EAAE,GAAG,SAAS;AAC5C,QAAA,WAAW,EAAE,KAAK;AAClB,QAAA,cAAc,EAAE;AACjB,KAAA,CAAC;AACJ;AAEA;;;;;AAKG;AACG,SAAU,iBAAiB,CAAC,OAAe,EAAE,SAAkB,EAAA;IACnE,OAAO,WAAW,CAAC,OAAO,EAAE;AAC1B,QAAA,IAAI,EAAE,cAAc;AACpB,QAAA,QAAQ,EAAE,eAAe;AACzB,QAAA,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,SAAS,GAAG,EAAE,SAAS,EAAE,GAAG,SAAS;AAC9C,QAAA,WAAW,EAAE,KAAK;AAClB,QAAA,cAAc,EAAE;AACjB,KAAA,CAAC;AACJ;AAOA;;AAEG;AACH,MAAM,aAAa,GAAuC,IAAI,GAAG,EAAE;AAEnE;;;;;AAKG;AACG,SAAU,oBAAoB,CAAC,QAAuB,EAAE,OAAqB,EAAA;IACjF,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;AAClD,IAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;AACtB,IAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAErC,IAAA,OAAO,MAAK;QACV,MAAM,eAAe,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnD,IAAI,eAAe,EAAE;YACnB,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC;AAC9C,YAAA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;AACd,gBAAA,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAClC;QACF;AACF,IAAA,CAAC;AACH;AAEA;;;AAGG;AACG,SAAU,WAAW,CAAC,KAAgB,EAAA;AAC1C,IAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE;IACxD,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE;IAEzD,CAAC,GAAG,QAAQ,EAAE,GAAG,cAAc,CAAC,CAAC,OAAO,CAAC,OAAO,IAAG;AACjD,QAAA,IAAI;YACF,OAAO,CAAC,KAAK,CAAC;QAChB;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAC7C;AACF,IAAA,CAAC,CAAC;AACJ;AAEA;;;;;AAKG;AACI,eAAe,QAAQ,CAC5B,SAA2B,EAC3B,YAA2B,EAAA;AAE3B,IAAA,IAAI;AACF,QAAA,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE;AAChC,QAAA,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;IACvB;IAAE,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC3C;AACF;AAEA;;;;;AAKG;AACG,SAAU,OAAO,CACrB,SAAkB,EAClB,YAA2B,EAAA;AAE3B,IAAA,IAAI;AACF,QAAA,MAAM,MAAM,GAAG,SAAS,EAAE;AAC1B,QAAA,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;IACvB;IAAE,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC3C;AACF;;AClYA;;;;;AAKG;AAEH;AACA;AACA;;ACTA;;AAEG;;;;"}