@elasticias/ui 1.0.8 → 1.0.10

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.
@@ -1 +1 @@
1
- {"version":3,"file":"elasticias-ui.mjs","sources":["../../../../libs/ui/src/lib/pipes/ef-currency.pipe.ts","../../../../libs/ui/src/lib/pipes/truncate.pipe.ts","../../../../libs/ui/src/lib/pipes/ef-compact.pipe.ts","../../../../libs/ui/src/lib/commerce/ef-price-display.component.ts","../../../../libs/ui/src/lib/commerce/ef-quantity-selector.component.ts","../../../../libs/ui/src/lib/commerce/ef-order-builder/ef-order-builder.component.types.ts","../../../../libs/ui/src/lib/layout/ef-label/ef-label.component.ts","../../../../libs/ui/src/lib/forms/ef-server-errors.directive.ts","../../../../libs/ui/src/lib/forms/abstract-ef-form-control.component.ts","../../../../libs/ui/src/lib/forms/ef-select/ef-select.component.ts","../../../../libs/ui/src/lib/forms/ef-select/ef-select.component.html","../../../../libs/ui/src/lib/forms/ef-clear-button/ef-clear-button.component.ts","../../../../libs/ui/src/lib/forms/ef-datepicker-advanced/ef-datepicker-advanced.component.ts","../../../../libs/ui/src/lib/forms/ef-datepicker-advanced/ef-datepicker-advanced.component.html","../../../../libs/ui/src/lib/forms/ef-inputnumber/ef-inputnumber.component.ts","../../../../libs/ui/src/lib/forms/ef-inputnumber/ef-inputnumber.component.html","../../../../libs/ui/src/lib/forms/ef-quantity-stepper/ef-quantity-stepper.component.ts","../../../../libs/ui/src/lib/forms/ef-quantity-stepper/ef-quantity-stepper.component.html","../../../../libs/ui/src/lib/layout/ef-button/ef-button.component.ts","../../../../libs/ui/src/lib/layout/ef-button/ef-button.component.html","../../../../libs/ui/src/lib/feedback/ef-skeleton/ef-skeleton.component.ts","../../../../libs/ui/src/lib/layout/ef-card/ef-card.component.ts","../../../../libs/ui/src/lib/layout/ef-dialog/ef-dialog.component.ts","../../../../libs/ui/src/lib/layout/ef-dialog/ef-dialog.component.html","../../../../libs/ui/src/lib/data/ef-change-history/ef-change-history.component.ts","../../../../libs/ui/src/lib/data/ef-change-history/ef-change-history.component.html","../../../../libs/ui/src/lib/commerce/ef-product-typeahead/ef-product-typeahead.component.ts","../../../../libs/ui/src/lib/commerce/ef-product-typeahead/ef-product-typeahead.component.html","../../../../libs/ui/src/lib/commerce/ef-order-builder/ef-order-builder.component.ts","../../../../libs/ui/src/lib/commerce/ef-order-builder/ef-order-builder.component.html","../../../../libs/ui/src/lib/commerce/ef-order-summary/ef-order-summary.component.ts","../../../../libs/ui/src/lib/commerce/ef-order-summary/ef-order-summary.component.html","../../../../libs/ui/src/lib/commerce/ef-product-catalogue-filter/ef-product-catalogue-filter.component.ts","../../../../libs/ui/src/lib/commerce/ef-product-catalogue-filter/ef-product-catalogue-filter.component.html","../../../../libs/ui/src/lib/commerce/ef-product-catalogue/ef-product-catalogue.component.ts","../../../../libs/ui/src/lib/commerce/ef-product-catalogue/ef-product-catalogue.component.html","../../../../libs/ui/src/lib/layout/ef-confirm-dialog/ef-confirm-dialog.component.ts","../../../../libs/ui/src/lib/layout/ef-theme-toggle/ef-theme-toggle.component.ts","../../../../libs/ui/src/lib/overlays/ef-tooltip.directive.ts","../../../../libs/ui/src/lib/layout/ef-build-stamp/ef-build-stamp.component.ts","../../../../libs/ui/src/lib/layout/ef-fieldset/ef-fieldset.component.ts","../../../../libs/ui/src/lib/layout/ef-fieldset/ef-fieldset.component.html","../../../../libs/ui/src/lib/layout/ef-button-group/ef-button-group.component.ts","../../../../libs/ui/src/lib/layout/ef-badge/ef-badge.component.types.ts","../../../../libs/ui/src/lib/layout/ef-badge/ef-badge.component.ts","../../../../libs/ui/src/lib/layout/ef-badge/ef-badge.component.html","../../../../libs/ui/src/lib/layout/ef-toolbar/ef-toolbar.component.ts","../../../../libs/ui/src/lib/layout/ef-toolbar/ef-toolbar.component.html","../../../../libs/ui/src/lib/layout/ef-module-rail/ef-module-rail.component.ts","../../../../libs/ui/src/lib/layout/ef-module-rail/ef-module-rail.component.html","../../../../libs/ui/src/lib/layout/ef-module-side/ef-module-side.component.ts","../../../../libs/ui/src/lib/layout/ef-module-side/ef-module-side.component.html","../../../../libs/ui/src/lib/layout/ef-app-top/ef-app-top.component.ts","../../../../libs/ui/src/lib/layout/ef-app-top/ef-app-top.component.html","../../../../libs/ui/src/lib/layout/ef-app-main/ef-app-main.component.ts","../../../../libs/ui/src/lib/layout/ef-app-main/ef-app-main.component.html","../../../../libs/ui/src/lib/layout/ef-bottom-sheet/ef-bottom-sheet.component.ts","../../../../libs/ui/src/lib/layout/ef-bottom-sheet/ef-bottom-sheet.component.html","../../../../libs/ui/src/lib/layout/ef-app-shell/ef-app-shell.component.ts","../../../../libs/ui/src/lib/layout/ef-app-shell/ef-app-shell.component.html","../../../../libs/ui/src/lib/layout/ef-app-shell-mobile/ef-app-shell-mobile.component.ts","../../../../libs/ui/src/lib/layout/ef-app-shell-mobile/ef-app-shell-mobile.component.html","../../../../libs/ui/src/lib/layout/ef-fab/ef-fab.component.ts","../../../../libs/ui/src/lib/layout/ef-fab/ef-fab.component.html","../../../../libs/ui/src/lib/layout/ef-pill-group/ef-pill-group.component.ts","../../../../libs/ui/src/lib/layout/ef-pill-group/ef-pill-group.component.html","../../../../libs/ui/src/lib/layout/ef-tabs/ef-tab-panel.directive.ts","../../../../libs/ui/src/lib/layout/ef-tabs/ef-tabs.component.ts","../../../../libs/ui/src/lib/layout/ef-tabs/ef-tabs.component.html","../../../../libs/ui/src/lib/layout/ef-profile-chip/ef-profile-chip.component.ts","../../../../libs/ui/src/lib/layout/ef-profile-chip/ef-profile-chip.component.html","../../../../libs/ui/src/lib/feedback/ef-block-ui/ef-block-ui.component.ts","../../../../libs/ui/src/lib/feedback/ef-block-ui/ef-block-ui.component.html","../../../../libs/ui/src/lib/feedback/ef-blockable-div/ef-blockable-div.component.ts","../../../../libs/ui/src/lib/feedback/ef-pulse/ef-pulse.component.ts","../../../../libs/ui/src/lib/feedback/ef-pulse/ef-pulse.component.html","../../../../libs/ui/src/lib/feedback/ef-pdf-preview/ef-pdf-preview.component.ts","../../../../libs/ui/src/lib/feedback/ef-pdf-preview/ef-pdf-preview.component.html","../../../../libs/ui/src/lib/feedback/ef-status-chip/ef-status-chip.types.ts","../../../../libs/ui/src/lib/feedback/ef-status-chip/ef-status-chip.component.ts","../../../../libs/ui/src/lib/feedback/ef-status-chip/ef-status-chip.component.html","../../../../libs/ui/src/lib/feedback/ef-toast-region/ef-toast-region.component.ts","../../../../libs/ui/src/lib/feedback/ef-toast-region/ef-toast-region.component.html","../../../../libs/ui/src/lib/layout/ef-form-grid/ef-form-grid.component.ts","../../../../libs/ui/src/lib/layout/ef-detail-toolbar/ef-detail-toolbar.component.ts","../../../../libs/ui/src/lib/layout/ef-detail-toolbar/ef-detail-toolbar.component.html","../../../../libs/ui/src/lib/layout/ef-search-toolbar/ef-search-toolbar.component.ts","../../../../libs/ui/src/lib/layout/ef-search-toolbar/ef-search-toolbar.component.html","../../../../libs/ui/src/lib/data/ef-totals/ef-totals.component.ts","../../../../libs/ui/src/lib/data/ef-stats/ef-stats.component.ts","../../../../libs/ui/src/lib/data/ef-timeline/ef-timeline.component.ts","../../../../libs/ui/src/lib/data/ef-kpi-card/ef-kpi-card.component.ts","../../../../libs/ui/src/lib/data/ef-chart/ef-chart.config.ts","../../../../libs/ui/src/lib/data/ef-chart/ef-chart.component.ts","../../../../libs/ui/src/lib/data/ef-rank-list/ef-rank-list.component.ts","../../../../libs/ui/src/lib/forms/ef-input-text/ef-input-text.component.ts","../../../../libs/ui/src/lib/forms/ef-input-text/ef-input-text.component.html","../../../../libs/ui/src/lib/forms/ef-checkbox/ef-checkbox.component.ts","../../../../libs/ui/src/lib/forms/ef-checkbox/ef-checkbox.component.html","../../../../libs/ui/src/lib/forms/ef-toggleswitch/ef-toggleswitch.component.ts","../../../../libs/ui/src/lib/forms/ef-datepicker/ef-datepicker.component.ts","../../../../libs/ui/src/lib/forms/ef-datepicker/ef-datepicker.component.html","../../../../libs/ui/src/lib/forms/ef-password/ef-password.component.ts","../../../../libs/ui/src/lib/forms/ef-password/ef-password.component.html","../../../../libs/ui/src/lib/forms/ef-multi-select/ef-multi-select.component.ts","../../../../libs/ui/src/lib/forms/ef-multi-select/ef-multi-select.component.html","../../../../libs/ui/src/lib/forms/ef-selectbutton/ef-selectbutton.component.ts","../../../../libs/ui/src/lib/forms/ef-selectbutton/ef-selectbutton.component.html","../../../../libs/ui/src/lib/forms/index.ts","../../../../libs/ui/src/lib/data/ef-datatable/ef-datatable.component.types.ts","../../../../libs/ui/src/lib/data/ef-datatable-actionbar/ef-datatable-actionbar.component.ts","../../../../libs/ui/src/lib/data/ef-datatable-actionbar/ef-datatable-actionbar.component.html","../../../../libs/ui/src/lib/data/ef-datatable/ef-datatable.component.ts","../../../../libs/ui/src/lib/data/ef-datatable/ef-datatable.component.html","../../../../libs/ui/src/lib/data/ef-data-card/ef-data-card.mobile.ts","../../../../libs/ui/src/lib/data/ef-pager/ef-pager.component.ts","../../../../libs/ui/src/lib/data/ef-pager/ef-pager.component.html","../../../../libs/ui/src/lib/data/ef-row-actions/ef-row-actions.component.ts","../../../../libs/ui/src/lib/data/ef-row-actions/ef-row-actions.component.html","../../../../libs/ui/src/lib/data/ef-data-card/ef-column-template.directive.ts","../../../../libs/ui/src/lib/data/ef-data-card/ef-data-card.component.ts","../../../../libs/ui/src/lib/data/ef-data-card/ef-data-card.component.html","../../../../libs/ui/src/lib/data/ef-bulk-bar/ef-bulk-bar.component.ts","../../../../libs/ui/src/lib/feedback/ef-empty-state/ef-empty-state.component.ts","../../../../libs/ui/src/lib/data/ef-smart-bar/ef-smart-bar.component.ts","../../../../libs/ui/src/lib/forms/ef-filter-pill/ef-filter-pill.component.ts","../../../../libs/ui/src/lib/forms/ef-filter-pill/ef-filter-pill.component.html","../../../../libs/ui/src/lib/forms/ef-textarea/ef-textarea.component.ts","../../../../libs/ui/src/lib/forms/ef-textarea/ef-textarea.component.html","../../../../libs/ui/src/lib/forms/ef-preset-pill/ef-preset-pill.component.ts","../../../../libs/ui/src/lib/forms/ef-filter-drawer/ef-filter-drawer.component.ts","../../../../libs/ui/src/lib/forms/ef-activation-filter/ef-activation-filter.component.ts","../../../../libs/ui/src/lib/ef-theme-configurator/ef-theme-configurator.component.ts","../../../../libs/ui/src/lib/analytics/ef-email-metrics-card/ef-email-metrics-card.component.ts","../../../../libs/ui/src/lib/analytics/ef-email-metrics-card/ef-email-metrics-card.component.html","../../../../libs/ui/src/index.ts","../../../../libs/ui/src/elasticias-ui.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Merged currency pipe from ERP (AppCurrencyPipe) and Store (CurrencyFormatPipe).\n * Uses Intl.NumberFormat for formatting — no CurrencyPipe dependency needed.\n * Default: MAD currency, fr-MA locale.\n */\n@Pipe({ name: 'efCurrency', standalone: true })\nexport class EfCurrencyPipe implements PipeTransform {\n transform(value: number | null | undefined, currency = 'MAD', locale = 'fr-MA'): string {\n if (value == null) return '';\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({ name: 'truncate', standalone: true })\nexport class TruncatePipe implements PipeTransform {\n transform(value: string, maxLength = 50, suffix = '...'): string {\n if (!value) return '';\n return value.length > maxLength ? value.slice(0, maxLength) + suffix : value;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { NumberUtils } from '@elasticias/utils';\n\n/**\n * Compact human-readable rendering of a number for KPI displays:\n * 1000 → \"1 k\", 2_500_000 → \"2,5 M\" (fr-MA locale, decimal comma).\n */\n@Pipe({ name: 'efCompact', standalone: true, pure: true })\nexport class EfCompactPipe implements PipeTransform {\n transform(value: number | null | undefined, maxDecimals = 2): string {\n return value === null || value === undefined ? '' : NumberUtils.compact(value, { maxDecimals });\n }\n}\n","import { Component, input } from '@angular/core';\nimport { EfCurrencyPipe } from '../pipes/ef-currency.pipe';\n\n@Component({\n selector: 'ef-price-display',\n standalone: true,\n imports: [EfCurrencyPipe],\n template: `<span class=\"font-medium\">{{ amount() | efCurrency }}</span>`,\n})\nexport class EfPriceDisplayComponent {\n readonly amount = input.required<number>();\n}\n","import { Component, input, output } from '@angular/core';\nimport { ButtonModule } from 'primeng/button';\n\n@Component({\n selector: 'ef-quantity-selector',\n standalone: true,\n imports: [ButtonModule],\n template: `\n <div class=\"flex items-center gap-2\">\n <p-button\n icon=\"pi pi-minus\"\n [rounded]=\"true\"\n [text]=\"true\"\n size=\"small\"\n (onClick)=\"decrement()\"\n [disabled]=\"quantity() <= 1\"\n />\n <span class=\"w-8 text-center font-medium\">{{ quantity() }}</span>\n <p-button\n icon=\"pi pi-plus\"\n [rounded]=\"true\"\n [text]=\"true\"\n size=\"small\"\n (onClick)=\"increment()\"\n />\n </div>\n `,\n})\nexport class EfQuantitySelectorComponent {\n readonly quantity = input(1);\n readonly quantityChange = output<number>();\n\n increment(): void {\n this.quantityChange.emit(this.quantity() + 1);\n }\n\n decrement(): void {\n if (this.quantity() > 1) {\n this.quantityChange.emit(this.quantity() - 1);\n }\n }\n}\n","import { UuidUtils } from '@elasticias/utils';\n\n/**\n * Summary item for product count groups\n */\nexport interface OrderSummaryItem {\n code: string;\n label: string;\n count: number;\n column: number;\n}\n\n/**\n * Order products summary grouped by countGroup\n */\nexport interface OrderProductsSummary {\n items: OrderSummaryItem[];\n totalCount: number;\n}\n\n/**\n * Represents a line item in an order, invoice, or quote\n */\nexport interface OrderLineItem {\n id?: string | number;\n product?: Record<string, unknown>;\n productId?: unknown;\n variantId?: string | null;\n countGroup?: string;\n productDescription?: string;\n productUnitPrice: number;\n quantity: number;\n discount: number;\n grossAmount: number;\n amount?: number;\n taxeId?: number | null;\n taxRate?: number;\n taxAmount?: number;\n position?: number;\n isEditing?: boolean;\n editingField?: string | null;\n}\n\n/**\n * Standard order entity contract\n */\nexport interface OrderEntity {\n // Core identification\n id?: number;\n documentNumber?: string;\n documentType: 'order' | 'invoice' | 'quote';\n status?: 'draft' | 'confirmed' | 'processing' | 'completed' | 'cancelled';\n\n // Customer information\n customerId?: string | null;\n customerName?: string;\n\n // Dates\n orderDate: Date;\n deliveryDate?: Date | null;\n dueDate?: Date | null;\n\n // Line items\n orderLines: OrderLineItem[];\n\n // Financial calculations\n grossTotal: number;\n discountTotal: number;\n taxTotal: number;\n finalTotal: number;\n\n // Optional fields\n notes?: string;\n internalNotes?: string;\n paymentTerms?: string;\n shippingAddress?: string;\n billingAddress?: string;\n\n // Products summary by countGroup\n productsSummary?: OrderProductsSummary;\n}\n\n/**\n * Configuration for document types (order, invoice, quote)\n */\nexport interface DocumentConfig {\n documentType: 'order' | 'invoice' | 'quote';\n headerLabel: string;\n dateLabel: string;\n customerLabel: string;\n enableTax?: boolean;\n enableDiscount?: boolean;\n showCatalogue?: boolean;\n allowInlineEdit?: boolean;\n enableQuickAdd?: boolean;\n showNotes?: boolean;\n showProductsSummary?: boolean;\n currencyCode?: string;\n locale?: string;\n}\n\n/**\n * Change tracking metadata\n */\nexport interface OrderChangeInfo {\n hasChanges: boolean;\n lastModified: Date;\n modifiedFields: Set<string>;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n isValid: boolean;\n errors: { [key: string]: string[] };\n warnings?: { [key: string]: string[] };\n}\n\n/**\n * Helper functions for order line items\n */\nexport class OrderLineItemHelper {\n /**\n * Calculate subtotal for a line item (price * quantity - discount)\n */\n static calculateSubtotal(item: OrderLineItem): number {\n if (!item.productUnitPrice || !item.quantity) return 0;\n const subtotal = item.productUnitPrice * item.quantity;\n const discount = item.discount || 0;\n return subtotal - (subtotal * discount) / 100;\n }\n\n /**\n * Calculate tax amount for a line item\n */\n static calculateTaxAmount(item: OrderLineItem): number {\n if (!item.taxRate) return 0;\n const subtotal = this.calculateSubtotal(item);\n return (subtotal * item.taxRate) / 100;\n }\n\n /**\n * Calculate final amount including tax\n */\n static calculateFinalAmount(item: OrderLineItem): number {\n const subtotal = this.calculateSubtotal(item);\n const taxAmount = this.calculateTaxAmount(item);\n return subtotal + taxAmount;\n }\n\n /**\n * Compose a line description from a product and (optionally) its variant.\n * Variable product → \"{displayName} ({variantTitle})\"\n * Simple product → displayName\n * Mirrors the legacy PDF format `[PF] {ref} - {NAME} ({volume})` after\n * the parent displayName has been cleaned of its baked-in volume suffix.\n */\n static composeDescription(\n product: Record<string, unknown> | null | undefined,\n variant?: Record<string, unknown>,\n ): string {\n if (!product) return '';\n const base = (product['displayName'] || product['name'] || '') as string;\n if (!base) return '';\n const title = variant?.['title'] as string | undefined;\n if (title && title.trim().length > 0) {\n return `${base} (${title})`;\n }\n return base;\n }\n\n /**\n * Create a new empty line item\n */\n static createEmptyItem(): OrderLineItem {\n return {\n id: UuidUtils.randomUUID(),\n product: null,\n productId: undefined,\n productUnitPrice: 0,\n quantity: 1,\n discount: 0,\n grossAmount: 0,\n taxRate: 0,\n taxAmount: 0,\n isEditing: true,\n editingField: null,\n };\n }\n\n /**\n * Create a line item from product selection\n * @param keyField - Field name used to identify the product (default: 'id')\n */\n static createFromProduct(product: Record<string, unknown>, quantity = 1, keyField = 'id', variantId?: string): OrderLineItem {\n // Resolve variant data if variantId is provided and product has variants\n const variants = product['variants'] as Array<Record<string, unknown>> | undefined;\n const variant = variantId && variants?.length\n ? variants.find((v) => v['variantId'] === variantId)\n : undefined;\n\n const unitPrice = variant?.['price'] ?? product.unitPrice ?? product.salePrice ?? 0;\n const taxRate = product.taxRate || 0;\n const countGroup = (variant?.['countGroup'] ?? product['countGroup'] ?? '') as string;\n\n const item: OrderLineItem = {\n id: UuidUtils.randomUUID(),\n productId: product[keyField] as string,\n variantId: variantId ?? null,\n countGroup: countGroup,\n product: product,\n productDescription: OrderLineItemHelper.composeDescription(product, variant),\n productUnitPrice: unitPrice as number,\n quantity: quantity,\n discount: 0,\n grossAmount: 0,\n amount: 0,\n taxeId: (product.taxeId || null) as number | null,\n taxRate: taxRate as number,\n taxAmount: 0,\n isEditing: false,\n editingField: null,\n };\n\n // Calculate amounts\n item.grossAmount = OrderLineItemHelper.calculateSubtotal(item);\n item.taxAmount = OrderLineItemHelper.calculateTaxAmount(item);\n item.amount = OrderLineItemHelper.calculateFinalAmount(item);\n\n return item;\n }\n\n /**\n * Update calculations for an existing line item\n */\n static updateCalculations(item: OrderLineItem): OrderLineItem {\n return {\n ...item,\n grossAmount: this.calculateSubtotal(item),\n taxAmount: this.calculateTaxAmount(item),\n amount: this.calculateFinalAmount(item),\n };\n }\n\n /**\n * Validate a line item\n */\n static validate(item: OrderLineItem): ValidationResult {\n const errors: { [key: string]: string[] } = {};\n\n if (!item.product && !item.productId) {\n errors['product'] = ['Le produit est requis'];\n }\n\n if (!item.productUnitPrice || item.productUnitPrice <= 0) {\n errors['productUnitPrice'] = [\"Le prix d'unité doit être supérieur à 0\"];\n }\n\n if (!item.quantity || item.quantity <= 0) {\n errors['quantity'] = ['La quantité doit être supérieure à 0'];\n }\n\n if (item.discount && (item.discount < 0 || item.discount > 100)) {\n errors['discount'] = ['La remise doit être entre 0 et 100'];\n }\n\n return {\n isValid: Object.keys(errors).length === 0,\n errors,\n };\n }\n\n /**\n * Compare two line items for equality\n */\n static areEqual(item1: OrderLineItem, item2: OrderLineItem): boolean {\n return (\n item1.productId === item2.productId &&\n item1.productUnitPrice === item2.productUnitPrice &&\n item1.quantity === item2.quantity &&\n item1.discount === item2.discount &&\n item1.taxRate === item2.taxRate\n );\n }\n}\n\n/**\n * Helper functions for order entity\n */\nexport class OrderEntityHelper {\n /**\n * Create a new empty order entity\n */\n static createEmpty(\n documentType: 'order' | 'invoice' | 'quote' = 'order',\n ): OrderEntity {\n return {\n documentType,\n orderDate: new Date(),\n orderLines: [],\n grossTotal: 0,\n discountTotal: 0,\n taxTotal: 0,\n finalTotal: 0,\n status: 'draft',\n };\n }\n\n /**\n * Calculate all totals for an order\n */\n static calculateTotals(order: OrderEntity): OrderEntity {\n const grossTotal = order.orderLines.reduce(\n (total, item) =>\n total + (item.productUnitPrice || 0) * (item.quantity || 0),\n 0,\n );\n\n const discountTotal = order.orderLines.reduce((total, item) => {\n const itemTotal = (item.productUnitPrice || 0) * (item.quantity || 0);\n const discount = item.discount || 0;\n return total + (itemTotal * discount) / 100;\n }, 0);\n\n const taxTotal = order.orderLines.reduce((total, item) => {\n return total + (item.taxAmount || 0);\n }, 0);\n\n const finalTotal = grossTotal - discountTotal + taxTotal;\n\n return {\n ...order,\n grossTotal,\n discountTotal,\n taxTotal,\n finalTotal,\n };\n }\n\n /**\n * Validate order entity\n */\n static validate(order: OrderEntity): ValidationResult {\n const errors: { [key: string]: string[] } = {};\n const warnings: { [key: string]: string[] } = {};\n\n // Validate required fields\n if (!order.customerId) {\n errors['customerId'] = ['Le client est requis'];\n }\n\n if (!order.orderDate) {\n errors['orderDate'] = ['La date est requise'];\n }\n\n if (!order.orderLines || order.orderLines.length === 0) {\n errors['orderLines'] = ['Au moins un article est requis'];\n }\n\n // Validate line items\n order.orderLines.forEach((item, index) => {\n const itemValidation = OrderLineItemHelper.validate(item);\n if (!itemValidation.isValid) {\n Object.keys(itemValidation.errors).forEach((key) => {\n errors[`orderLines[${index}].${key}`] = itemValidation.errors[key];\n });\n }\n });\n\n // Check for warnings\n if (order.finalTotal <= 0) {\n warnings['finalTotal'] = ['Le montant total est invalide'];\n }\n\n return {\n isValid: Object.keys(errors).length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Clone order entity for immutability\n */\n static clone(order: OrderEntity): OrderEntity {\n return {\n ...order,\n orderDate: new Date(order.orderDate),\n deliveryDate: order.deliveryDate ? new Date(order.deliveryDate) : null,\n dueDate: order.dueDate ? new Date(order.dueDate) : null,\n orderLines: order.orderLines.map((item) => ({ ...item })),\n };\n }\n\n /**\n * Compare two orders for changes\n */\n static detectChanges(\n original: OrderEntity,\n current: OrderEntity,\n ): OrderChangeInfo {\n const modifiedFields = new Set<string>();\n\n // Compare basic fields\n const fieldsToCompare: (keyof OrderEntity)[] = [\n 'customerId',\n 'orderDate',\n 'deliveryDate',\n 'dueDate',\n 'notes',\n 'internalNotes',\n 'status',\n ];\n\n fieldsToCompare.forEach((field) => {\n if (original[field] !== current[field]) {\n modifiedFields.add(field as string);\n }\n });\n\n // Compare order items\n if (original.orderLines.length !== current.orderLines.length) {\n modifiedFields.add('orderLines');\n } else {\n for (let i = 0; i < original.orderLines.length; i++) {\n if (\n !OrderLineItemHelper.areEqual(\n original.orderLines[i],\n current.orderLines[i],\n )\n ) {\n modifiedFields.add('orderLines');\n break;\n }\n }\n }\n\n return {\n hasChanges: modifiedFields.size > 0,\n lastModified: new Date(),\n modifiedFields,\n };\n }\n}\n","import { booleanAttribute, Component, Input } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Comptoir form label — renders a `<label>` with the design-system\n * typography (uppercase Manrope 11px / 700 / `--text-mute`,\n * 0.06em letter-spacing) defined under `.ef-label` in\n * `@elasticias/ui/styles/patterns`.\n *\n * - `[labelKey]` — translation key (preferred). Falls back to\n * `[label]` when missing. The `feedback_i18n_keys` memory says\n * always use `*Key` on shared `ef-*` components.\n * - `[for]` — DOM id of the input the label labels. Mapped through\n * `[attr.for]` so an empty value renders no attribute (the input\n * doesn't end up with a broken `for=\"\"`).\n * - `[required]` — toggles a red asterisk via\n * `.ef-label.is-required::after`.\n * - `[styleClass]` — caller-supplied extra class. Defaults to\n * `'form-label'` for v1 back-compat. The `.ef-label` Comptoir\n * class is always applied on top.\n */\n@Component({\n selector: 'ef-label',\n standalone: true,\n template: `\n <label\n [attr.for]=\"for || null\"\n [class]=\"resolvedClass\"\n >{{ labelKey ? (labelKey | translate) : label }}</label>\n `,\n styles: [`:host { display: contents; }`],\n imports: [TranslateModule],\n})\nexport class EfLabelComponent {\n /** Direct label text — use `labelKey` for i18n. */\n @Input() label?: string;\n /** Translation key — preferred. */\n @Input() labelKey?: string;\n /** DOM id of the labelled input. Empty / unset → no `for` attr. */\n @Input() for?: string;\n /** Caller-supplied extra class. The Comptoir `.ef-label` class is\n * always applied; this stacks on top. Defaults to `'form-label'`\n * for v1 back-compat. */\n @Input() styleClass = 'form-label';\n /** Show the required-asterisk modifier. */\n @Input({ transform: booleanAttribute }) required = false;\n\n /** Composes `'ef-label'` + `styleClass` + the `'is-required'`\n * modifier into a single class string. Angular's `[class]`\n * binding replaces (doesn't merge) so we do the joining here. */\n get resolvedClass(): string {\n const parts = ['ef-label'];\n if (this.styleClass) parts.push(this.styleClass);\n if (this.required) parts.push('is-required');\n return parts.join(' ');\n }\n}\n","import { Directive, input } from '@angular/core';\n\n/**\n * Scopes a map of server/validation errors to its descendant `ef-*` form\n * controls, which auto-link by their `name` — no per-field `[errors]`\n * binding needed.\n *\n * Drop it on any container that wraps the form fields and bind the screen's\n * `serverErrors()` signal once:\n *\n * ```html\n * <div class=\"detail-grid\" [efServerErrors]=\"serverErrors()\">\n * <ef-input-text name=\"companyName\" ... /> <!-- picks up errors['companyName'] -->\n * <ef-select name=\"clientType\" ... /> <!-- picks up errors['clientType'] -->\n * </div>\n * ```\n *\n * Each control resolves its messages via `AbstractEfFormControl`\n * (`resolvedExternalErrors`): an explicit `[errors]` input still wins when\n * present, otherwise the control falls back to this scope keyed by `name`.\n * Keys must match the control `name` (camelCase) — `AbstractScreenComponent.setServerErrors`\n * already normalizes the backend's PascalCase keys, so the map is camelCase.\n *\n * The input is a signal, so updates propagate to controls under zoneless\n * change detection (controls read it through a `computed`).\n */\n@Directive({\n selector: '[efServerErrors]',\n standalone: true,\n})\nexport class EfServerErrorsDirective {\n /** Field-name → messages map (camelCase keys, matching control `name`). */\n readonly errors = input<{ [key: string]: string[] } | null>(null, {\n alias: 'efServerErrors',\n });\n\n /** Messages for a control by its `name`, or `null` when none. */\n errorsFor(name: string | undefined | null): string[] | null {\n const map = this.errors();\n if (!name || !map) return null;\n return map[name] ?? null;\n }\n}\n\n/**\n * Resolves a form control's external (server) errors: the explicit `[errors]`\n * input wins, otherwise fall back to the enclosing `[efServerErrors]` scope\n * keyed by `name`. Shared by `AbstractEfFormControl` and the standalone\n * controls that don't extend it (ef-password, ef-datepicker, …), so the\n * precedence stays identical everywhere.\n *\n * Call from a `computed(() => resolveExternalErrors(this.errors(), this.serverErrorsScope, this.name))`\n * so the read tracks both signal sources under zoneless change detection.\n */\nexport function resolveExternalErrors(\n explicit: string[] | null | undefined,\n scope: EfServerErrorsDirective | null,\n name: string | undefined | null,\n): string[] | null {\n if (explicit && explicit.length) return explicit;\n return scope?.errorsFor(name) ?? null;\n}\n","import { booleanAttribute, Component, computed, inject, input, signal } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { EfServerErrorsDirective, resolveExternalErrors } from './ef-server-errors.directive';\n\n/**\n * Shared base for every Comptoir form control (`ef-input-text`,\n * `ef-textarea`, `ef-select`, `ef-input-number`, `ef-checkbox`, …).\n *\n * Hoists the cross-cutting concerns that every form control wants\n * to handle the same way:\n *\n * - **Identity** — `inputId` / `name` plus an auto-generated id\n * (`ef-ctrl-<n>`) so the `<label for>` ↔ `<input id>` binding\n * always works for screen readers + click-to-focus, even when\n * the consumer didn't pass anything.\n * - **Label / placeholder i18n** — `labelKey` / `label` and\n * `placeholderKey` / `placeholder` with the same precedence\n * convention (`*Key` wins, falls back to literal). All ef-*\n * form controls follow the\n * [feedback_i18n_keys](memory) convention by surfacing both\n * inputs.\n * - **ARIA** — `ariaLabelKey` / `ariaLabel` for screen-reader-only\n * labels; `effectiveAriaLabel` returns `null` when a visible\n * label is rendered (which already serves as the ARIA name).\n * `errorsId` provides a stable id for the error/hint container\n * so subclasses can wire `aria-describedby`.\n * - **State** — `required` / `readonly` / `disabled` shared inputs,\n * used directly in subclass templates and toggled by CVA's\n * `setDisabledState` in subclasses.\n *\n * Subclasses still own their own `value` field, ControlValueAccessor\n * implementation, and any control-specific inputs (e.g. textarea's\n * `rows`, select's `options`).\n *\n * ```ts\n * export class EfInputTextComponent extends AbstractEfFormControl\n * implements ControlValueAccessor {\n * @Input() type = 'text';\n * @Input() value = '';\n * // ... CVA + value-specific logic\n * }\n * ```\n */\n@Component({ template: '', standalone: true })\nexport abstract class AbstractEfFormControl {\n /* ── Identity ─────────────────────────────────────────────── *\n * Signal inputs (`input()`) throughout, so signal-native subclasses\n * (e.g. ef-datepicker-advanced) can extend this base and read everything\n * reactively. Subclasses + templates read these as calls: `name()`,\n * `isDisabled()`, etc. */\n\n /** Explicit DOM `id` for the inner control. Falls back to\n * `name`, then to the auto-generated `_autoId`. */\n readonly inputId = input<string>('');\n\n /** Form `name` attribute — also used as the id fallback. */\n readonly name = input<string>('');\n\n /** Per-instance auto id used when neither `inputId` nor `name`\n * is supplied. The static counter is shared across all\n * AbstractEfFormControl subclasses, which is fine — uniqueness\n * per-page is the only requirement. */\n private static _nextId = 0;\n protected readonly _autoId = `ef-ctrl-${++AbstractEfFormControl._nextId}`;\n\n /* ── Visible label (i18n) ─────────────────────────────────── */\n\n /** Direct label text. Use `labelKey` for i18n. */\n readonly label = input<string>('');\n\n /** Translation key for the label — preferred (memory:\n * feedback_i18n_keys says always use `*Key`). */\n readonly labelKey = input<string>('');\n\n /* ── Placeholder (i18n) ───────────────────────────────────── */\n\n readonly placeholder = input<string>('');\n readonly placeholderKey = input<string>('');\n\n /* ── Screen-reader-only label (when no visible label) ─────── */\n\n readonly ariaLabel = input<string>('');\n readonly ariaLabelKey = input<string>('');\n\n /* ── State ────────────────────────────────────────────────── */\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n\n /** The `[disabled]` input. The **effective** disabled (input OR\n * form-driven via CVA) is {@link isDisabled} — bind that in templates. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Form-driven disabled set by CVA `setDisabledState`, merged with the\n * `[disabled]` input. Writable signal (the input itself is read-only). */\n private readonly _cvaDisabled = signal(false);\n\n /** Effective disabled state — the `[disabled]` input OR a reactive-form\n * `disable()`. Templates/logic should use this, not `disabled()`. */\n readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\n\n /** CVA hook for subclasses: `setDisabledState(d) { this.updateDisabledState(d); }`. */\n protected updateDisabledState(disabled: boolean): void {\n this._cvaDisabled.set(disabled);\n }\n\n /* ── Clearable ────────────────────────────────────────────── */\n\n /**\n * Show the inline clear ✕ (the shared `ef-clear-button`). On by default —\n * every control is clearable; the ✕ only appears when there's a value and\n * the field is editable (see {@link canClear}). Set `[showClear]=\"false\"`\n * to opt a field out.\n */\n readonly showClear = input(true, { transform: booleanAttribute });\n\n /** Whether the clear ✕ should currently render: opted in, the control\n * holds a value ({@link hasValue}), and the field is editable. */\n get canClear(): boolean {\n return this.showClear() && this.hasValue && !this.isDisabled() && !this.readonly();\n }\n\n /** Subclasses report whether they currently hold a clearable value.\n * Default `false` (controls that don't override never show a clear). */\n protected get hasValue(): boolean {\n return false;\n }\n\n /** Reset the control's value (and notify forms / `valueChangeEvent`).\n * Overridden by subclasses that support clearing. */\n clearValue(): void {\n /* no-op — overridden by clearable subclasses */\n }\n\n /**\n * Forms-independent server/validation errors for this field.\n *\n * The signal-based V2 detail screens bind values with `[value]` +\n * `(valueChangeEvent)` and never register an `NgControl`, so the\n * `ngControl`-based `serverError` path can't surface backend\n * validation messages. Two ways to feed them in:\n *\n * - Explicit, per-field: `[errors]=\"serverErrors()['clientType']\"`.\n * - Automatic, by `name`: wrap the fields in `[efServerErrors]=\"serverErrors()\"`\n * and the control links itself via {@link EfServerErrorsDirective}\n * (no per-field binding). See {@link resolvedExternalErrors}.\n *\n * Either way the control renders the messages and the invalid state.\n * Falls back to the `NgControl` `serverError` path when neither is\n * present, so `ngModel`-based (v1) screens keep working unchanged.\n */\n readonly errors = input<string[] | null | undefined>(undefined);\n\n /** Optional enclosing `[efServerErrors]` scope (auto-link by `name`). */\n private readonly serverErrorsScope = inject(EfServerErrorsDirective, { optional: true });\n\n /**\n * External (server) errors for this control, resolved reactively from\n * either the explicit `[errors]` input (wins) or the enclosing\n * `[efServerErrors]` scope keyed by `name`. A `computed` so reads inside\n * the subclass `serverErrors` / `isInvalid` getters track the source\n * signals under zoneless change detection.\n */\n readonly resolvedExternalErrors = computed<string[] | null>(() =>\n resolveExternalErrors(this.errors(), this.serverErrorsScope, this.name()),\n );\n\n /* ── Internals ────────────────────────────────────────────── */\n\n protected readonly translateService = inject(TranslateService);\n\n /** Resolved DOM id. Always non-empty so `<label for>` and\n * `<input id>` can match unambiguously. */\n get effectiveId(): string {\n return this.inputId() || this.name() || this._autoId;\n }\n\n /** Translated placeholder (or empty string). */\n get effectivePlaceholder(): string {\n if (this.placeholderKey()) {\n return this.translateService.instant(this.placeholderKey());\n }\n return this.placeholder() || '';\n }\n\n /**\n * Resolved `aria-label` value — used when no visible label is\n * rendered. Returns `null` (no attribute) when a visible label\n * IS shown, since the visible label already serves as the\n * accessible name and duplicate `aria-label` would override it.\n */\n get effectiveAriaLabel(): string | null {\n if (this.labelKey() || this.label()) return null;\n if (this.ariaLabelKey()) {\n return this.translateService.instant(this.ariaLabelKey());\n }\n return this.ariaLabel() || null;\n }\n\n /** Stable id for the error / hint container — wired through\n * `aria-describedby` on the input so screen readers announce\n * the validation message together with the field name. */\n get errorsId(): string {\n return `${this.effectiveId}-errors`;\n }\n}\n","import {\n booleanAttribute,\n Component,\n ContentChild,\n forwardRef,\n HostBinding,\n inject,\n Injector,\n Input,\n OnInit,\n Output,\n EventEmitter,\n OnChanges,\n SimpleChanges,\n TemplateRef,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { SelectModule } from 'primeng/select';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n/**\n * Comptoir select — wraps PrimeNG `p-select` (single) or `p-multiselect`\n * (multi) and skins it against the `.es` / `.es__panel` patterns lifted\n * from the static prototype (`docs/ux-ui/erp/screens/components.html`,\n * Section 04). All the heavy machinery (filter, virtual scroll, group\n * support, keyboard nav, ARIA listbox semantics, RTL, focus trapping,\n * lazy loading) comes from PrimeNG; we own only the visuals + the\n * Elasticias API surface (i18n `*Key` inputs, `selectionChangeEvent`,\n * `filterByKeys`, content-projected templates).\n *\n * The `'comptoir'` variant remains as a lite, no-deps escape hatch\n * (native `<select>` styled via `.ef-select-native`); use the default\n * `'primeng'` variant for any screen that needs filter / multi /\n * group / templating.\n *\n * ```html\n * <ef-select\n * labelKey=\"orders.status\"\n * placeholderKey=\"orders.status_placeholder\"\n * [(value)]=\"status\"\n * [options]=\"statuses\"\n * optionLabel=\"label\" optionValue=\"code\"\n * [filter]=\"true\" [showClear]=\"true\">\n * </ef-select>\n *\n * <ef-select\n * labelKey=\"users.assigned\"\n * [options]=\"users\" optionLabel=\"name\" optionValue=\"id\"\n * [multiple]=\"true\" [filter]=\"true\">\n * <ng-template #item let-u>\n * <span class=\"av\">{{ u.initials }}</span>\n * <span class=\"body\">\n * <span class=\"nm\">{{ u.name }}</span>\n * <span class=\"meta\">{{ u.role }}</span>\n * </span>\n * </ng-template>\n * </ef-select>\n * ```\n */\n@Component({\n selector: 'ef-select',\n standalone: true,\n templateUrl: './ef-select.component.html',\n styleUrls: ['./ef-select.component.scss'],\n imports: [\n SelectModule,\n MultiSelectModule,\n FormsModule,\n TranslateModule,\n EfLabelComponent,\n CommonModule,\n ],\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => EfSelectComponent),\n multi: true,\n }],\n})\nexport class EfSelectComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor, OnInit, OnChanges\n{\n /* Identity / label / placeholder / aria / required / readonly /\n disabled all inherited from AbstractEfFormControl. */\n\n /* ── Data ────────────────────────────────────────────────────── */\n\n @Input() options: any[] = [];\n @Input() optionLabel = 'name';\n @Input() optionValue?: string;\n @Input() optionDisabled?: string;\n /** Stable identity key — required for groups and virtual scroll. */\n @Input() dataKey?: string;\n\n /** Group mode — pair with `optionGroupLabel` + `optionGroupChildren`. */\n @Input({ transform: booleanAttribute }) group = false;\n @Input() optionGroupLabel = 'label';\n @Input() optionGroupChildren = 'items';\n\n /* ── Layout / size ───────────────────────────────────────────── */\n\n /** Control height. Default (undefined) = the canonical `--hit-base` (40px),\n * matching native inputs (ADR-009). `'small'` opts into the dense 32px\n * variant for compact contexts (e.g. table-row editors). */\n @Input() size?: 'small' | 'large';\n @Input({ transform: booleanAttribute }) fluid = true;\n @Input({ transform: booleanAttribute }) inline = false;\n @Input() appendTo?: string;\n\n /* ── Behavior ────────────────────────────────────────────────── */\n\n /** Multi-selection — internally swaps `<p-select>` for `<p-multiselect>`. */\n @Input({ transform: booleanAttribute }) multiple = false;\n\n @Input({ transform: booleanAttribute }) filter = false;\n /** Filter the list against these option fields (string or csv).\n * PrimeNG default: `optionLabel`. */\n @Input() filterBy?: string;\n @Input() filterPlaceholder?: string;\n @Input() filterPlaceholderKey?: string;\n /** Auto-focus the filter input when the panel opens (default: true). */\n @Input({ transform: booleanAttribute }) autofocusFilter = true;\n\n /* showClear is inherited from AbstractEfFormControl (default true →\n clearable by default; PrimeNG only renders the ✕ when a value is set). */\n @Input({ transform: booleanAttribute }) editable = false;\n @Input({ transform: booleanAttribute }) loading = false;\n\n /** Virtual-scroll for long lists (>100 items). Pair with\n * `virtualScrollItemSize` (default 38px). */\n @Input({ transform: booleanAttribute }) virtualScroll = false;\n @Input() virtualScrollItemSize = 38;\n @Input() scrollHeight = '240px';\n\n /** Multi-select trigger display: `'chip'` (default — chips visible\n * in the trigger, individually removable) or `'comma'`. */\n @Input() multiDisplay: 'chip' | 'comma' = 'chip';\n\n /** Multi-select header \"select all\" toggle. Off by default — the\n * Comptoir multiselect leads with the filter; opt in when bulk\n * select-all is genuinely useful. */\n @Input({ transform: booleanAttribute }) showToggleAll = false;\n\n /* ── Empty state messages (i18n) ─────────────────────────────── */\n\n @Input() emptyMessage?: string;\n @Input() emptyMessageKey?: string;\n @Input() emptyFilterMessage?: string;\n @Input() emptyFilterMessageKey?: string;\n\n /* ── Style hooks (merged with our base `.es` / `.es__panel`) ── */\n\n @Input() styleClass?: string;\n @Input() panelStyleClass?: string;\n\n /** Filter options by matching key-value pairs (legacy Elasticias\n * helper — pre-filters `options` before they reach PrimeNG). */\n @Input() filterByKeys?: { [key: string]: any };\n\n /**\n * Rendering variant.\n * - `'primeng'` (default) — wraps `p-select` / `p-multiselect`, skinned with\n * the `.es` / `.es__panel` patterns (the custom\n * dropdown: filter, styled options, animated panel\n * — see `components.html` Section 04). Also pinned\n * to the canonical `--hit-base` (40px) trigger\n * height (`.es.p-select { min-height: --hit-base }`),\n * so it aligns with inputs/buttons in a row.\n * - `'comptoir'` — lite native `<select class=\"ef-select-native\">`.\n * No filter / panel / multi / templates; use it for\n * inline / dense contexts that want the plain native\n * control (e.g. table-row editors).\n * The `.es` dropdown is the default per the design system; opt into\n * `comptoir` only when a native control is specifically wanted. See ADR-009.\n */\n @Input() variant: 'primeng' | 'comptoir' = 'primeng';\n\n @HostBinding('class.ef-inline') get isInline() { return this.inline; }\n @HostBinding('class.ef-select-host') readonly hostClass = true;\n\n /* ── Content templates (projected into PrimeNG via local refs) ── */\n\n @ContentChild('item') itemTemplate: TemplateRef<any> | null = null;\n @ContentChild('selectedItem') selectedItemTemplate: TemplateRef<any> | null = null;\n @ContentChild('group') groupTemplate: TemplateRef<any> | null = null;\n @ContentChild('header') headerTemplate: TemplateRef<any> | null = null;\n @ContentChild('footer') footerTemplate: TemplateRef<any> | null = null;\n @ContentChild('empty') emptyTemplate: TemplateRef<any> | null = null;\n @ContentChild('emptyFilter') emptyFilterTemplate: TemplateRef<any> | null = null;\n @ContentChild('filter') filterTemplate: TemplateRef<any> | null = null;\n @ContentChild('loader') loaderTemplate: TemplateRef<any> | null = null;\n\n /* ── Outputs ─────────────────────────────────────────────────── */\n\n @Output() selectionChangeEvent = new EventEmitter<any>();\n @Output() filterChangeEvent = new EventEmitter<string>();\n @Output() panelShowEvent = new EventEmitter<void>();\n @Output() panelHideEvent = new EventEmitter<void>();\n\n /** Two-way-bindable as `[value]` (one-way) or\n * `[(value)]` (set + listen via `selectionChangeEvent`). */\n @Input() value: any = null;\n filteredOptions: any[] = [];\n\n private onChange: (value: any) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n /** Resolved lazily in ngOnInit to avoid circular DI with NG_VALUE_ACCESSOR */\n ngControl: NgControl | null = null;\n private readonly injector = inject(Injector);\n\n ngOnInit(): void {\n this.ngControl = this.injector.get(NgControl, null);\n this.applyFilters();\n }\n\n /* effectiveId / effectivePlaceholder / effectiveAriaLabel /\n errorsId all inherited from AbstractEfFormControl. */\n\n /** Translated filter placeholder. Falls back to a generic key, then\n * to \"Search…\" so it always renders something readable. */\n get effectiveFilterPlaceholder(): string {\n if (this.filterPlaceholderKey) {\n return this.translateService.instant(this.filterPlaceholderKey);\n }\n return this.filterPlaceholder ?? this.translateService.instant('ef_select_filter_placeholder');\n }\n\n get effectiveEmptyMessage(): string {\n if (this.emptyMessageKey) return this.translateService.instant(this.emptyMessageKey);\n return this.emptyMessage ?? this.translateService.instant('ef_select_empty');\n }\n\n get effectiveEmptyFilterMessage(): string {\n if (this.emptyFilterMessageKey) return this.translateService.instant(this.emptyFilterMessageKey);\n return this.emptyFilterMessage ?? this.translateService.instant('ef_select_empty_filter');\n }\n\n /** Always include `.es` so the global Comptoir skin in\n * `_patterns.scss` always finds a hook, regardless of what the\n * consumer passes via `styleClass`. */\n get effectiveStyleClass(): string {\n return ['es', this.size === 'small' ? 'es--sm' : null, this.styleClass]\n .filter(Boolean).join(' ');\n }\n\n get effectivePanelStyleClass(): string {\n return ['es__panel', this.panelStyleClass].filter(Boolean).join(' ');\n }\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? this.ngControl?.control?.errors?.['serverError'] ?? null;\n }\n\n get isInvalid(): boolean {\n if (this.resolvedExternalErrors()?.length) return true;\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.invalid && (ctrl?.touched || ctrl?.dirty));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['options'] || changes['filterByKeys']) {\n this.applyFilters();\n }\n }\n\n writeValue(value: any): void {\n this.value = value ?? null;\n }\n\n registerOnChange(fn: (value: any) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n handleSelectionChange(event: { originalEvent?: Event; value: any }): void {\n const val = event?.value ?? null;\n this.value = val;\n this.onChange(val);\n this.onTouched();\n this.selectionChangeEvent.emit(val);\n }\n\n handleClear(): void {\n this.value = this.multiple ? [] : null;\n this.onChange(this.value);\n this.onTouched();\n this.selectionChangeEvent.emit(this.value);\n }\n\n handleFilter(event: { originalEvent?: Event; filter: string }): void {\n this.filterChangeEvent.emit(event?.filter ?? '');\n }\n\n handlePanelShow(): void {\n this.panelShowEvent.emit();\n }\n\n handlePanelHide(): void {\n this.panelHideEvent.emit();\n this.onTouched();\n }\n\n /** Comptoir variant — native `<select>` change handler. The empty\n * string from the placeholder option becomes `null`; otherwise we\n * resolve the value through `optionValue` if provided. */\n handleNativeSelectChange(rawValue: string): void {\n if (rawValue === '' || rawValue == null) {\n this.handleClear();\n return;\n }\n let resolved: any = rawValue;\n if (this.optionValue) {\n // Map the string back to its option's value (which may be a\n // number, object key, etc. — preserves the original type).\n const match = this.filteredOptions.find(\n (opt) => String(opt[this.optionValue!]) === rawValue,\n );\n if (match) resolved = match[this.optionValue];\n }\n this.value = resolved;\n this.onChange(resolved);\n this.onTouched();\n this.selectionChangeEvent.emit(resolved);\n }\n\n private applyFilters(): void {\n if (this.options && this.filterByKeys && typeof this.filterByKeys === 'object') {\n this.filteredOptions = this.options.filter(option =>\n Object.keys(this.filterByKeys!).every(key => option[key] === this.filterByKeys![key])\n );\n } else {\n this.filteredOptions = this.options ?? [];\n }\n }\n}\n","@if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" [for]=\"effectiveId\" [required]=\"required()\" />\n}\n<div class=\"ef-field-control\">\n @if (variant === 'comptoir') {\n <!-- Comptoir variant — native <select> against the\n .ef-select-native pattern. No filter / virtualization /\n multi / templates; use the PrimeNG variant for those. -->\n <select\n class=\"ef-select-native\"\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [disabled]=\"isDisabled()\"\n [class.is-invalid]=\"isInvalid\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n (change)=\"handleNativeSelectChange($any($event.target).value)\"\n >\n @if (effectivePlaceholder) {\n <option value=\"\" [selected]=\"value === null || value === undefined\">— {{ effectivePlaceholder }} —</option>\n }\n @for (opt of filteredOptions; track $index) {\n <option\n [value]=\"optionValue ? opt[optionValue] : opt\"\n [selected]=\"(optionValue ? opt[optionValue] : opt) === value\"\n >\n {{ opt[optionLabel] }}\n </option>\n }\n </select>\n } @else if (multiple) {\n <!-- ───── PrimeNG multi-select branch ───── -->\n <p-multiselect\n [inputId]=\"effectiveId\"\n [name]=\"name()\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n (onChange)=\"handleSelectionChange($event)\"\n (onClear)=\"handleClear()\"\n (onFilter)=\"handleFilter($event)\"\n (onPanelShow)=\"handlePanelShow()\"\n (onPanelHide)=\"handlePanelHide()\"\n [options]=\"filteredOptions\"\n [optionLabel]=\"optionLabel\"\n [optionValue]=\"optionValue\"\n [optionDisabled]=\"optionDisabled\"\n [dataKey]=\"dataKey\"\n [group]=\"group\"\n [optionGroupLabel]=\"optionGroupLabel\"\n [optionGroupChildren]=\"optionGroupChildren\"\n [placeholder]=\"effectivePlaceholder\"\n [filter]=\"filter\"\n [filterPlaceHolder]=\"effectiveFilterPlaceholder\"\n [autofocusFilter]=\"autofocusFilter\"\n [filterBy]=\"filterBy ?? optionLabel\"\n [showClear]=\"showClear()\"\n [disabled]=\"isDisabled()\"\n [appendTo]=\"appendTo\"\n [styleClass]=\"effectiveStyleClass\"\n [panelStyleClass]=\"effectivePanelStyleClass\"\n [scrollHeight]=\"scrollHeight\"\n [virtualScroll]=\"virtualScroll\"\n [virtualScrollItemSize]=\"virtualScrollItemSize\"\n [loading]=\"loading\"\n [emptyMessage]=\"effectiveEmptyMessage\"\n [emptyFilterMessage]=\"effectiveEmptyFilterMessage\"\n [display]=\"multiDisplay\"\n [showToggleAll]=\"showToggleAll\"\n [class.ng-invalid]=\"isInvalid\"\n [class.ng-touched]=\"ngControl?.touched\"\n fluid\n >\n @if (itemTemplate) {\n <ng-template #item let-item>\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\" />\n </ng-template>\n }\n @if (selectedItemTemplate) {\n <ng-template #selectedItems let-items>\n <ng-container *ngTemplateOutlet=\"selectedItemTemplate; context: { $implicit: items }\" />\n </ng-template>\n }\n @if (groupTemplate) {\n <ng-template #group let-group>\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { $implicit: group }\" />\n </ng-template>\n }\n @if (headerTemplate) {\n <ng-template #header>\n <ng-container *ngTemplateOutlet=\"headerTemplate\" />\n </ng-template>\n }\n @if (footerTemplate) {\n <ng-template #footer>\n <ng-container *ngTemplateOutlet=\"footerTemplate\" />\n </ng-template>\n }\n @if (emptyTemplate) {\n <ng-template #empty>\n <ng-container *ngTemplateOutlet=\"emptyTemplate\" />\n </ng-template>\n }\n @if (emptyFilterTemplate) {\n <ng-template #emptyfilter>\n <ng-container *ngTemplateOutlet=\"emptyFilterTemplate\" />\n </ng-template>\n }\n @if (filterTemplate) {\n <ng-template #filter let-options=\"options\">\n <ng-container *ngTemplateOutlet=\"filterTemplate; context: { $implicit: options }\" />\n </ng-template>\n }\n @if (loaderTemplate) {\n <ng-template #loader>\n <ng-container *ngTemplateOutlet=\"loaderTemplate\" />\n </ng-template>\n }\n <ng-template #clearicon>\n <span class=\"es-clear\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </span>\n </ng-template>\n <ng-template #dropdownicon>\n <svg class=\"ef-chevron\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </ng-template>\n </p-multiselect>\n } @else {\n <!-- ───── PrimeNG single-select branch ───── -->\n <p-select\n [inputId]=\"effectiveId\"\n [name]=\"name()\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n (onChange)=\"handleSelectionChange($event)\"\n (onClear)=\"handleClear()\"\n (onFilter)=\"handleFilter($event)\"\n (onShow)=\"handlePanelShow()\"\n (onHide)=\"handlePanelHide()\"\n [options]=\"filteredOptions\"\n [optionLabel]=\"optionLabel\"\n [optionValue]=\"optionValue\"\n [optionDisabled]=\"optionDisabled\"\n [dataKey]=\"dataKey\"\n [group]=\"group\"\n [optionGroupLabel]=\"optionGroupLabel\"\n [optionGroupChildren]=\"optionGroupChildren\"\n [placeholder]=\"effectivePlaceholder\"\n [size]=\"size\"\n [filter]=\"filter\"\n [filterPlaceholder]=\"effectiveFilterPlaceholder\"\n [filterBy]=\"filterBy ?? optionLabel\"\n [autofocusFilter]=\"autofocusFilter\"\n [showClear]=\"showClear()\"\n [editable]=\"editable\"\n [disabled]=\"isDisabled()\"\n [appendTo]=\"appendTo\"\n [styleClass]=\"effectiveStyleClass\"\n [panelStyleClass]=\"effectivePanelStyleClass\"\n [scrollHeight]=\"scrollHeight\"\n [virtualScroll]=\"virtualScroll\"\n [virtualScrollItemSize]=\"virtualScrollItemSize\"\n [loading]=\"loading\"\n [emptyMessage]=\"effectiveEmptyMessage\"\n [emptyFilterMessage]=\"effectiveEmptyFilterMessage\"\n [class.ng-invalid]=\"isInvalid\"\n [class.ng-touched]=\"ngControl?.touched\"\n fluid\n >\n @if (itemTemplate) {\n <ng-template #item let-item>\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\" />\n </ng-template>\n }\n @if (selectedItemTemplate) {\n <ng-template #selectedItem let-item>\n <ng-container *ngTemplateOutlet=\"selectedItemTemplate; context: { $implicit: item }\" />\n </ng-template>\n }\n @if (groupTemplate) {\n <ng-template #group let-group>\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { $implicit: group }\" />\n </ng-template>\n }\n @if (headerTemplate) {\n <ng-template #header>\n <ng-container *ngTemplateOutlet=\"headerTemplate\" />\n </ng-template>\n }\n @if (footerTemplate) {\n <ng-template #footer>\n <ng-container *ngTemplateOutlet=\"footerTemplate\" />\n </ng-template>\n }\n @if (emptyTemplate) {\n <ng-template #empty>\n <ng-container *ngTemplateOutlet=\"emptyTemplate\" />\n </ng-template>\n }\n @if (emptyFilterTemplate) {\n <ng-template #emptyfilter>\n <ng-container *ngTemplateOutlet=\"emptyFilterTemplate\" />\n </ng-template>\n }\n @if (filterTemplate) {\n <ng-template #filter let-options=\"options\">\n <ng-container *ngTemplateOutlet=\"filterTemplate; context: { $implicit: options }\" />\n </ng-template>\n }\n @if (loaderTemplate) {\n <ng-template #loader>\n <ng-container *ngTemplateOutlet=\"loaderTemplate\" />\n </ng-template>\n }\n <ng-template #clearicon>\n <span class=\"es-clear\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </span>\n </ng-template>\n <ng-template #dropdownicon>\n <svg class=\"ef-chevron\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </ng-template>\n </p-select>\n }\n @if (showRequired || serverErrors) {\n <div [id]=\"errorsId\" role=\"alert\" aria-live=\"polite\">\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n} from '@angular/core';\n\n/**\n * The shared inline \"clear\" affordance — a circular button with the canonical\n * stroke-✕ glyph. One component so every clearable control (ef-input-text,\n * ef-inputnumber, ef-select via its `#clearicon` template, ef-product-typeahead,\n * …) shows the exact same clear icon, hover circle, and hit area.\n *\n * Styling lives in `_patterns.scss` under `.ef-clear` (global, so the same\n * glyph is reachable from PrimeNG templates that can't import this component).\n *\n * `mousedown` is prevented so clicking the clear doesn't blur/commit the field\n * before the `clear` handler runs.\n */\n@Component({\n selector: 'ef-clear-button',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <button\n type=\"button\"\n class=\"ef-clear\"\n [attr.aria-label]=\"ariaLabel\"\n [disabled]=\"disabled\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"clear.emit($event)\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n `,\n})\nexport class EfClearButtonComponent {\n @Input() ariaLabel = 'Clear';\n @Input() disabled = false;\n @Output() clear = new EventEmitter<Event>();\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n ElementRef,\n EmbeddedViewRef,\n HostListener,\n LOCALE_ID,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CommonModule, formatDate } from '@angular/common';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { EfClearButtonComponent } from '../ef-clear-button/ef-clear-button.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\nimport {\n EfDatePreset,\n EfDatePresetKey,\n EfDateRange,\n} from './ef-datepicker-advanced.types';\n\n/** Value shape emitted / accepted by the field-mode ControlValueAccessor.\n * Mirrors PrimeNG's `p-datepicker`: a lone `Date` for single selection,\n * a `[start, end]` tuple for a range — so `ef-datepicker-advanced` is a\n * drop-in replacement for the legacy `ef-datepicker` in forms. */\nexport type EfDateFieldValue = Date | [Date, Date] | null;\n\n/**\n * Comptoir period selector for smart-bars — a pill trigger (\"Date — 30\n * derniers jours v\") that opens a popover with a preset list and an\n * optional custom-range view (full month calendar with range band).\n *\n * Replaces the legacy `ef-preset-pill` for date filters and the\n * date-range mini-popover that screens used to roll inline.\n *\n * ```html\n * <ef-datepicker-advanced\n * [activePreset]=\"dateFilter().presetKey\"\n * [start]=\"dateFilter().start\"\n * [end]=\"dateFilter().end\"\n * triggerLabelKey=\"filter_date\"\n * (rangeChange)=\"onDateChange($event)\"\n * />\n * ```\n *\n * Built-in presets (computed from `today` at open time):\n * `today`, `this_week`, `this_month`, `last_30_days`, `last_90_days`,\n * `this_quarter`, `this_year`. Override with `[presets]=\"customList\"`\n * if you need a different set.\n */\n@Component({\n selector: 'ef-datepicker-advanced',\n standalone: true,\n imports: [CommonModule, TranslateModule, EfLabelComponent, EfClearButtonComponent],\n templateUrl: './ef-datepicker-advanced.component.html',\n styleUrl: './ef-datepicker-advanced.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class.dp-host--field]': \"mode() === 'field'\" },\n})\nexport class EfDatepickerAdvancedComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor, AfterViewInit {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly locale = inject(LOCALE_ID);\n private readonly vcr = inject(ViewContainerRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n\n /**\n * Self-injected form control (present only when the consumer binds\n * `[(ngModel)]` / `formControlName` in field mode). We register as its\n * `valueAccessor` manually — same pattern as `ef-datepicker` — so no\n * `NG_VALUE_ACCESSOR` provider is needed and there's no circular DI.\n * `null` in filter mode (the output-only smart-bar usage).\n */\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n /** Always-present wrapper — the anchor for portal positioning (the\n * trigger itself lives behind an `@if`, so we anchor to the host box). */\n @ViewChild('anchorEl', { static: true })\n private anchorEl!: ElementRef<HTMLElement>;\n\n /** Panel template — instantiated and attached to <body> on open. */\n @ViewChild('panelTpl', { static: true })\n private panelTpl!: TemplateRef<unknown>;\n\n /** Active embedded view + its root node, while the panel is open. */\n private panelView: EmbeddedViewRef<unknown> | null = null;\n private panelRoot: HTMLElement | null = null;\n private resizeHandler: (() => void) | null = null;\n\n constructor() {\n super();\n // Register as our own NgControl's value accessor (field mode only).\n if (this.ngControl) this.ngControl.valueAccessor = this;\n\n // React to `open` toggling: attach / detach the body-portaled panel.\n effect(() => {\n if (this.open()) this.attachPortal();\n else this.detachPortal();\n });\n\n // Last-line cleanup if the host is destroyed while the panel is open\n // (route change, *ngIf collapse, …) — orphan DOM is the worst.\n this.destroyRef.onDestroy(() => this.detachPortal());\n }\n\n ngAfterViewInit(): void {\n // Field-mode validation display (`showRequired` / `isInvalid` /\n // `serverErrors`) reads NgControl state through plain getters. We're\n // OnPush + signal-driven, so a parent flipping touched/validity —\n // notably `form.markAllAsTouched()` on submit, which emits no value or\n // status change — wouldn't re-render this component and the error /\n // red border would go stale. Mirror the control's events (Angular 18+\n // `AbstractControl.events`: value, status, touched, pristine) into\n // change detection. No-op in filter mode (no NgControl).\n this.ngControl?.control?.events\n ?.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.cdr.markForCheck());\n }\n\n /* ── Inputs ─────────────────────────────────────────────────── */\n\n /** Trigger left-side label (translation key). Default: `'filter_date'`. */\n readonly triggerLabelKey = input<string>('filter_date');\n /** Direct label fallback when `triggerLabelKey` is empty. */\n readonly triggerLabel = input<string>('');\n\n /**\n * Override the default preset list. The component ships sensible\n * defaults for `today`, `this_week`, `this_month`, `last_30_days`,\n * `last_90_days`, `this_quarter`, `this_year` — pass anything to\n * replace them outright (e.g. include a `last_year` preset).\n */\n readonly presets = input<ReadonlyArray<EfDatePreset> | undefined>(undefined);\n\n /** Currently active preset key (controlled). */\n readonly activePreset = input<EfDatePresetKey | undefined>(undefined);\n\n /** Currently selected start (controlled — pairs with `activePreset`). */\n readonly start = input<Date | null | undefined>(undefined);\n /** Currently selected end. */\n readonly end = input<Date | null | undefined>(undefined);\n\n /* `disabled` inherited from AbstractEfFormControl (effective = isDisabled). */\n\n /** Show a `'Personnalisé…'` row that opens the calendar view. */\n readonly allowCustomRange = input(true, { transform: booleanAttribute });\n\n /* ── Field mode (form control) ──────────────────────────────────\n `'filter'` (default) is the existing smart-bar period selector:\n preset list + custom range, output-only via `rangeChange`.\n `'field'` turns the component into a Comptoir-styled form control\n (ControlValueAccessor) that replaces the legacy `ef-datepicker`:\n no presets, opens straight to the calendar, and binds with\n `[(ngModel)]` / `formControlName`. */\n\n /** Component behaviour: smart-bar filter vs. form field. */\n readonly mode = input<'filter' | 'field'>('filter');\n\n /** Field mode only — pick a single date or a `[start, end]` range. */\n readonly selectionMode = input<'single' | 'range'>('range');\n\n /** Field mode trigger appearance: a labelled field box (default) or\n * the rounded pill used by filter mode. */\n readonly variant = input<'field' | 'pill'>('field');\n\n /**\n * Field mode only — also pick a time (24h `HH:mm`, free minutes).\n * Single: the calendar no longer commits on day-click; a time field +\n * Apply appear. Range: an `HH:mm` field sits under each of Du / Au.\n * The committed value is a `Date` with hours/minutes set (not\n * start-of-day) and the trigger renders `DD/MM/YYYY HH:mm`.\n */\n readonly showTime = input(false, { transform: booleanAttribute });\n\n /* label / labelKey / placeholder / placeholderKey / ariaLabel / ariaLabelKey\n / required / inputId / name / errors (+ resolvedExternalErrors) all\n inherited from AbstractEfFormControl. */\n\n /* ── Outputs ────────────────────────────────────────────────── */\n\n /** Emitted whenever a preset or applied custom range changes. */\n readonly rangeChange = output<EfDateRange>();\n /** Forwarded when the popover opens / closes (mirrors ef-row-actions). */\n readonly opened = output<void>();\n readonly closed = output<void>();\n\n /* ── State ──────────────────────────────────────────────────── */\n\n readonly open = signal(false);\n readonly view = signal<'presets' | 'custom'>('presets');\n\n /**\n * Custom view sub-mode: the day grid, the month picker, or the year\n * picker. Clicking the month / year labels in the calendar header\n * drills into the corresponding picker; selecting a cell returns to\n * the day grid.\n */\n readonly calMode = signal<'days' | 'months' | 'years'>('days');\n\n /** First year shown in the 12-cell year picker grid. */\n readonly yearWindowStart = signal<number>(this.startOfYearWindow(new Date().getFullYear()));\n\n /** Custom view: month being displayed (1st of the month, 00:00). */\n readonly visibleMonth = signal<Date>(this.startOfMonth(new Date()));\n\n /** Custom view: working start/end, before the user clicks Apply. */\n readonly draftStart = signal<Date | null>(null);\n readonly draftEnd = signal<Date | null>(null);\n\n /** Effective preset list — defaults if none provided. */\n readonly effectivePresets = computed<ReadonlyArray<EfDatePreset>>(\n () => this.presets() ?? this.defaultPresets,\n );\n\n /** Current value resolved against today's date. */\n readonly resolvedRange = computed<EfDateRange>(() => {\n const key = this.activePreset() ?? 'last_30_days';\n const explicitStart = this.start();\n const explicitEnd = this.end();\n if (explicitStart && explicitEnd) {\n return this.buildRange(key, explicitStart, explicitEnd);\n }\n return this.computePresetRange(key);\n });\n\n /** 7×6 grid for the visible month, prev/next-month overflow days included. */\n readonly calendarGrid = computed(() => this.buildMonthGrid(this.visibleMonth()));\n\n /** Day-of-week labels from CLDR (Mon-first). */\n readonly dowLabels = computed(() => this.buildDowLabels());\n\n /** Month + year title for the calendar header. */\n readonly monthLabel = computed(() => {\n const d = this.visibleMonth();\n return formatDate(d, 'LLLL', this.locale)\n .replace(/^./, c => c.toUpperCase());\n });\n readonly yearLabel = computed(() => formatDate(this.visibleMonth(), 'yyyy', this.locale));\n\n /** Range label for the year-picker header, e.g. `2024 – 2035`. */\n readonly yearWindowLabel = computed(() => {\n const start = this.yearWindowStart();\n return `${start} – ${start + 11}`;\n });\n\n /** 12 abbreviated months for the month picker (Jan…Déc), CLDR-localised. */\n readonly monthCells = computed(() => {\n const visible = this.visibleMonth();\n const today = new Date();\n return Array.from({ length: 12 }, (_, m) => ({\n month: m,\n label: formatDate(new Date(2000, m, 1), 'LLL', this.locale)\n .replace(/^./, c => c.toUpperCase()),\n active: m === visible.getMonth(),\n today: m === today.getMonth() && visible.getFullYear() === today.getFullYear(),\n }));\n });\n\n /** 12 consecutive years for the year picker, starting at `yearWindowStart`. */\n readonly yearCells = computed(() => {\n const start = this.yearWindowStart();\n const visibleYear = this.visibleMonth().getFullYear();\n const todayYear = new Date().getFullYear();\n return Array.from({ length: 12 }, (_, i) => {\n const year = start + i;\n return { year, active: year === visibleYear, today: year === todayYear };\n });\n });\n\n /** Live duration in days for the draft range. Mirrors `applyCustomRange`:\n * a lone start is treated as a single-day range (→ \"1 jour\"). */\n readonly draftDurationDays = computed(() => {\n const s = this.draftStart();\n if (!s) return 0;\n const e = this.draftEnd() ?? s;\n return Math.round((this.startOfDay(e).getTime() - this.startOfDay(s).getTime()) / 86_400_000) + 1;\n });\n\n /** Du / Au inputs as DD/MM/YYYY strings (kept in sync with drafts). */\n readonly fromText = computed(() => this.formatDayInput(this.draftStart()));\n readonly toText = computed(() => this.formatDayInput(this.draftEnd()));\n\n /* ── Field mode: committed value (ControlValueAccessor) ──────────\n The trigger in field mode renders THIS — the committed CVA value —\n not the drafts (mid-selection) nor `resolvedRange()` (filter-only). */\n\n /** Committed value pushed in via `writeValue` / day-pick / Apply. */\n private readonly fieldValue = signal<EfDateFieldValue>(null);\n\n /* isDisabled (the `[disabled]` input OR form-driven) and updateDisabledState\n are inherited from AbstractEfFormControl. */\n\n /** Committed start / end derived from `fieldValue`. */\n readonly fieldStart = computed<Date | null>(() => {\n const v = this.fieldValue();\n if (!v) return null;\n return Array.isArray(v) ? v[0] ?? null : v;\n });\n readonly fieldEnd = computed<Date | null>(() => {\n const v = this.fieldValue();\n return v && Array.isArray(v) ? v[1] ?? null : null;\n });\n\n /** Whether the field currently holds a value (vs. placeholder). */\n readonly hasFieldValue = computed(() => this.fieldStart() != null);\n\n /** Text rendered in the field-mode trigger (date, +time when enabled). */\n readonly fieldDisplay = computed<string>(() => {\n const s = this.fieldStart();\n if (!s) return '';\n const fmt = this.showTime() ? 'dd/MM/yyyy HH:mm' : 'dd/MM/yyyy';\n const from = formatDate(s, fmt, this.locale);\n if (this.selectionMode() === 'single') return from;\n const e = this.fieldEnd();\n return e ? `${from} — ${formatDate(e, fmt, this.locale)}` : from;\n });\n\n /* ── Time drafts (field mode + showTime) ────────────────────────\n Tracked separately from the day drafts so the calendar stays\n start-of-day internally; date + time are merged only at commit. */\n readonly draftStartTime = signal<{ h: number; m: number }>({ h: 0, m: 0 });\n readonly draftEndTime = signal<{ h: number; m: number }>({ h: 0, m: 0 });\n\n /** Du / Au time inputs as `HH:mm` strings (kept in sync with drafts). */\n readonly fromTimeText = computed(() => this.formatTime(this.draftStartTime()));\n readonly toTimeText = computed(() => this.formatTime(this.draftEndTime()));\n\n private onChange: (value: EfDateFieldValue) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n /* effectiveId / errorsId / _autoId inherited from AbstractEfFormControl. */\n\n /** Required error is shown once the control is touched. */\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n /** Backend validation messages stashed under `serverError`. */\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? (this.ngControl?.control?.errors?.['serverError'] as string[]) ?? null;\n }\n /** Invalid + interacted — drives the red border on the field box. */\n get isInvalid(): boolean {\n if (this.resolvedExternalErrors()?.length) return true;\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.invalid && (ctrl?.touched || ctrl?.dirty));\n }\n\n /* ── ControlValueAccessor ───────────────────────────────────── */\n\n writeValue(value: Date | Date[] | string | number | null | undefined): void {\n this.fieldValue.set(this.coerceValue(value));\n }\n registerOnChange(fn: (value: EfDateFieldValue) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n /* ── Clearable (field + single mode only) ───────────────────── *\n * showClear / canClear inherited from AbstractEfFormControl. Only offer\n * the inline clear ✕ for a single-date field with a committed value —\n * range clearing is intentionally left out. */\n protected override get hasValue(): boolean {\n return this.selectionMode() === 'single' && this.hasFieldValue();\n }\n\n override clearValue(): void {\n this.fieldValue.set(null);\n this.onChange(null);\n this.onTouched();\n }\n\n /** Normalise whatever a form pushes in to our internal value shape.\n * Tolerates `null`, `[start, null]`, strings/epochs, and stray\n * multi-element arrays (keeps the first two). */\n private coerceValue(value: Date | Date[] | string | number | null | undefined): EfDateFieldValue {\n if (value == null) return null;\n if (Array.isArray(value)) {\n const start = this.toDate(value[0]);\n if (!start) return null;\n const end = this.toDate(value[1]);\n return end ? [start, end] : start;\n }\n return this.toDate(value);\n }\n\n private toDate(v: unknown): Date | null {\n // Preserve the time component — `showTime` mode needs it; date-only\n // paths re-normalise to start-of-day when they seed the calendar and\n // when they commit, so nothing leaks the stray time.\n if (v == null) return null;\n if (v instanceof Date) return isNaN(v.getTime()) ? null : v;\n if (typeof v === 'string' || typeof v === 'number') {\n const d = new Date(v);\n return isNaN(d.getTime()) ? null : d;\n }\n return null;\n }\n\n /** Commit a field-mode value: update internal state, notify the form,\n * and close the popover. `single` → `Date`, `range` → `[start, end]`. */\n private commitField(value: Date | [Date, Date]): void {\n this.fieldValue.set(value);\n this.onChange(value);\n this.close();\n }\n\n /** Merge a day with a draft time. Returns start-of-day when `showTime`\n * is off, so date-only commits stay time-free. */\n private composeDateTime(day: Date, time: { h: number; m: number }): Date {\n const base = this.startOfDay(day);\n if (this.showTime()) base.setHours(time.h, time.m, 0, 0);\n return base;\n }\n\n /** Format a draft time as zero-padded `HH:mm`. */\n private formatTime(t: { h: number; m: number }): string {\n return `${String(t.h).padStart(2, '0')}:${String(t.m).padStart(2, '0')}`;\n }\n\n /** Parse `H:mm` … `HH:mm` (24h) → `{h, m}`, or null when out of range. */\n private parseTimeInput(raw: string): { h: number; m: number } | null {\n const m = raw.trim().match(/^(\\d{1,2}):(\\d{1,2})$/);\n if (!m) return null;\n const h = +m[1];\n const min = +m[2];\n if (h > 23 || min > 59) return null;\n return { h, m: min };\n }\n\n /** Allow only digits and `:` while typing a time; Enter commits via blur. */\n onTimeKeydown(event: KeyboardEvent, el: HTMLInputElement): void {\n if (event.key === 'Enter') {\n el.blur();\n return;\n }\n if (event.ctrlKey || event.metaKey || event.altKey) return;\n if (event.key.length > 1) return;\n if (!/[0-9:]/.test(event.key)) event.preventDefault();\n }\n\n /** Commit a typed `HH:mm` value to the start or end draft time. */\n commitTimeInput(which: 'start' | 'end', el: HTMLInputElement): void {\n const parsed = this.parseTimeInput(el.value);\n if (!parsed) {\n el.value = which === 'start' ? this.fromTimeText() : this.toTimeText();\n return;\n }\n if (which === 'start') this.draftStartTime.set(parsed);\n else this.draftEndTime.set(parsed);\n el.value = which === 'start' ? this.fromTimeText() : this.toTimeText();\n }\n\n /* ── Trigger / popover ──────────────────────────────────────── */\n\n toggle(event: MouseEvent): void {\n event.stopPropagation();\n if (this.isDisabled()) return;\n this.open.update(v => !v);\n if (this.open()) {\n this.calMode.set('days');\n if (this.mode() === 'field') {\n // No presets in field mode — open straight to the calendar.\n this.view.set('custom');\n this.seedDraftFromValue();\n const anchor = this.draftStart() ?? new Date();\n this.visibleMonth.set(this.startOfMonth(anchor));\n } else if (this.activePreset() === 'custom') {\n // The active range was hand-picked, so the preset list has\n // nothing selected to show. Reopen where it was chosen, with\n // the calendar already sitting on those dates.\n this.openCustomView();\n } else {\n this.view.set('presets');\n this.seedDraftFromValue();\n }\n this.opened.emit();\n } else {\n this.onTouched();\n this.closed.emit();\n }\n }\n\n close(): void {\n if (!this.open()) return;\n this.open.set(false);\n this.onTouched();\n this.closed.emit();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node | null;\n if (!target) return;\n // Trigger sits inside the host element …\n if (this.host.nativeElement.contains(target)) return;\n // … the panel is portaled to <body>, so check it separately.\n if (this.panelRoot && this.panelRoot.contains(target)) return;\n this.close();\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n // Drill back out one level at a time: year/month picker → day grid\n // → presets → closed.\n if (this.view() === 'custom' && this.calMode() !== 'days') {\n this.calMode.set('days');\n return;\n }\n // Field mode has no preset view to drill back to — Escape closes.\n if (this.view() === 'custom' && this.mode() !== 'field') {\n this.backToPresets();\n return;\n }\n this.close();\n }\n\n /* ── Preset actions ─────────────────────────────────────────── */\n\n selectPreset(preset: EfDatePreset): void {\n if (preset.key === 'custom') {\n this.openCustomView();\n return;\n }\n const range = this.computePresetRange(preset.key);\n this.rangeChange.emit(range);\n this.close();\n }\n\n isActivePreset(key: EfDatePresetKey): boolean {\n return (this.activePreset() ?? 'last_30_days') === key;\n }\n\n presetHint(preset: EfDatePreset): string {\n if (preset.hintFn) return preset.hintFn(new Date());\n return this.builtInHint(preset.key);\n }\n\n /* ── Custom view ────────────────────────────────────────────── */\n\n openCustomView(): void {\n this.view.set('custom');\n this.calMode.set('days');\n this.seedDraftFromValue();\n const anchor = this.draftStart() ?? new Date();\n this.visibleMonth.set(this.startOfMonth(anchor));\n }\n\n backToPresets(): void {\n this.view.set('presets');\n this.calMode.set('days');\n }\n\n /* ── Calendar header navigation (context-aware) ─────────────────\n The same ‹ / › chevrons step by month (day grid), by year\n (month picker), or by 12-year page (year picker). */\n\n headerPrev(): void {\n this.stepHeader(-1);\n }\n\n headerNext(): void {\n this.stepHeader(1);\n }\n\n private stepHeader(dir: 1 | -1): void {\n switch (this.calMode()) {\n case 'days':\n this.visibleMonth.update(d => this.addMonths(d, dir));\n break;\n case 'months':\n this.visibleMonth.update(d => this.addMonths(d, dir * 12));\n break;\n case 'years':\n this.yearWindowStart.update(y => y + dir * 12);\n break;\n }\n }\n\n /* ── Month / year pickers ───────────────────────────────────── */\n\n /** Open the month picker (triggered by clicking the month label). */\n openMonthPicker(): void {\n this.calMode.set('months');\n }\n\n /** Open the year picker (triggered by clicking the year label). */\n openYearPicker(): void {\n this.yearWindowStart.set(this.startOfYearWindow(this.visibleMonth().getFullYear()));\n this.calMode.set('years');\n }\n\n /** Pick a month → jump the day grid to it. */\n selectMonth(month: number): void {\n this.visibleMonth.update(d => new Date(d.getFullYear(), month, 1));\n this.calMode.set('days');\n }\n\n /** Pick a year → keep the current month, return to the day grid. */\n selectYear(year: number): void {\n this.visibleMonth.update(d => new Date(year, d.getMonth(), 1));\n this.calMode.set('days');\n }\n\n /* ── Editable Du / Au inputs ────────────────────────────────────\n The text inputs are no longer read-only — the user can type a\n `JJ/MM/AAAA` date. We commit on blur / Enter: a valid date updates\n the matching draft (auto-swapping if end precedes start) and moves\n the calendar to it; an invalid one reverts the field to canonical. */\n\n /** Allow only digits and `/` for printable keys; Enter commits via blur. */\n onDateKeydown(event: KeyboardEvent, el: HTMLInputElement): void {\n if (event.key === 'Enter') {\n el.blur();\n return;\n }\n if (event.ctrlKey || event.metaKey || event.altKey) return;\n // Multi-char keys (Backspace, ArrowLeft, Tab, Delete, …) pass through.\n if (event.key.length > 1) return;\n if (!/[0-9/]/.test(event.key)) event.preventDefault();\n }\n\n /** Commit a typed `JJ/MM/AAAA` value to the start or end draft. */\n commitDateInput(which: 'start' | 'end', el: HTMLInputElement): void {\n const parsed = this.parseDayInput(el.value);\n if (!parsed) {\n // Invalid → restore the canonical text for this field.\n el.value = which === 'start' ? this.fromText() : this.toText();\n return;\n }\n\n if (which === 'start') {\n this.draftStart.set(parsed);\n const end = this.draftEnd();\n // New start after the existing end → drop the now-invalid end.\n if (end && parsed.getTime() > end.getTime()) this.draftEnd.set(null);\n } else {\n const start = this.draftStart();\n if (start && parsed.getTime() < start.getTime()) {\n // End before start → swap so the range stays ordered.\n this.draftStart.set(parsed);\n this.draftEnd.set(start);\n } else {\n this.draftEnd.set(parsed);\n }\n }\n\n this.visibleMonth.set(this.startOfMonth(parsed));\n // Re-sync to canonical (zero-padded) regardless of how it was typed.\n el.value = which === 'start' ? this.fromText() : this.toText();\n }\n\n /* ── Portal (panel rendered as a child of <body>) ───────────── */\n\n private attachPortal(): void {\n if (this.panelView || !this.panelTpl) return;\n\n this.panelView = this.vcr.createEmbeddedView(this.panelTpl);\n this.panelView.detectChanges();\n\n const root = this.panelView.rootNodes.find(\n (n: Node): n is HTMLElement => n instanceof HTMLElement,\n );\n if (!root) return;\n\n this.panelRoot = root;\n document.body.appendChild(root);\n this.positionPanel();\n\n // Reposition when the viewport changes; scroll already moves the\n // panel with the trigger because we use absolute / page coords.\n this.resizeHandler = () => this.positionPanel();\n window.addEventListener('resize', this.resizeHandler);\n }\n\n private detachPortal(): void {\n if (this.resizeHandler) {\n window.removeEventListener('resize', this.resizeHandler);\n this.resizeHandler = null;\n }\n if (this.panelRoot && this.panelRoot.parentNode) {\n this.panelRoot.parentNode.removeChild(this.panelRoot);\n }\n this.panelRoot = null;\n if (this.panelView) {\n this.panelView.destroy();\n this.panelView = null;\n }\n }\n\n /** Anchor the panel's top-left to the trigger's bottom-left, using\n * page coords so the panel scrolls with the trigger naturally.\n * Flips to right-aligned (and clamps to the viewport) when the\n * default left-anchor would overflow the right edge — otherwise the\n * panel is clipped for triggers that sit near the right of the page. */\n private positionPanel(): void {\n if (!this.panelRoot || !this.anchorEl) return;\n const rect = this.anchorEl.nativeElement.getBoundingClientRect();\n const margin = 8;\n const viewportWidth = document.documentElement.clientWidth;\n const panelWidth = this.panelRoot.offsetWidth || 320;\n\n // Default: align panel's left edge to the trigger's left edge.\n let left = rect.left;\n // Flip to right-aligned (panel right edge ↔ trigger right edge)\n // if the panel would spill past the right viewport edge.\n if (left + panelWidth > viewportWidth - margin) {\n left = rect.right - panelWidth;\n }\n // Never let it spill past the left edge either.\n left = Math.max(margin, left);\n\n Object.assign(this.panelRoot.style, {\n position: 'absolute',\n top: `${window.scrollY + rect.bottom + 8}px`,\n left: `${window.scrollX + left}px`,\n insetInlineEnd: 'auto',\n });\n }\n\n /** Click handling: 1st click sets start, 2nd click sets end (or swap).\n * Field single-date mode short-circuits — one click commits & closes. */\n selectDay(day: Date): void {\n if (this.mode() === 'field' && this.selectionMode() === 'single') {\n const picked = this.startOfDay(day);\n this.draftStart.set(picked);\n this.draftEnd.set(null);\n // With a time field, wait for Apply so the user can set the time.\n if (this.showTime()) return;\n this.commitField(picked);\n return;\n }\n\n const start = this.draftStart();\n const end = this.draftEnd();\n\n // Reset → set start; or already-have-both → start over\n if (!start || (start && end)) {\n this.draftStart.set(this.startOfDay(day));\n this.draftEnd.set(null);\n return;\n }\n\n // Have only start → set end (with auto-swap if before start)\n const picked = this.startOfDay(day);\n if (picked.getTime() < start.getTime()) {\n this.draftStart.set(picked);\n this.draftEnd.set(start);\n } else {\n this.draftEnd.set(picked);\n }\n }\n\n applyCustomRange(): void {\n const s = this.draftStart();\n const e = this.draftEnd() ?? s;\n if (!s || !e) return;\n if (this.mode() === 'field') {\n // Commit as a form value (single → Date, range → [start, end]),\n // merging the draft time(s) when `showTime` is on.\n this.commitField(\n this.selectionMode() === 'single'\n ? this.composeDateTime(s, this.draftStartTime())\n : [\n this.composeDateTime(s, this.draftStartTime()),\n this.composeDateTime(e, this.draftEndTime()),\n ],\n );\n return;\n }\n this.rangeChange.emit(this.buildRange('custom', s, e));\n this.close();\n }\n\n /** Field single-date mode: commit a typed `JJ/MM/AAAA` value & close.\n * With `showTime`, only update the draft — Apply commits date + time. */\n commitSingleInput(el: HTMLInputElement): void {\n const parsed = this.parseDayInput(el.value);\n if (!parsed) {\n el.value = this.fromText();\n return;\n }\n this.draftStart.set(parsed);\n this.draftEnd.set(null);\n this.visibleMonth.set(this.startOfMonth(parsed));\n if (this.showTime()) {\n el.value = this.fromText();\n return;\n }\n this.commitField(parsed);\n }\n\n /* ── Internals ──────────────────────────────────────────────── */\n\n /** Default preset list — built-in semantics, all keys recognised. */\n private readonly defaultPresets: ReadonlyArray<EfDatePreset> = [\n { key: 'today', labelKey: 'date_preset_today' },\n { key: 'this_week', labelKey: 'date_preset_this_week' },\n { key: 'this_month', labelKey: 'date_preset_this_month' },\n { key: 'last_30_days', labelKey: 'date_preset_last_30_days' },\n { key: 'last_90_days', labelKey: 'date_preset_last_90_days' },\n { key: 'this_quarter', labelKey: 'date_preset_this_quarter' },\n { key: 'this_year', labelKey: 'date_preset_this_year' },\n ];\n\n private seedDraftFromValue(): void {\n if (this.mode() === 'field') {\n // Seed the calendar (day) + time drafts from the committed value.\n const s = this.fieldStart();\n const e = this.fieldEnd();\n this.draftStart.set(s ? this.startOfDay(s) : null);\n this.draftEnd.set(e ? this.startOfDay(e) : null);\n this.draftStartTime.set(s ? { h: s.getHours(), m: s.getMinutes() } : { h: 0, m: 0 });\n this.draftEndTime.set(e ? { h: e.getHours(), m: e.getMinutes() } : { h: 0, m: 0 });\n return;\n }\n const range = this.resolvedRange();\n this.draftStart.set(this.startOfDay(range.start));\n this.draftEnd.set(this.startOfDay(range.end));\n }\n\n /** Compute the date range for a preset key. */\n private computePresetRange(key: EfDatePresetKey): EfDateRange {\n const today = new Date();\n const preset = this.effectivePresets().find(p => p.key === key);\n const { start, end } = preset?.compute\n ? preset.compute(today)\n : this.builtInRange(key, today);\n return this.buildRange(key, start, end);\n }\n\n /** Assemble an EfDateRange — exposes `labelKey` (for the trigger\n * to render via `| translate`) and a literal `label` fallback. */\n private buildRange(key: EfDatePresetKey, start: Date, end: Date): EfDateRange {\n if (key === 'custom') {\n const sameYear = start.getFullYear() === end.getFullYear();\n const fmt = sameYear ? 'd MMM' : 'd MMM yyyy';\n return {\n start, end,\n presetKey: 'custom',\n label: `${formatDate(start, fmt, this.locale)} — ${formatDate(end, fmt, this.locale)}`,\n };\n }\n const preset = this.effectivePresets().find(p => p.key === key);\n return {\n start, end,\n presetKey: key,\n labelKey: preset?.labelKey,\n label: preset?.label ?? this.builtInHint(key),\n };\n }\n\n private builtInRange(key: EfDatePresetKey, today: Date): { start: Date; end: Date } {\n const t = this.startOfDay(today);\n switch (key) {\n case 'today':\n return { start: t, end: t };\n case 'this_week': {\n const dow = (t.getDay() + 6) % 7; // Monday = 0\n const start = this.addDays(t, -dow);\n return { start, end: t };\n }\n case 'this_month':\n return { start: this.startOfMonth(t), end: t };\n case 'last_30_days':\n return { start: this.addDays(t, -29), end: t };\n case 'last_90_days':\n return { start: this.addDays(t, -89), end: t };\n case 'this_quarter': {\n const q = Math.floor(t.getMonth() / 3);\n const start = new Date(t.getFullYear(), q * 3, 1);\n return { start, end: t };\n }\n case 'this_year':\n return { start: new Date(t.getFullYear(), 0, 1), end: t };\n default:\n // Unknown key falls back to today.\n return { start: t, end: t };\n }\n }\n\n private builtInHint(key: EfDatePresetKey): string {\n const today = new Date();\n const r = this.builtInRange(key, today);\n switch (key) {\n case 'today':\n return formatDate(today, 'd MMM', this.locale);\n case 'this_week':\n case 'this_month':\n return `${this.daysBetween(r.start, r.end)} j`;\n case 'last_30_days':\n case 'last_90_days':\n return `${formatDate(r.start, 'd MMM', this.locale)} — ${formatDate(r.end, 'd MMM', this.locale)}`;\n case 'this_quarter':\n return `T${Math.floor(today.getMonth() / 3) + 1}`;\n case 'this_year':\n return formatDate(today, 'yyyy', this.locale);\n default:\n return '';\n }\n }\n\n /** 6 weeks × 7 days. Each cell carries its date + flags. */\n private buildMonthGrid(month: Date): ReadonlyArray<{\n date: Date;\n day: number;\n out: boolean;\n today: boolean;\n inRange: boolean;\n rangeStart: boolean;\n rangeEnd: boolean;\n }> {\n const startOfMonth = this.startOfMonth(month);\n const offset = (startOfMonth.getDay() + 6) % 7; // Mon-first\n const gridStart = this.addDays(startOfMonth, -offset);\n const today = this.startOfDay(new Date());\n const ds = this.draftStart();\n const de = this.draftEnd();\n\n return Array.from({ length: 42 }, (_, i) => {\n const date = this.addDays(gridStart, i);\n const out = date.getMonth() !== month.getMonth();\n const t = this.startOfDay(date);\n const sameDay = (a: Date | null, b: Date) =>\n !!a && a.getTime() === b.getTime();\n\n const inBand = ds && de && t.getTime() > ds.getTime() && t.getTime() < de.getTime();\n return {\n date: t,\n day: date.getDate(),\n out,\n today: t.getTime() === today.getTime(),\n inRange: !!inBand,\n rangeStart: sameDay(ds, t),\n rangeEnd: sameDay(de, t),\n };\n });\n }\n\n private buildDowLabels(): ReadonlyArray<string> {\n // Build a Monday → Sunday list from CLDR's narrow weekday name.\n // CLDR puts Sunday at index 0; we want Mon first.\n const monday = new Date(2024, 0, 1); // 2024-01-01 is a Monday\n return Array.from({ length: 7 }, (_, i) =>\n formatDate(this.addDays(monday, i), 'EEEEE', this.locale).slice(0, 2)\n .replace(/^./, c => c.toUpperCase()),\n );\n }\n\n /* ── Date math (no library; everything local-time) ──────────── */\n\n private startOfDay(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n }\n\n private startOfMonth(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), 1);\n }\n\n private addDays(d: Date, n: number): Date {\n const out = new Date(d);\n out.setDate(out.getDate() + n);\n return this.startOfDay(out);\n }\n\n private addMonths(d: Date, n: number): Date {\n return new Date(d.getFullYear(), d.getMonth() + n, 1);\n }\n\n private daysBetween(a: Date, b: Date): number {\n return Math.round((this.startOfDay(b).getTime() - this.startOfDay(a).getTime()) / 86_400_000) + 1;\n }\n\n private formatDayInput(d: Date | null | undefined): string {\n if (!d) return '';\n return formatDate(d, 'dd/MM/yyyy', this.locale);\n }\n\n /** Parse a `J/M/AAAA`…`JJ/MM/AAAA` string to a start-of-day Date, or\n * null when malformed or out of range (e.g. `31/02/2026`). */\n private parseDayInput(raw: string): Date | null {\n const m = raw.trim().match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n if (!m) return null;\n const day = +m[1];\n const month = +m[2];\n const year = +m[3];\n if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n const d = new Date(year, month - 1, day);\n // Reject calendar overflow — JS rolls 31/02 into March.\n if (d.getFullYear() !== year || d.getMonth() !== month - 1 || d.getDate() !== day) {\n return null;\n }\n return this.startOfDay(d);\n }\n\n /** First year of the 12-cell window containing `year` (e.g. 2026 → 2016). */\n private startOfYearWindow(year: number): number {\n // -4 anchors the current year roughly in the second row of the grid.\n return year - ((year - 4) % 12 + 12) % 12;\n }\n\n /** Stable trackBy across renders. */\n trackByPreset = (_: number, p: EfDatePreset): string => p.key;\n trackByDay = (_: number, day: { date: Date }): number => day.date.getTime();\n trackByDow = (_: number, label: string): string => label;\n}\n","<div class=\"dp\" [class.dp--field]=\"mode() === 'field'\" #anchorEl>\n @if (mode() === 'field' && variant() === 'field') {\n <!-- Field mode — labelled field-box trigger (form control) -->\n @if (labelKey() || label()) {\n <ef-label\n [labelKey]=\"labelKey()\"\n [label]=\"label()\"\n [for]=\"effectiveId\"\n [required]=\"required()\"\n />\n }\n <div class=\"ef-field-control\">\n <button\n type=\"button\"\n class=\"dp__field-trigger\"\n [id]=\"effectiveId\"\n [class.open]=\"open()\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-placeholder]=\"!hasFieldValue()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n [attr.aria-label]=\"(labelKey() || label()) ? null : (ariaLabelKey() ? (ariaLabelKey() | translate) : (ariaLabel() || null))\"\n (click)=\"toggle($event)\"\n >\n <i class=\"ico pi pi-calendar\" aria-hidden=\"true\"></i>\n <span class=\"val\">\n {{ hasFieldValue() ? fieldDisplay() : (placeholderKey() ? (placeholderKey() | translate) : placeholder()) }}\n </span>\n <svg class=\"caret ef-chevron\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"6 9 12 15 18 9\" /></svg>\n </button>\n @if (canClear) {\n <!-- Overlaid sibling (not nested in the trigger <button>) so it\n clears instead of toggling the calendar. -->\n <ef-clear-button\n class=\"dp__field-clear\"\n [ariaLabel]=\"'action.clear' | translate\"\n (clear)=\"clearValue()\"\n />\n }\n @if (showRequired || serverErrors) {\n <div [id]=\"errorsId\" role=\"alert\" aria-live=\"polite\">\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n </div>\n }\n </div>\n } @else {\n <!-- Pill trigger — filter mode, or field mode with variant=\"pill\" -->\n <button\n type=\"button\"\n class=\"dp__trigger\"\n [class.open]=\"open()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-label]=\"mode() === 'field' && !(labelKey() || label()) ? (ariaLabelKey() ? (ariaLabelKey() | translate) : (ariaLabel() || null)) : null\"\n (click)=\"toggle($event)\"\n >\n <i class=\"ico pi pi-calendar\" aria-hidden=\"true\"></i>\n @if (mode() === 'field') {\n <span class=\"val\">\n {{ hasFieldValue() ? fieldDisplay() : (placeholderKey() ? (placeholderKey() | translate) : placeholder()) }}\n </span>\n } @else {\n <span class=\"lbl\">\n {{ triggerLabelKey() ? (triggerLabelKey() | translate) : triggerLabel() }}\n </span>\n <span class=\"val\">\n @if (resolvedRange().labelKey; as key) {\n {{ key | translate }}\n } @else {\n {{ resolvedRange().label }}\n }\n </span>\n }\n <svg class=\"caret ef-chevron\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"6 9 12 15 18 9\" /></svg>\n </button>\n }\n</div>\n\n<!--\n Popover panel — instantiated via ViewContainerRef + appended to\n <body> when `open()` flips on. Anchored absolutely to the trigger\n via positionPanel(); escapes ancestor overflow / stacking contexts.\n-->\n<ng-template #panelTpl>\n <div\n class=\"dp__panel open\"\n [class.wide]=\"view() === 'custom'\"\n role=\"dialog\"\n [attr.aria-label]=\"triggerLabelKey() | translate\"\n >\n <!-- ── View 1 — preset list ── -->\n <div class=\"dp__view\" [class.active]=\"view() === 'presets'\">\n @for (preset of effectivePresets(); track trackByPreset($index, preset)) {\n <button\n type=\"button\"\n class=\"dp__preset\"\n [class.active]=\"isActivePreset(preset.key)\"\n (click)=\"selectPreset(preset)\"\n >\n {{ preset.labelKey ? (preset.labelKey | translate) : preset.label }}\n <span class=\"hint\">{{ presetHint(preset) }}</span>\n </button>\n }\n\n @if (allowCustomRange()) {\n <div class=\"dp__divider\" role=\"separator\"></div>\n <button\n type=\"button\"\n class=\"dp__preset muted\"\n (click)=\"openCustomView()\"\n >\n <span style=\"display:inline-flex;align-items:center;gap:8px\">\n <i class=\"ico-lead pi pi-calendar\" aria-hidden=\"true\"></i>\n {{ 'date_preset_custom' | translate }}\n </span>\n <span class=\"hint\">⇧</span>\n </button>\n }\n </div>\n\n <!-- ── View 2 — custom range with calendar ── -->\n <div class=\"dp__view\" [class.active]=\"view() === 'custom'\">\n <div class=\"dp__custom-head\">\n @if (mode() !== 'field') {\n <button\n type=\"button\"\n class=\"dp__back\"\n [attr.aria-label]=\"'common_back' | translate\"\n (click)=\"backToPresets()\"\n >\n <i class=\"pi pi-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n } @else {\n <span></span>\n }\n <div class=\"dp__custom-title\">\n <span class=\"pulse-dot\"></span>\n {{ (mode() === 'field' && selectionMode() === 'single' ? 'date_select_date' : 'date_custom_range') | translate }}\n </div>\n <span></span>\n </div>\n\n <div class=\"dp__cal\">\n <div class=\"dp__cal-head\">\n <button\n type=\"button\"\n class=\"dp__cal-nav\"\n [attr.aria-label]=\"'date_prev_month' | translate\"\n (click)=\"headerPrev()\"\n >\n <i class=\"pi pi-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n <div class=\"dp__cal-title\">\n @switch (calMode()) {\n @case ('years') {\n <span class=\"dp__cal-pick is-static\">{{ yearWindowLabel() }}</span>\n }\n @case ('months') {\n <button type=\"button\" class=\"dp__cal-pick\" (click)=\"openYearPicker()\">\n {{ yearLabel() }}\n </button>\n }\n @default {\n <button type=\"button\" class=\"dp__cal-pick\" (click)=\"openMonthPicker()\">\n {{ monthLabel() }}\n </button>\n <button type=\"button\" class=\"dp__cal-pick\" (click)=\"openYearPicker()\">\n {{ yearLabel() }}\n </button>\n }\n }\n </div>\n <button\n type=\"button\"\n class=\"dp__cal-nav\"\n [attr.aria-label]=\"'date_next_month' | translate\"\n (click)=\"headerNext()\"\n >\n <i class=\"pi pi-chevron-right\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @switch (calMode()) {\n @case ('months') {\n <div class=\"dp__cal-cells\">\n @for (cell of monthCells(); track cell.month) {\n <button\n type=\"button\"\n class=\"dp__cal-cell\"\n [class.active]=\"cell.active\"\n [class.today]=\"cell.today\"\n (click)=\"selectMonth(cell.month)\"\n >\n {{ cell.label }}\n </button>\n }\n </div>\n }\n @case ('years') {\n <div class=\"dp__cal-cells\">\n @for (cell of yearCells(); track cell.year) {\n <button\n type=\"button\"\n class=\"dp__cal-cell\"\n [class.active]=\"cell.active\"\n [class.today]=\"cell.today\"\n (click)=\"selectYear(cell.year)\"\n >\n {{ cell.year }}\n </button>\n }\n </div>\n }\n @default {\n <div class=\"dp__cal-dow-row\">\n @for (label of dowLabels(); track trackByDow($index, label)) {\n <div class=\"dp__cal-dow\">{{ label }}</div>\n }\n </div>\n\n <div class=\"dp__cal-grid\">\n @for (day of calendarGrid(); track trackByDay($index, day)) {\n <button\n type=\"button\"\n class=\"dp__cal-day\"\n [class.out]=\"day.out\"\n [class.today]=\"day.today\"\n [class.in-range]=\"day.inRange\"\n [class.range-start]=\"day.rangeStart\"\n [class.range-end]=\"day.rangeEnd\"\n [attr.aria-label]=\"day.date | date:'fullDate'\"\n (click)=\"selectDay(day.date)\"\n >\n <span class=\"day-num\">{{ day.day }}</span>\n </button>\n }\n </div>\n }\n }\n </div>\n\n @if (mode() === 'field' && selectionMode() === 'single') {\n <!-- Single-date field: date (+ time when enabled). Without time,\n picking a day commits & closes; with time, Apply commits. -->\n <div class=\"dp__inputs\" [class.dp__inputs--single]=\"!showTime()\">\n <div class=\"dp__field\">\n <label [attr.for]=\"effectiveId + '-single'\">{{ 'date_select_date' | translate }}</label>\n <input\n #singleInput\n [id]=\"effectiveId + '-single'\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"10\"\n [value]=\"fromText()\"\n placeholder=\"JJ/MM/AAAA\"\n (keydown)=\"onDateKeydown($event, singleInput)\"\n (change)=\"commitSingleInput(singleInput)\"\n />\n </div>\n @if (showTime()) {\n <div class=\"dp__field\">\n <label [attr.for]=\"effectiveId + '-single-time'\">{{ 'date_time' | translate }}</label>\n <input\n #singleTime\n [id]=\"effectiveId + '-single-time'\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"5\"\n [value]=\"fromTimeText()\"\n placeholder=\"HH:mm\"\n (keydown)=\"onTimeKeydown($event, singleTime)\"\n (change)=\"commitTimeInput('start', singleTime)\"\n />\n </div>\n }\n </div>\n } @else {\n <div class=\"dp__inputs\">\n <div class=\"dp__field\">\n <label [attr.for]=\"effectiveId + '-from'\">{{ 'date_from' | translate }}</label>\n <input\n #fromInput\n [id]=\"effectiveId + '-from'\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"10\"\n [value]=\"fromText()\"\n placeholder=\"JJ/MM/AAAA\"\n (keydown)=\"onDateKeydown($event, fromInput)\"\n (change)=\"commitDateInput('start', fromInput)\"\n />\n @if (mode() === 'field' && showTime()) {\n <input\n #fromTime\n [attr.aria-label]=\"'date_time' | translate\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"5\"\n [value]=\"fromTimeText()\"\n placeholder=\"HH:mm\"\n (keydown)=\"onTimeKeydown($event, fromTime)\"\n (change)=\"commitTimeInput('start', fromTime)\"\n />\n }\n </div>\n <div class=\"dp__field\">\n <label [attr.for]=\"effectiveId + '-to'\">{{ 'date_to' | translate }}</label>\n <input\n #toInput\n [id]=\"effectiveId + '-to'\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"10\"\n [value]=\"toText()\"\n placeholder=\"JJ/MM/AAAA\"\n (keydown)=\"onDateKeydown($event, toInput)\"\n (change)=\"commitDateInput('end', toInput)\"\n />\n @if (mode() === 'field' && showTime()) {\n <input\n #toTime\n [attr.aria-label]=\"'date_time' | translate\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"5\"\n [value]=\"toTimeText()\"\n placeholder=\"HH:mm\"\n (keydown)=\"onTimeKeydown($event, toTime)\"\n (change)=\"commitTimeInput('end', toTime)\"\n />\n }\n </div>\n </div>\n }\n\n <!-- Footer: hidden only for single field WITHOUT time (commit on pick). -->\n @if (!(mode() === 'field' && selectionMode() === 'single' && !showTime())) {\n <div class=\"dp__actions\">\n @if (mode() === 'field' && selectionMode() === 'single') {\n <span></span>\n } @else {\n <span class=\"duration\">\n <span class=\"num\">{{ draftDurationDays() }}</span>\n {{ 'date_days' | translate }}\n </span>\n }\n <div class=\"right\">\n @if (mode() !== 'field') {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n (click)=\"backToPresets()\"\n >\n {{ 'common_back' | translate }}\n </button>\n }\n <button\n type=\"button\"\n class=\"btn btn-primary btn-sm\"\n [disabled]=\"!draftStart()\"\n (click)=\"applyCustomRange()\"\n >\n {{ 'common_apply' | translate }}\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n</ng-template>\n","import {\n booleanAttribute,\n Component,\n HostBinding,\n inject,\n Input,\n Output,\n EventEmitter,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport {\n InputNumber,\n InputNumberInputEvent,\n InputNumberModule,\n} from 'primeng/inputnumber';\nimport { Nullable } from 'primeng/ts-helpers';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { EfClearButtonComponent } from '../ef-clear-button/ef-clear-button.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n/**\n * Comptoir number input.\n *\n * Two render variants share the same API:\n * - `'comptoir'` (default) — native `<input type=\"text\" inputmode=\"decimal\">`\n * styled against `.ef-input` / `.ef-input-group`. Lean, no locale\n * formatting on display, but data entry accepts both `,` and `.` as\n * the decimal separator (fr-MA users type commas) and ignores\n * space group separators; pair with `suffix=\"MAD\"` for unit display\n * in dense grids (variants table, inventory adjustments, etc.).\n * See ADR-009.\n * - `'primeng'` — wraps `p-inputnumber`. Full locale-aware\n * currency / decimal formatting, stepper buttons, prefix / suffix.\n *\n * Identity / label / placeholder / aria / required / readonly /\n * disabled are inherited from `AbstractEfFormControl`.\n *\n * ```html\n * <ef-inputnumber\n * labelKey=\"catalog.price\"\n * variant=\"primeng\"\n * mode=\"currency\" currency=\"MAD\" locale=\"fr-MA\"\n * [(value)]=\"variant.price\" />\n *\n * <ef-inputnumber\n * labelKey=\"catalog.inventory\"\n * variant=\"comptoir\"\n * [showButtons]=\"true\" buttonLayout=\"horizontal\"\n * [min]=\"0\" [step]=\"1\"\n * [(value)]=\"variant.inventoryQuantity\" />\n * ```\n */\n@Component({\n selector: 'ef-inputnumber',\n standalone: true,\n templateUrl: './ef-inputnumber.component.html',\n styleUrls: ['./ef-inputnumber.component.scss'],\n imports: [InputNumberModule, FormsModule, TranslateModule, EfLabelComponent, EfClearButtonComponent],\n})\nexport class EfInputNumberComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor\n{\n @ViewChild('inputNumber', { static: false }) inputNumber?: InputNumber;\n\n /* Identity / label / placeholder / aria / required / readonly /\n disabled all inherited from AbstractEfFormControl. */\n\n /* ── Value & state ──────────────────────────────────────────── */\n\n @Input() value?: Nullable<number>;\n @Input() invalid = false;\n\n /* ── Format & display (primeng variant) ──────────────────────── */\n\n @Input() format = true;\n @Input({ transform: booleanAttribute }) showButtons = false;\n @Input() buttonLayout: 'stacked' | 'horizontal' | 'vertical' = 'stacked';\n @Input() incrementButtonClass?: string;\n @Input() decrementButtonClass?: string;\n @Input() incrementButtonIcon?: string;\n @Input() decrementButtonIcon?: string;\n @Input() prefix?: string;\n @Input() suffix?: string;\n @Input() currency?: string;\n @Input() currencyDisplay?: string;\n @Input() locale?: string;\n @Input() localeMatcher?: 'lookup' | 'best fit';\n @Input() mode: 'decimal' | 'currency' = 'decimal';\n @Input() useGrouping = true;\n @Input() minFractionDigits?: number;\n @Input() maxFractionDigits?: number;\n\n /* ── Constraints ─────────────────────────────────────────────── */\n\n @Input() min?: number;\n @Input() max?: number;\n @Input() step = 1;\n @Input() allowEmpty = true;\n\n /* ── Input attributes ────────────────────────────────────────── */\n\n @Input() inputSize?: number;\n /** Default (undefined) = canonical `--hit-base` (40px); `'small'` = dense 32px. */\n @Input() size?: 'small' | 'large';\n @Input() maxlength?: number;\n @Input() minlength?: number;\n @Input() pattern?: string;\n @Input() tabindex?: number;\n @Input() title?: string;\n @Input() ariaLabelledBy?: string;\n @Input() inputStyle?: any;\n @Input() inputStyleClass?: string;\n @Input() style?: any;\n @Input() styleClass?: string;\n /* showClear inherited from AbstractEfFormControl (default true). */\n /** PrimeNG visual variant (`'filled'` | `'outlined'`) — only\n * honored when {@link variant} === 'primeng'. */\n @Input() primeNgVariant?: 'filled' | 'outlined';\n @Input({ transform: booleanAttribute }) autofocus = false;\n @Input() autocomplete?: string;\n @Input() fluid = true;\n @Input({ transform: booleanAttribute }) inline = false;\n\n /**\n * Render variant.\n * - `'comptoir'` (default) — native `<input type=\"text\" inputmode=\"decimal\">`\n * styled against `.ef-input` / `.ef-input-group`,\n * at the canonical `--hit-base` (40px) height.\n * Accepts `,` and `.` as decimal separator.\n * - `'primeng'` — wraps `p-inputnumber`. Opt in for PrimeNG's\n * formatted stepper behaviour.\n * See ADR-009 for why comptoir is the height-consistent default.\n */\n @Input() variant: 'primeng' | 'comptoir' = 'comptoir';\n\n @HostBinding('class.ef-inline') get isInline() { return this.inline; }\n\n /* ── Styling pass-through (primeng variant) ─────────────────── */\n\n @Input() pt?: any;\n @Input() ptOptions?: any;\n @Input() dt?: any;\n @Input() unstyled?: boolean;\n\n /* ── Events ──────────────────────────────────────────────────── */\n\n @Output() inputEvent = new EventEmitter<InputNumberInputEvent>();\n @Output() valueChangeEvent: EventEmitter<number | null> = new EventEmitter<number | null>();\n @Output() focusEvent = new EventEmitter<Event>();\n @Output() blurEvent = new EventEmitter<Event>();\n @Output() keyDownEvent = new EventEmitter<KeyboardEvent>();\n @Output() clearEvent = new EventEmitter<void>();\n\n /* ── Clearable (showClear / canClear inherited from the base) ── */\n\n /** A number field is clearable when it holds any value (including 0). */\n protected override get hasValue(): boolean {\n return this.value != null;\n }\n\n override clearValue(): void {\n this.handleClear();\n }\n\n /* ── CVA ─────────────────────────────────────────────────────── */\n\n private onChange: (value: any) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n /* effectiveId / effectivePlaceholder / effectiveAriaLabel /\n errorsId all inherited from AbstractEfFormControl. */\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? this.ngControl?.control?.errors?.['serverError'] ?? null;\n }\n\n get isInvalid(): boolean {\n if (this.resolvedExternalErrors()?.length) return true;\n const ctrl = this.ngControl?.control;\n return this.invalid || !!(ctrl?.invalid && (ctrl?.touched || ctrl?.dirty));\n }\n\n writeValue(value: any): void {\n this.value = value;\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n /* ── Event handlers ─────────────────────────────────────────── */\n\n handleInput(event: InputNumberInputEvent): void {\n const next = (event.value ?? null) as number | null;\n this.value = next;\n this.onChange(next);\n this.inputEvent.emit(event);\n this.valueChangeEvent.emit(next);\n }\n\n /** Comptoir native input handler — the text input emits a raw\n * string; normalize + coerce to number or null (empty / invalid). */\n handleNativeInput(raw: string): void {\n const next = this.parseComptoirValue(raw);\n this.value = next;\n this.onChange(next);\n this.valueChangeEvent.emit(next);\n }\n\n /**\n * Parses comptoir free-text numeric entry.\n *\n * fr-MA users type commas as the decimal separator (`23,50`), while\n * `Number()` only understands `.` — so a comma is normalized to a\n * dot before parsing, and spaces (JS `\\s` covers NBSP / narrow-NBSP\n * group separators) are stripped. Both `23,50` and `23.50` parse to\n * 23.5; unparseable text yields `null` (existing empty semantics).\n */\n private parseComptoirValue(raw: string): number | null {\n if (raw == null) return null;\n const normalized = raw.replace(/\\s/g, '').replace(/,/g, '.');\n if (normalized === '') return null;\n const parsed = Number(normalized);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n /**\n * Blur-time clamp for the comptoir variant. The native input no\n * longer carries `min` / `max` attributes (it's `type=\"text\"`), so\n * range enforcement — previously only advisory on `type=\"number\"`\n * anyway — happens here, and the field text is re-synced to the\n * canonical parsed value (e.g. a dangling `23,` becomes `23`).\n */\n private clampAndReflect(el: HTMLInputElement | null): void {\n const current = this.value ?? null;\n let next = current;\n if (next != null) {\n if (this.min != null && next < this.min) next = this.min;\n if (this.max != null && next > this.max) next = this.max;\n }\n if (next !== current) {\n this.value = next;\n this.onChange(next);\n this.valueChangeEvent.emit(next);\n }\n if (el) el.value = next == null ? '' : String(next);\n }\n\n /** Comptoir stepper buttons handler — bumps `value` by `step`,\n * clamped to `min` / `max`. */\n step$(direction: 1 | -1): void {\n const current = this.value ?? 0;\n let next = current + direction * (this.step ?? 1);\n if (this.min != null) next = Math.max(this.min, next);\n if (this.max != null) next = Math.min(this.max, next);\n this.value = next;\n this.onChange(next);\n this.valueChangeEvent.emit(next);\n }\n\n handleFocus(event: Event): void {\n this.focusEvent.emit(event);\n }\n\n handleBlur(event: Event): void {\n if (this.variant === 'comptoir') {\n this.clampAndReflect((event.target as HTMLInputElement | null) ?? null);\n }\n this.onTouched();\n this.blurEvent.emit(event);\n }\n\n handleKeyDown(event: KeyboardEvent): void {\n this.keyDownEvent.emit(event);\n }\n\n handleClear(): void {\n this.value = null;\n this.onChange(null);\n this.valueChangeEvent.emit(null);\n this.clearEvent.emit();\n }\n\n focus(): void {\n this.inputNumber?.input?.nativeElement?.focus();\n }\n\n clear(): void {\n if (this.inputNumber) {\n this.inputNumber.clear();\n }\n this.handleClear();\n }\n}\n","@if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" [for]=\"effectiveId\" [required]=\"required()\" />\n}\n<div class=\"ef-field-control\">\n @if (variant === 'comptoir') {\n @if (prefix || suffix || showButtons) {\n <!-- Comptoir variant — native text input (inputmode=decimal, accepts\n \",\" or \".\" as decimal separator) wrapped in .ef-input-group when\n there's a prefix / suffix / stepper. min/max are enforced by\n blur-time clamping in the component (text inputs have no native\n range semantics). -->\n <div class=\"ef-input-group\" [class.is-invalid]=\"isInvalid\">\n @if (showButtons) {\n <button\n type=\"button\"\n class=\"ef-input-addon is-stepper\"\n [disabled]=\"isDisabled() || (min !== undefined && (value ?? 0) <= min)\"\n (click)=\"step$(-1)\"\n [attr.aria-label]=\"('ef_input_decrement' | translate) || 'Decrease'\"\n >\n <i class=\"pi pi-minus\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (prefix) {\n <span class=\"ef-input-addon is-prefix\" aria-hidden=\"true\">{{ prefix }}</span>\n }\n <input\n type=\"text\"\n inputmode=\"decimal\"\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [value]=\"value ?? ''\"\n [attr.placeholder]=\"effectivePlaceholder || null\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete ?? 'off'\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n (input)=\"handleNativeInput($any($event.target).value)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n @if (canClear) {\n <ef-clear-button\n class=\"ef-group-clear\"\n [ariaLabel]=\"'action.clear' | translate\"\n (clear)=\"clearValue()\"\n />\n }\n @if (suffix) {\n <span class=\"ef-input-addon is-suffix\" aria-hidden=\"true\">{{ suffix }}</span>\n }\n @if (showButtons) {\n <button\n type=\"button\"\n class=\"ef-input-addon is-stepper\"\n [disabled]=\"isDisabled() || (max !== undefined && (value ?? 0) >= max)\"\n (click)=\"step$(1)\"\n [attr.aria-label]=\"('ef_input_increment' | translate) || 'Increase'\"\n >\n <i class=\"pi pi-plus\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n } @else {\n <!-- Comptoir variant — bare native text input (inputmode=decimal,\n accepts \",\" or \".\" as decimal separator; optional inline clear).\n min/max are enforced by blur-time clamping in the component. -->\n <div class=\"ef-input-wrap\">\n <input\n type=\"text\"\n inputmode=\"decimal\"\n class=\"ef-input\"\n [class.has-clear]=\"canClear\"\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [value]=\"value ?? ''\"\n [attr.placeholder]=\"effectivePlaceholder || null\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete ?? 'off'\"\n [class.is-invalid]=\"isInvalid\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n (input)=\"handleNativeInput($any($event.target).value)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n @if (canClear) {\n <ef-clear-button\n class=\"ef-input-clear\"\n [ariaLabel]=\"'action.clear' | translate\"\n (clear)=\"clearValue()\"\n />\n }\n </div>\n }\n } @else {\n <!-- PrimeNG variant (default) — full locale-aware formatting. -->\n <p-inputnumber\n #inputNumber\n [(ngModel)]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n [invalid]=\"isInvalid\"\n [disabled]=\"isDisabled()\"\n [readonly]=\"readonly()\"\n [required]=\"required()\"\n [format]=\"format\"\n [showButtons]=\"showButtons\"\n [buttonLayout]=\"buttonLayout\"\n [incrementButtonClass]=\"incrementButtonClass\"\n [decrementButtonClass]=\"decrementButtonClass\"\n [incrementButtonIcon]=\"incrementButtonIcon\"\n [decrementButtonIcon]=\"decrementButtonIcon\"\n [prefix]=\"prefix\"\n [suffix]=\"suffix\"\n [currency]=\"currency\"\n [currencyDisplay]=\"currencyDisplay\"\n [locale]=\"locale\"\n [localeMatcher]=\"localeMatcher\"\n [mode]=\"mode\"\n [useGrouping]=\"useGrouping\"\n [minFractionDigits]=\"minFractionDigits\"\n [maxFractionDigits]=\"maxFractionDigits\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n [allowEmpty]=\"allowEmpty\"\n [inputId]=\"effectiveId\"\n [name]=\"name()\"\n [placeholder]=\"effectivePlaceholder\"\n [inputSize]=\"inputSize\"\n [size]=\"size\"\n [maxlength]=\"maxlength\"\n [minlength]=\"minlength\"\n [pattern]=\"pattern\"\n [tabindex]=\"tabindex\"\n [title]=\"title\"\n [ariaLabel]=\"effectiveAriaLabel\"\n [ariaLabelledBy]=\"ariaLabelledBy\"\n [ariaRequired]=\"required()\"\n [inputStyle]=\"inputStyle\"\n [inputStyleClass]=\"inputStyleClass\"\n [style]=\"style\"\n [styleClass]=\"styleClass\"\n [showClear]=\"showClear()\"\n [variant]=\"primeNgVariant\"\n [autofocus]=\"autofocus\"\n [autocomplete]=\"autocomplete\"\n [fluid]=\"fluid\"\n [pt]=\"pt\"\n [ptOptions]=\"ptOptions\"\n [dt]=\"dt\"\n [unstyled]=\"unstyled\"\n (onInput)=\"handleInput($event)\"\n (onFocus)=\"handleFocus($event)\"\n (onBlur)=\"handleBlur($event)\"\n (onKeyDown)=\"handleKeyDown($event)\"\n (onClear)=\"handleClear()\"\n />\n }\n @if (showRequired || serverErrors) {\n <div [id]=\"errorsId\" role=\"alert\" aria-live=\"polite\">\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n </div>\n }\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n forwardRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport {\n NG_VALUE_ACCESSOR,\n ControlValueAccessor,\n FormsModule,\n} from '@angular/forms';\nimport { Nullable } from 'primeng/ts-helpers';\nimport { EfInputNumberComponent } from '../ef-inputnumber/ef-inputnumber.component';\n\n/**\n * EfQuantityStepper is a specialized component for quantity selection with increment/decrement buttons.\n * Perfect for shopping carts, POS systems, and order forms where users need to adjust quantities.\n *\n * Features:\n * - Increment/decrement buttons with customizable styling\n * - Min/max value constraints\n * - Configurable step value\n * - Fully integrated with Angular Forms (ngModel, FormControl)\n * - Rounded button design optimized for touch interfaces\n *\n * @group Components\n */\n@Component({\n selector: 'ef-quantity-stepper',\n templateUrl: './ef-quantity-stepper.component.html',\n styleUrls: ['./ef-quantity-stepper.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [EfInputNumberComponent, FormsModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => EfQuantityStepperComponent),\n multi: true,\n },\n ],\n})\nexport class EfQuantityStepperComponent implements ControlValueAccessor {\n /**\n * Current quantity value\n */\n @Input() value: Nullable<number> = 0;\n\n /**\n * Minimum allowed value\n */\n @Input() min = 0;\n\n /**\n * Maximum allowed value\n */\n @Input() max = 999;\n\n /**\n * Step increment/decrement value\n */\n @Input() step = 1;\n\n /**\n * Minimum fraction digits to display (forwarded to ef-inputnumber).\n */\n @Input() minFractionDigits?: number;\n\n /**\n * Maximum fraction digits to display (forwarded to ef-inputnumber).\n */\n @Input() maxFractionDigits?: number;\n\n /**\n * Locale used for number formatting (forwarded to ef-inputnumber).\n */\n @Input() locale?: string;\n\n /**\n * When present, it specifies that the component should be disabled\n */\n @Input() disabled = false;\n\n /**\n * Callback to invoke when the value changes\n */\n @Output() valueChange = new EventEmitter<number>();\n\n /**\n * Pass Through configuration for custom styling\n */\n ptConfig = {\n root: {\n class: 'flex items-center justify-center gap-2',\n },\n pcInputText: {\n root: {\n class:\n '!w-12 !border-none !rounded-full bg-transparent font-bold text-primary dark:text-primary-contrast !text-center',\n },\n },\n decrementButton: {\n class:\n '!w-9 !border-none cursor-pointer !rounded-full !bg-white px-3 py-2 font-bold !text-primary dark:!text-primary-contrast !text-center',\n },\n incrementButton: {\n class:\n '!w-9 !border-none cursor-pointer !rounded-full !bg-white px-3 py-2 font-bold !text-primary dark:!text-primary-contrast !text-center',\n },\n decrementButtonIcon: {\n innerHTML: '-',\n },\n incrementButtonIcon: {\n innerHTML: '+',\n },\n };\n\n // ============================================================================\n // CONTROL VALUE ACCESSOR\n // ============================================================================\n\n private onChange: (value: any) => void = () => {\n /* noop */\n };\n private onTouched: () => void = () => {\n /* noop */\n };\n\n // ============================================================================\n // CONTROL VALUE ACCESSOR IMPLEMENTATION\n // ============================================================================\n\n writeValue(value: any): void {\n this.value = value;\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n // ============================================================================\n // EVENT HANDLERS\n // ============================================================================\n\n handleValueChange(value: number | null): void {\n this.value = value;\n this.onChange(value);\n this.valueChange.emit(value);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n}\n","<div\n class=\"flex h-12 items-center text-center justify-center gap-2 rounded-full !border !border-gray-200 bg-gray-100 dark:bg-slate-500 p-2\"\n>\n <ef-inputnumber\n [(ngModel)]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n [minFractionDigits]=\"minFractionDigits\"\n [maxFractionDigits]=\"maxFractionDigits\"\n [locale]=\"locale\"\n [disabled]=\"disabled\"\n [showButtons]=\"true\"\n buttonLayout=\"horizontal\"\n decrementButtonIcon=\"-\"\n incrementButtonIcon=\"+\"\n [pt]=\"ptConfig\"\n (ngModelChange)=\"handleValueChange($event)\"\n (blurEvent)=\"handleBlur()\"\n >\n </ef-inputnumber>\n</div>\n","import {\n booleanAttribute,\n Component,\n EventEmitter,\n Input,\n Output,\n} from '@angular/core';\nimport { ButtonModule } from 'primeng/button';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/** PrimeNG severity vocabulary (v1's default). */\nexport type EfButtonPrimeNGSeverity =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'info'\n | 'warn'\n | 'danger'\n | 'help'\n | 'contrast';\n\n/** Comptoir severity vocabulary — maps to `.btn-{name}` rules in\n * `@elasticias/ui/styles/patterns`. `'danger'` renders as\n * `.btn-ghost` with the cancelled-fg tint applied inline. */\nexport type EfButtonComptoirSeverity = 'primary' | 'tenant' | 'ghost' | 'danger';\n\nexport type EfButtonSeverity = EfButtonPrimeNGSeverity | EfButtonComptoirSeverity;\n\n/**\n * Wrapper button for both v1 (PrimeNG-themed) and V2 (Comptoir-themed)\n * surfaces. `[variant]` picks the rendering path:\n *\n * - `'primeng'` (default) — wraps `<p-button>` with PrimeNG severities\n * (`primary / success / danger / …`). Keeps v1 imports working\n * unchanged.\n *\n * - `'comptoir'` — renders a native `<button class=\"btn btn-{severity}\n * btn-sm\">` against the Comptoir `.btn` pattern. Severities are\n * `'primary' | 'tenant' | 'ghost' | 'danger'`; `'danger'` falls back\n * to `.btn-ghost` with the `--st-cancelled-fg` tint applied inline,\n * matching the prototype's Delete-button styling.\n *\n * Both variants honour `labelKey` (i18n preferred), `icon`,\n * `disabled`, `loading`, `pTooltip` (via `tooltipKey`), and emit the\n * same `clickEvent`.\n */\n@Component({\n selector: 'ef-button',\n standalone: true,\n templateUrl: './ef-button.component.html',\n imports: [ButtonModule, TooltipModule, TranslateModule],\n})\nexport class EfButtonComponent {\n /** Direct label text (not translated). */\n @Input() label?: string;\n /** Translation key — takes priority over `label`. */\n @Input() labelKey?: string;\n\n @Input() icon?: string;\n\n /**\n * Which rendering surface to use. Default `'primeng'` keeps v1\n * consumers unchanged. V2 detail/list screens pass `'comptoir'`\n * to opt into the Comptoir `.btn` styling.\n */\n @Input() variant: 'primeng' | 'comptoir' = 'primeng';\n\n @Input() severity: EfButtonSeverity = 'primary';\n @Input() size: 'small' | 'large' = 'small';\n\n @Input({ transform: booleanAttribute }) disabled = false;\n @Input({ transform: booleanAttribute }) rounded = false;\n @Input({ transform: booleanAttribute }) outlined = false;\n @Input({ transform: booleanAttribute }) raised = false;\n @Input({ transform: booleanAttribute }) text = false;\n @Input({ transform: booleanAttribute }) loading = false;\n @Input() styleClass?: string;\n @Input() type: 'button' | 'submit' = 'button';\n @Input() badge?: string;\n @Input() badgeSeverity?:\n | 'success'\n | 'info'\n | 'warn'\n | 'danger'\n | 'help'\n | 'primary'\n | 'secondary'\n | 'contrast';\n\n /** Direct tooltip text (not translated). Falls back to `label`\n * when neither `tooltip` nor `tooltipKey` is set. */\n @Input() tooltip?: string;\n /** Translation key for tooltip — takes priority over `tooltip`.\n * Falls back to `labelKey` when not provided, so buttons with\n * visible labels still expose them to screen readers / mobile\n * long-press once the label is hidden by responsive CSS. */\n @Input() tooltipKey?: string;\n @Input() tooltipPosition: 'top' | 'bottom' | 'left' | 'right' = 'top';\n\n /** Resolved tooltip translation key — `tooltipKey` if provided,\n * otherwise `labelKey`. Lets responsive icon-only buttons reuse\n * their label as the tooltip without restating it at every call\n * site. */\n get effectiveTooltipKey(): string | undefined {\n return this.tooltipKey ?? this.labelKey;\n }\n\n /** Resolved plain tooltip text — `tooltip` if provided, otherwise\n * `label`. Used only when neither `tooltipKey` nor `labelKey` is\n * set. */\n get effectiveTooltip(): string | undefined {\n return this.tooltip ?? this.label;\n }\n\n @Output() clickEvent = new EventEmitter<Event>();\n\n /** Composed class string for the Comptoir variant —\n * `btn btn-{severity} btn-sm` plus any caller-supplied `styleClass`. */\n get comptoirClass(): string {\n // 'danger' renders as ghost + danger-tint (applied as inline style\n // in the template); other severities map directly.\n const sevClass = this.severity === 'danger' ? 'btn-ghost' : `btn-${this.severity}`;\n const sizeClass = this.size === 'small' ? 'btn-sm' : '';\n return ['btn', sevClass, sizeClass, this.styleClass ?? '']\n .filter(Boolean)\n .join(' ');\n }\n\n /** Inline danger tint for the `severity=\"danger\"` Comptoir variant. */\n get comptoirInlineColor(): string | null {\n return this.severity === 'danger' ? 'var(--st-cancelled-fg)' : null;\n }\n\n handleClick(event: Event): void {\n if (this.disabled || this.loading) return;\n this.clickEvent.emit(event);\n }\n}\n","@if (variant === 'comptoir') {\n <!-- Comptoir variant — native button against the `.btn` pattern\n in `@elasticias/ui/styles/patterns`. PrimeNG severities\n (success/info/warn/help/contrast/secondary) fall through to\n this branch only when explicitly passed with variant='comptoir';\n they render as ghost since they have no Comptoir equivalent. -->\n <button\n [type]=\"type\"\n [class]=\"comptoirClass\"\n [disabled]=\"disabled || loading\"\n [style.color]=\"comptoirInlineColor\"\n [pTooltip]=\"effectiveTooltipKey ? (effectiveTooltipKey | translate) : effectiveTooltip\"\n [tooltipPosition]=\"tooltipPosition\"\n (click)=\"handleClick($event)\"\n >\n @if (loading) {\n <i class=\"pi pi-spinner pi-spin\" aria-hidden=\"true\"></i>\n } @else if (icon) {\n <i [class]=\"icon\" aria-hidden=\"true\"></i>\n }\n @if (labelKey || label) {\n <span>{{ labelKey ? (labelKey | translate) : label }}</span>\n }\n </button>\n} @else {\n <!-- PrimeNG variant (default) — v1 styling via <p-button>. -->\n <p-button\n [label]=\"labelKey ? (labelKey | translate) : label\"\n [icon]=\"icon\"\n [severity]=\"$any(severity)\"\n [size]=\"size\"\n [disabled]=\"disabled\"\n [rounded]=\"rounded\"\n [outlined]=\"outlined\"\n [raised]=\"raised\"\n [text]=\"text\"\n [loading]=\"loading\"\n [styleClass]=\"styleClass\"\n [type]=\"type\"\n [badge]=\"badge\"\n [badgeSeverity]=\"badgeSeverity\"\n [pTooltip]=\"effectiveTooltipKey ? (effectiveTooltipKey | translate) : effectiveTooltip\"\n [tooltipPosition]=\"tooltipPosition\"\n (onClick)=\"handleClick($event)\"\n />\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/** Shape of the placeholder rendered while a widget's data is in flight. */\nexport type EfSkeletonVariant = 'text' | 'kpi' | 'chart' | 'table';\n\n/**\n * Comptoir loading skeleton — the one reusable \"waiting for results\"\n * placeholder for async card/widget bodies (dashboards, reports,\n * detail sidebars). Pure CSS shimmer on the design-system tokens;\n * decorative only (`aria-hidden`), so hosts flag busyness themselves\n * (`ef-card` sets `aria-busy` on its body when `[loading]` is true).\n *\n * Prefer injecting it through `ef-card`'s `[loading]` + `skeleton`\n * inputs — the card swaps its body for the skeleton with a single\n * binding. Use the component directly only for non-card shells\n * (e.g. a KPI tile row):\n *\n * ```html\n * <ef-card titleKey=\"…\" [loading]=\"state() === 'loading'\" skeleton=\"chart\">…</ef-card>\n * <ef-skeleton class=\"kpi\" variant=\"kpi\" />\n * ```\n *\n * Variants: `text` (default, `rows` lines), `kpi` (label / value /\n * delta bars), `chart` (one block, `height` px), `table` (header bar\n * + `rows` row bars).\n */\n@Component({\n selector: 'ef-skeleton',\n standalone: true,\n template: `\n @switch (variant()) {\n @case ('kpi') {\n <span class=\"sk sk-label\"></span>\n <span class=\"sk sk-value\"></span>\n <span class=\"sk sk-delta\"></span>\n }\n @case ('chart') {\n <span class=\"sk sk-chart\" [style.height.px]=\"height()\"></span>\n }\n @case ('table') {\n <span class=\"sk sk-th\"></span>\n @for (i of lines(); track i) {\n <span class=\"sk sk-row\"></span>\n }\n }\n @default {\n @for (i of lines(); track i) {\n <span class=\"sk sk-text\"></span>\n }\n }\n }\n `,\n styleUrl: './ef-skeleton.component.scss',\n host: { 'aria-hidden': 'true' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfSkeletonComponent {\n /** Placeholder shape. */\n readonly variant = input<EfSkeletonVariant>('text');\n\n /** Line/row count for the `text` and `table` variants. */\n readonly rows = input(4);\n\n /** Block height (px) for the `chart` variant. */\n readonly height = input(280);\n\n readonly lines = computed(() =>\n Array.from({ length: Math.max(1, this.rows()) }, (_, i) => i),\n );\n}\n","import { ChangeDetectionStrategy, Component, booleanAttribute, computed, input, model } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfSkeletonComponent, EfSkeletonVariant } from '../../feedback/ef-skeleton/ef-skeleton.component';\n\n/**\n * Comptoir card primitive — `.card` shell with optional `.card-head`,\n * `.card-body`, `.card-foot`. Phase 7's most reused container.\n *\n * Three projection slots:\n * `head-extra` — projected on the right of the head row, after the\n * built-in title/meta. Use for a status chip,\n * action button, kbd hint, etc.\n * default — body content (replaced by the reusable\n * `ef-skeleton` while `[loading]` is true).\n * `foot` — bottom strip with rule-soft separator + paper bg.\n *\n * ```html\n * <ef-card titleKey=\"orders_status\" [tone]=\"'module'\">\n * <ng-container head-extra>\n * <ef-status-chip referenceKey=\"sales_order_status\" [code]=\"status\" />\n * </ng-container>\n * <div>… body content …</div>\n * <div foot>\n * <span class=\"small text-mute\">Modifié il y a 2 min</span>\n * </div>\n * </ef-card>\n * ```\n */\n@Component({\n selector: 'ef-card',\n standalone: true,\n host: { '[class.is-overflow-visible]': 'overflowVisible()' },\n imports: [CommonModule, TranslateModule, EfSkeletonComponent],\n template: `\n @if (showHead()) {\n <div\n class=\"card-head\"\n [class.tone-module]=\"tone() === 'module'\"\n [class.is-collapsible]=\"collapsible()\"\n [attr.role]=\"collapsible() ? 'button' : null\"\n [attr.tabindex]=\"collapsible() ? 0 : null\"\n (click)=\"onHeadClick()\"\n (keydown.enter)=\"onHeadClick()\"\n (keydown.space)=\"onHeadClick()\"\n >\n <div>\n @if (titleKey() || title()) {\n <div class=\"title\">\n {{ titleKey() ? (titleKey() | translate) : title() }}\n </div>\n }\n @if (metaKey() || meta()) {\n <div class=\"meta\">\n {{ metaKey() ? (metaKey() | translate) : meta() }}\n </div>\n }\n </div>\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"card-head-actions\"\n (click)=\"$event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n >\n <ng-content select=\"[head-extra]\"></ng-content>\n @if (collapsible()) {\n <button\n type=\"button\"\n class=\"card-collapse-btn\"\n (click)=\"toggle()\"\n [attr.aria-expanded]=\"!collapsed()\"\n >\n <i\n class=\"pi\"\n [class.pi-chevron-down]=\"collapsed()\"\n [class.pi-chevron-up]=\"!collapsed()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n </div>\n </div>\n }\n\n @if (!collapsed()) {\n <div class=\"card-body\" [attr.aria-busy]=\"loading() ? 'true' : null\">\n @if (loading()) {\n <ef-skeleton\n [variant]=\"skeleton()\"\n [rows]=\"skeletonRows()\"\n [height]=\"skeletonHeight()\"\n />\n } @else {\n <ng-content></ng-content>\n }\n </div>\n }\n\n @if (showFoot() && !collapsed()) {\n <div class=\"card-foot\">\n <ng-content select=\"[foot]\"></ng-content>\n </div>\n }\n `,\n styleUrl: './ef-card.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfCardComponent {\n /** Translation key for the head title — preferred. */\n readonly titleKey = input<string>('');\n /** Direct title fallback when `titleKey` is empty. */\n readonly title = input<string>('');\n\n /** Translation key for the head's small meta line. */\n readonly metaKey = input<string>('');\n readonly meta = input<string>('');\n\n /** Module-tinted head — uses `var(--module)` for the head bg. */\n readonly tone = input<'default' | 'module'>('default');\n\n /** Force the head to render even when no title/meta (e.g. when\n * using only the head-extra slot). Defaults to auto-detect. */\n readonly forceHead = input(false, { transform: booleanAttribute });\n\n /** Render the foot strip — set when projecting `[foot]` content. */\n readonly hasFoot = input(false, { transform: booleanAttribute });\n\n /** When true, the head shows a chevron toggle and the body/foot collapse. */\n readonly collapsible = input(false, { transform: booleanAttribute });\n\n /** Let overlay content (custom dropdowns/menus rendered inside the body)\n * escape the card's `overflow: hidden`. PrimeNG overlays should prefer\n * `appendTo=\"body\"`; use this for non-PrimeNG absolute-positioned menus. */\n readonly overflowVisible = input(false, { transform: booleanAttribute });\n\n /** While true, the body renders the reusable `ef-skeleton` instead of\n * the projected content (and flags `aria-busy`). Bind each card's own\n * async state so widgets shimmer independently:\n * `[loading]=\"state().series === 'loading'\"`. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** Skeleton shape shown while `loading` — match the body content. */\n readonly skeleton = input<EfSkeletonVariant>('text');\n\n /** Line/row count for the `text` / `table` skeleton variants. */\n readonly skeletonRows = input(4);\n\n /** Block height (px) for the `chart` skeleton variant. */\n readonly skeletonHeight = input(280);\n\n /** Collapsed state (two-way). Bind `[collapsed]=\"true\"` to start collapsed. */\n readonly collapsed = model(false);\n\n readonly showHead = computed(\n () =>\n this.forceHead() ||\n this.collapsible() ||\n !!this.titleKey() ||\n !!this.title() ||\n !!this.metaKey() ||\n !!this.meta(),\n );\n\n readonly showFoot = computed(() => this.hasFoot());\n\n /** Toggle collapsed state (no-op when not collapsible). */\n toggle(): void {\n if (this.collapsible()) this.collapsed.set(!this.collapsed());\n }\n\n /** Clicking anywhere on a collapsible head (except the actions area, which\n * stops propagation) toggles the card. */\n onHeadClick(): void {\n this.toggle();\n }\n}\n","import {\n booleanAttribute,\n Component,\n EventEmitter,\n inject,\n Input,\n Output,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DialogModule } from 'primeng/dialog';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { EfButtonComponent } from '../ef-button/ef-button.component';\n\n/**\n * Dynamic action descriptor for `ef-dialog`. The dialog renders one\n * `<button class=\"btn …\">` per entry, in array order (left → right);\n * the rightmost entry is the focused / \"primary\" by convention.\n *\n * When `command` returns a `Promise`, the button auto-toggles\n * `.is-loading` for the duration and the dialog closes when it\n * resolves (unless `dismiss === false`).\n */\nexport interface EfDialogAction {\n /** Direct label text. Use `labelKey` for i18n. */\n label?: string;\n /** Translation key for the label — takes precedence over `label`. */\n labelKey?: string;\n /** Visual severity (controls the .btn class). Default: `'ghost'`. */\n severity?: 'primary' | 'ghost' | 'tenant' | 'danger';\n /** PrimeNG icon class (e.g. `'pi pi-trash'`). Optional. */\n icon?: string;\n /** Extra class(es) appended to the footer button — for brand-tinted\n * actions (e.g. `'btn-whatsapp'`) or layout helpers (`'btn-dialog-leading'`)\n * beyond the four standard severities. */\n styleClass?: string;\n /** Click handler. Return a `Promise` to auto-toggle the loading\n * spinner overlay on the button until it settles. */\n command?: () => void | Promise<void>;\n /** Close the dialog after the command resolves. Default: `true`. */\n dismiss?: boolean;\n /** Render the button as disabled. */\n disabled?: boolean;\n /** Render the button as loading (in-flight). Mutated automatically\n * by the dialog when the command returns a Promise. */\n loading?: boolean;\n}\n\nexport type EfDialogSeverity = 'default' | 'danger' | 'warn' | 'info' | 'success' | 'tenant';\nexport type EfDialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\n/**\n * Comptoir dialog — wraps PrimeNG `p-dialog` and skins it against the\n * `.es-dialog` patterns lifted from the static prototype\n * (`docs/ux-ui/erp/screens/components.html` § Section 05).\n *\n * **Card design with two rules** — the header has a `border-bottom`,\n * the footer has a `border-top` (`1px var(--rule)`). Header layout:\n * optional severity-tinted icon · title + subtitle · close ✕.\n *\n * **Dynamic actions** — pass an `EfDialogAction[]` via `[actions]`\n * and the footer renders one button per entry, in order. The rightmost\n * is conventionally the primary action; consumers control severity\n * per-entry. Async commands flip the button to `.is-loading` until\n * resolved, then auto-dismiss (unless opted out).\n *\n * ```html\n * <ef-dialog\n * [(visible)]=\"show\"\n * headerKey=\"orders.delete_confirm\"\n * subtitleKey=\"orders.delete_irreversible\"\n * severity=\"danger\"\n * size=\"md\"\n * [actions]=\"[\n * { labelKey: 'common_cancel', severity: 'ghost' },\n * { labelKey: 'common_delete', severity: 'danger',\n * command: () => this.api.deleteOrder(this.id) }\n * ]\"\n * >\n * <div class=\"es-dialog__highlight\">\n * <span class=\"av tenant\">L</span>\n * <div class=\"body\">\n * <div class=\"nm\">SO-2026-198 · Leila Bennani</div>\n * <div class=\"meta\">07 mai · 1 132,00 MAD</div>\n * </div>\n * </div>\n * <p>{{ 'orders.delete_warning' | translate }}</p>\n * </ef-dialog>\n * ```\n */\n@Component({\n selector: 'ef-dialog',\n standalone: true,\n templateUrl: './ef-dialog.component.html',\n imports: [CommonModule, DialogModule, TranslateModule, EfButtonComponent],\n})\nexport class EfDialogComponent {\n private readonly translate = inject(TranslateService);\n\n /* ── Identity (existing) ─────────────────────────────────── */\n\n /** Direct header text (not translated). */\n @Input() header?: string;\n /** Translation key — takes precedence over `header`. */\n @Input() headerKey?: string;\n\n /** Direct subtitle text. */\n @Input() subtitle?: string;\n /** Translation key — takes precedence over `subtitle`. */\n @Input() subtitleKey?: string;\n\n /* ── Visibility / behaviour (existing + 1 new) ──────────── */\n\n @Input({ transform: booleanAttribute }) visible = false;\n @Input({ transform: booleanAttribute }) modal = true;\n @Input({ transform: booleanAttribute }) closable = true;\n @Input({ transform: booleanAttribute }) draggable = false;\n @Input({ transform: booleanAttribute }) resizable = false;\n /** Close the dialog when the user clicks the backdrop mask. */\n @Input({ transform: booleanAttribute }) dismissableMask = false;\n /** Close the dialog on Escape (PrimeNG default = true). */\n @Input({ transform: booleanAttribute }) closeOnEscape = true;\n\n /* ── Visuals (new) ──────────────────────────────────────── */\n\n /** Severity drives the header icon tint (panel itself stays neutral).\n * Pair with `[icon]` to override the default icon-class per severity. */\n @Input() severity: EfDialogSeverity = 'default';\n /** Header icon class (PrimeNG `pi pi-*`). Overrides the severity default. */\n @Input() icon?: string;\n /** Width preset: sm 380 / md 480 (default) / lg 640 / xl 880 / full. */\n @Input() size: EfDialogSize = 'md';\n\n /* ── Style hooks ────────────────────────────────────────── */\n\n @Input() style?: { [key: string]: string };\n @Input() styleClass?: string;\n\n @Input() position:\n | 'center' | 'top' | 'bottom' | 'left' | 'right'\n | 'topleft' | 'topright' | 'bottomleft' | 'bottomright' = 'center';\n @Input() appendTo?: string;\n\n /**\n * Render variant.\n * - `'comptoir'` (default) — applies the `.es-dialog` Comptoir skin,\n * custom header (icon + title + subtitle + close), and dynamic-action\n * footer.\n * - `'primeng'` — bare `p-dialog` with its native header (just the\n * `[header]` text + PrimeNG's default close). Use for legacy screens\n * or to dodge the Comptoir skin one-off.\n */\n @Input() variant: 'primeng' | 'comptoir' = 'comptoir';\n\n /* ── Dynamic actions (new) ──────────────────────────────── */\n\n /** Footer actions, rendered left → right. When set (non-empty),\n * takes precedence over `defaultActions`. */\n @Input() actions?: EfDialogAction[];\n\n /* ── Default actions (existing — preserved verbatim) ───── */\n\n /**\n * Render a standard cancel + save action footer. Backward-compat\n * shortcut — for richer footers prefer `[actions]`. When false (and\n * no `[actions]` provided), the footer is omitted entirely.\n */\n @Input({ transform: booleanAttribute }) defaultActions = true;\n @Input() saveLabelKey = 'common_save';\n @Input() cancelLabelKey = 'common_cancel';\n @Input() saveLabel?: string;\n @Input() cancelLabel?: string;\n @Input() saveIcon = 'pi pi-check';\n @Input() cancelIcon?: string;\n @Input({ transform: booleanAttribute }) saveDisabled = false;\n @Input() saveStyleClass?: string;\n @Input() cancelStyleClass?: string;\n @Input() saveSeverity: 'primary' | 'tenant' | 'ghost' | 'danger' = 'primary';\n @Input() cancelSeverity: 'primary' | 'tenant' | 'ghost' | 'danger' = 'ghost';\n\n /* ── Outputs ────────────────────────────────────────────── */\n\n @Output() visibleChange = new EventEmitter<boolean>();\n @Output() showEvent = new EventEmitter<void>();\n @Output() hideEvent = new EventEmitter<void>();\n @Output() saveAction = new EventEmitter<void>();\n @Output() cancelAction = new EventEmitter<void>();\n /** Emits for every action in the dynamic `[actions]` footer. The\n * payload includes the action object and its index. */\n @Output() actionClick = new EventEmitter<{ action: EfDialogAction; index: number }>();\n\n /** ViewChild ref to the default-action footer template — used in the\n * `'primeng'` variant via [footerTemplate] input. */\n @ViewChild('defaultFooter', { static: true }) defaultFooterTpl?: TemplateRef<void>;\n\n /* ── Derived ────────────────────────────────────────────── */\n\n /** Severity → default header icon. Override per-instance with `[icon]`. */\n private static readonly SEV_ICONS: Record<EfDialogSeverity, string> = {\n danger: 'pi pi-trash',\n warn: 'pi pi-exclamation-triangle',\n info: 'pi pi-info-circle',\n success: 'pi pi-check',\n tenant: 'pi pi-bookmark-fill',\n default: '',\n };\n\n get effectiveStyleClass(): string {\n const parts: string[] = [];\n if (this.variant === 'comptoir') {\n parts.push('es-dialog', `es-dialog--${this.size}`);\n if (this.severity !== 'default') parts.push(`es-dialog--${this.severity}`);\n }\n if (this.styleClass) parts.push(this.styleClass);\n return parts.join(' ');\n }\n\n get effectiveTitle(): string {\n if (this.headerKey) return this.translate.instant(this.headerKey);\n return this.header ?? '';\n }\n\n get effectiveSubtitle(): string {\n if (this.subtitleKey) return this.translate.instant(this.subtitleKey);\n return this.subtitle ?? '';\n }\n\n get effectiveIcon(): string | null {\n if (this.icon) return this.icon;\n return EfDialogComponent.SEV_ICONS[this.severity] || null;\n }\n\n /** True when the dynamic `[actions]` path should render the footer. */\n get useDynamicActions(): boolean {\n return Array.isArray(this.actions) && this.actions.length > 0;\n }\n\n /** Whether any kind of footer should render at all. */\n get hasFooter(): boolean {\n return this.useDynamicActions || this.defaultActions;\n }\n\n actionLabel(a: EfDialogAction): string {\n if (a.labelKey) return this.translate.instant(a.labelKey);\n return a.label ?? '';\n }\n\n actionClass(a: EfDialogAction): string {\n const sev = a.severity ?? 'ghost';\n const variantClass = (\n sev === 'primary' ? 'btn-primary'\n : sev === 'tenant' ? 'btn-tenant'\n : sev === 'danger' ? 'btn-danger'\n : 'btn-ghost'\n );\n return `btn ${variantClass} btn-sm${a.loading ? ' is-loading' : ''}${a.styleClass ? ' ' + a.styleClass : ''}`;\n }\n\n /* ── Handlers ───────────────────────────────────────────── */\n\n handleActionClick(a: EfDialogAction, index: number): void {\n if (a.disabled || a.loading) return;\n this.actionClick.emit({ action: a, index });\n\n let result: unknown;\n try {\n result = a.command?.();\n } catch {\n // Consumer error handling lives in their `command`. Swallow here\n // so a throw doesn't leave the dialog wedged open.\n }\n\n const isThenable = result && typeof (result as Promise<unknown>).then === 'function';\n if (isThenable) {\n a.loading = true;\n (result as Promise<unknown>).finally(() => {\n a.loading = false;\n if (a.dismiss !== false) this.handleVisibleChange(false);\n });\n } else if (a.dismiss !== false) {\n this.handleVisibleChange(false);\n }\n }\n\n handleVisibleChange(value: boolean): void {\n this.visible = value;\n this.visibleChange.emit(value);\n }\n\n handleShow(): void { this.showEvent.emit(); }\n handleHide(): void { this.hideEvent.emit(); }\n\n /** Default cancel — emits and closes. */\n onDefaultCancel(): void {\n this.cancelAction.emit();\n this.handleVisibleChange(false);\n }\n\n /** Default save — emits only (consumer closes after success). */\n onDefaultSave(): void {\n if (this.saveDisabled) return;\n this.saveAction.emit();\n }\n}\n","<p-dialog\n [visible]=\"visible\"\n (visibleChange)=\"handleVisibleChange($event)\"\n [modal]=\"modal\"\n [draggable]=\"draggable\"\n [resizable]=\"resizable\"\n [dismissableMask]=\"dismissableMask\"\n [closeOnEscape]=\"closeOnEscape\"\n [style]=\"style\"\n [styleClass]=\"effectiveStyleClass\"\n [position]=\"position\"\n [appendTo]=\"appendTo\"\n [header]=\"variant === 'primeng' ? effectiveTitle : null\"\n [closable]=\"variant === 'primeng' ? closable : false\"\n [footerTemplate]=\"variant === 'primeng' && !useDynamicActions && defaultActions ? defaultFooterTpl : null\"\n (onShow)=\"handleShow()\"\n (onHide)=\"handleHide()\"\n>\n <!-- ─────────── COMPTOIR HEADER (content-child #header) ───────────\n Replaces PrimeNG's default header strip with our icon + title\n + subtitle + close X structure. Skipped in 'primeng' variant\n (which uses the [header] string input + native close). -->\n @if (variant === 'comptoir') {\n <ng-template #header>\n @if (effectiveIcon) {\n <span class=\"es-dialog__icon\" aria-hidden=\"true\">\n <i [class]=\"effectiveIcon\"></i>\n </span>\n }\n <div class=\"es-dialog__title-block\">\n <div class=\"es-dialog__title\">{{ effectiveTitle }}</div>\n @if (effectiveSubtitle) {\n <div class=\"es-dialog__sub\">{{ effectiveSubtitle }}</div>\n }\n </div>\n @if (closable) {\n <button\n type=\"button\"\n class=\"es-dialog__close\"\n [attr.aria-label]=\"'common_close' | translate\"\n (click)=\"handleVisibleChange(false)\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n }\n </ng-template>\n }\n\n <!-- Body — projected from <ef-dialog>…</ef-dialog> -->\n <ng-content />\n\n <!-- ─────────── COMPTOIR FOOTER (content-child #footer) ───────────\n Dynamic [actions] path takes precedence; falls back to the\n backward-compat save+cancel pair when defaultActions is on. -->\n @if (variant === 'comptoir' && hasFooter) {\n <ng-template #footer>\n @if (useDynamicActions) {\n @for (a of actions; track $index) {\n <button\n type=\"button\"\n [class]=\"actionClass(a)\"\n [disabled]=\"a.disabled || a.loading\"\n (click)=\"handleActionClick(a, $index)\"\n >\n @if (a.icon) {\n <i [class]=\"a.icon\"></i>\n }\n {{ actionLabel(a) }}\n </button>\n }\n } @else {\n <ef-button\n variant=\"comptoir\"\n [severity]=\"cancelSeverity\"\n [labelKey]=\"cancelLabelKey\"\n [label]=\"cancelLabel\"\n [icon]=\"cancelIcon\"\n [styleClass]=\"cancelStyleClass\"\n (clickEvent)=\"onDefaultCancel()\"\n />\n <ef-button\n variant=\"comptoir\"\n [severity]=\"saveSeverity\"\n [labelKey]=\"saveLabelKey\"\n [label]=\"saveLabel\"\n [icon]=\"saveIcon\"\n [styleClass]=\"saveStyleClass\"\n [disabled]=\"saveDisabled\"\n (clickEvent)=\"onDefaultSave()\"\n />\n }\n </ng-template>\n }\n</p-dialog>\n\n<!-- Default-action footer template for the 'primeng' variant (legacy path).\n Declared outside <p-dialog> because the comptoir branch above already\n provides its own content-child footer; this template is only consumed\n when variant === 'primeng' via [footerTemplate] input binding. -->\n<ng-template #defaultFooter>\n <ef-button\n variant=\"primeng\"\n [severity]=\"cancelSeverity\"\n [labelKey]=\"cancelLabelKey\"\n [label]=\"cancelLabel\"\n [icon]=\"cancelIcon\"\n [styleClass]=\"cancelStyleClass\"\n (clickEvent)=\"onDefaultCancel()\"\n />\n <ef-button\n variant=\"primeng\"\n [severity]=\"saveSeverity\"\n [labelKey]=\"saveLabelKey\"\n [label]=\"saveLabel\"\n [icon]=\"saveIcon\"\n [styleClass]=\"saveStyleClass\"\n [disabled]=\"saveDisabled\"\n (clickEvent)=\"onDefaultSave()\"\n />\n</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { EfCardComponent } from '../../layout/ef-card/ef-card.component';\nimport { EfDialogComponent } from '../../layout/ef-dialog/ef-dialog.component';\nimport { EfButtonComponent } from '../../layout/ef-button/ef-button.component';\nimport { EfChangeHistoryEntry } from './ef-change-history.types';\n\ninterface OpMeta {\n cls: string;\n}\n\n/** Built-in color class per standardized operation code — keeps the box\n * self-contained (no reference-data round-trip needed for the visual).\n * Dots are plain solid circles; only the color varies. */\nconst OP_META: Record<string, OpMeta> = {\n created: { cls: 'op-created' },\n updated: { cls: 'op-updated' },\n status_changed: { cls: 'op-status' },\n deleted: { cls: 'op-deleted' },\n note: { cls: 'op-note' },\n};\nconst DEFAULT_META: OpMeta = { cls: 'op-default' };\n\n/**\n * Standardized change-history box. Drop it on any detail screen and feed it the\n * record's audit entries (from `GET /api/audit/{entityType}/{id}` via the NSwag\n * `AuditClient`). Renders a vertical timeline inside an {@link EfCardComponent},\n * resolving operation labels through `audit_op_*` i18n keys and field labels\n * through `audit_field_*` (falling back to the raw field key when unmapped).\n *\n * ```html\n * <ef-change-history [entries]=\"auditEntries()\" />\n * ```\n */\n@Component({\n selector: 'ef-change-history',\n standalone: true,\n imports: [\n CommonModule,\n TranslateModule,\n EfCardComponent,\n EfDialogComponent,\n EfButtonComponent,\n ],\n templateUrl: './ef-change-history.component.html',\n styleUrl: './ef-change-history.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfChangeHistoryComponent {\n private readonly translate = inject(TranslateService);\n\n readonly entries = input<ReadonlyArray<EfChangeHistoryEntry>>([]);\n readonly titleKey = input<string>('audit_history_title');\n readonly emptyKey = input<string>('audit_empty');\n /** Cap the total rows considered (newest first). 0 = no cap. */\n readonly limit = input<number>(0);\n /** How many recent entries to show inline in the card. 0 = all. The rest\n * are reachable via the \"view details\" dialog. */\n readonly previewLimit = input<number>(3);\n /** Render inside a collapsible card. */\n readonly collapsible = input(true);\n /** Initial collapsed state — expanded by default. */\n readonly startCollapsed = input(false);\n\n /** \"Show more\" dialog visibility. */\n readonly dialogVisible = signal(false);\n\n /** First `previewLimit` rows shown inline in the card. */\n readonly previewRows = computed(() => {\n const all = this.rows();\n const n = this.previewLimit();\n return n > 0 ? all.slice(0, n) : all;\n });\n\n /** True when the full list has more entries than the inline preview. */\n readonly hasMore = computed(() => this.rows().length > this.previewRows().length);\n\n openDialog(event?: Event): void {\n event?.stopPropagation();\n this.dialogVisible.set(true);\n }\n\n readonly rows = computed(() => {\n const list = this.entries() ?? [];\n const limited = this.limit() > 0 ? list.slice(0, this.limit()) : list;\n return limited.map((entry) => {\n const op = entry.operation ?? '';\n return {\n entry,\n meta: OP_META[op] ?? DEFAULT_META,\n operationLabel: this.resolveLabel(`audit_op_${op}`, op),\n };\n });\n });\n\n /** Resolve a field key to its label. Adding an `audit_field_<field>` key is\n * OPTIONAL — when it's missing the raw field name is humanized\n * (`clientCode` → \"Client code\"), so new entities/fields work with zero\n * i18n maintenance. Add a key only for a properly localized (fr/ar) term. */\n fieldLabel(field: string | undefined): string {\n if (!field) return '';\n // Dotted paths (address.city, contacts.added) → underscore i18n key,\n // since ngx-translate treats dots as nested lookups.\n const key = `audit_field_${field.replace(/\\./g, '_')}`;\n return this.resolveLabel(key, field);\n }\n\n /** Returns the translation when present, otherwise a humanized fallback of\n * the source token (ngx-translate echoes the key on a miss). */\n private resolveLabel(key: string, source: string): string {\n const translated = this.translate.instant(key);\n return translated === key ? this.humanize(source) : translated;\n }\n\n /** `clientCode` / `status_changed` → \"Client code\" / \"Status changed\". */\n private humanize(token: string): string {\n const words = token\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[._-]+/g, ' ')\n .trim()\n .toLowerCase();\n return words ? words.charAt(0).toUpperCase() + words.slice(1) : '';\n }\n\n /** Locale-stable dd/MM/yyyy HH:mm — avoids depending on Angular locale data\n * registration (the app's default locale is fr-MA). */\n formatWhen(value: string | Date | null | undefined): string {\n if (!value) return '';\n const d = typeof value === 'string' ? new Date(value) : value;\n if (!d || isNaN(d.getTime())) return '';\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${pad(d.getDate())}/${pad(d.getMonth() + 1)}/${d.getFullYear()} ${pad(d.getHours())}:${pad(d.getMinutes())}`;\n }\n}\n","<ef-card\n [titleKey]=\"titleKey()\"\n [collapsible]=\"collapsible()\"\n [collapsed]=\"startCollapsed()\"\n>\n <ng-container head-extra>\n @if (hasMore()) {\n <ef-button\n variant=\"comptoir\"\n severity=\"ghost\"\n size=\"small\"\n icon=\"pi pi-window-maximize\"\n tooltipKey=\"audit_view_all\"\n (clickEvent)=\"openDialog($event)\"\n />\n }\n </ng-container>\n\n <ng-container\n *ngTemplateOutlet=\"timeline; context: { $implicit: previewRows(), compact: true }\"\n ></ng-container>\n\n @if (hasMore()) {\n <button type=\"button\" class=\"ch-more\" (click)=\"openDialog()\">\n {{ 'audit_view_all' | translate }} ({{ rows().length }})\n </button>\n }\n</ef-card>\n\n<!-- \"Show more\" dialog — full timeline, roomy + scrollable -->\n<ef-dialog\n [visible]=\"dialogVisible()\"\n (visibleChange)=\"dialogVisible.set($event)\"\n [headerKey]=\"titleKey()\"\n [defaultActions]=\"false\"\n size=\"lg\"\n [modal]=\"true\"\n position=\"center\"\n>\n <ng-container\n *ngTemplateOutlet=\"timeline; context: { $implicit: rows(), compact: false }\"\n ></ng-container>\n</ef-dialog>\n\n<ng-template #timeline let-items let-compact=\"compact\">\n @if (items.length === 0) {\n <p class=\"text-mute small\">{{ emptyKey() | translate }}</p>\n } @else {\n <div class=\"timeline\" [class.timeline--compact]=\"compact\">\n @for (row of items; track $index) {\n <div class=\"item\">\n <span class=\"dot\" [class]=\"row.meta.cls\" aria-hidden=\"true\"></span>\n <div class=\"body\">\n <div class=\"label\">{{ row.operationLabel }}</div>\n <div class=\"meta\">\n @if (row.entry.userName) {\n <span class=\"strong\">{{ row.entry.userName }}</span> ·\n }\n {{ formatWhen(row.entry.occurredAt) }}\n </div>\n\n @if (row.entry.operation === 'status_changed' && (row.entry.fromStatus || row.entry.toStatus)) {\n <div class=\"ch-status small\">\n <span class=\"text-mute\">{{ row.entry.fromStatus || '—' }}</span>\n <i class=\"pi pi-arrow-right\"></i>\n <span class=\"strong\">{{ row.entry.toStatus || '—' }}</span>\n </div>\n }\n\n @if (row.entry.changes?.length) {\n <ul class=\"ch-changes small\">\n @for (c of row.entry.changes; track c.field) {\n <li>\n <span class=\"ch-field\">{{ fieldLabel(c.field) }}</span>\n <span class=\"text-mute\">{{ c.oldValue || '—' }}</span>\n <i class=\"pi pi-arrow-right\"></i>\n <span class=\"strong\">{{ c.newValue || '—' }}</span>\n </li>\n }\n </ul>\n }\n\n @if (row.entry.note) {\n <div class=\"ch-note small\">{{ row.entry.note }}</div>\n }\n </div>\n </div>\n }\n </div>\n }\n</ng-template>\n","import {\n Component,\n ChangeDetectionStrategy,\n booleanAttribute,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport {\n HighlightSegment,\n ProductTypeaheadRow,\n ProductTypeaheadSelection,\n} from './ef-product-typeahead.component.types';\n\n/**\n * Keyboard-navigable product search. Filters products by display name,\n * highlights the match, exposes per-product variant chips, and emits the\n * chosen product + active variant + unit price. Pure input-driven — no API.\n *\n * @example\n * <ef-product-typeahead\n * [products]=\"products()\"\n * productKeyField=\"id\"\n * placeholderKey=\"label.search_product\"\n * (productSelect)=\"onPicked($event)\" />\n */\n@Component({\n selector: 'ef-product-typeahead',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, TranslateModule],\n templateUrl: './ef-product-typeahead.component.html',\n styleUrl: './ef-product-typeahead.component.scss',\n})\nexport class EfProductTypeaheadComponent {\n products = input.required<Record<string, unknown>[]>();\n productKeyField = input<string>('id');\n placeholderKey = input<string>('');\n disabled = input(false, { transform: booleanAttribute });\n currency = input<string>('MAD');\n locale = input<string>('fr-FR');\n /**\n * How variants are presented.\n * - `true` (default): compact — one row per product with inline variant\n * chips (e.g. `30ml` / `50ml`); clicking a chip switches the active\n * variant + price.\n * - `false`: V1 expanded — one row per active variant, with the variant\n * title composed into the label (`Name - 30ml`) and its own price.\n *\n * Display-only: the emitted `ProductTypeaheadSelection` (product + chosen\n * variant + unit price) is identical either way.\n */\n showVariants = input(true, { transform: booleanAttribute });\n\n productSelect = output<ProductTypeaheadSelection>();\n\n query = signal('');\n open = signal(false);\n highlightedIndex = signal(0);\n /** Map of product key -> chosen variant index (defaults to 0). */\n activeVariant = signal<Record<string, number>>({});\n\n private static norm(value: string): string {\n return value\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '');\n }\n\n rows = computed<ProductTypeaheadRow[]>(() => {\n const q = this.query().trim();\n if (q.length < 2) return [];\n const keyField = this.productKeyField();\n const nq = EfProductTypeaheadComponent.norm(q);\n const expand = !this.showVariants();\n\n return this.products()\n .flatMap((product) => {\n const baseLabel = (product['displayName'] ||\n product['name'] ||\n '') as string;\n const key = String(product[keyField]);\n const variants = (\n (product['variants'] as Record<string, unknown>[] | undefined) ?? []\n ).filter((v) => v['isActive'] !== false);\n\n // V1 expanded mode: one row per active variant, with the variant\n // title composed into the label and resolved as the row's sole\n // variant (so price + emitted payload follow it). A variant-less\n // product still yields one base row.\n if (expand && variants.length > 0) {\n return variants.map((variant, vi) => {\n const label = `${baseLabel} - ${variant['title']}`;\n const variantId = variant['variantId'];\n return {\n key: variantId != null ? `${key}:${variantId}` : `${key}:${vi}`,\n product,\n label,\n variants: [variant],\n segments: this.buildSegments(label, q),\n };\n });\n }\n\n // Compact mode (variant chips), or a product with no variants.\n return [\n {\n key,\n product,\n label: baseLabel,\n variants,\n segments: this.buildSegments(baseLabel, q),\n },\n ];\n })\n .filter((row) => EfProductTypeaheadComponent.norm(row.label).includes(nq));\n });\n\n buildSegments(label: string, query: string): HighlightSegment[] {\n const nLabel = EfProductTypeaheadComponent.norm(label);\n const nq = EfProductTypeaheadComponent.norm(query.trim());\n const at = nLabel.indexOf(nq);\n if (nq.length === 0 || at === -1) return [{ text: label, mark: false }];\n return [\n { text: label.slice(0, at), mark: false },\n { text: label.slice(at, at + nq.length), mark: true },\n { text: label.slice(at + nq.length), mark: false },\n ].filter((s) => s.text.length > 0);\n }\n\n onInput(value: string): void {\n this.query.set(value);\n this.open.set(true);\n this.highlightedIndex.set(0);\n }\n\n moveHighlight(delta: number): void {\n const max = this.rows().length - 1;\n if (max < 0) return;\n const next = Math.min(max, Math.max(0, this.highlightedIndex() + delta));\n this.highlightedIndex.set(next);\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.open.set(true);\n this.moveHighlight(1);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.moveHighlight(-1);\n } else if (event.key === 'Enter') {\n event.preventDefault();\n this.selectHighlighted();\n } else if (event.key === 'Escape') {\n this.open.set(false);\n }\n }\n\n /** Active variant index for a row (defaults to 0). */\n variantIndexOf(row: ProductTypeaheadRow): number {\n return this.activeVariant()[row.key] ?? 0;\n }\n\n variantOf(row: ProductTypeaheadRow): Record<string, unknown> | null {\n return row.variants[this.variantIndexOf(row)] ?? null;\n }\n\n priceOf(row: ProductTypeaheadRow): number {\n const variant = this.variantOf(row);\n return (variant?.['price'] ??\n row.product['unitPrice'] ??\n row.product['salePrice'] ??\n 0) as number;\n }\n\n setActiveVariant(row: ProductTypeaheadRow, index: number): void {\n this.activeVariant.update((m) => ({ ...m, [row.key]: index }));\n }\n\n selectRow(row: ProductTypeaheadRow): void {\n this.productSelect.emit({\n product: row.product,\n variant: this.variantOf(row),\n unitPrice: this.priceOf(row),\n });\n // Keep the picked product visible in the field (the bar fills; the\n // consumer adds the line explicitly). Just close the results menu.\n this.query.set(row.label);\n this.open.set(false);\n }\n\n selectHighlighted(): void {\n const row = this.rows()[this.highlightedIndex()];\n if (row) this.selectRow(row);\n }\n\n /** Clear the field after the consumer has consumed the selection. */\n reset(): void {\n this.query.set('');\n this.open.set(false);\n this.highlightedIndex.set(0);\n this.activeVariant.set({});\n }\n}\n","<div class=\"qa-combo\">\n <svg class=\"ic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"m20 20-3-3\" />\n </svg>\n <input\n class=\"input\"\n type=\"text\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-controls=\"qa-listbox\"\n [attr.aria-expanded]=\"open() && rows().length > 0\"\n [disabled]=\"disabled()\"\n [placeholder]=\"placeholderKey() ? (placeholderKey() | translate) : ''\"\n [ngModel]=\"query()\"\n (ngModelChange)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (focus)=\"open.set(true)\"\n (blur)=\"open.set(false)\" />\n\n @if (query() && !disabled()) {\n <button\n type=\"button\"\n class=\"qa-clear\"\n [attr.aria-label]=\"'action.clear' | translate\"\n (mousedown)=\"$event.preventDefault(); reset()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n }\n\n @if (open() && rows().length > 0) {\n <div id=\"qa-listbox\" class=\"qa-menu\" role=\"listbox\">\n <div class=\"grp\">{{ rows().length }} · « {{ query() }} »</div>\n @for (row of rows(); track row.key; let i = $index) {\n <div\n class=\"qa-opt\"\n role=\"option\"\n [attr.aria-selected]=\"i === highlightedIndex()\"\n [class.hl]=\"i === highlightedIndex()\"\n (mouseenter)=\"highlightedIndex.set(i)\"\n (mousedown)=\"$event.preventDefault(); selectRow(row)\">\n <span class=\"nm\">\n @for (seg of row.segments; track $index) {\n @if (seg.mark) { <mark>{{ seg.text }}</mark> } @else { {{ seg.text }} }\n }\n </span>\n <span class=\"var\">\n @if (showVariants()) {\n @for (variant of row.variants; track variant['variantId']; let vi = $index) {\n <span\n class=\"qa-chip\"\n [class.on]=\"vi === variantIndexOf(row)\"\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation(); setActiveVariant(row, vi)\">\n {{ variant['title'] }}\n </span>\n }\n }\n </span>\n <span class=\"px\">{{ priceOf(row) | number: '1.2-2' : locale() }}</span>\n </div>\n }\n <div class=\"qa-foot\">\n <span class=\"qa-hint\">\n <span class=\"kbd\">↑</span><span class=\"kbd\">↓</span>\n {{ 'order_builder.qa_navigate' | translate }} ·\n <span class=\"kbd\">↵</span> {{ 'order_builder.qa_add' | translate }}\n </span>\n </div>\n </div>\n }\n</div>\n","import {\n Component,\n computed,\n effect,\n input,\n model,\n OnInit,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport {\n DocumentConfig,\n OrderEntity,\n OrderLineItem,\n OrderLineItemHelper,\n OrderEntityHelper,\n OrderChangeInfo,\n ValidationResult,\n OrderProductsSummary,\n OrderSummaryItem,\n} from './ef-order-builder.component.types';\nimport { ProductCountGroupLabel } from '../ef-order-summary/ef-order-summary.component';\nimport { EfSelectComponent } from '../../forms/ef-select/ef-select.component';\nimport { EfDatepickerAdvancedComponent } from '../../forms/ef-datepicker-advanced/ef-datepicker-advanced.component';\nimport { EfInputNumberComponent } from '../../forms/ef-inputnumber/ef-inputnumber.component';\nimport { EfQuantityStepperComponent } from '../../forms/ef-quantity-stepper/ef-quantity-stepper.component';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { EfButtonComponent } from '../../layout/ef-button/ef-button.component';\nimport { EfCardComponent } from '../../layout/ef-card/ef-card.component';\nimport { EfChangeHistoryComponent } from '../../data/ef-change-history/ef-change-history.component';\nimport { EfChangeHistoryEntry } from '../../data/ef-change-history/ef-change-history.types';\nimport { EfProductTypeaheadComponent } from '../ef-product-typeahead/ef-product-typeahead.component';\nimport { ProductTypeaheadSelection } from '../ef-product-typeahead/ef-product-typeahead.component.types';\nimport { UuidUtils } from '@elasticias/utils';\n\n/**\n * Reusable order builder component for orders, invoices, and quotes\n * Manages complete order entity with automatic change tracking\n *\n * @example\n * <ef-order-builder\n * [(order)]=\"orderEntity\"\n * [config]=\"documentConfig\"\n * [products]=\"products\"\n * [customers]=\"customers\"\n * (openCatalogue)=\"handleCatalogueOpen()\"\n * (orderChanged)=\"handleOrderChange($event)\"\n * />\n */\n/** Numeric line columns that support inline click-to-edit. */\ntype EditableLineField = 'price' | 'qty' | 'discount' | 'tva';\n\n@Component({\n selector: 'ef-order-builder',\n standalone: true,\n templateUrl: 'ef-order-builder.component.html',\n styleUrl: 'ef-order-builder.component.scss',\n imports: [\n CommonModule,\n FormsModule,\n TranslateModule,\n EfSelectComponent,\n EfDatepickerAdvancedComponent,\n EfInputNumberComponent,\n EfQuantityStepperComponent,\n EfLabelComponent,\n EfButtonComponent,\n EfCardComponent,\n EfChangeHistoryComponent,\n EfProductTypeaheadComponent,\n ],\n})\nexport class EfOrderBuilderComponent implements OnInit {\n rowTrackBy = (_: number, item: OrderLineItem) => item.id;\n\n config = input<DocumentConfig>({\n documentType: 'order',\n headerLabel: 'Commande',\n dateLabel: 'Date de commande',\n customerLabel: 'Client',\n enableTax: false,\n enableDiscount: true,\n showCatalogue: false,\n allowInlineEdit: true,\n currencyCode: 'MAD',\n locale: 'fr-FR',\n });\n\n order = model.required<OrderEntity>();\n products = input.required<Record<string, unknown>[]>();\n customers = input.required<Record<string, unknown>[]>();\n readonly = input<boolean>(false);\n countGroupLabels = input<ProductCountGroupLabel[]>([]);\n /** Field name used to identify products (must match catalogue's trackByField) */\n productKeyField = input<string>('id');\n backendErrors = input<{ [key: string]: string[] }>({});\n\n /** Optional change-history entries; when non-empty the Historique rail card renders. */\n auditEntries = input<EfChangeHistoryEntry[]>([]);\n\n openCatalogue = output<void>();\n orderChanged = output<OrderChangeInfo>();\n orderValidated = output<ValidationResult>();\n productsAdded = output<OrderLineItem[]>();\n\n private originalOrder = signal<OrderEntity | null>(null);\n private initialized = signal(false);\n\n quickAddSelection = signal<ProductTypeaheadSelection | null>(null);\n quickAddPrice = signal<number>(0);\n quickAddQuantity = signal<number>(1);\n\n quickAddDisabled = computed(\n () =>\n this.quickAddSelection() === null || (this.quickAddQuantity() ?? 0) <= 0,\n );\n\n orderLines = computed(() => this.order().orderLines || []);\n\n grossTotal = computed(() => {\n return this.orderLines().reduce((total, item) => {\n return total + (item.productUnitPrice || 0) * (item.quantity || 0);\n }, 0);\n });\n\n discountTotal = computed(() => {\n return this.orderLines().reduce((total, item) => {\n const itemTotal = (item.productUnitPrice || 0) * (item.quantity || 0);\n const discount = item.discount || 0;\n return total + (itemTotal * discount) / 100;\n }, 0);\n });\n\n tvaTotal = computed(() => {\n return this.orderLines().reduce((total, item) => {\n return total + (item.taxAmount || 0);\n }, 0);\n });\n\n finalTotal = computed(() => {\n return this.grossTotal() - this.discountTotal() + this.tvaTotal();\n });\n\n currency = computed(() => this.config().currencyCode || 'MAD');\n locale = computed(() => this.config().locale || 'fr-FR');\n hasItems = computed(() => this.orderLines().length > 0);\n\n productsSummary = computed<OrderProductsSummary>(() => {\n const lines = this.orderLines();\n const labels = this.countGroupLabels();\n const countMap = new Map<string, number>();\n\n lines.forEach((line) => {\n const product = line.product as { countGroup?: string };\n const countGroup = line.countGroup || product?.countGroup;\n\n if (countGroup) {\n const currentCount = countMap.get(countGroup) || 0;\n countMap.set(countGroup, currentCount + (line.quantity || 0));\n }\n });\n\n const items: OrderSummaryItem[] = [];\n\n countMap.forEach((count, code) => {\n const labelItem = labels.find(\n (l) => l.code.toUpperCase() === code.toUpperCase(),\n );\n items.push({\n code,\n label: labelItem?.label || code,\n count,\n column: labelItem?.column ?? 1,\n });\n });\n\n items.sort((a, b) => {\n const labelA = labels.find((l) => l.code === a.code);\n const labelB = labels.find((l) => l.code === b.code);\n const orderA = labelA?.sortOrder ?? 999;\n const orderB = labelB?.sortOrder ?? 999;\n return orderA - orderB;\n });\n\n const totalCount = items.reduce((sum, item) => sum + item.count, 0);\n\n return { items, totalCount };\n });\n\n validationResult = computed(() => {\n return OrderEntityHelper.validate(this.order());\n });\n\n combinedErrors = computed(() => {\n const clientErrors = this.validationResult().errors;\n const serverErrors = this.backendErrors();\n return { ...clientErrors, ...serverErrors };\n });\n\n hasErrors = computed(() => Object.keys(this.combinedErrors()).length > 0);\n\n isValid = computed(\n () =>\n this.validationResult().isValid &&\n Object.keys(this.backendErrors()).length === 0,\n );\n\n changeInfo = computed<OrderChangeInfo | null>(() => {\n const original = this.originalOrder();\n if (!original || !this.initialized()) return null;\n\n return OrderEntityHelper.detectChanges(original, this.order());\n });\n\n hasChanges = computed(() => this.changeInfo()?.hasChanges ?? false);\n\n focusMode = model(true);\n railOpen = signal(false);\n\n /**\n * Inline cell editing — lines render their numeric values as read-only text\n * until the user clicks a value, which swaps just that cell to an input\n * (V1 behaviour). One cell is editable at a time; blur / Enter / Escape /\n * Tab commits and returns the cell to display.\n */\n editingCell = signal<{\n id: OrderLineItem['id'];\n field: EditableLineField;\n } | null>(null);\n\n /** Number of table columns, used for the empty-state colspan. */\n colCount = computed(\n () =>\n 5 +\n (this.config().enableDiscount ? 1 : 0) +\n (this.config().enableTax ? 1 : 0),\n );\n\n isEditingCell(item: OrderLineItem, field: EditableLineField): boolean {\n const cell = this.editingCell();\n return cell !== null && cell.id === item.id && cell.field === field;\n }\n\n startEditCell(item: OrderLineItem, field: EditableLineField): void {\n if (this.readonly()) return;\n this.editingCell.set({ id: item.id, field });\n }\n\n stopEditCell(): void {\n this.editingCell.set(null);\n }\n\n onEditCellKeydown(event: KeyboardEvent): void {\n if (\n event.key === 'Enter' ||\n event.key === 'Escape' ||\n event.key === 'Tab'\n ) {\n this.stopEditCell();\n }\n }\n\n toggleFocus(): void {\n this.focusMode.update((v) => !v);\n }\n toggleRail(open?: boolean): void {\n this.railOpen.set(open ?? !this.railOpen());\n }\n\n hasAudit = computed(() => this.auditEntries().length > 0);\n\n /** Récap items grouped into columns (column index from reference data). */\n recapColumns = computed<OrderSummaryItem[][]>(() => {\n const items = this.productsSummary().items;\n const byCol = new Map<number, OrderSummaryItem[]>();\n for (const it of items) {\n const col = it.column ?? 1;\n if (!byCol.has(col)) byCol.set(col, []);\n byCol.get(col)!.push(it);\n }\n return [...byCol.keys()].sort((a, b) => a - b).map((k) => byCol.get(k)!);\n });\n\n constructor() {\n effect(() => {\n if (!this.initialized()) return;\n\n const updatedOrder = OrderEntityHelper.calculateTotals(this.order());\n const summary = this.productsSummary();\n\n if (\n updatedOrder.grossTotal !== this.order().grossTotal ||\n updatedOrder.discountTotal !== this.order().discountTotal ||\n updatedOrder.taxTotal !== this.order().taxTotal ||\n updatedOrder.finalTotal !== this.order().finalTotal ||\n JSON.stringify(updatedOrder.productsSummary) !== JSON.stringify(summary)\n ) {\n this.order.set({ ...updatedOrder, productsSummary: summary });\n }\n });\n\n effect(() => {\n const info = this.changeInfo();\n if (info && info.hasChanges) {\n this.orderChanged.emit(info);\n }\n });\n\n effect(() => {\n if (!this.initialized()) return;\n\n const validation = this.validationResult();\n this.orderValidated.emit(validation);\n });\n }\n\n ngOnInit(): void {\n this.originalOrder.set(OrderEntityHelper.clone(this.order()));\n this.initialized.set(true);\n }\n\n removeOrderLine(id: string | number | undefined): void {\n if (this.readonly() || id === undefined) return;\n\n const updatedItems = this.orderLines().filter((item) => item.id !== id);\n this.updateOrderLines(updatedItems);\n }\n\n onFieldChange(item: OrderLineItem): void {\n const updatedItem = OrderLineItemHelper.updateCalculations(item);\n Object.assign(item, updatedItem);\n this.updateOrderLines([...this.orderLines()]);\n }\n\n calculateSubtotal(item: OrderLineItem): number {\n return OrderLineItemHelper.calculateSubtotal(item);\n }\n\n handleOpenCatalogue(): void {\n if (this.readonly()) return;\n this.openCatalogue.emit();\n }\n\n private readonly typeahead = viewChild(EfProductTypeaheadComponent);\n\n /**\n * Fill the quick-add bar from a typeahead pick. Does NOT add the line —\n * the user reviews price/quantity then clicks \"Ajouter\" (addQuickProduct).\n */\n onTypeaheadSelect(selection: ProductTypeaheadSelection): void {\n if (this.readonly()) return;\n this.quickAddSelection.set(selection);\n this.quickAddPrice.set(selection.unitPrice);\n }\n\n addQuickProduct(): void {\n const selection = this.quickAddSelection();\n if (\n this.readonly() ||\n selection === null ||\n (this.quickAddQuantity() ?? 0) <= 0\n ) {\n return;\n }\n const variantId =\n (selection.variant?.['variantId'] as string | undefined) ?? undefined;\n const newItem = OrderLineItemHelper.createFromProduct(\n selection.product,\n this.quickAddQuantity(),\n this.productKeyField(),\n variantId,\n );\n const overridden = OrderLineItemHelper.updateCalculations({\n ...newItem,\n productUnitPrice: this.quickAddPrice(),\n });\n this.updateOrderLines([...this.orderLines(), overridden]);\n this.productsAdded.emit([overridden]);\n\n this.quickAddSelection.set(null);\n this.quickAddPrice.set(0);\n this.quickAddQuantity.set(1);\n this.typeahead()?.reset();\n }\n\n addProductsFromCatalogue(\n selectedProducts: Array<{\n product: Record<string, unknown>;\n quantity: number;\n variantId?: string;\n }>,\n ): void {\n if (this.readonly() || !selectedProducts || selectedProducts.length === 0) {\n return;\n }\n\n const currentItems = [...this.orderLines()];\n const addedItems: OrderLineItem[] = [];\n\n const keyField = this.productKeyField();\n\n selectedProducts.forEach(({ product, quantity, variantId }) => {\n const productKeyValue = product[keyField];\n // Match by both productId AND variantId to avoid merging different variants\n const existingIndex = currentItems.findIndex(\n (item) =>\n item.productId === productKeyValue &&\n item.variantId === (variantId ?? null),\n );\n\n if (existingIndex !== -1) {\n // The catalogue is seeded with current order lines via\n // `initialSelectedItems` and shows live steppers, so the emitted\n // selection represents the desired final quantity for each product\n // — replace rather than add, otherwise reopening the catalogue and\n // re-validating doubles every previously-selected line.\n const existing = currentItems[existingIndex];\n const updated = OrderLineItemHelper.updateCalculations({\n ...existing,\n quantity,\n });\n currentItems[existingIndex] = updated;\n } else {\n const newItem = OrderLineItemHelper.createFromProduct(\n product,\n quantity,\n keyField,\n variantId,\n );\n currentItems.push(newItem);\n addedItems.push(newItem);\n }\n });\n\n this.updateOrderLines(currentItems);\n\n if (addedItems.length > 0) {\n this.productsAdded.emit(addedItems);\n }\n }\n\n updateCustomer(customerId: string | null): void {\n if (this.readonly()) return;\n\n this.order.update((order) => ({\n ...order,\n customerId,\n customerName: this.getCustomerName(customerId),\n }));\n }\n\n updateOrderDate(date: Date): void {\n if (this.readonly()) return;\n\n this.order.update((order) => ({\n ...order,\n orderDate: date,\n }));\n }\n\n updateDeliveryDate(date: Date | null): void {\n if (this.readonly()) return;\n\n this.order.update((order) => ({\n ...order,\n deliveryDate: date,\n }));\n }\n\n updateNotes(notes: string): void {\n if (this.readonly()) return;\n\n this.order.update((order) => ({\n ...order,\n notes,\n }));\n }\n\n resetChanges(): void {\n const original = this.originalOrder();\n if (original) {\n this.order.set(OrderEntityHelper.clone(original));\n }\n }\n\n markAsSaved(): void {\n this.originalOrder.set(OrderEntityHelper.clone(this.order()));\n }\n\n validate(): ValidationResult {\n return this.validationResult();\n }\n\n private updateOrderLines(items: OrderLineItem[]): void {\n this.order.update((order) => ({\n ...order,\n orderLines: items,\n }));\n }\n\n private getCustomerName(customerId: string | null): string | undefined {\n if (!customerId) return undefined;\n\n const customer = this.customers().find(\n (c) => c['customerId'] === customerId,\n );\n return (customer?.['companyName'] || customer?.['name']) as\n | string\n | undefined;\n }\n\n getProduct(productId: unknown): Record<string, unknown> | undefined {\n const field = this.productKeyField();\n return this.products().find((p) => p[field] === productId);\n }\n\n getCustomer(customerId: string): Record<string, unknown> | undefined {\n return this.customers().find((c) => c['customerId'] === customerId);\n }\n\n initializeOrderLines(): void {\n const items = this.order().orderLines || [];\n\n const initializedItems = items.map((item: OrderLineItem) => {\n let product = item.product;\n\n if (item.productId && !item.product) {\n product = this.getProduct(item.productId);\n }\n\n if (product && !item.productDescription) {\n const variants = product['variants'] as\n | Array<Record<string, unknown>>\n | undefined;\n const variant =\n item.variantId && variants?.length\n ? variants.find((v) => v['variantId'] === item.variantId)\n : undefined;\n item.productDescription = OrderLineItemHelper.composeDescription(\n product,\n variant,\n );\n }\n\n return OrderLineItemHelper.updateCalculations({\n ...item,\n product,\n id: item.id || UuidUtils.randomUUID(),\n isEditing: item.isEditing ?? false,\n editingField: item.editingField ?? null,\n });\n });\n\n this.updateOrderLines(initializedItems);\n }\n\n getTotals() {\n return {\n grossTotal: this.grossTotal(),\n discountTotal: this.discountTotal(),\n tvaTotal: this.tvaTotal(),\n finalTotal: this.finalTotal(),\n };\n }\n\n exportOrder(): OrderEntity {\n return OrderEntityHelper.calculateTotals(this.order());\n }\n}\n","<div\n class=\"order-builder\"\n [class.ob-collapsed]=\"focusMode()\"\n [class.ob-rail-open]=\"railOpen()\">\n <div class=\"ob-grid\">\n <div class=\"ob-main\">\n <!-- Order header: customer + date + express add (one card) -->\n <ef-card\n titleKey=\"order_builder.section_order\"\n [metaKey]=\"readonly() ? '' : 'order_builder.quick_add_hint'\"\n [overflowVisible]=\"true\">\n <div class=\"ob-order-head\">\n <div class=\"form-grid\">\n <div class=\"field col-6\">\n <ef-label labelKey=\"label.customer\" for=\"ob-cust\" [required]=\"true\" />\n <ef-select\n inputId=\"ob-cust\"\n [options]=\"customers()\"\n optionLabel=\"companyName\"\n optionValue=\"customerId\"\n [ngModel]=\"order().customerId\"\n (ngModelChange)=\"updateCustomer($event)\"\n [disabled]=\"readonly()\"\n [showClear]=\"true\"\n [filter]=\"true\"\n filterBy=\"companyName\"\n filterPlaceholderKey=\"label.search_customer\"\n appendTo=\"body\"\n placeholderKey=\"label.select_customer\" />\n </div>\n <div class=\"field col-3\">\n <ef-label labelKey=\"label.order_date\" for=\"ob-date\" [required]=\"true\" />\n <ef-datepicker-advanced\n mode=\"field\"\n selectionMode=\"single\"\n inputId=\"ob-date\"\n placeholderKey=\"date_select_date\"\n [ngModel]=\"order().orderDate\"\n (ngModelChange)=\"updateOrderDate($event)\"\n [disabled]=\"readonly()\" />\n </div>\n </div>\n\n @if (!readonly()) {\n <div class=\"qa-grid\">\n <div class=\"qa-combo-wrap\">\n <ef-label labelKey=\"label.article\" />\n <ef-product-typeahead\n [products]=\"products()\"\n [productKeyField]=\"productKeyField()\"\n placeholderKey=\"label.search_product\"\n [currency]=\"currency()\"\n [locale]=\"locale()\"\n (productSelect)=\"onTypeaheadSelect($event)\"\n [showVariants]=\"false\" />\n </div>\n <div class=\"qa-price\">\n <ef-label labelKey=\"label.sale_price\" />\n <ef-inputnumber\n variant=\"comptoir\"\n [value]=\"quickAddPrice()\"\n (valueChangeEvent)=\"quickAddPrice.set($event ?? 0)\"\n [minFractionDigits]=\"2\"\n [maxFractionDigits]=\"2\"\n [locale]=\"locale()\"\n [disabled]=\"readonly()\" />\n </div>\n <div class=\"qa-qtyf\">\n <ef-label labelKey=\"label.quantity\" />\n <ef-inputnumber\n variant=\"comptoir\"\n [ngModel]=\"quickAddQuantity()\"\n (ngModelChange)=\"quickAddQuantity.set($event)\"\n [min]=\"0\"\n [maxFractionDigits]=\"4\"\n [locale]=\"locale()\"\n [disabled]=\"readonly()\"\n />\n </div>\n <div class=\"qa-go\">\n <ef-button\n labelKey=\"action.add\"\n icon=\"pi pi-plus\"\n variant=\"comptoir\"\n severity=\"tenant\"\n [disabled]=\"quickAddDisabled()\"\n (clickEvent)=\"addQuickProduct()\" />\n </div>\n </div>\n }\n </div>\n </ef-card>\n\n <!-- Lines -->\n <ef-card titleKey=\"order_builder.lines\" [meta]=\"'· ' + orderLines().length\">\n <div head-extra class=\"head-actions\">\n @if (config().showCatalogue && !readonly()) {\n <ef-button\n labelKey=\"action.open_catalogue\"\n icon=\"pi pi-box\"\n severity=\"secondary\"\n [text]=\"true\"\n (clickEvent)=\"handleOpenCatalogue()\" />\n }\n <ef-button\n [labelKey]=\"focusMode() ? 'order_builder.show_summary' : 'order_builder.fullscreen'\"\n icon=\"pi pi-window-maximize\"\n severity=\"secondary\"\n [text]=\"true\"\n (clickEvent)=\"toggleFocus()\" />\n </div>\n\n <table class=\"ob-tbl\">\n <thead>\n <tr>\n <th class=\"col-prod\">{{ 'label.article' | translate }}</th>\n <th>{{ 'label.sale_price' | translate }}</th>\n <th>{{ 'label.quantity' | translate }}</th>\n @if (config().enableDiscount) {\n <th>{{ 'label.discount' | translate }}</th>\n }\n @if (config().enableTax) {\n <th>{{ 'order_builder.tax' | translate }}</th>\n }\n <th>{{ 'label.subtotal' | translate }}</th>\n <th class=\"col-act\"></th>\n </tr>\n </thead>\n <tbody>\n @for (item of orderLines(); track item.id; let i = $index) {\n <tr>\n <td class=\"col-prod\">\n <div class=\"p\">\n <span class=\"ln\">{{ i + 1 }}</span>\n <span class=\"pp\">\n <span class=\"nm\">{{ item.productDescription }}</span>\n </span>\n </div>\n </td>\n <td class=\"num w-[120px]\">\n @if (!readonly() && isEditingCell(item, 'price')) {\n <ef-inputnumber\n [(ngModel)]=\"item.productUnitPrice\"\n (ngModelChange)=\"onFieldChange(item)\"\n [showClear]=\"false\"\n [autofocus]=\"true\"\n (blurEvent)=\"stopEditCell()\"\n (keyDownEvent)=\"onEditCellKeydown($event)\"\n [min]=\"0\"\n [minFractionDigits]=\"2\"\n [maxFractionDigits]=\"2\"\n [locale]=\"locale()\"\n size=\"small\"\n class=\"!text-end\" />\n } @else {\n <button\n type=\"button\"\n class=\"ln-val\"\n [disabled]=\"readonly()\"\n (click)=\"startEditCell(item, 'price')\">\n {{ item.productUnitPrice | number: '1.2-2' : locale() }}\n </button>\n }\n </td>\n <td class=\"num w-[120px]\">\n @if (!readonly() && isEditingCell(item, 'qty')) {\n <ef-inputnumber\n [(ngModel)]=\"item.quantity\"\n (ngModelChange)=\"onFieldChange(item)\"\n [showClear]=\"false\"\n [autofocus]=\"true\"\n (blurEvent)=\"stopEditCell()\"\n (keyDownEvent)=\"onEditCellKeydown($event)\"\n [min]=\"0\"\n [maxFractionDigits]=\"4\"\n [locale]=\"locale()\"\n size=\"small\"\n class=\"!text-end\" />\n } @else {\n <button\n type=\"button\"\n class=\"ln-val\"\n [disabled]=\"readonly()\"\n (click)=\"startEditCell(item, 'qty')\">\n {{ item.quantity | number: '1.0-4' : locale() }}\n </button>\n }\n </td>\n @if (config().enableDiscount) {\n <td class=\"num w-[80px]\">\n @if (!readonly() && isEditingCell(item, 'discount')) {\n <ef-inputnumber\n [(ngModel)]=\"item.discount\"\n (ngModelChange)=\"onFieldChange(item)\"\n [showClear]=\"false\"\n [autofocus]=\"true\"\n (blurEvent)=\"stopEditCell()\"\n (keyDownEvent)=\"onEditCellKeydown($event)\"\n [min]=\"0\"\n [max]=\"100\"\n [maxFractionDigits]=\"2\"\n suffix=\" %\"\n [locale]=\"locale()\"\n size=\"small\"\n class=\"!text-end\" />\n } @else {\n <button\n type=\"button\"\n class=\"ln-val\"\n [disabled]=\"readonly()\"\n (click)=\"startEditCell(item, 'discount')\">\n {{ item.discount | number: '1.0-2' : locale() }} %\n </button>\n }\n </td>\n }\n @if (config().enableTax) {\n <td class=\"num w-[80px]\">\n @if (!readonly() && isEditingCell(item, 'tva')) {\n <ef-inputnumber\n [(ngModel)]=\"item.taxRate\"\n (ngModelChange)=\"onFieldChange(item)\"\n [showClear]=\"false\"\n [autofocus]=\"true\"\n (blurEvent)=\"stopEditCell()\"\n (keyDownEvent)=\"onEditCellKeydown($event)\"\n [min]=\"0\"\n [max]=\"100\"\n [maxFractionDigits]=\"2\"\n suffix=\" %\"\n [locale]=\"locale()\"\n size=\"small\"\n class=\"!text-end\" />\n } @else {\n <button\n type=\"button\"\n class=\"ln-val\"\n [disabled]=\"readonly()\"\n (click)=\"startEditCell(item, 'tva')\">\n {{ (item.taxRate ?? 0) | number: '1.0-2' : locale() }} %\n </button>\n }\n </td>\n }\n <td class=\"total\">\n {{ calculateSubtotal(item) | number: '1.2-2' : locale() }}\n </td>\n <td class=\"col-act\">\n @if (!readonly()) {\n <ef-button\n icon=\"pi pi-trash\"\n severity=\"danger\"\n [text]=\"true\"\n styleClass=\"ob-del\"\n (clickEvent)=\"removeOrderLine(item.id)\" />\n }\n </td>\n </tr>\n } @empty {\n <tr>\n <td [attr.colspan]=\"colCount()\">\n <div class=\"ob-empty\">{{ 'order_builder.empty' | translate }}</div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </ef-card>\n </div>\n\n <!-- CONTEXT RAIL (1/3) -->\n <aside class=\"ob-rail\">\n <!-- Totaux (top) -->\n <ef-card titleKey=\"order_builder.totals\" [meta]=\"currency()\">\n <div class=\"ob-totals\">\n <div class=\"row\">\n <span class=\"lbl\">{{ 'order_builder.gross' | translate }}</span>\n <span class=\"v\">{{ grossTotal() | number: '1.2-2' : locale() }}</span>\n </div>\n <div class=\"row discount\">\n <span class=\"lbl\">{{ 'order_builder.discount' | translate }}</span>\n <span class=\"v\">−{{ discountTotal() | number: '1.2-2' : locale() }}</span>\n </div>\n <div class=\"row\">\n <span class=\"lbl\">{{ 'order_builder.tax' | translate }}</span>\n <span class=\"v\">{{ tvaTotal() | number: '1.2-2' : locale() }}</span>\n </div>\n <hr />\n <div class=\"row grand\">\n <span class=\"lbl\">{{ 'order_builder.grand_total' | translate }}</span>\n <span class=\"v\">{{ finalTotal() | number: '1.2-2' : locale() }}<span class=\"cur\">{{ currency() }}</span></span>\n </div>\n </div>\n </ef-card>\n\n <!-- Récapitulatif par format -->\n @if (productsSummary().items.length > 0) {\n <ef-card titleKey=\"order_builder.recap\" metaKey=\"order_builder.auto\">\n <div class=\"ob-recap\">\n <div class=\"cols\">\n @for (col of recapColumns(); track $index) {\n <div class=\"grp\">\n @for (seg of col; track seg.code) {\n <div class=\"seg\">\n <span class=\"fmt\">{{ seg.label }}</span>\n <span class=\"n\">{{ seg.count | number: '1.0-0' : locale() }}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"tot\">\n <span class=\"l\">{{ 'order_builder.total_units' | translate }}</span>\n <span class=\"n\">{{ productsSummary().totalCount | number: '1.0-0' : locale() }}</span>\n </div>\n </div>\n </ef-card>\n }\n\n <!-- Historique (optional, component-owned) -->\n @if (hasAudit()) {\n <ef-change-history [entries]=\"auditEntries()\" />\n }\n </aside>\n </div>\n\n <!-- Floating summary FAB + backdrop -->\n <button type=\"button\" class=\"ob-backdrop\" aria-hidden=\"true\" tabindex=\"-1\" (click)=\"toggleRail(false)\"></button>\n <div class=\"ob-fab\" role=\"status\">\n <div class=\"ft\">\n <span class=\"k\">{{ 'order_builder.total_units' | translate }} · {{ productsSummary().totalCount }}</span>\n <span class=\"vv\">{{ finalTotal() | number: '1.2-2' : locale() }}<span class=\"cur\">{{ currency() }}</span></span>\n </div>\n <button type=\"button\" class=\"open\" (click)=\"toggleRail(true)\">\n {{ 'order_builder.summary' | translate }}\n </button>\n </div>\n</div>\n","import { Component, computed, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FieldsetModule } from 'primeng/fieldset';\nimport { OrderLineItem } from '../ef-order-builder/ef-order-builder.component.types';\n\n/**\n * Product count group entry for displaying grouped counts\n */\nexport interface ProductCountGroup {\n code: string;\n label: string;\n count: number;\n column: number;\n}\n\n/**\n * Reference data item for product count group labels\n */\nexport interface ProductCountGroupLabel {\n code: string;\n label: string;\n description?: string;\n isActive?: boolean;\n sortOrder?: number;\n column?: number;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Product with countGroup field\n */\nexport interface ProductWithCountGroup {\n countGroup?: string;\n [key: string]: unknown;\n}\n\n/**\n * Displays a summary of product quantities grouped by their countGroup field.\n * Maps countGroup codes to labels from product_count_group_labels reference data.\n *\n * @example\n * <ef-order-summary\n * [orderLines]=\"orderLines()\"\n * [countGroupLabels]=\"countGroupLabels\"\n * />\n */\n@Component({\n selector: 'ef-order-summary',\n standalone: true,\n imports: [CommonModule, FieldsetModule],\n templateUrl: './ef-order-summary.component.html',\n styleUrl: './ef-order-summary.component.scss',\n})\nexport class EfOrderSummaryComponent {\n /**\n * Order line items to summarize\n */\n orderLines = input.required<OrderLineItem[]>();\n\n /**\n * Product count group labels from reference data\n */\n countGroupLabels = input<ProductCountGroupLabel[]>([]);\n\n /**\n * Legend text for the fieldset\n */\n legend = input<string>('Récapitulatif');\n\n /**\n * Computed grouped counts by countGroup\n */\n groupedCounts = computed<ProductCountGroup[]>(() => {\n const lines = this.orderLines();\n const labels = this.countGroupLabels();\n\n const countMap = new Map<string, number>();\n\n lines.forEach((line) => {\n const product = line.product as ProductWithCountGroup;\n const countGroup = (line as { countGroup?: string }).countGroup || product?.countGroup;\n\n if (countGroup) {\n const currentCount = countMap.get(countGroup) || 0;\n countMap.set(countGroup, currentCount + (line.quantity || 0));\n }\n });\n\n const groups: ProductCountGroup[] = [];\n\n countMap.forEach((count, code) => {\n const labelItem = labels.find(\n (l) => l.code.toUpperCase() === code.toUpperCase(),\n );\n groups.push({\n code,\n label: labelItem?.label || code,\n count,\n column: labelItem?.column ?? 1,\n });\n });\n\n // Sort by the sortOrder from labels, then by label alphabetically\n groups.sort((a, b) => {\n const labelA = labels.find(\n (l) => l.code.toUpperCase() === a.code.toUpperCase(),\n );\n const labelB = labels.find(\n (l) => l.code.toUpperCase() === b.code.toUpperCase(),\n );\n const orderA = labelA?.sortOrder ?? 999;\n const orderB = labelB?.sortOrder ?? 999;\n\n if (orderA !== orderB) {\n return orderA - orderB;\n }\n return a.label.localeCompare(b.label);\n });\n\n return groups;\n });\n\n /**\n * Total quantity across all groups\n */\n totalCount = computed(() => {\n return this.groupedCounts().reduce((sum, group) => sum + group.count, 0);\n });\n\n /**\n * Split groups into columns based on column field from reference data\n */\n columnGroups = computed(() => {\n const groups = this.groupedCounts();\n const columnMap = new Map<number, ProductCountGroup[]>();\n\n groups.forEach((group) => {\n const colIndex = group.column;\n if (!columnMap.has(colIndex)) {\n columnMap.set(colIndex, []);\n }\n const col = columnMap.get(colIndex);\n if (col) {\n col.push(group);\n }\n });\n\n // Sort columns by key and return as array\n const sortedKeys = Array.from(columnMap.keys()).sort((a, b) => a - b);\n return sortedKeys.map((key) => columnMap.get(key) as ProductCountGroup[]);\n });\n\n /**\n * Check if there are any groups to display\n */\n hasGroups = computed(() => this.groupedCounts().length > 0);\n}\n","@if (hasGroups()) {\n <p-fieldset [legend]=\"legend()\">\n <div class=\"ef-order-summary\">\n <div class=\"ef-order-summary__content\">\n @for (column of columnGroups(); track $index) {\n <div class=\"ef-order-summary__column\">\n @for (group of column; track group.code) {\n <div class=\"ef-order-summary__item\">\n <span class=\"ef-order-summary__label\">{{ group.label }}:</span>\n <span class=\"ef-order-summary__count\">{{ group.count }}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"ef-order-summary__footer\">\n <span class=\"ef-order-summary__total-label\">Total:</span>\n <span class=\"ef-order-summary__total-count\">{{ totalCount() }}</span>\n </div>\n </div>\n </p-fieldset>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AccordionModule } from 'primeng/accordion';\nimport { BadgeModule } from 'primeng/badge';\nimport { ButtonModule } from 'primeng/button';\nimport { CheckboxModule } from 'primeng/checkbox';\nimport { ChipModule } from 'primeng/chip';\nimport { IconFieldModule } from 'primeng/iconfield';\nimport { InputIconModule } from 'primeng/inputicon';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\n\nexport interface CategoryItem {\n code: string;\n label: string;\n description?: string | null;\n isActive: boolean;\n sortOrder: number;\n metadata?: Record<string, unknown> | null;\n children?: CategoryItem[];\n}\n\nexport interface CategoryGroup {\n code: string;\n label: string;\n description?: string | null;\n isActive: boolean;\n sortOrder: number;\n metadata?: Record<string, unknown> | null;\n children?: CategoryItem[];\n}\n\nexport interface CategoryAssignment {\n type: string;\n code: string;\n}\n\nexport interface SelectedFilter {\n type: string;\n code: string;\n label: string;\n}\n\n@Component({\n selector: 'ef-product-catalogue-filter',\n templateUrl: './ef-product-catalogue-filter.component.html',\n imports: [\n FormsModule,\n AccordionModule,\n BadgeModule,\n ButtonModule,\n CheckboxModule,\n ChipModule,\n IconFieldModule,\n InputIconModule,\n InputTextModule,\n EfLabelComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfProductCatalogueFilterComponent {\n /** Category groups from reference_data (product_categories items with children) */\n categoryGroups = input.required<CategoryGroup[]>();\n\n /** Products to calculate counts */\n products = input.required<Array<{ categoryAssignments?: CategoryAssignment[] }>>();\n\n /** Selected filters (two-way binding) */\n selectedFilters = model<SelectedFilter[]>([]);\n\n /** Emitted when filters change */\n filtersChanged = output<SelectedFilter[]>();\n\n /** Search terms for each category group */\n searchTerms = signal<Record<string, string>>({});\n\n /** Accordion panel values (expanded panels) */\n expandedPanels = computed(() =>\n this.categoryGroups()\n .filter((g) => g.children && g.children.length > 0)\n .map((g) => g.code)\n );\n\n /** Get filtered children for a category group based on search */\n getFilteredChildren(group: CategoryGroup): CategoryItem[] {\n const children = group.children || [];\n const searchTerm = this.searchTerms()[group.code]?.toLowerCase() || '';\n\n if (!searchTerm) {\n return children.filter((c) => c.isActive);\n }\n\n return children.filter(\n (c) => c.isActive && c.label.toLowerCase().includes(searchTerm)\n );\n }\n\n /** Get product count for a specific category item */\n getItemCount(groupCode: string, itemCode: string): number {\n return this.products().filter((product) =>\n product.categoryAssignments?.some(\n (ca) => ca.type === groupCode && ca.code === itemCode\n )\n ).length;\n }\n\n /** Check if a filter is selected */\n isFilterSelected(groupCode: string, itemCode: string): boolean {\n return this.selectedFilters().some(\n (f) => f.type === groupCode && f.code === itemCode\n );\n }\n\n /** Toggle a filter selection */\n toggleFilter(group: CategoryGroup, item: CategoryItem): void {\n const currentFilters = this.selectedFilters();\n const existingIndex = currentFilters.findIndex(\n (f) => f.type === group.code && f.code === item.code\n );\n\n let newFilters: SelectedFilter[];\n if (existingIndex >= 0) {\n newFilters = currentFilters.filter((_, i) => i !== existingIndex);\n } else {\n newFilters = [\n ...currentFilters,\n { type: group.code, code: item.code, label: item.label },\n ];\n }\n\n this.selectedFilters.set(newFilters);\n this.filtersChanged.emit(newFilters);\n }\n\n /** Remove a specific filter */\n removeFilter(filter: SelectedFilter): void {\n const newFilters = this.selectedFilters().filter(\n (f) => !(f.type === filter.type && f.code === filter.code)\n );\n this.selectedFilters.set(newFilters);\n this.filtersChanged.emit(newFilters);\n }\n\n /** Clear all filters */\n clearAllFilters(): void {\n this.selectedFilters.set([]);\n this.filtersChanged.emit([]);\n }\n\n /** Update search term for a category group */\n updateSearchTerm(groupCode: string, term: string): void {\n this.searchTerms.update((current) => ({\n ...current,\n [groupCode]: term,\n }));\n }\n\n /** Get color class from metadata if available */\n getColorClass(item: CategoryItem): string | null {\n const color = item.metadata?.['color'];\n return typeof color === 'string' ? color : null;\n }\n\n /** Check if group should show search input (more than 5 items) */\n shouldShowSearch(group: CategoryGroup): boolean {\n return (group.children?.length || 0) > 5;\n }\n}\n","<div class=\"flex w-80 shrink-0 flex-col items-start justify-start sticky top-4 max-h-[calc(100vh-2rem)] overflow-y-auto\">\n <div\n class=\"mb-4 flex flex-col items-start justify-center gap-2 self-stretch border-b border-surface-200 px-2 pb-4 dark:border-surface-700\"\n >\n <div class=\"flex items-center justify-between gap-2 self-stretch\">\n <div\n class=\"text-base font-semibold leading-tight text-surface-900 dark:text-surface-0\"\n >\n Filters\n </div>\n <p-button\n size=\"small\"\n severity=\"secondary\"\n [text]=\"true\"\n class=\"py-1! px-2! text-base! font-normal!\"\n (clickEvent)=\"clearAllFilters()\"\n >\n <span pButtonLabel>\n <i class=\"pi pi-eraser\"></i>\n Clear\n </span>\n </p-button>\n </div>\n @if (selectedFilters().length > 0) {\n <div\n class=\"flex flex-wrap items-start justify-start gap-2 self-stretch\"\n >\n @for (filter of selectedFilters(); track filter.type + filter.code) {\n <p-chip\n [label]=\"filter.label\"\n [removable]=\"true\"\n size=\"small\"\n class=\"h-auto rounded-full px-6\"\n removeIcon=\"pi pi-times\"\n (onRemove)=\"removeFilter(filter)\"\n ></p-chip>\n }\n </div>\n }\n </div>\n\n <p-accordion\n [multiple]=\"true\"\n [value]=\"expandedPanels()\"\n class=\"w-full\"\n >\n @for (group of categoryGroups(); track group.code) {\n @if (group.children && group.children.length > 0) {\n <p-accordion-panel [value]=\"group.code\">\n <p-accordion-header>\n <span\n class=\"text-base font-semibold leading-tight text-surface-900 dark:text-surface-0\"\n >{{ group.label }}</span>\n </p-accordion-header>\n <p-accordion-content>\n <div class=\"flex flex-col gap-4\">\n @if (shouldShowSearch(group)) {\n <p-iconfield iconPosition=\"left\" class=\"w-full\">\n <p-inputicon class=\"pi pi-search\"></p-inputicon>\n <input\n pInputText\n size=\"small\"\n [ngModel]=\"searchTerms()[group.code] || ''\"\n (ngModelChange)=\"updateSearchTerm(group.code, $event)\"\n [placeholder]=\"'Rechercher ' + group.label.toLowerCase()\"\n class=\"w-full\"\n />\n </p-iconfield>\n }\n\n @for (item of getFilteredChildren(group); track item.code) {\n <div class=\"flex items-center justify-between gap-2\">\n <div class=\"flex flex-1 items-center gap-2\">\n <p-checkbox\n size=\"small\"\n [inputId]=\"group.code + '_' + item.code\"\n [binary]=\"true\"\n [ngModel]=\"isFilterSelected(group.code, item.code)\"\n (ngModelChange)=\"toggleFilter(group, item)\"\n ></p-checkbox>\n @if (getColorClass(item)) {\n <div\n class=\"h-5 w-5 rounded-full\"\n [class]=\"getColorClass(item)\"\n ></div>\n }\n <ef-label\n [label]=\"item.label\"\n [for]=\"group.code + '_' + item.code\"\n styleClass=\"cursor-pointer text-base font-normal leading-tight text-surface-700 dark:text-surface-300\"\n />\n </div>\n @if (getItemCount(group.code, item.code) > 0) {\n <p-badge\n [value]=\"getItemCount(group.code, item.code)\"\n size=\"small\"\n class=\"rounded-xl! h-6! min-w-6!\"\n severity=\"secondary\"\n ></p-badge>\n }\n </div>\n }\n </div>\n </p-accordion-content>\n </p-accordion-panel>\n }\n }\n </p-accordion>\n</div>\n","import { CommonModule, CurrencyPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n inject,\n input,\n LOCALE_ID,\n OnChanges,\n output,\n signal,\n TemplateRef,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { BadgeModule } from 'primeng/badge';\nimport { CardModule } from 'primeng/card';\nimport { IconFieldModule } from 'primeng/iconfield';\nimport { InputIconModule } from 'primeng/inputicon';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { Menu, MenuModule } from 'primeng/menu';\nimport { SelectModule } from 'primeng/select';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfQuantityStepperComponent } from '../../forms/ef-quantity-stepper/ef-quantity-stepper.component';\nimport { EfProductCatalogueFilterComponent } from '../ef-product-catalogue-filter/ef-product-catalogue-filter.component';\nimport {\n CategoryAssignment,\n CategoryGroup,\n SelectedFilter,\n} from '../ef-product-catalogue-filter/ef-product-catalogue-filter.component';\nimport { EfButtonComponent } from '../../layout/ef-button/ef-button.component';\n\nexport interface CatalogueProductVariant {\n variantId: string;\n title: string;\n sku?: string | null;\n price: number;\n compareAtPrice?: number | null;\n optionValues?: Record<string, string>;\n isActive?: boolean;\n countGroup?: string | null;\n [key: string]: unknown;\n}\n\nexport interface CatalogueProduct {\n id: number;\n productCode: string;\n name: string;\n displayName: string;\n unitPrice?: number | null;\n packagingVolume?: number | null;\n categoryAssignments?: CategoryAssignment[];\n productType?: string | null; // 'SIMPLE' | 'VARIABLE'\n variants?: CatalogueProductVariant[];\n defaultVariantId?: string | null;\n [key: string]: unknown;\n}\n\n@Component({\n selector: 'ef-product-catalogue',\n styleUrl: './ef-product-catalogue.component.scss',\n templateUrl: './ef-product-catalogue.component.html',\n imports: [\n CommonModule,\n FormsModule,\n BadgeModule,\n EfButtonComponent,\n CardModule,\n IconFieldModule,\n InputIconModule,\n InputTextModule,\n MenuModule,\n SelectModule,\n EfQuantityStepperComponent,\n EfProductCatalogueFilterComponent,\n TranslateModule,\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfProductCatalogueComponent implements OnChanges {\n private readonly locale = inject(LOCALE_ID);\n private readonly currencyPipe = new CurrencyPipe(this.locale);\n\n /** Products to display */\n products = input<CatalogueProduct[]>([]);\n\n /** Category groups for filtering */\n categoryGroups = input<CategoryGroup[]>([]);\n\n /** Initial selected items (for editing existing orders) */\n initialSelectedItems = input<Array<{ productId?: unknown; quantity: number; variantId?: string | null }>>(\n [],\n );\n\n /** Default filters to apply on init */\n defaultFilters = input<SelectedFilter[]>([]);\n\n /** Property name used as unique key for tracking products in the list */\n trackByField = input<string>('id');\n\n /** Currency code for price formatting */\n currencyCode = input<string>('MAD');\n\n /** Locale used for number/currency formatting and the quantity stepper */\n localeCode = input<string>('fr-FR');\n\n /**\n * Custom product thumbnail template.\n * Context: { $implicit: CatalogueProduct }\n *\n * @example\n * <ef-product-catalogue [products]=\"products()\">\n * <ng-template #productThumbnail let-product>\n * <my-custom-thumbnail [product]=\"product\" />\n * </ng-template>\n * </ef-product-catalogue>\n */\n productThumbnailTpl = contentChild<TemplateRef<unknown>>('productThumbnail');\n\n @ViewChild('sortMenu') sortMenu!: Menu;\n\n /** Emitted when products are validated */\n productsValidated =\n output<Array<{ product: CatalogueProduct; quantity: number; variantId?: string }>>();\n\n productSearch = signal('');\n selectedFilters = signal<SelectedFilter[]>([]);\n selectedSort = signal('Sort By');\n selectedProducts = signal<\n Array<{ product: CatalogueProduct; quantity: number; variantId?: string }>\n >([]);\n\n /** Tracks the currently selected variantId per product key */\n selectedVariants = signal<Record<string, string>>({});\n\n filteredProducts = computed(() => {\n let filtered = this.products();\n const filters = this.selectedFilters();\n const searchTerm = this.productSearch().toLowerCase().trim();\n\n if (searchTerm) {\n filtered = filtered.filter((p) => {\n const displayName = (p.displayName || '').toLowerCase();\n const name = (p.name || '').toLowerCase();\n return displayName.includes(searchTerm) || name.includes(searchTerm);\n });\n }\n\n if (filters.length === 0) {\n return filtered;\n }\n\n const filtersByType = filters.reduce(\n (acc, filter) => {\n if (!acc[filter.type]) {\n acc[filter.type] = [];\n }\n acc[filter.type].push(filter.code);\n return acc;\n },\n {} as Record<string, string[]>,\n );\n\n filtered = filtered.filter((product) => {\n const assignments = product.categoryAssignments || [];\n return Object.entries(filtersByType).every(([type, codes]) => {\n return assignments.some(\n (a) => a.type === type && codes.includes(a.code),\n );\n });\n });\n\n return filtered;\n });\n\n sortOptions = [\n {\n label: 'Newest First',\n icon: 'pi pi-calendar-plus',\n command: () => {\n this.selectedSort.set('Newest First');\n this.sortMenu.hide();\n },\n },\n {\n label: 'Price: Low to High',\n icon: 'pi pi-sort-amount-up',\n command: () => {\n this.selectedSort.set('Price: Low to High');\n this.sortMenu.hide();\n },\n },\n {\n label: 'Price: High to Low',\n icon: 'pi pi-sort-amount-down',\n command: () => {\n this.selectedSort.set('Price: High to Low');\n this.sortMenu.hide();\n },\n },\n ];\n\n onFiltersChanged(filters: SelectedFilter[]): void {\n this.selectedFilters.set(filters);\n }\n\n ngOnChanges(): void {\n this.initializeSelectedProducts();\n this.initializeDefaultFilters();\n }\n\n productKey(product: CatalogueProduct): unknown {\n return product[this.trackByField()];\n }\n\n private initializeSelectedProducts(): void {\n const initialItems = this.initialSelectedItems();\n const allProducts = this.products();\n\n if (\n !initialItems ||\n initialItems.length === 0 ||\n !allProducts ||\n allProducts.length === 0\n ) {\n return;\n }\n\n const selectedProductsArray: Array<{\n product: CatalogueProduct;\n quantity: number;\n variantId?: string;\n }> = [];\n\n initialItems.forEach((orderItem) => {\n const matchingProduct = allProducts.find(\n (p) => this.productKey(p) === orderItem.productId,\n );\n if (matchingProduct) {\n selectedProductsArray.push({\n product: matchingProduct,\n quantity: orderItem.quantity || 1,\n variantId: orderItem.variantId ?? undefined,\n });\n }\n });\n\n this.selectedProducts.set(selectedProductsArray);\n }\n\n private initializeDefaultFilters(): void {\n const defaults = this.defaultFilters();\n if (defaults.length > 0 && this.selectedFilters().length === 0) {\n this.selectedFilters.set(defaults);\n }\n }\n\n toggleSortMenu(event: Event): void {\n this.sortMenu.toggle(event);\n }\n\n /** Composite key for tracking product+variant selections */\n private selectionKey(productKey: unknown, variantId?: string): string {\n return variantId ? `${productKey}::${variantId}` : `${productKey}`;\n }\n\n /** Get the selected variantId for a product, or its defaultVariantId */\n getSelectedVariantId(product: CatalogueProduct): string | undefined {\n const key = String(this.productKey(product));\n const selected = this.selectedVariants()[key];\n if (selected) return selected;\n if (this.isVariableProduct(product)) {\n const activeVariants = this.getActiveVariants(product);\n return product.defaultVariantId ?? activeVariants[0]?.variantId;\n }\n return undefined;\n }\n\n /** Set the selected variant for a product */\n setSelectedVariant(product: CatalogueProduct, variantId: string): void {\n const key = String(this.productKey(product));\n this.selectedVariants.update((v) => ({ ...v, [key]: variantId }));\n }\n\n /** Check if product is a VARIABLE product with variants */\n isVariableProduct(product: CatalogueProduct): boolean {\n return product.productType === 'VARIABLE' && !!product.variants?.length;\n }\n\n /** Get active variants for a product */\n getActiveVariants(product: CatalogueProduct): CatalogueProductVariant[] {\n return (product.variants || []).filter((v) => v.isActive !== false);\n }\n\n /** Get total quantity for a product across all its variants */\n getProductQuantity(product: CatalogueProduct): number {\n const key = this.productKey(product);\n if (this.isVariableProduct(product)) {\n return this.selectedProducts()\n .filter((sp) => this.productKey(sp.product) === key)\n .reduce((sum, sp) => sum + sp.quantity, 0);\n }\n const selected = this.selectedProducts().find(\n (sp) => this.productKey(sp.product) === key,\n );\n return selected?.quantity || 0;\n }\n\n /** Get quantity for a specific product+variant combination */\n getVariantQuantity(product: CatalogueProduct, variantId: string): number {\n const key = this.productKey(product);\n const selected = this.selectedProducts().find(\n (sp) => this.productKey(sp.product) === key && sp.variantId === variantId,\n );\n return selected?.quantity || 0;\n }\n\n addProduct(product: CatalogueProduct): void {\n const key = this.productKey(product);\n const variantId = this.isVariableProduct(product)\n ? this.getSelectedVariantId(product)\n : undefined;\n const selKey = this.selectionKey(key, variantId);\n const currentProducts = this.selectedProducts();\n\n const existingIndex = currentProducts.findIndex(\n (sp) => this.selectionKey(this.productKey(sp.product), sp.variantId) === selKey,\n );\n\n if (existingIndex !== -1) {\n this.selectedProducts.set(\n currentProducts.map((sp, i) =>\n i === existingIndex ? { ...sp, quantity: sp.quantity + 1 } : sp,\n ),\n );\n } else {\n this.selectedProducts.set([\n ...currentProducts,\n { product, quantity: 1, variantId },\n ]);\n }\n }\n\n removeProduct(product: CatalogueProduct): void {\n const key = this.productKey(product);\n if (this.isVariableProduct(product)) {\n // Remove all variant selections for this product\n this.selectedProducts.set(\n this.selectedProducts().filter(\n (sp) => this.productKey(sp.product) !== key,\n ),\n );\n } else {\n this.selectedProducts.set(\n this.selectedProducts().filter(\n (sp) => this.productKey(sp.product) !== key,\n ),\n );\n }\n }\n\n removeVariantSelection(product: CatalogueProduct, variantId: string): void {\n const key = this.productKey(product);\n const selKey = this.selectionKey(key, variantId);\n this.selectedProducts.set(\n this.selectedProducts().filter(\n (sp) => this.selectionKey(this.productKey(sp.product), sp.variantId) !== selKey,\n ),\n );\n }\n\n updateProductQuantity(product: CatalogueProduct, quantity: number): void {\n const key = this.productKey(product);\n const variantId = this.isVariableProduct(product)\n ? this.getSelectedVariantId(product)\n : undefined;\n const selKey = this.selectionKey(key, variantId);\n const currentProducts = this.selectedProducts();\n\n if (quantity === 0) {\n this.selectedProducts.set(\n currentProducts.filter(\n (sp) => this.selectionKey(this.productKey(sp.product), sp.variantId) !== selKey,\n ),\n );\n } else {\n this.selectedProducts.set(\n currentProducts.map((sp) =>\n this.selectionKey(this.productKey(sp.product), sp.variantId) === selKey\n ? { ...sp, quantity }\n : sp,\n ),\n );\n }\n }\n\n updateVariantQuantity(product: CatalogueProduct, variantId: string, quantity: number): void {\n const key = this.productKey(product);\n const selKey = this.selectionKey(key, variantId);\n const currentProducts = this.selectedProducts();\n\n if (quantity === 0) {\n this.removeVariantSelection(product, variantId);\n } else {\n const existingIndex = currentProducts.findIndex(\n (sp) => this.selectionKey(this.productKey(sp.product), sp.variantId) === selKey,\n );\n if (existingIndex !== -1) {\n this.selectedProducts.set(\n currentProducts.map((sp, i) =>\n i === existingIndex ? { ...sp, quantity } : sp,\n ),\n );\n } else {\n this.selectedProducts.set([\n ...currentProducts,\n { product, quantity, variantId },\n ]);\n }\n }\n }\n\n validateSelection(): void {\n const selectedItems = this.selectedProducts();\n if (selectedItems.length > 0) {\n this.productsValidated.emit([...selectedItems]);\n this.selectedProducts.set([]);\n this.selectedVariants.set({});\n }\n }\n\n getPackagingLabel(product: CatalogueProduct): string {\n const packagingAssignment = product.categoryAssignments?.find(\n (ca) => ca.type === 'PACKAGING',\n );\n return packagingAssignment?.code || '';\n }\n\n getVariantTitle(product: CatalogueProduct, variantId: string): string {\n const variant = product.variants?.find((v) => v.variantId === variantId);\n return variant?.title || variantId;\n }\n\n trackKey(product: CatalogueProduct): unknown {\n return this.productKey(product);\n }\n\n formatPrice(product: CatalogueProduct): string {\n if (this.isVariableProduct(product)) {\n const variantId = this.getSelectedVariantId(product);\n const variant = product.variants?.find((v) => v.variantId === variantId);\n if (variant) {\n return this.formatCurrency(variant.price);\n }\n // Fallback: show price range\n const activeVariants = this.getActiveVariants(product);\n if (activeVariants.length > 0) {\n const min = Math.min(...activeVariants.map((v) => v.price));\n const max = Math.max(...activeVariants.map((v) => v.price));\n if (min === max) return this.formatCurrency(min);\n return `${this.formatCurrency(min)} - ${this.formatCurrency(max)}`;\n }\n }\n const price = product.unitPrice;\n if (price == null) return '';\n return this.formatCurrency(price);\n }\n\n formatVariantPrice(variant: CatalogueProductVariant): string {\n return this.formatCurrency(variant.price);\n }\n\n private formatCurrency(value: number | null | undefined): string {\n if (value == null) return '';\n return (\n this.currencyPipe.transform(\n value,\n this.currencyCode(),\n 'symbol-narrow',\n '1.2-2',\n ) || ''\n );\n }\n}\n","<div class=\"bg-surface-0 dark:bg-surface-950\">\n <div class=\"flex flex-row gap-4\">\n <!-- Filter Sidebar -->\n <ef-product-catalogue-filter\n [categoryGroups]=\"categoryGroups()\"\n [products]=\"products()\"\n [(selectedFilters)]=\"selectedFilters\"\n (filtersChanged)=\"onFiltersChanged($event)\"\n />\n\n <!-- Product Grid -->\n <div\n class=\"min-h-96 flex-1 rounded-md border-2 border-dotted border-surface-200 bg-surface-50 p-4 dark:border-surface-700 dark:bg-surface-800\"\n >\n <div class=\"sticky top-0 z-10 w-full mb-4 bg-surface-50 dark:bg-surface-800 pb-2 -mt-4 pt-4 -mx-4 px-4\">\n <p-iconfield iconPosition=\"left\" class=\"w-full\">\n <p-inputicon class=\"pi pi-search\"></p-inputicon>\n <input\n pInputText\n size=\"small\"\n [(ngModel)]=\"productSearch\"\n [placeholder]=\"'placeholder.search_products' | translate\"\n class=\"w-full\"\n />\n </p-iconfield>\n </div>\n <div class=\"grid grid-cols-2 gap-4 lg:grid-cols-3 xl:grid-cols-4\">\n @for (product of filteredProducts(); track trackKey(product)) {\n <p-card\n [header]=\"''\"\n [class.border-2]=\"true\"\n [class.border-blue-100]=\"getProductQuantity(product) > 0\"\n [class.!bg-blue-100]=\"getProductQuantity(product) > 0\"\n [class.dark:!border-blue-900]=\"getProductQuantity(product) > 0\"\n [class.dark:!bg-blue-900]=\"getProductQuantity(product) > 0\"\n [class.border-transparent]=\"getProductQuantity(product) === 0\"\n class=\"cursor-pointer hover:shadow-md dark:hover:shadow-md dark:hover:shadow-gray-300/50\"\n >\n <ng-template pTemplate=\"header\">\n <div class=\"w-full\">\n @if (productThumbnailTpl()) {\n <ng-container *ngTemplateOutlet=\"productThumbnailTpl(); context: { $implicit: product }\"></ng-container>\n } @else {\n <!-- Default fallback thumbnail -->\n <div class=\"flex h-[13rem] items-center justify-center bg-surface-100 text-3xl text-surface-400 dark:bg-surface-800\">\n <i class=\"pi pi-box\"></i>\n </div>\n }\n </div>\n </ng-template>\n <ng-template pTemplate=\"content\">\n <div [innerHTML]=\"product.displayName\" class=\"h-14 font-semibold\"></div>\n </ng-template>\n <ng-template pTemplate=\"footer\">\n @if (isVariableProduct(product)) {\n <!-- Variable product: variant selector + per-variant quantities -->\n <div class=\"flex items-center justify-between mb-2\">\n <p-badge\n severity=\"secondary\"\n [value]=\"getActiveVariants(product).length + ' ' + ('catalogue.variants' | translate)\"\n badgeSize=\"small\"\n />\n <div class=\"text-lg font-bold\">\n {{ formatPrice(product) }}\n </div>\n </div>\n\n <!-- Variant selector -->\n <p-select\n [options]=\"getActiveVariants(product)\"\n optionLabel=\"title\"\n optionValue=\"variantId\"\n [ngModel]=\"getSelectedVariantId(product)\"\n (ngModelChange)=\"setSelectedVariant(product, $event)\"\n size=\"small\"\n styleClass=\"w-full mb-3\"\n [placeholder]=\"'placeholder.select_variant' | translate\"\n />\n\n <!-- Add button or quantity stepper for selected variant -->\n <div class=\"mt-2\">\n @if (getProductQuantity(product) > 0) {\n <!-- Show per-variant breakdown -->\n @for (entry of selectedProducts(); track $index) {\n @if (productKey(entry.product) === productKey(product) && entry.variantId) {\n <div class=\"flex items-center justify-center gap-2 mb-2\">\n <span class=\"text-xs font-medium text-surface-600 dark:text-surface-400 min-w-12 text-center\">\n {{ getVariantTitle(product, entry.variantId) }}\n </span>\n <ef-quantity-stepper\n [ngModel]=\"entry.quantity\"\n (ngModelChange)=\"updateVariantQuantity(product, entry.variantId!, $event)\"\n [min]=\"0\"\n [max]=\"1000\"\n [maxFractionDigits]=\"4\"\n [locale]=\"localeCode()\"\n />\n <ef-button\n icon=\"pi pi-times\"\n severity=\"danger\"\n styleClass=\"!rounded-full !w-7 !h-7 !p-0\"\n size=\"small\"\n (clickEvent)=\"removeVariantSelection(product, entry.variantId!)\"\n />\n </div>\n }\n }\n <!-- Add another variant button -->\n <ef-button\n icon=\"pi pi-plus\"\n [label]=\"'button.add_variant' | translate\"\n severity=\"primary\"\n styleClass=\"w-full !rounded-full !h-10 mt-1\"\n size=\"small\"\n (clickEvent)=\"addProduct(product)\"\n />\n } @else {\n <ef-button\n [label]=\"'button.add' | translate\"\n icon=\"pi pi-shopping-cart\"\n severity=\"primary\"\n styleClass=\"w-full !rounded-full !h-12\"\n (clickEvent)=\"addProduct(product)\"\n />\n }\n </div>\n } @else {\n <!-- Simple product: original behavior -->\n <div class=\"flex items-center justify-between\">\n <p-badge\n severity=\"secondary\"\n [value]=\"getPackagingLabel(product)\"\n badgeSize=\"small\"\n />\n <div class=\"text-lg font-bold\">\n {{ formatPrice(product) }}\n </div>\n </div>\n <div class=\"mt-4\">\n @if (getProductQuantity(product) > 0) {\n <div class=\"flex items-center justify-between\">\n <ef-button\n icon=\"pi pi-trash\"\n severity=\"primary\"\n styleClass=\"!rounded-full\"\n (clickEvent)=\"removeProduct(product)\"\n />\n <ef-quantity-stepper\n [ngModel]=\"getProductQuantity(product)\"\n (ngModelChange)=\"updateProductQuantity(product, $event)\"\n [min]=\"0\"\n [max]=\"1000\"\n [maxFractionDigits]=\"4\"\n [locale]=\"localeCode()\"\n />\n </div>\n } @else {\n <ef-button\n [label]=\"'button.add' | translate\"\n icon=\"pi pi-shopping-cart\"\n severity=\"primary\"\n styleClass=\"w-full !rounded-full !h-12\"\n (clickEvent)=\"addProduct(product)\"\n />\n }\n </div>\n }\n </ng-template>\n </p-card>\n } @empty {\n <div class=\"p-2\">{{ 'message.no_products_found' | translate }}</div>\n }\n </div>\n </div>\n </div>\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ConfirmDialogModule } from 'primeng/confirmdialog';\n\n/**\n * The app-wide confirmation modal, wearing the same skin as `ef-dialog`.\n *\n * PrimeNG's `<p-confirmdialog>` renders an ordinary `<p-dialog>` inside\n * itself and forwards `styleClass` to its root, so handing it the\n * `es-dialog` classes makes every rule that dresses `ef-dialog` — the\n * paper-alt panel, the rule-separated header and footer, the Bricolage\n * title, the ghost close — apply here too. Only the confirm-specific\n * internals (the icon tile, the message, the two action buttons) need\n * their own rules, and those live beside the rest in `_patterns.scss`.\n *\n * Drop one instance at the application root; the content is driven by\n * `ConfirmDialogService.confirm()`, not by inputs.\n *\n * ```html\n * <ef-confirm-dialog />\n * ```\n */\n@Component({\n selector: 'ef-confirm-dialog',\n standalone: true,\n imports: [ConfirmDialogModule],\n template: `<p-confirmdialog [styleClass]=\"effectiveStyleClass()\" />`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfConfirmDialogComponent {\n /** Panel width preset, mirroring `ef-dialog`'s `size`. */\n readonly size = input<'sm' | 'md' | 'lg'>('sm');\n\n /** Extra classes appended to the panel. */\n readonly styleClass = input<string>('');\n\n protected readonly effectiveStyleClass = () =>\n ['es-dialog', `es-dialog--${this.size()}`, 'es-confirm', this.styleClass()]\n .filter(Boolean)\n .join(' ');\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfThemeConfigService } from '@elasticias/core';\n\n/**\n * Light / dark switch.\n *\n * All of the machinery already exists in `EfThemeConfigService`: it holds\n * `darkTheme` in the persisted app state, puts `.p-dark` on `<html>`, and\n * runs the swap through a view transition where the browser supports one.\n * This is the control that was missing, so the preference had no way to be\n * expressed.\n *\n * The icon shows the theme you would move to, not the one you are in, which\n * is what makes a single-button toggle readable: a moon means \"go dark\".\n *\n * ```html\n * <ef-theme-toggle />\n * ```\n */\n@Component({\n selector: 'ef-theme-toggle',\n standalone: true,\n imports: [TranslateModule],\n template: `\n <button\n type=\"button\"\n class=\"ef-theme-toggle\"\n [class.is-dark]=\"isDark()\"\n [attr.aria-label]=\"labelKey() | translate\"\n [attr.title]=\"labelKey() | translate\"\n [attr.aria-pressed]=\"isDark()\"\n (click)=\"toggle()\"\n >\n <i [class]=\"isDark() ? lightIcon() : darkIcon()\" aria-hidden=\"true\"></i>\n </button>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfThemeToggleComponent {\n private readonly themeConfig = inject(EfThemeConfigService);\n\n /** Icon shown while light is active (i.e. \"switch to dark\"). */\n readonly darkIcon = input<string>('pi pi-moon');\n\n /** Icon shown while dark is active (i.e. \"switch to light\"). */\n readonly lightIcon = input<string>('pi pi-sun');\n\n /** Translation key for the accessible name. */\n readonly ariaLabelKey = input<string>('');\n\n readonly isDark = computed(() => !!this.themeConfig.appState()?.darkTheme);\n\n protected readonly labelKey = computed(\n () =>\n this.ariaLabelKey() ||\n (this.isDark() ? 'common_theme_switch_light' : 'common_theme_switch_dark'),\n );\n\n toggle(): void {\n this.themeConfig.appState.update(state => ({ ...state, darkTheme: !state.darkTheme }));\n }\n}\n","import { Directive } from '@angular/core';\nimport { Tooltip } from 'primeng/tooltip';\n\n/**\n * Comptoir-skinned tooltip.\n *\n * `ef-button` already drives PrimeNG's tooltip through its `tooltipKey`\n * input, so this composes the same directive rather than introducing a\n * second tooltip with its own positioning and its own bugs. It contributes\n * the `ef-*` name the house style asks for and nothing else; the look comes\n * from the `.p-tooltip` rules in `_patterns.scss`, which means every tooltip\n * in the app — this one and `ef-button`'s — reads the same.\n *\n * Text is a plain input, so translate at the call site:\n *\n * ```html\n * <span [efTooltip]=\"'module_sales_hint' | translate\" efTooltipPosition=\"top\"></span>\n * ```\n */\n@Directive({\n selector: '[efTooltip]',\n standalone: true,\n hostDirectives: [\n {\n directive: Tooltip,\n inputs: [\n 'pTooltip: efTooltip',\n 'tooltipPosition: efTooltipPosition',\n 'tooltipDisabled: efTooltipDisabled',\n 'tooltipStyleClass: efTooltipStyleClass',\n 'tooltipEvent: efTooltipEvent',\n 'showDelay: efTooltipShowDelay',\n 'hideDelay: efTooltipHideDelay',\n 'appendTo: efTooltipAppendTo',\n 'autoHide: efTooltipAutoHide',\n 'escape: efTooltipEscape',\n 'life: efTooltipLife',\n ],\n },\n ],\n})\nexport class EfTooltipDirective {}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { EF_BUILD_INFO } from '@elasticias/core';\nimport { EfTooltipDirective } from '../../overlays/ef-tooltip.directive';\n\n/**\n * Which build is running, for a footer or an about box.\n *\n * Reads `EF_BUILD_INFO` optionally and renders nothing when the app has not\n * provided it, so a consumer that never wired a build stamp shows no empty\n * line. The commit and branch go in the tooltip rather than the label: the\n * date is what a person recognises, the hash is what you paste into an issue.\n *\n * ```html\n * <ef-build-stamp owner=\"Elasticias\" />\n * ```\n */\n@Component({\n selector: 'ef-build-stamp',\n standalone: true,\n imports: [EfTooltipDirective],\n template: `\n @if (info) {\n <span class=\"ef-build-stamp\" [efTooltip]=\"detail()\" efTooltipPosition=\"bottom\">\n @if (owner()) {\n <span class=\"ef-build-stamp__owner\">© {{ year }} {{ owner() }}</span>\n <span class=\"ef-build-stamp__sep\" aria-hidden=\"true\">·</span>\n }\n <span class=\"ef-build-stamp__build\">{{ label() }}</span>\n </span>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfBuildStampComponent {\n /** Copyright holder shown before the build. Omit for the build alone. */\n readonly owner = input<string>('');\n\n protected readonly info = inject(EF_BUILD_INFO, { optional: true });\n\n protected readonly year = new Date().getFullYear();\n\n /**\n * A released build is known by its version; an unreleased one has no\n * version to be known by, so it shows what actually identifies it.\n *\n * That is not a cosmetic split. Only production is cut from a tag, so\n * only production has a number a person can repeat back to you. On\n * develop and staging the honest answer is where it came from and when.\n */\n protected readonly label = computed(() => {\n if (!this.info) return '';\n if (this.info.version) return `v${this.info.version}`;\n return [this.info.environment, this.info.commit, this.info.date]\n .filter(Boolean)\n .join(' · ');\n });\n\n /** The rest of the identity, for when the label is only a version. */\n protected readonly detail = computed(() => {\n if (!this.info) return '';\n return [this.info.commit, this.info.environment, this.info.date]\n .filter(Boolean)\n .join(' · ');\n });\n}\n","import {\n booleanAttribute,\n Component,\n Input,\n} from '@angular/core';\nimport { FieldsetModule } from 'primeng/fieldset';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@Component({\n selector: 'ef-fieldset',\n standalone: true,\n templateUrl: './ef-fieldset.component.html',\n imports: [FieldsetModule, TranslateModule],\n})\nexport class EfFieldsetComponent {\n /** Direct legend text (not translated) */\n @Input() legend?: string;\n /** Translation key — takes priority over legend */\n @Input() legendKey?: string;\n\n @Input({ transform: booleanAttribute }) toggleable = false;\n @Input({ transform: booleanAttribute }) collapsed = false;\n @Input() styleClass?: string;\n}\n","<p-fieldset\n [legend]=\"legendKey ? (legendKey | translate) : legend\"\n [toggleable]=\"toggleable\"\n [collapsed]=\"collapsed\"\n [styleClass]=\"styleClass\"\n>\n <ng-content />\n</p-fieldset>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ButtonGroupModule } from 'primeng/buttongroup';\n\n@Component({\n selector: 'ef-button-group',\n standalone: true,\n template: `<p-buttonGroup><ng-content /></p-buttonGroup>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ButtonGroupModule],\n})\nexport class EfButtonGroupComponent {}\n","/**\n * Available Tailwind color names for badges\n */\nexport type EfBadgeColor =\n | 'emerald'\n | 'green'\n | 'lime'\n | 'orange'\n | 'amber'\n | 'yellow'\n | 'teal'\n | 'cyan'\n | 'sky'\n | 'blue'\n | 'indigo'\n | 'violet'\n | 'purple'\n | 'fuchsia'\n | 'pink'\n | 'rose'\n | 'slate'\n | 'gray'\n | 'zinc'\n | 'neutral'\n | 'stone'\n | 'red';\n\n/**\n * Badge size variants\n */\nexport type EfBadgeSize = 'sm' | 'md' | 'lg';\n\n/**\n * Badge style variants\n */\nexport type EfBadgeVariant = 'filled' | 'outline' | 'dot' | 'pill';\n\n/**\n * Badge configuration interface\n */\nexport interface EfBadgeConfig {\n /**\n * Text label to display (optional for 'dot' variant)\n */\n label?: string;\n\n /**\n * Badge color (Tailwind color name)\n * @default 'blue'\n */\n color?: EfBadgeColor;\n\n /**\n * Badge size\n * @default 'md'\n */\n size?: EfBadgeSize;\n\n /**\n * Badge style variant\n * @default 'filled'\n */\n variant?: EfBadgeVariant;\n\n /**\n * Custom CSS classes to apply\n */\n styleClass?: string;\n\n /**\n * Icon class (e.g., PrimeIcons) to display before label\n */\n icon?: string;\n\n /**\n * Whether to show the dot indicator\n * @default true for 'dot' variant, false otherwise\n */\n showDot?: boolean;\n}\n\n/**\n * Default badge configuration\n */\nexport const EF_BADGE_DEFAULTS: Required<Omit<EfBadgeConfig, 'label' | 'icon'>> = {\n color: 'blue',\n size: 'md',\n variant: 'filled',\n styleClass: '',\n showDot: false,\n};\n\n/**\n * Maps Tailwind colors to their background classes\n */\nexport const EF_BADGE_BG_COLORS: Record<EfBadgeColor, string> = {\n emerald: 'bg-emerald-500',\n green: 'bg-green-500',\n lime: 'bg-lime-500',\n orange: 'bg-orange-500',\n amber: 'bg-amber-500',\n yellow: 'bg-yellow-500',\n teal: 'bg-teal-500',\n cyan: 'bg-cyan-500',\n sky: 'bg-sky-500',\n blue: 'bg-blue-500',\n indigo: 'bg-indigo-500',\n violet: 'bg-violet-500',\n purple: 'bg-purple-500',\n fuchsia: 'bg-fuchsia-500',\n pink: 'bg-pink-500',\n rose: 'bg-rose-500',\n slate: 'bg-slate-500',\n gray: 'bg-gray-500',\n zinc: 'bg-zinc-500',\n neutral: 'bg-neutral-500',\n stone: 'bg-stone-500',\n red: 'bg-red-500',\n};\n\n/**\n * Maps Tailwind colors to their text classes\n */\nexport const EF_BADGE_TEXT_COLORS: Record<EfBadgeColor, string> = {\n emerald: 'text-emerald-700',\n green: 'text-green-700',\n lime: 'text-lime-700',\n orange: 'text-orange-700',\n amber: 'text-amber-700',\n yellow: 'text-yellow-700',\n teal: 'text-teal-700',\n cyan: 'text-cyan-700',\n sky: 'text-sky-700',\n blue: 'text-blue-700',\n indigo: 'text-indigo-700',\n violet: 'text-violet-700',\n purple: 'text-purple-700',\n fuchsia: 'text-fuchsia-700',\n pink: 'text-pink-700',\n rose: 'text-rose-700',\n slate: 'text-slate-700',\n gray: 'text-gray-700',\n zinc: 'text-zinc-700',\n neutral: 'text-neutral-700',\n stone: 'text-stone-700',\n red: 'text-red-700',\n};\n\n/**\n * Maps Tailwind colors to their border classes\n */\nexport const EF_BADGE_BORDER_COLORS: Record<EfBadgeColor, string> = {\n emerald: 'border-emerald-500',\n green: 'border-green-500',\n lime: 'border-lime-500',\n orange: 'border-orange-500',\n amber: 'border-amber-500',\n yellow: 'border-yellow-500',\n teal: 'border-teal-500',\n cyan: 'border-cyan-500',\n sky: 'border-sky-500',\n blue: 'border-blue-500',\n indigo: 'border-indigo-500',\n violet: 'border-violet-500',\n purple: 'border-purple-500',\n fuchsia: 'border-fuchsia-500',\n pink: 'border-pink-500',\n rose: 'border-rose-500',\n slate: 'border-slate-500',\n gray: 'border-gray-500',\n zinc: 'border-zinc-500',\n neutral: 'border-neutral-500',\n stone: 'border-stone-500',\n red: 'border-red-500',\n};\n\n/**\n * Maps Tailwind colors to their light background classes (for filled variant)\n */\nexport const EF_BADGE_BG_LIGHT_COLORS: Record<EfBadgeColor, string> = {\n emerald: 'bg-emerald-100',\n green: 'bg-green-100',\n lime: 'bg-lime-100',\n orange: 'bg-orange-100',\n amber: 'bg-amber-100',\n yellow: 'bg-yellow-100',\n teal: 'bg-teal-100',\n cyan: 'bg-cyan-100',\n sky: 'bg-sky-100',\n blue: 'bg-blue-100',\n indigo: 'bg-indigo-100',\n violet: 'bg-violet-100',\n purple: 'bg-purple-100',\n fuchsia: 'bg-fuchsia-100',\n pink: 'bg-pink-100',\n rose: 'bg-rose-100',\n slate: 'bg-slate-100',\n gray: 'bg-gray-100',\n zinc: 'bg-zinc-100',\n neutral: 'bg-neutral-100',\n stone: 'bg-stone-100',\n red: 'bg-red-100',\n};\n","import { Component, computed, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n EfBadgeConfig,\n EfBadgeColor,\n EfBadgeSize,\n EfBadgeVariant,\n EF_BADGE_DEFAULTS,\n EF_BADGE_BG_COLORS,\n EF_BADGE_TEXT_COLORS,\n EF_BADGE_BORDER_COLORS,\n EF_BADGE_BG_LIGHT_COLORS,\n} from './ef-badge.component.types';\n\n/**\n * ef-badge - Reusable status badge component\n *\n * Features:\n * - Multiple color variants (Tailwind colors)\n * - Multiple size options (sm, md, lg)\n * - Multiple style variants (filled, outline, dot, pill)\n * - Icon support\n * - Fully customizable with styleClass\n *\n * @example\n * ```html\n * <!-- Simple filled badge -->\n * <ef-badge label=\"Active\" color=\"green\" />\n *\n * <!-- Dot variant -->\n * <ef-badge label=\"En attente\" color=\"yellow\" variant=\"dot\" />\n *\n * <!-- With icon -->\n * <ef-badge label=\"Error\" color=\"red\" icon=\"pi pi-exclamation-circle\" />\n *\n * <!-- Outline variant -->\n * <ef-badge label=\"Info\" color=\"blue\" variant=\"outline\" />\n *\n * <!-- Pill variant -->\n * <ef-badge label=\"New\" color=\"purple\" variant=\"pill\" />\n * ```\n */\n@Component({\n selector: 'ef-badge',\n standalone: true,\n templateUrl: './ef-badge.component.html',\n styleUrl: './ef-badge.component.scss',\n imports: [CommonModule],\n})\nexport class EfBadgeComponent {\n /**\n * Badge label text\n */\n label = input<string>();\n\n /**\n * Badge color (Tailwind color name)\n */\n color = input<EfBadgeColor>(EF_BADGE_DEFAULTS.color);\n\n /**\n * Badge size\n */\n size = input<EfBadgeSize>(EF_BADGE_DEFAULTS.size);\n\n /**\n * Badge style variant\n */\n variant = input<EfBadgeVariant>(EF_BADGE_DEFAULTS.variant);\n\n /**\n * Custom CSS classes\n */\n styleClass = input<string>(EF_BADGE_DEFAULTS.styleClass);\n\n /**\n * Icon class (e.g., PrimeIcons)\n */\n icon = input<string>();\n\n /**\n * Whether to show the dot indicator\n */\n showDot = input<boolean>(EF_BADGE_DEFAULTS.showDot);\n\n /**\n * Computed badge configuration with defaults\n */\n config = computed<Required<EfBadgeConfig>>(() => ({\n label: this.label() || '',\n color: this.color(),\n size: this.size(),\n variant: this.variant(),\n styleClass: this.styleClass(),\n icon: this.icon() || '',\n showDot: this.showDot() || this.variant() === 'dot',\n }));\n\n /**\n * Computed CSS classes for the badge\n */\n badgeClasses = computed(() => {\n const cfg = this.config();\n const classes: string[] = ['ef-badge'];\n\n // Base classes\n classes.push('inline-flex', 'items-center', 'gap-1.5', 'font-medium');\n\n // Size classes\n switch (cfg.size) {\n case 'sm':\n classes.push('text-xs', 'px-2', 'py-0.5');\n break;\n case 'md':\n classes.push('text-sm', 'px-2.5', 'py-1');\n break;\n case 'lg':\n classes.push('text-base', 'px-3', 'py-1.5');\n break;\n }\n\n // Variant-specific classes\n switch (cfg.variant) {\n case 'filled':\n classes.push('rounded');\n classes.push(EF_BADGE_BG_LIGHT_COLORS[cfg.color]);\n classes.push(EF_BADGE_TEXT_COLORS[cfg.color]);\n break;\n\n case 'outline':\n classes.push('rounded', 'border-2');\n classes.push(EF_BADGE_BORDER_COLORS[cfg.color]);\n classes.push(EF_BADGE_TEXT_COLORS[cfg.color]);\n classes.push('bg-white');\n break;\n\n case 'dot':\n classes.push('rounded');\n classes.push(EF_BADGE_TEXT_COLORS[cfg.color]);\n break;\n\n case 'pill':\n classes.push('rounded-full');\n classes.push(EF_BADGE_BG_LIGHT_COLORS[cfg.color]);\n classes.push(EF_BADGE_TEXT_COLORS[cfg.color]);\n break;\n }\n\n // Custom classes\n if (cfg.styleClass) {\n classes.push(cfg.styleClass);\n }\n\n return classes.join(' ');\n });\n\n /**\n * Computed CSS classes for the dot indicator\n */\n dotClasses = computed(() => {\n const cfg = this.config();\n const classes: string[] = ['inline-block', 'shrink-0', 'rounded-full'];\n\n // Dot size based on badge size\n switch (cfg.size) {\n case 'sm':\n classes.push('w-2', 'h-2');\n break;\n case 'md':\n classes.push('w-2.5', 'h-2.5');\n break;\n case 'lg':\n classes.push('w-3', 'h-3');\n break;\n }\n\n // Dot color\n classes.push(EF_BADGE_BG_COLORS[cfg.color]);\n\n return classes.join(' ');\n });\n\n /**\n * Computed CSS classes for the icon\n */\n iconClasses = computed(() => {\n const cfg = this.config();\n const classes: string[] = [];\n\n if (cfg.icon) {\n classes.push(cfg.icon);\n }\n\n // Icon size based on badge size\n switch (cfg.size) {\n case 'sm':\n classes.push('text-xs');\n break;\n case 'md':\n classes.push('text-sm');\n break;\n case 'lg':\n classes.push('text-base');\n break;\n }\n\n return classes.join(' ');\n });\n}\n","<span [class]=\"badgeClasses()\">\n <!-- Dot indicator -->\n @if (config().showDot) {\n <span [class]=\"dotClasses()\"></span>\n }\n\n <!-- Icon -->\n @if (config().icon) {\n <i [class]=\"iconClasses()\"></i>\n }\n\n <!-- Label -->\n @if (config().label) {\n <span>{{ config().label }}</span>\n }\n</span>\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n inject,\n Input,\n Output,\n} from '@angular/core';\nimport { EfButtonComponent } from '../ef-button/ef-button.component';\nimport { IconFieldModule } from 'primeng/iconfield';\nimport { InputIconModule } from 'primeng/inputicon';\nimport { ToolbarModule } from 'primeng/toolbar';\nimport { ScreenStateEnum, ScreenContext } from '@elasticias/screens';\nimport { Router } from '@angular/router';\nimport { Permissions } from '@elasticias/types';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@Component({\n selector: 'ef-toolbar',\n standalone: true,\n templateUrl: 'ef-toolbar.component.html',\n styleUrl: 'ef-toolbar.component.scss',\n imports: [\n CommonModule,\n ToolbarModule,\n EfButtonComponent,\n IconFieldModule,\n InputIconModule,\n InputTextModule,\n FormsModule,\n TranslateModule,\n ],\n})\nexport class EfToolbarComponent {\n @Input() context: ScreenContext;\n\n @Input() state: string;\n @Input() disabled: boolean;\n\n // Detail Action\n @Output() back = new EventEmitter();\n @Output() save = new EventEmitter();\n @Output() delete = new EventEmitter();\n @Output() duplicate = new EventEmitter();\n @Output() print = new EventEmitter();\n @Output() triggerCustoAction = new EventEmitter<any>();\n\n // Search Actions\n @Output() add = new EventEmitter();\n // `search` collides with the native HTMLInputElement `search` event. The\n // no-output-native rule is not enabled in this config, so there is nothing to\n // suppress; renaming would churn every consumer template, so the name stays.\n // `search` shadows a native DOM event name. Renaming this output would\n // churn every consumer template, so the name stays and the rule is\n // suppressed here deliberately.\n // eslint-disable-next-line @angular-eslint/no-output-native\n @Output() search = new EventEmitter();\n @Output() clear = new EventEmitter();\n\n searchText = '';\n\n // Flags\n @Input() backButton = false;\n @Input() deleteButton = false;\n @Input() duplicateButton = true;\n @Input() saveButton = true;\n @Input() exportButton = false;\n @Input() printButton = false;\n @Input() addButton = true;\n @Input() clearButton = true;\n @Input() searchButton = true;\n @Input() showFreeSearchInput = false;\n\n private router = inject(Router);\n\n get isSearchState(): boolean {\n return this.state === ScreenStateEnum.SEARCH;\n }\n\n get isDetailState(): boolean {\n return this.state === ScreenStateEnum.DETAIL;\n }\n\n get hasReadPermission(): boolean {\n return this.context.isGranted(Permissions.Read);\n }\n\n get hasCreatePermission(): boolean {\n return this.context.isGranted(Permissions.Create);\n }\n\n get hasEditPermission(): boolean {\n return this.context.isGranted(Permissions.Edit);\n }\n\n get hasDeletePermission(): boolean {\n return this.context.isGranted(Permissions.Delete);\n }\n\n get hasDuplicatePermission(): boolean {\n return this.context.isGranted(Permissions.Duplicate);\n }\n\n get hasExportPermission(): boolean {\n return this.context.isGranted(Permissions.Export);\n }\n\n get isDuplicateMode(): boolean {\n return this.context?.duplicateMode ?? false;\n }\n\n backAction() {\n this.back.emit();\n this.navigateBack();\n }\n\n deleteAction() {\n this.delete.emit();\n }\n\n saveAction() {\n this.save.emit();\n }\n\n duplicateAction() {\n this.duplicate.emit();\n }\n\n printAction() {\n this.print.emit();\n }\n\n exportAction() {\n this.add.emit();\n }\n\n addAction() {\n this.add.emit();\n }\n\n searchAction() {\n this.search.emit();\n }\n\n clearAction() {\n this.clear.emit();\n }\n\n navigateBack() {\n const currentUrl = this.router.url;\n const baseUrl = currentUrl.substring(0, currentUrl.indexOf('/details'));\n this.router.navigate([baseUrl]);\n }\n}\n","<p-toolbar>\n <ng-template #start>\n <div class=\"flex items-center gap-3\">\n @if (isDetailState || backButton) {\n <ef-button\n icon=\"pi pi-angle-left\"\n severity=\"primary\"\n styleClass=\"action-btn-text\"\n tooltipKey=\"common.back\"\n labelKey=\"common.back\"\n size=\"small\"\n (clickEvent)=\"backAction()\"\n />\n }\n <!-- Custom content slot for start section (e.g., status badge) -->\n <ng-content select=\"[toolbarStart]\" />\n </div>\n </ng-template>\n <ng-template #center>\n @if (showFreeSearchInput) {\n <p-iconfield iconPosition=\"left\">\n <p-inputicon styleClass=\"pi pi-search\" />\n <input\n id=\"freeTextSearch\"\n type=\"text\"\n pInputText\n [placeholder]=\"'common.search' | translate\"\n />\n </p-iconfield>\n }\n </ng-template>\n <ng-template #end>\n <!-- DETAIL state -->\n <!-- Custom content slot for start section (e.g., status badge) -->\n <ng-content select=\"[toolbarEnd]\" />\n @if (isDetailState && isDuplicateMode) {\n <span\n class=\"duplicate-badge flex items-center gap-1 rounded bg-blue-100 px-2 py-1 text-sm text-blue-700\"\n >\n <i class=\"pi pi-copy\"></i> {{ 'common.duplicate' | translate }}\n </span>\n }\n @if (isDetailState && deleteButton && hasDeletePermission) {\n <ef-button\n icon=\"pi pi-trash\"\n severity=\"danger\"\n styleClass=\"action-btn\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.delete\"\n size=\"small\"\n [disabled]=\"disabled\"\n (clickEvent)=\"deleteAction()\"\n />\n }\n @if (isDetailState && printButton) {\n <ef-button\n icon=\"pi pi-print\"\n severity=\"primary\"\n styleClass=\"action-btn\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.print\"\n size=\"small\"\n [disabled]=\"disabled\"\n (clickEvent)=\"printAction()\"\n />\n }\n @if (\n isDetailState &&\n duplicateButton &&\n hasDuplicatePermission &&\n !isDuplicateMode\n ) {\n <ef-button\n icon=\"pi pi-copy\"\n severity=\"primary\"\n styleClass=\"action-btn\"\n tooltipPosition=\"left\"\n tooltipKey=\"common.duplicate\"\n size=\"small\"\n [disabled]=\"disabled\"\n (clickEvent)=\"duplicateAction()\"\n />\n }\n @if (isDetailState && saveButton && (hasCreatePermission || hasEditPermission)) {\n <ef-button\n icon=\"pi pi-save\"\n severity=\"primary\"\n styleClass=\"action-btn\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.save\"\n size=\"small\"\n [disabled]=\"disabled\"\n (clickEvent)=\"saveAction()\"\n />\n }\n <!-- SEARCH state -->\n @if (isSearchState && exportButton && hasExportPermission) {\n <ef-button\n icon=\"pi pi-upload\"\n severity=\"primary\"\n styleClass=\"action-btn\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.export\"\n size=\"small\"\n (clickEvent)=\"exportAction()\"\n />\n }\n @if (isSearchState && addButton && hasCreatePermission) {\n <ef-button\n icon=\"pi pi-plus\"\n severity=\"primary\"\n styleClass=\"action-btn-text\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.add\"\n labelKey=\"common.add\"\n size=\"small\"\n (clickEvent)=\"addAction()\"\n />\n }\n @if (isSearchState && clearButton) {\n <ef-button\n icon=\"pi pi-filter-slash\"\n severity=\"primary\"\n styleClass=\"action-btn-text\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.clear_search_criteria\"\n labelKey=\"common.clear\"\n size=\"small\"\n (clickEvent)=\"clearAction()\"\n />\n }\n @if (isSearchState && searchButton && hasReadPermission) {\n <ef-button\n icon=\"pi pi-search\"\n severity=\"primary\"\n styleClass=\"action-btn-text\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.search\"\n labelKey=\"common.search\"\n size=\"small\"\n [disabled]=\"disabled\"\n (clickEvent)=\"searchAction()\"\n />\n }\n </ng-template>\n</p-toolbar>\n","import { ChangeDetectionStrategy, Component, computed, inject, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { TranslateModule } from '@ngx-translate/core';\nimport {\n EfActiveModuleService,\n EfModule,\n EfModuleId,\n EfPermissionService,\n} from '@elasticias/core';\n\n/**\n * Rail row — either a module button (with the metadata needed by the\n * template) or a divider rendered between two modules whose `group`\n * differs.\n */\ntype RailRow =\n | { kind: 'module'; module: EfModule }\n | { kind: 'divider' };\n\n/**\n * 64px vertical module switcher rendered at the left of `ef-app-shell`\n * on desktop and tablet. Black (`--ink-active`) background with\n * white-alpha icons, 44×44px buttons, and a 3px module-color accent\n * strip on the inside edge of the active button.\n *\n * Reads from `EfPermissionService.visibleModules()` and\n * `EfActiveModuleService.activeModule()`. No per-app wiring needed.\n *\n * Apps can supply per-module badge content (e.g., notification counts)\n * via the `[badges]` input keyed by module id, and project a logo into\n * the `[logo]` content slot — typical content is the tenant initial,\n * an avatar, or a small SVG. When a logo is projected, a hairline\n * divider is rendered between the logo and the first module group.\n *\n * Dividers also appear automatically between consecutive modules whose\n * `EfModule.group` differs (e.g. Sales/operations followed by\n * Admin/admin).\n */\n@Component({\n selector: 'ef-module-rail',\n standalone: true,\n templateUrl: './ef-module-rail.component.html',\n styleUrl: './ef-module-rail.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TooltipModule, TranslateModule],\n})\nexport class EfModuleRailComponent {\n private readonly perms = inject(EfPermissionService);\n private readonly active = inject(EfActiveModuleService);\n private readonly router = inject(Router);\n\n /** Optional notification badges per module id. */\n @Input() badges: Partial<Record<EfModuleId, string | number>> = {};\n\n readonly visibleModules = this.perms.visibleModules;\n readonly activeId = this.active.activeModuleId;\n\n /** Visible modules interleaved with dividers at group boundaries. */\n readonly rows = computed<RailRow[]>(() => {\n const rows: RailRow[] = [];\n let prevGroup: string | undefined;\n for (const module of this.visibleModules()) {\n if (rows.length > 0 && module.group !== prevGroup) {\n rows.push({ kind: 'divider' });\n }\n rows.push({ kind: 'module', module });\n prevGroup = module.group;\n }\n return rows;\n });\n\n readonly hasBadges = computed(() => Object.keys(this.badges).length > 0);\n\n onSelect(module: EfModule): void {\n this.router.navigateByUrl(module.defaultRoute);\n }\n\n badgeFor(id: EfModuleId): string | number | undefined {\n return this.badges[id];\n }\n\n trackRow(index: number, row: RailRow): string {\n return row.kind === 'module' ? `m:${row.module.id}` : `d:${index}`;\n }\n}\n","<nav class=\"ef-module-rail\" aria-label=\"Modules\">\n <div class=\"ef-module-rail__logo-slot\">\n <ng-content select=\"[logo]\"></ng-content>\n </div>\n\n @for (row of rows(); track trackRow($index, row)) {\n @if (row.kind === 'divider') {\n <span class=\"ef-module-rail__divider\" aria-hidden=\"true\"></span>\n } @else {\n <button\n type=\"button\"\n class=\"ef-module-rail__btn\"\n [class.is-active]=\"activeId() === row.module.id\"\n [attr.data-module]=\"row.module.id\"\n [attr.aria-current]=\"activeId() === row.module.id ? 'page' : null\"\n [style.--m-color]=\"'var(--' + row.module.accent + ')'\"\n [pTooltip]=\"row.module.labelKey | translate\"\n tooltipPosition=\"right\"\n (click)=\"onSelect(row.module)\"\n >\n <i class=\"ef-module-rail__icon\" [class]=\"row.module.icon\" aria-hidden=\"true\"></i>\n\n @if (badgeFor(row.module.id); as badge) {\n <span class=\"ef-module-rail__badge\">{{ badge }}</span>\n }\n\n <span class=\"ef-module-rail__sr\">{{ row.module.labelKey | translate }}</span>\n </button>\n }\n }\n</nav>\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router, RouterLink, RouterLinkActive } from '@angular/router';\nimport { TranslateModule } from '@ngx-translate/core';\nimport {\n EfActiveModuleService,\n EfNavItem,\n EfNavSection,\n EfPermissionService,\n} from '@elasticias/core';\n\n/**\n * 240px module-specific side panel. Renders the active module's\n * `navSections`, filtered by `EfPermissionService.can()` against\n * each item's `requiredAction` (defaults to `'read'`).\n *\n * When no module is active, or the active module has no sections,\n * the panel collapses (renders nothing) — apps using `ef-app-shell`\n * already handle the layout reflow.\n */\n@Component({\n selector: 'ef-module-side',\n standalone: true,\n templateUrl: './ef-module-side.component.html',\n styleUrl: './ef-module-side.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, RouterLink, RouterLinkActive, TranslateModule],\n host: {\n '[attr.data-module]': 'moduleId()',\n },\n})\nexport class EfModuleSideComponent {\n private readonly active = inject(EfActiveModuleService);\n private readonly perms = inject(EfPermissionService);\n\n readonly module = this.active.activeModule;\n readonly moduleId = this.active.activeModuleId;\n\n readonly visibleSections = computed<EfNavSection[]>(() => {\n const m = this.module();\n if (!m) return [];\n\n return m.navSections\n .map(section => ({\n ...section,\n items: section.items.filter(item =>\n this.perms.can(m.id, item.requiredAction ?? 'read')\n ),\n }))\n .filter(section => section.items.length > 0);\n });\n\n trackSection(_: number, s: EfNavSection): string {\n return s.id;\n }\n\n trackItem(_: number, i: EfNavItem): string {\n return i.id;\n }\n}\n","@if (module(); as m) {\n <div class=\"ef-module-side__scroll\">\n <header class=\"ef-module-side__header\">\n <span\n class=\"ef-module-side__header-icon\"\n [style.--m-color]=\"'var(--' + m.accent + ')'\"\n aria-hidden=\"true\"\n >\n @if (m.icon) {\n <i [class]=\"m.icon\"></i>\n }\n </span>\n <span class=\"ef-module-side__header-text\">\n <span class=\"ef-module-side__name\">{{ m.labelKey | translate }}</span>\n <span class=\"ef-module-side__meta\">\n <ng-content select=\"[side-header-meta]\"></ng-content>\n </span>\n </span>\n </header>\n\n @for (section of visibleSections(); track section.id) {\n <section class=\"ef-module-side__section\">\n @if (section.labelKey) {\n <h3 class=\"ef-module-side__section-title\">{{ section.labelKey | translate }}</h3>\n }\n <ul class=\"ef-module-side__list\">\n @for (item of section.items; track item.id) {\n <li>\n <a\n class=\"ef-module-side__item\"\n [routerLink]=\"item.route\"\n routerLinkActive=\"is-active\"\n [routerLinkActiveOptions]=\"{ exact: false }\"\n >\n @if (item.icon) {\n <i class=\"ef-module-side__icon\" [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n <span class=\"ef-module-side__label\">{{ item.labelKey | translate }}</span>\n @if (item.badge !== undefined && item.badge !== null) {\n <span class=\"ef-module-side__badge\">{{ item.badge }}</span>\n }\n </a>\n </li>\n }\n </ul>\n </section>\n }\n </div>\n\n <div class=\"ef-module-side__footer\">\n <ng-content></ng-content>\n </div>\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EF_SESSION, EfActiveModuleService } from '@elasticias/core';\nimport { EfThemeToggleComponent } from '../ef-theme-toggle/ef-theme-toggle.component';\n\n/**\n * Top chrome bar for the desktop and mobile shells.\n *\n * Layout is three slots: `breadcrumb` (left), `search` (centre), and\n * `actions` (right). Apps project into `search` and `actions` for global\n * features (⌘K, notifications bell, profile chip).\n *\n * The breadcrumb slot fills automatically from `EfActiveModuleService`:\n * a leading dot in the active module's accent, the module label, then\n * the active nav-item label as the leaf. Apps that need a custom\n * breadcrumb can still project their own content into `[breadcrumb]`.\n */\n@Component({\n selector: 'ef-app-top',\n standalone: true,\n templateUrl: './ef-app-top.component.html',\n styleUrl: './ef-app-top.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TranslateModule, EfThemeToggleComponent],\n})\nexport class EfAppTopComponent {\n /**\n * Show the light/dark switch at the trailing edge of the bar.\n *\n * It lives here rather than being projected through `[actions]`\n * because that slot is declared once per viewport branch in\n * `ef-app-shell` and only the mobile one receives content — so\n * anything an app projects there never appears on desktop.\n */\n readonly themeToggle = input(true, { transform: booleanAttribute });\n\n /**\n * Show the sign-out button. It only renders when the app has provided\n * `EF_SESSION`, so this input turns off a control the app opted into\n * rather than being the thing that enables it.\n */\n readonly logout = input(true, { transform: booleanAttribute });\n\n /** Present only when the app provides `EF_SESSION`. */\n protected readonly session = inject(EF_SESSION, { optional: true });\n\n protected signOut(): void {\n this.session?.logout();\n }\n\n private readonly active = inject(EfActiveModuleService);\n\n readonly module = this.active.activeModule;\n readonly navItem = this.active.activeNavItem;\n\n readonly hasBreadcrumb = computed(() => this.module() != null);\n}\n","<div class=\"ef-app-top__slot ef-app-top__slot--breadcrumb\">\n <ng-content select=\"[breadcrumb]\"></ng-content>\n @if (hasBreadcrumb()) {\n <nav class=\"ef-app-top__crumb\" aria-label=\"breadcrumb\">\n <span class=\"ef-app-top__crumb-dot\" [attr.data-module]=\"module()!.id\" aria-hidden=\"true\"></span>\n <span class=\"ef-app-top__crumb-root\">{{ module()!.labelKey | translate }}</span>\n @if (navItem(); as item) {\n <span class=\"ef-app-top__crumb-sep\" aria-hidden=\"true\">/</span>\n <span class=\"ef-app-top__crumb-leaf\">{{ item.labelKey | translate }}</span>\n }\n </nav>\n }\n</div>\n\n<div class=\"ef-app-top__slot ef-app-top__slot--actions\">\n <ng-content select=\"[actions]\"></ng-content>\n @if (themeToggle()) {\n <ef-theme-toggle />\n }\n @if (logout() && session) {\n <button\n type=\"button\"\n class=\"ef-app-top__logout\"\n [attr.aria-label]=\"'common_logout' | translate\"\n [attr.title]=\"'common_logout' | translate\"\n (click)=\"signOut()\"\n >\n <i class=\"pi pi-sign-out\" aria-hidden=\"true\"></i>\n </button>\n }\n</div>\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, Input } from '@angular/core';\nimport { EfActiveModuleService } from '@elasticias/core';\n\n/**\n * Content scroll container. Lives at the right of the rail+side\n * on desktop, full-width on mobile. Sets `data-module` so the\n * Comptoir SCSS layer's `[data-module=\"...\"]` rules apply the\n * active module's `--module` accent inside this region.\n *\n * Usage:\n * ```html\n * <ef-app-main [stripe]=\"true\">\n * <router-outlet />\n * </ef-app-main>\n * ```\n *\n * Reads the active module from `EfActiveModuleService` — no per-app\n * wiring required.\n */\n@Component({\n selector: 'ef-app-main',\n standalone: true,\n templateUrl: './ef-app-main.component.html',\n styleUrl: './ef-app-main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-module]': 'moduleId()',\n },\n})\nexport class EfAppMainComponent {\n private readonly activeModule = inject(EfActiveModuleService);\n\n /** Render the 3px module-color stripe at the top of the content area. */\n @Input({ transform: booleanAttribute }) stripe = false;\n\n /** `data-module` value bound to the host. Null when no module is active. */\n readonly moduleId = computed(() => this.activeModule.activeModuleId());\n}\n","@if (stripe) {\n <div class=\"ef-app-main__stripe\" aria-hidden=\"true\"></div>\n}\n<div class=\"ef-app-main__content\">\n <ng-content></ng-content>\n</div>\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostListener,\n Input,\n Output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Slide-up overlay with a grabber. Replaces dropdowns and dialogs on\n * mobile per the Comptoir plan. Controlled component — apps drive\n * `[open]` and listen to `(openChange)`.\n *\n * Tapping the backdrop or pressing Escape emits `openChange.emit(false)`.\n *\n * Usage:\n * ```html\n * <ef-bottom-sheet [open]=\"filtersOpen()\" (openChange)=\"filtersOpen.set($event)\">\n * <ng-template>...filters body...</ng-template>\n * </ef-bottom-sheet>\n * ```\n */\n@Component({\n selector: 'ef-bottom-sheet',\n standalone: true,\n templateUrl: './ef-bottom-sheet.component.html',\n styleUrl: './ef-bottom-sheet.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule],\n host: {\n '[class.is-open]': 'open',\n '[attr.aria-hidden]': '!open',\n },\n})\nexport class EfBottomSheetComponent {\n @Input({ transform: booleanAttribute }) open = false;\n @Input({ transform: booleanAttribute }) dismissOnBackdrop = true;\n\n @Output() openChange = new EventEmitter<boolean>();\n\n onBackdropClick(): void {\n if (this.dismissOnBackdrop) this.close();\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.open) this.close();\n }\n\n close(): void {\n this.open = false;\n this.openChange.emit(false);\n }\n}\n","<div class=\"ef-bottom-sheet__backdrop\" (click)=\"onBackdropClick()\" aria-hidden=\"true\"></div>\n\n<div class=\"ef-bottom-sheet__panel\" role=\"dialog\" aria-modal=\"true\">\n <div class=\"ef-bottom-sheet__grabber\" aria-hidden=\"true\"></div>\n <div class=\"ef-bottom-sheet__body\">\n <ng-content></ng-content>\n </div>\n</div>\n","import { ChangeDetectionStrategy, Component, computed, inject, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EfViewportService } from '@elasticias/core';\nimport { EfModuleRailComponent } from '../ef-module-rail/ef-module-rail.component';\nimport { EfModuleSideComponent } from '../ef-module-side/ef-module-side.component';\nimport { EfAppTopComponent } from '../ef-app-top/ef-app-top.component';\nimport { EfAppMainComponent } from '../ef-app-main/ef-app-main.component';\nimport { EfBottomSheetComponent } from '../ef-bottom-sheet/ef-bottom-sheet.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { Router, RouterLink } from '@angular/router';\nimport {\n EfActiveModuleService,\n EfPermissionService,\n EfModule,\n EfNavItem,\n EfNavSection,\n} from '@elasticias/core';\nimport { signal } from '@angular/core';\n\n/**\n * Top-level Comptoir shell.\n *\n * Composes the chrome an Elasticias app puts around its `<router-outlet />`.\n * Apps mount it at their root component:\n *\n * ```html\n * <ef-app-shell>\n * <router-outlet />\n * </ef-app-shell>\n * ```\n *\n * The shell reads:\n * - `EfViewportService` to switch between desktop and mobile branches\n * - `EfPermissionService` (via the rail / mobile tabs) for visible modules\n * - `EfActiveModuleService` for the active module accent\n *\n * **Desktop / tablet:** rail (64px) + side (240px) + (top + main).\n * **Mobile:** delegates to `<ef-app-shell-mobile>` — top bar + scrollable\n * body + 5-tab bottom bar + FAB slot.\n *\n * Top-bar slots are forwarded to `<ef-app-top>` on both layouts: project\n * with `breadcrumb`, `search`, `actions` attributes. The `side-footer`\n * slot is forwarded to the bottom of `<ef-module-side>` (desktop only —\n * mobile drops it; surface identity via `[actions]` instead). The `logo`\n * slot is forwarded to the top of `<ef-module-rail>` (desktop/tablet\n * only — mobile uses the bottom tab bar instead).\n */\n@Component({\n selector: 'ef-app-shell',\n standalone: true,\n templateUrl: './ef-app-shell.component.html',\n styleUrl: './ef-app-shell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n EfModuleRailComponent,\n EfModuleSideComponent,\n EfAppTopComponent,\n EfAppMainComponent,\n EfBottomSheetComponent,\n TranslateModule,\n RouterLink,\n ],\n host: {\n '[attr.data-viewport]': 'viewport()',\n },\n})\nexport class EfAppShellComponent {\n private readonly vp = inject(EfViewportService);\n private readonly perms = inject(EfPermissionService);\n private readonly active = inject(EfActiveModuleService);\n private readonly router = inject(Router);\n\n /** Show the 3px module-color stripe at the top of the content area. */\n @Input() stripe = true;\n\n readonly viewport = this.vp.current;\n readonly isMobile = this.vp.isMobile;\n readonly showSide = computed(() => !this.vp.isMobile());\n\n /* ── Mobile chrome ───────────────────────────────────────────\n Tabs and the module sheet live here rather than in a child\n component: content has to be declared once, in one template,\n and a child shell would mean declaring the slots twice. */\n\n readonly activeId = this.active.activeModuleId;\n readonly switcherOpen = signal(false);\n\n /** Five tabs is what fits a phone; the rest live in the sheet. */\n readonly tabs = computed<EfModule[]>(() => this.perms.visibleModules().slice(0, 5));\n readonly allVisible = this.perms.visibleModules;\n\n /**\n * The screens inside the active module, for the mobile sheet.\n *\n * On a phone the side nav is not rendered, and the tab bar switches\n * modules — so without this there was no way to reach any screen except\n * the module's default one. Same filtering as `ef-module-side`, because\n * it answers the same question.\n */\n readonly moduleSections = computed<EfNavSection[]>(() => {\n const m = this.active.activeModule();\n if (!m) return [];\n return m.navSections\n .map(section => ({\n ...section,\n items: section.items.filter(item =>\n this.perms.can(m.id, item.requiredAction ?? 'read'),\n ),\n }))\n .filter(section => section.items.length > 0);\n });\n\n onNavigate(item: EfNavItem): void {\n this.router.navigateByUrl(item.route);\n this.switcherOpen.set(false);\n }\n\n openSwitcher(): void {\n this.switcherOpen.set(true);\n }\n\n onSwitcherChange(open: boolean): void {\n this.switcherOpen.set(open);\n }\n\n onSelect(module: EfModule): void {\n this.router.navigateByUrl(module.defaultRoute);\n this.switcherOpen.set(false);\n }\n}\n","<!-- One layout, one declaration per slot.\n Angular binds projected content to the LAST matching <ng-content> in a\n template, so declaring the same selector once per viewport branch meant the\n branch that was actually rendered on a phone received nothing — every\n screen came up blank inside working chrome. The layouts differ by CSS and\n by which chrome is rendered, never by where the content is declared. -->\n\n<ef-module-rail class=\"ef-app-shell__rail\">\n <ng-content select=\"[logo]\" logo></ng-content>\n</ef-module-rail>\n\n@if (showSide()) {\n <ef-module-side class=\"ef-app-shell__side\">\n <ng-content select=\"[side-header-meta]\" side-header-meta></ng-content>\n <ng-content select=\"[side-footer]\" side-footer></ng-content>\n </ef-module-side>\n}\n\n<div class=\"ef-app-shell__column\">\n <ef-app-top>\n <ng-content select=\"[breadcrumb]\" breadcrumb></ng-content>\n <ng-content select=\"[search]\" search></ng-content>\n @if (isMobile()) {\n <button\n actions\n type=\"button\"\n class=\"ef-app-shell__menu\"\n (click)=\"openSwitcher()\"\n [attr.aria-label]=\"'common_modules' | translate\"\n >\n <i class=\"pi pi-bars\" aria-hidden=\"true\"></i>\n </button>\n }\n <ng-content select=\"[actions]\" actions></ng-content>\n </ef-app-top>\n\n <ef-app-main [stripe]=\"stripe\">\n <ng-content></ng-content>\n </ef-app-main>\n\n @if (isMobile()) {\n <nav class=\"ef-app-shell__tabs\" [attr.aria-label]=\"'common_modules' | translate\">\n @for (module of tabs(); track module.id) {\n <button\n type=\"button\"\n class=\"ef-app-shell__tab\"\n [class.is-active]=\"activeId() === module.id\"\n [attr.data-module]=\"module.id\"\n [attr.aria-current]=\"activeId() === module.id ? 'page' : null\"\n (click)=\"onSelect(module)\"\n >\n <i class=\"ef-app-shell__tab-icon\" [class]=\"module.icon\" aria-hidden=\"true\"></i>\n <span class=\"ef-app-shell__tab-label\">{{ module.labelKey | translate }}</span>\n </button>\n }\n </nav>\n }\n</div>\n\n<ng-content select=\"[fab]\"></ng-content>\n\n@if (isMobile()) {\n <ef-bottom-sheet [open]=\"switcherOpen()\" (openChange)=\"onSwitcherChange($event)\">\n <!-- The screens first: the tab bar already switches modules, so this is\n the only way to reach anything but a module's default screen. -->\n @for (section of moduleSections(); track section.id) {\n @if (section.labelKey) {\n <h2 class=\"ef-app-shell__sheet-title\">{{ section.labelKey | translate }}</h2>\n }\n <ul class=\"ef-app-shell__sheet-list\">\n @for (item of section.items; track item.id) {\n <li>\n <a\n class=\"ef-app-shell__sheet-item\"\n [routerLink]=\"item.route\"\n routerLinkActive=\"is-active\"\n (click)=\"onNavigate(item)\"\n >\n @if (item.icon) {\n <i [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n <span>{{ item.labelKey | translate }}</span>\n @if (item.badge !== undefined && item.badge !== null) {\n <span class=\"ef-app-shell__sheet-badge\">{{ item.badge }}</span>\n }\n </a>\n </li>\n }\n </ul>\n }\n\n <h2 class=\"ef-app-shell__sheet-title\">{{ 'common_modules' | translate }}</h2>\n <ul class=\"ef-app-shell__sheet-list\">\n @for (module of allVisible(); track module.id) {\n <li>\n <button\n type=\"button\"\n class=\"ef-app-shell__sheet-item\"\n [class.is-active]=\"activeId() === module.id\"\n [attr.data-module]=\"module.id\"\n (click)=\"onSelect(module)\"\n >\n <i [class]=\"module.icon\" aria-hidden=\"true\"></i>\n <span>{{ module.labelKey | translate }}</span>\n </button>\n </li>\n }\n </ul>\n </ef-bottom-sheet>\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { TooltipModule } from 'primeng/tooltip';\nimport {\n EfActiveModuleService,\n EfModule,\n EfPermissionService,\n} from '@elasticias/core';\nimport { EfAppTopComponent } from '../ef-app-top/ef-app-top.component';\nimport { EfAppMainComponent } from '../ef-app-main/ef-app-main.component';\nimport { EfBottomSheetComponent } from '../ef-bottom-sheet/ef-bottom-sheet.component';\n\n/**\n * Mobile-only shell. Picks up when `ef-app-shell` detects a mobile\n * viewport. Composition:\n *\n * - Top bar (`ef-app-top`) with a menu trigger that opens the module\n * switcher in a bottom sheet.\n * - Scrollable content (`ef-app-main`) — projects `<router-outlet />`.\n * - 5-tab bottom bar — first 5 visible modules from\n * `EfPermissionService.visibleModules()`. Apps that want a usage-\n * ranked tab order can replace the registry via `EF_MODULES_TOKEN`.\n * - FAB slot (`[fab]`) — apps project a `<ef-fab />` here.\n *\n * The module switcher (bottom sheet) lists all visible modules so\n * users can reach modules outside the top-5 tabs.\n */\n@Component({\n selector: 'ef-app-shell-mobile',\n standalone: true,\n templateUrl: './ef-app-shell-mobile.component.html',\n styleUrl: './ef-app-shell-mobile.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n TooltipModule,\n EfAppTopComponent,\n EfAppMainComponent,\n EfBottomSheetComponent,\n ],\n})\nexport class EfAppShellMobileComponent {\n private readonly perms = inject(EfPermissionService);\n private readonly active = inject(EfActiveModuleService);\n private readonly router = inject(Router);\n\n readonly activeId = this.active.activeModuleId;\n readonly switcherOpen = signal(false);\n\n readonly tabs = computed<EfModule[]>(() => this.perms.visibleModules().slice(0, 5));\n readonly allVisible = this.perms.visibleModules;\n\n openSwitcher(): void { this.switcherOpen.set(true); }\n onSwitcherChange(open: boolean): void { this.switcherOpen.set(open); }\n\n onSelect(module: EfModule): void {\n this.router.navigateByUrl(module.defaultRoute);\n this.switcherOpen.set(false);\n }\n}\n","<ef-app-top>\n <ng-content select=\"[breadcrumb]\" breadcrumb></ng-content>\n <ng-content select=\"[search]\" search></ng-content>\n <button\n actions\n type=\"button\"\n class=\"ef-app-shell-mobile__menu\"\n (click)=\"openSwitcher()\"\n aria-label=\"Modules\"\n >\n <i class=\"pi pi-bars\" aria-hidden=\"true\"></i>\n </button>\n <ng-content select=\"[actions]\" actions></ng-content>\n</ef-app-top>\n\n<ef-app-main [stripe]=\"true\">\n <ng-content></ng-content>\n</ef-app-main>\n\n<nav class=\"ef-app-shell-mobile__tabs\" aria-label=\"Modules\">\n @for (module of tabs(); track module.id) {\n <button\n type=\"button\"\n class=\"ef-app-shell-mobile__tab\"\n [class.is-active]=\"activeId() === module.id\"\n [attr.data-module]=\"module.id\"\n [attr.aria-current]=\"activeId() === module.id ? 'page' : null\"\n (click)=\"onSelect(module)\"\n >\n <i class=\"ef-app-shell-mobile__tab-icon\" [class]=\"module.icon\" aria-hidden=\"true\"></i>\n <span class=\"ef-app-shell-mobile__tab-label\">{{ module.labelKey | translate }}</span>\n </button>\n }\n</nav>\n\n<ng-content select=\"[fab]\"></ng-content>\n\n<ef-bottom-sheet [open]=\"switcherOpen()\" (openChange)=\"onSwitcherChange($event)\">\n <h2 class=\"ef-app-shell-mobile__sheet-title\">{{ 'modules.all' | translate }}</h2>\n <ul class=\"ef-app-shell-mobile__sheet-list\">\n @for (module of allVisible(); track module.id) {\n <li>\n <button\n type=\"button\"\n class=\"ef-app-shell-mobile__sheet-item\"\n [class.is-active]=\"activeId() === module.id\"\n [attr.data-module]=\"module.id\"\n (click)=\"onSelect(module)\"\n >\n <i [class]=\"module.icon\" aria-hidden=\"true\"></i>\n <span>{{ module.labelKey | translate }}</span>\n </button>\n </li>\n }\n </ul>\n</ef-bottom-sheet>\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\nexport type EfFabPosition = 'bottom-right' | 'bottom-center' | 'bottom-left';\n\n/**\n * Floating action button — mobile primary action surface.\n *\n * Lives at the bottom of the mobile viewport, carrying the screen's\n * principal action (e.g. Nouvelle commande). Reads `--tenant-500`\n * for its background; foreground is `--tenant-contrast` (defaults\n * to white). When `label` / `labelKey` is provided, renders as an\n * extended FAB with the label inline.\n *\n * Usage:\n * ```html\n * <ef-fab icon=\"pi pi-plus\" labelKey=\"orders.new\" (press)=\"onNew()\" />\n * ```\n */\n@Component({\n selector: 'ef-fab',\n standalone: true,\n templateUrl: './ef-fab.component.html',\n styleUrl: './ef-fab.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TranslateModule],\n host: {\n '[attr.data-position]': 'position',\n '[class.is-extended]': 'isExtended',\n },\n})\nexport class EfFabComponent {\n @Input() icon = 'pi pi-plus';\n @Input() label?: string;\n /** Translation key — takes priority over `label`. */\n @Input() labelKey?: string;\n\n @Input() position: EfFabPosition = 'bottom-right';\n\n @Input({ transform: booleanAttribute }) disabled = false;\n\n @Output() press = new EventEmitter<MouseEvent>();\n\n get isExtended(): boolean {\n return !!(this.label || this.labelKey);\n }\n\n onClick(e: MouseEvent): void {\n if (!this.disabled) this.press.emit(e);\n }\n}\n","<button\n type=\"button\"\n class=\"ef-fab\"\n [disabled]=\"disabled\"\n (click)=\"onClick($event)\"\n>\n <i class=\"ef-fab__icon\" [class]=\"icon\" aria-hidden=\"true\"></i>\n\n @if (isExtended) {\n <span class=\"ef-fab__label\">\n @if (labelKey) {\n {{ labelKey | translate }}\n } @else {\n {{ label }}\n }\n </span>\n }\n</button>\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\nexport interface EfPillItem<T = string> {\n value: T;\n /** Direct label (no translation). */\n label?: string;\n /** Translation key — takes priority over label. */\n labelKey?: string;\n /** Optional count rendered after a thin separator. */\n count?: number;\n}\n\n/**\n * Segmented pill filter. Used for tab-like selectors over a small\n * set of options — \"Toutes · 87 / À approuver · 14 / En retard · 3\".\n *\n * ```html\n * <ef-pill-group\n * [items]=\"filters\"\n * [(value)]=\"activeFilter\"\n * (valueChange)=\"onFilterChange($event)\"\n * />\n * ```\n *\n * The active pill picks up a contrast fill (`--ink-active`); inactive\n * pills sit on transparent ground with muted text. Heights map to\n * `--hit` (32px) so it stacks naturally next to compact action buttons.\n */\n@Component({\n selector: 'ef-pill-group',\n standalone: true,\n templateUrl: './ef-pill-group.component.html',\n styleUrl: './ef-pill-group.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TranslateModule],\n})\nexport class EfPillGroupComponent<T = string> {\n @Input({ required: true }) items: ReadonlyArray<EfPillItem<T>> = [];\n @Input() value: T | null = null;\n @Input() ariaLabel = 'filters';\n /** Hide counts even when items provide them. */\n @Input() hideCounts = false;\n\n @Output() readonly valueChange = new EventEmitter<T>();\n\n select(item: EfPillItem<T>): void {\n if (this.value !== item.value) {\n this.value = item.value;\n this.valueChange.emit(item.value);\n }\n }\n\n trackValue(_: number, item: EfPillItem<T>): T {\n return item.value;\n }\n}\n","<div class=\"ef-pill-group\" role=\"tablist\" [attr.aria-label]=\"ariaLabel\">\n @for (item of items; track trackValue($index, item)) {\n <button\n type=\"button\"\n class=\"ef-pill\"\n role=\"tab\"\n [class.is-active]=\"item.value === value\"\n [attr.aria-selected]=\"item.value === value\"\n (click)=\"select(item)\"\n >\n <span class=\"ef-pill__label\">\n @if (item.labelKey) {\n {{ item.labelKey | translate }}\n } @else {\n {{ item.label }}\n }\n </span>\n @if (!hideCounts && item.count !== undefined) {\n <span class=\"ef-pill__sep\" aria-hidden=\"true\">·</span>\n <span class=\"ef-pill__count\">{{ item.count }}</span>\n }\n </button>\n }\n</div>\n","import { Directive, Input, TemplateRef, inject } from '@angular/core';\n\n/**\n * Marks an `<ng-template>` as the panel renderer for a tab value on\n * `<ef-tabs>`. When at least one panel template is projected,\n * `ef-tabs` renders the matching one below the tablist. When none is\n * projected, the component stays a tablist only — the consumer owns\n * panel rendering via `@switch` / `@if` on the active value.\n *\n * ```html\n * <ef-tabs [items]=\"sections\" [(value)]=\"active\">\n * <ng-template efTabPanel=\"identity\">\n * <product-identity />\n * </ng-template>\n * <ng-template efTabPanel=\"media\">\n * <product-media />\n * </ng-template>\n * </ef-tabs>\n * ```\n *\n * The input value must match one of the `EfTabItem.value` entries the\n * tabset is driven by.\n */\n@Directive({\n selector: '[efTabPanel]',\n standalone: true,\n})\nexport class EfTabPanelDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n\n @Input({ alias: 'efTabPanel', required: true })\n value!: string;\n}\n","import {\n AfterContentInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n QueryList,\n TemplateRef,\n ViewChildren,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfTabPanelDirective } from './ef-tab-panel.directive';\n\n/** Visual treatment of the tabset. `'pill'` is the default. */\nexport type EfTabsVariant = 'pill' | 'underline';\n\n/** Known module slugs whose accent (`var(--m-{slug})`) drives the\n * active indicator and count tint when `variant === 'underline'`. */\nexport type EfTabsModule =\n | 'sales'\n | 'purchase'\n | 'stock'\n | 'pos'\n | 'marketing'\n | 'store'\n | 'finance'\n | 'admin';\n\nexport interface EfTabItem<T = string> {\n value: T;\n /** Direct label (not translated). */\n label?: string;\n /** Translation key — takes priority over `label`. */\n labelKey?: string;\n /** PrimeIcons class string, e.g. `'pi pi-th-large'`. Rendered\n * before the label, muted when idle. */\n icon?: string;\n /** Optional count rendered after the label in a mono badge. */\n count?: number;\n /** Show a dirty/unread dot after the label/count. */\n dirty?: boolean;\n disabled?: boolean;\n}\n\n/**\n * Comptoir tabset. Pilots the visible *view* on a detail screen\n * (Identité / Médias / Variantes / SEO / Activité…). Defaults to the\n * pill variant — chunky toggle suited for sub-modes (Editor / Preview,\n * Day / Week) — with `'underline'` available for fiche-wide navigation\n * where the active tab adopts the module accent.\n *\n * Two consumer surfaces, mirroring `<ef-data-card>`:\n *\n * 1. **Tablist only** — no panels projected. The component renders\n * the tab strip and emits `valueChange` ; the consumer owns panel\n * rendering via `@switch` / `@if`.\n *\n * ```html\n * <ef-tabs [items]=\"sections\" [(value)]=\"active\" />\n * @switch (active) {\n * @case ('identity') { <product-identity /> }\n * @case ('media') { <product-media /> }\n * }\n * ```\n *\n * 2. **Tabs + projected panels** — `<ng-template efTabPanel=\"…\">`\n * blocks declare the body of each tab. The component shows the one\n * whose `efTabPanel` matches the active value.\n *\n * ```html\n * <ef-tabs [items]=\"sections\" [(value)]=\"active\" variant=\"underline\" module=\"store\">\n * <ng-template efTabPanel=\"identity\"><product-identity /></ng-template>\n * <ng-template efTabPanel=\"media\"><product-media /></ng-template>\n * </ef-tabs>\n * ```\n *\n * For filter toggles over result sets (Toutes / Pending / Shipped),\n * prefer `<ef-pill-group>` — it shares the pill look but stays scoped\n * to filter selection rather than view switching.\n */\n@Component({\n selector: 'ef-tabs',\n standalone: true,\n templateUrl: './ef-tabs.component.html',\n styleUrl: './ef-tabs.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TranslateModule],\n host: {\n '[class.ef-tabs--pill]': \"variant === 'pill'\",\n '[class.ef-tabs--underline]': \"variant === 'underline'\",\n '[class.ef-tabs--overflow]': 'overflow',\n '[attr.data-module]': 'module ?? null',\n },\n})\nexport class EfTabsComponent<T = string> implements AfterContentInit {\n @Input({ required: true }) items: ReadonlyArray<EfTabItem<T>> = [];\n /** Currently-selected tab value. When no `*efTabPanel` templates\n * are projected, panel rendering is the consumer's job (typically\n * via `@switch (active)` in the template). */\n @Input() value: T | null = null;\n\n /** Visual variant. `'pill'` (default) is the segmented toggle ;\n * `'underline'` draws a 2px indicator under the active tab. */\n @Input() variant: EfTabsVariant = 'pill';\n\n /** Forces the module accent on the active indicator + count tint\n * (only meaningful for `variant='underline'`). When omitted, the\n * underline inherits `--module` from the closest `[data-module]`\n * ancestor (and falls back to `--ink-active`). */\n @Input() module?: EfTabsModule;\n\n /** Show edge fades when the tablist overflows horizontally. The\n * list itself always scrolls — tabs are never collapsed into a\n * menu. */\n @Input({ transform: booleanAttribute }) overflow = false;\n\n /** Hide count badges even when items provide them. */\n @Input({ transform: booleanAttribute }) hideCounts = false;\n\n @Input() ariaLabel = 'tabs';\n\n /** Translation key used as the `aria-label` of the dirty dot.\n * Defaults to `'common.dirty'` — apps add the matching entry to\n * `fr.json` / `ar.json`. */\n @Input() dirtyLabelKey = 'common.dirty';\n\n @Output() readonly valueChange = new EventEmitter<T>();\n\n @ViewChildren('tabEl') private tabEls?: QueryList<ElementRef<HTMLButtonElement>>;\n\n /* ── Content children (optional projected panels) ────────────── */\n\n @ContentChildren(EfTabPanelDirective)\n private readonly panels!: QueryList<EfTabPanelDirective>;\n\n private readonly panelMap = signal<Map<string, TemplateRef<unknown>>>(new Map());\n\n /** Active panel template for the current `value`, or `null` when\n * no template matches (incl. tablist-only mode). Read by the\n * template via `ngTemplateOutlet`. */\n activePanel(): TemplateRef<unknown> | null {\n const v = this.value;\n if (v === null || v === undefined) return null;\n return this.panelMap().get(String(v)) ?? null;\n }\n\n /** `true` when at least one `*efTabPanel` template has been\n * projected — toggles the panel rendering slot in the template. */\n hasPanels(): boolean {\n return this.panelMap().size > 0;\n }\n\n ngAfterContentInit(): void {\n this.panelMap.set(toPanelMap(this.panels));\n this.panels.changes.subscribe(() => this.panelMap.set(toPanelMap(this.panels)));\n }\n\n select(item: EfTabItem<T>): void {\n if (item.disabled) return;\n if (this.value !== item.value) {\n this.value = item.value;\n this.valueChange.emit(item.value);\n }\n }\n\n onKeydown(event: KeyboardEvent, index: number): void {\n const all = this.items;\n if (all.length === 0) return;\n\n // Build the cyclic list of enabled positions and locate the current one.\n const enabledPositions: number[] = [];\n for (let i = 0; i < all.length; i++) {\n if (!all[i].disabled) enabledPositions.push(i);\n }\n if (enabledPositions.length === 0) return;\n\n const here = enabledPositions.indexOf(index);\n let nextPos = -1;\n\n switch (event.key) {\n case 'ArrowRight':\n nextPos = enabledPositions[(here + 1) % enabledPositions.length];\n break;\n case 'ArrowLeft':\n nextPos =\n enabledPositions[(here - 1 + enabledPositions.length) % enabledPositions.length];\n break;\n case 'Home':\n nextPos = enabledPositions[0];\n break;\n case 'End':\n nextPos = enabledPositions[enabledPositions.length - 1];\n break;\n default:\n return;\n }\n\n event.preventDefault();\n const target = all[nextPos];\n this.select(target);\n // Focus follows selection — the WAI-ARIA \"tabs with automatic\n // activation\" pattern, mirrored from the prototype.\n const el = this.tabEls?.toArray()[nextPos]?.nativeElement;\n el?.focus();\n }\n\n trackValue(_: number, item: EfTabItem<T>): T {\n return item.value;\n }\n}\n\nfunction toPanelMap(\n panels: QueryList<EfTabPanelDirective>,\n): Map<string, TemplateRef<unknown>> {\n const map = new Map<string, TemplateRef<unknown>>();\n panels.forEach(p => map.set(p.value, p.templateRef));\n return map;\n}\n","<div class=\"ef-tabs__list\" role=\"tablist\" [attr.aria-label]=\"ariaLabel\">\n @for (item of items; track trackValue($index, item); let i = $index) {\n <button\n #tabEl\n type=\"button\"\n class=\"ef-tabs__tab\"\n role=\"tab\"\n [class.is-active]=\"item.value === value\"\n [class.is-disabled]=\"!!item.disabled\"\n [attr.aria-selected]=\"item.value === value\"\n [attr.aria-disabled]=\"item.disabled ? 'true' : null\"\n [disabled]=\"item.disabled\"\n [tabindex]=\"item.value === value ? 0 : -1\"\n (click)=\"select(item)\"\n (keydown)=\"onKeydown($event, i)\"\n >\n @if (item.icon) {\n <i class=\"ef-tabs__ico\" [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n <span class=\"ef-tabs__label\">\n @if (item.labelKey) {\n {{ item.labelKey | translate }}\n } @else {\n {{ item.label }}\n }\n </span>\n @if (!hideCounts && item.count !== undefined && item.count !== null) {\n <span class=\"ef-tabs__count\">{{ item.count }}</span>\n }\n @if (item.dirty) {\n <span class=\"ef-tabs__dot\" [attr.aria-label]=\"dirtyLabelKey | translate\"></span>\n }\n </button>\n }\n</div>\n\n@if (hasPanels()) {\n <div class=\"ef-tabs__panels\" role=\"tabpanel\">\n @if (activePanel(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\"></ng-container>\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n booleanAttribute,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Compact identity chip — avatar + name + role — designed to sit at the\n * bottom of `ef-module-side` (project via the `side-footer` slot of\n * `ef-app-shell`). On mobile, apps usually surface the same identity in\n * the top bar `[actions]` slot instead.\n *\n * ```html\n * <ef-app-shell>\n * <ef-profile-chip\n * side-footer\n * [name]=\"user.name\"\n * [role]=\"user.roleLabel\"\n * (clickEvent)=\"openUserMenu()\"\n * />\n * <router-outlet />\n * </ef-app-shell>\n * ```\n *\n * The component is intentionally dumb: apps wire their own identity\n * source. Initials are derived from `name` unless explicitly overridden.\n */\n@Component({\n selector: 'ef-profile-chip',\n standalone: true,\n templateUrl: './ef-profile-chip.component.html',\n styleUrl: './ef-profile-chip.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TranslateModule],\n})\nexport class EfProfileChipComponent {\n /** Direct name text (not translated). */\n @Input() name?: string;\n\n /** Direct role text (not translated). */\n @Input() role?: string;\n\n /** Translation key for the role line — takes priority over `role`. */\n @Input() roleKey?: string;\n\n /** Override the avatar glyph. Defaults to the first letter of `name`. */\n @Input() initial?: string;\n\n /** Tenant tone uses `--tenant-500`; neutral uses `--ink-active`. */\n @Input() tone: 'tenant' | 'neutral' = 'tenant';\n\n /** Render as a non-interactive container (no hover/focus, no click). */\n @Input({ transform: booleanAttribute }) readonly = false;\n\n @Output() readonly clickEvent = new EventEmitter<Event>();\n\n get computedInitial(): string {\n const source = (this.initial ?? this.name ?? '').trim();\n return source ? source.charAt(0).toUpperCase() : '?';\n }\n\n handleClick(event: Event): void {\n if (!this.readonly) {\n this.clickEvent.emit(event);\n }\n }\n}\n","<button\n type=\"button\"\n class=\"ef-profile-chip\"\n [class.is-tenant]=\"tone === 'tenant'\"\n [class.is-readonly]=\"readonly\"\n [attr.aria-label]=\"name || null\"\n [attr.tabindex]=\"readonly ? -1 : null\"\n (click)=\"handleClick($event)\"\n>\n <span class=\"ef-profile-chip__avatar\" aria-hidden=\"true\">{{ computedInitial }}</span>\n <span class=\"ef-profile-chip__text\">\n @if (name) {\n <span class=\"ef-profile-chip__name\">{{ name }}</span>\n }\n @if (roleKey || role) {\n <span class=\"ef-profile-chip__role\">\n @if (roleKey) {\n {{ roleKey | translate }}\n } @else {\n {{ role }}\n }\n </span>\n }\n </span>\n</button>\n","import { Component, Input } from '@angular/core';\nimport { BlockUIModule } from 'primeng/blockui';\n\n@Component({\n selector: 'ef-block-ui',\n standalone: true,\n templateUrl: './ef-block-ui.component.html',\n styleUrls: ['./ef-block-ui.component.scss'],\n imports: [BlockUIModule],\n})\nexport class EfBlockUiComponent {\n @Input() isLoading = false;\n @Input() contentPanel!: any;\n}\n","@if (isLoading) {\n <p-blockUI\n [target]=\"contentPanel\"\n [blocked]=\"isLoading\"\n styleClass=\"appBlockUI w-full h-full fixed top-0 left-0 right-0 flex items-start justify-center bg-black/30 z-20\">\n\n <ng-template pTemplate=\"loader\">\n <!-- Loader Container -->\n <div class=\"mt-2 flex flex-row items-center space-x-4 rounded-lg bg-white px-4 py-2 shadow\">\n <!-- Spinning Loader -->\n <div class=\"h-6 w-6 animate-spin rounded-full border-2 border-primary border-t-transparent dark:border-primary-contrast dark:border-t-transparent\"></div>\n\n <!-- Loading Text -->\n <div id=\"loading-text\" class=\"font-normal text-primary dark:text-primary-contrast\">\n Chargement en cours... !\n </div>\n </div>\n </ng-template>\n </p-blockUI>\n}\n","import { Component, ElementRef, inject, Input, HostBinding } from '@angular/core';\nimport { BlockableUI } from 'primeng/api';\n\n@Component({\n selector: 'ef-blockable-div',\n standalone: true,\n template: `<ng-content></ng-content>`,\n})\nexport class EfBlockableDivComponent implements BlockableUI {\n @Input() style: { [key: string]: string } = {};\n @Input() cssClass = '';\n\n private readonly el = inject(ElementRef);\n\n getBlockableElement(): HTMLElement {\n return this.el.nativeElement;\n }\n\n @HostBinding('style') get componentStyle() {\n return this.style;\n }\n\n @HostBinding('class') get componentClass() {\n return this.cssClass;\n }\n}\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Live-indicator dot with a soft breath animation.\n *\n * Used for \"Live\", presence indicators, anything that says \"this is\n * happening right now.\" Defaults to the Comptoir `--st-delivered-fg`\n * green; pass `[severity]=\"'warn' | 'danger' | 'mute'\"` for amber, red,\n * or grey variants.\n *\n * ```html\n * <ef-pulse labelKey=\"status.live\" />\n * <ef-pulse label=\"Offline\" severity=\"mute\" />\n * ```\n */\n@Component({\n selector: 'ef-pulse',\n standalone: true,\n templateUrl: './ef-pulse.component.html',\n styleUrl: './ef-pulse.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TranslateModule],\n})\nexport class EfPulseComponent {\n /** Direct label text (no translation). */\n @Input() label?: string;\n /** Translation key — takes priority over label. */\n @Input() labelKey?: string;\n /** Visual tone of the dot. */\n @Input() severity: 'success' | 'warn' | 'danger' | 'mute' = 'success';\n /** Set false to freeze the breath animation. */\n @Input() active = true;\n}\n","<span class=\"ef-pulse\" [attr.data-severity]=\"severity\" [class.is-static]=\"!active\">\n <span class=\"ef-pulse__halo\" aria-hidden=\"true\"></span>\n <span class=\"ef-pulse__dot\" aria-hidden=\"true\"></span>\n @if (labelKey) {\n <span class=\"ef-pulse__label\">{{ labelKey | translate }}</span>\n } @else if (label) {\n <span class=\"ef-pulse__label\">{{ label }}</span>\n }\n</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport {\n EfDialogAction,\n EfDialogComponent,\n} from '../../layout/ef-dialog/ef-dialog.component';\n\n/**\n * Reusable PDF preview overlay — an `ef-dialog` hosting the browser's native\n * PDF viewer (an `<iframe>` fed a sanitized object URL) plus an optional action\n * bar (WhatsApp share · download · open in new tab · print · close).\n *\n * Self-contained: pass a `Blob` and a `fileName`, toggle which actions show.\n * The object URL is created/revoked automatically with the blob's lifetime.\n *\n * @example\n * <ef-pdf-preview\n * [(visible)]=\"pdfVisible\"\n * [blob]=\"pdfBlob()\"\n * [fileName]=\"pdfName()\"\n * [showWhatsappShare]=\"true\"\n * [whatsappPhone]=\"customerPhone()\" />\n */\n@Component({\n selector: 'ef-pdf-preview',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TranslateModule, EfDialogComponent],\n templateUrl: './ef-pdf-preview.component.html',\n styleUrl: './ef-pdf-preview.component.scss',\n})\nexport class EfPdfPreviewComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** The PDF blob to preview. Setting it (re)creates the object URL. */\n blob = input<Blob | null>(null);\n /** File name shown in the header + used for download / share. */\n fileName = input<string>('document.pdf');\n /** Two-way dialog visibility. */\n visible = model<boolean>(false);\n /** Header title translation key. */\n titleKey = input<string>('pdf_preview.title');\n\n showDownload = input(true, { transform: booleanAttribute });\n showPrint = input(true, { transform: booleanAttribute });\n showOpenInNewTab = input(true, { transform: booleanAttribute });\n /** Show the WhatsApp share button (Web Share API → wa.me fallback). */\n showWhatsappShare = input(false, { transform: booleanAttribute });\n /** Optional recipient phone for the wa.me fallback (digits / +). */\n whatsappPhone = input<string>('');\n\n private readonly objectUrl = signal<string | null>(null);\n private currentUrl: string | null = null;\n\n readonly safeUrl = computed<SafeResourceUrl | null>(() => {\n const url = this.objectUrl();\n return url ? this.sanitizer.bypassSecurityTrustResourceUrl(url) : null;\n });\n\n /** Footer buttons, rendered by `ef-dialog`'s `[actions]`. `dismiss:false`\n * keeps the preview open after download/print/share/open. */\n readonly actions = computed<EfDialogAction[]>(() => {\n const list: EfDialogAction[] = [\n {\n labelKey: 'common_close',\n icon: 'pi pi-times',\n severity: 'ghost',\n styleClass: 'btn-dialog-leading',\n dismiss: true,\n },\n ];\n if (this.showWhatsappShare()) {\n list.push({\n labelKey: 'pdf_preview.whatsapp',\n icon: 'pi pi-whatsapp',\n severity: 'ghost',\n styleClass: 'btn-whatsapp',\n dismiss: false,\n command: () => this.shareWhatsapp(),\n });\n }\n if (this.showDownload()) {\n list.push({\n labelKey: 'pdf_preview.download',\n icon: 'pi pi-download',\n severity: 'ghost',\n styleClass: 'btn-download',\n dismiss: false,\n command: () => this.download(),\n });\n }\n if (this.showOpenInNewTab()) {\n list.push({\n labelKey: 'pdf_preview.new_window',\n icon: 'pi pi-external-link',\n severity: 'ghost',\n dismiss: false,\n command: () => this.openInNewTab(),\n });\n }\n if (this.showPrint()) {\n list.push({\n labelKey: 'pdf_preview.print',\n icon: 'pi pi-print',\n severity: 'primary',\n dismiss: false,\n command: () => this.print(),\n });\n }\n return list;\n });\n\n constructor() {\n effect(() => {\n const blob = this.blob();\n this.revoke();\n this.currentUrl = blob ? URL.createObjectURL(blob) : null;\n this.objectUrl.set(this.currentUrl);\n });\n inject(DestroyRef).onDestroy(() => this.revoke());\n }\n\n private revoke(): void {\n if (this.currentUrl) {\n URL.revokeObjectURL(this.currentUrl);\n this.currentUrl = null;\n }\n }\n\n close(): void {\n this.visible.set(false);\n }\n\n download(): void {\n if (!this.currentUrl) return;\n const a = document.createElement('a');\n a.href = this.currentUrl;\n a.download = this.fileName();\n a.click();\n }\n\n openInNewTab(): void {\n if (this.currentUrl) window.open(this.currentUrl, '_blank');\n }\n\n print(): void {\n if (!this.currentUrl) return;\n const win = window.open(this.currentUrl, '_blank');\n win?.addEventListener('load', () => win.print());\n }\n\n shareWhatsapp(): void {\n const blob = this.blob();\n if (!blob) return;\n const file = new File([blob], this.fileName(), { type: 'application/pdf' });\n const nav = navigator as Navigator & {\n canShare?: (data?: unknown) => boolean;\n };\n if (nav.share && nav.canShare?.({ files: [file] })) {\n nav\n .share({ files: [file], title: this.fileName() })\n .catch(() => this.openWhatsappWeb());\n return;\n }\n this.openWhatsappWeb();\n }\n\n private openWhatsappWeb(): void {\n const phone = (this.whatsappPhone() || '').replace(/[^0-9+]/g, '');\n const msg = encodeURIComponent(this.fileName());\n const url = phone\n ? `https://wa.me/${phone}?text=${msg}`\n : `https://wa.me/?text=${msg}`;\n window.open(url, '_blank');\n }\n}\n","<ef-dialog\n [(visible)]=\"visible\"\n [headerKey]=\"titleKey()\"\n [subtitle]=\"fileName()\"\n icon=\"pi pi-file-pdf\"\n [style]=\"{ width: '92vw', 'max-width': '1280px' }\"\n styleClass=\"ef-pdf-preview-dialog\"\n [actions]=\"actions()\"\n>\n <div class=\"pdf-frame-wrap\">\n @if (safeUrl()) {\n <iframe class=\"pdf-frame\" [src]=\"safeUrl()\" [title]=\"fileName()\"></iframe>\n } @else {\n <div class=\"pdf-empty\">{{ 'pdf_preview.empty' | translate }}</div>\n }\n </div>\n</ef-dialog>\n","/**\n * Comptoir status spectrum — the canonical set of chip tones every\n * status reference can map to via `metadata.color`.\n *\n * Tenants customize their status palettes by writing one of these\n * values into `reference_data.metadata.color` for each entry. The\n * elastic-portal admin (when ready) picks from this same enum, so\n * the framework stays tenant-agnostic and the data layer is the\n * only knob that needs to change per tenant.\n */\nexport type EfStatusColor =\n | 'pending'\n | 'processing'\n | 'shipped'\n | 'delivered'\n | 'cancelled'\n | 'refunded'\n | 'onhold'\n | 'tenant'\n | 'module'\n | 'neutral';\n\n/**\n * Shape `ef-status-chip` expects when reading from a reference\n * dictionary. Mirrors the `reference_data` MongoDB collection in\n * ElasticERP — apps can pass any object with these fields.\n */\nexport interface EfStatusReferenceItem {\n code: string;\n label?: string;\n labelKey?: string;\n metadata?: {\n color?: EfStatusColor | string;\n icon?: string;\n [key: string]: unknown;\n };\n}\n\n/** Canonical tone list — used for membership checks by the resolver. */\nexport const EF_STATUS_COLORS: ReadonlyArray<EfStatusColor> = [\n 'pending',\n 'processing',\n 'shipped',\n 'delivered',\n 'cancelled',\n 'refunded',\n 'onhold',\n 'tenant',\n 'module',\n 'neutral',\n];\n\n/**\n * Generic color-name aliases → Comptoir tones. Seeded `reference_data`\n * commonly stores plain color names in `metadata.color` (e.g.\n * `sales_order_status`: Draft=gray, Completed=green, Cancelled=red).\n * Resolving them here keeps chips AND status-keyed charts on the same\n * `--st-*` tokens without migrating tenant data.\n */\nexport const EF_STATUS_COLOR_ALIASES: Readonly<Record<string, EfStatusColor>> = {\n gray: 'onhold',\n grey: 'onhold',\n slate: 'onhold',\n yellow: 'refunded',\n orange: 'pending',\n blue: 'processing',\n purple: 'shipped',\n green: 'delivered',\n red: 'cancelled',\n};\n\n/**\n * Resolve a `metadata.color` value — a canonical tone OR a generic\n * color-name alias — to its Comptoir tone. `undefined` when unknown,\n * so callers can chain fallbacks (e.g. the status code itself, then\n * `'neutral'`). Case-insensitive.\n */\nexport function resolveEfStatusColor(\n value: string | null | undefined,\n): EfStatusColor | undefined {\n if (!value) return undefined;\n const v = value.toLowerCase();\n if ((EF_STATUS_COLORS as ReadonlyArray<string>).includes(v)) {\n return v as EfStatusColor;\n }\n return EF_STATUS_COLOR_ALIASES[v];\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n Optional,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport {\n SCREEN_REF_DATA_SERVICE,\n ScreenReferenceDataService,\n} from '@elasticias/screens';\nimport {\n EfStatusColor,\n EfStatusReferenceItem,\n resolveEfStatusColor,\n} from './ef-status-chip.types';\n\n/**\n * Comptoir status chip — single source of truth for any kind of\n * status / pill across the app.\n *\n * Resolves the chip's tone + label from the `reference_data`\n * collection so each tenant can re-skin its status palette without\n * touching consumer code:\n *\n * 1. Look up `referenceKey` in `SCREEN_REF_DATA_SERVICE`.\n * 2. Find the entry whose `code` matches the `code` input.\n * 3. Use `metadata.color` for the chip class and `label` /\n * `labelKey` for the text.\n * 4. Fall back to the `code` itself (lowercased) when no reference\n * data is registered — this lets screens render meaningfully even\n * before the real `ReferenceDataService` is wired.\n *\n * ```html\n * <ef-status-chip\n * referenceKey=\"sales_order_status\"\n * [code]=\"row.status\"\n * />\n * ```\n *\n * Override knobs (escape hatches):\n * - `[color]` forces a specific Comptoir tone, ignoring metadata.\n * - `[label]` / `[labelKey]` force the text, ignoring reference data.\n * - `[hideDot]` removes the leading ● glyph.\n * - `[showCode]` displays the raw code (useful for admin screens).\n */\n@Component({\n selector: 'ef-status-chip',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n templateUrl: './ef-status-chip.component.html',\n styleUrl: './ef-status-chip.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfStatusChipComponent {\n private readonly refDataService = inject<ScreenReferenceDataService | null>(\n SCREEN_REF_DATA_SERVICE,\n { optional: true },\n );\n\n /** Reference key (e.g. `'sales_order_status'`). */\n readonly referenceKey = input<string>('');\n\n /** Entry code to look up (e.g. `'Pending'`). */\n readonly code = input<string>('');\n\n /** Force a specific Comptoir tone (overrides metadata.color). */\n readonly color = input<EfStatusColor | ''>('');\n\n /** Force the displayed label (skips reference lookup). */\n readonly label = input<string>('');\n /** Translation key — preferred when forcing a label. */\n readonly labelKey = input<string>('');\n\n /** Hide the leading ● dot. */\n readonly hideDot = input(false, { transform: booleanAttribute });\n\n /** Render the raw `code` after the label (admin-screen helper). */\n readonly showCode = input(false, { transform: booleanAttribute });\n\n /** The reference entry matching `code`, or `undefined`. */\n private readonly entry = computed<EfStatusReferenceItem | undefined>(() => {\n if (!this.refDataService) return undefined;\n const key = this.referenceKey();\n if (!key) return undefined;\n const list = this.refDataService.getReference(key)();\n return list.find(\n (item: EfStatusReferenceItem) => item?.code === this.code(),\n );\n });\n\n /** Chip tone — explicit override → metadata (canonical tone or\n * generic color-name alias, e.g. `green` → `delivered`) → code\n * fallback → `neutral`. */\n readonly resolvedColor = computed<EfStatusColor>(() => {\n const forced = this.color();\n if (forced) return forced as EfStatusColor;\n\n return (\n resolveEfStatusColor(this.entry()?.metadata?.color) ??\n resolveEfStatusColor(this.code()) ??\n 'neutral'\n );\n });\n\n /** Resolved label — labelKey input → label input → reference label → code. */\n readonly resolvedLabel = computed<string>(() => {\n const entry = this.entry();\n return this.label() || entry?.label || this.code();\n });\n\n /** Translation key returned for the template's translate pipe. */\n readonly resolvedLabelKey = computed<string>(() => {\n return this.labelKey() || this.entry()?.labelKey || '';\n });\n}\n","<span class=\"chip\" [class]=\"'chip chip-' + resolvedColor()\">\n @if (!hideDot()) {\n <span aria-hidden=\"true\">●</span>\n }\n @if (resolvedLabelKey()) {\n {{ resolvedLabelKey() | translate }}\n } @else {\n {{ resolvedLabel() }}\n }\n @if (showCode()) {\n <span class=\"text-mute\" style=\"margin-inline-start: 6px; font-family: 'JetBrains Mono', monospace; font-size: 10.5px;\">\n {{ code() }}\n </span>\n }\n</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n booleanAttribute,\n effect,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfToast, EfToastAction, EfToastService } from '@elasticias/core';\n\n/**\n * Available anchor positions for the toast region.\n */\nexport type EfToastRegionPosition =\n | 'top-right'\n | 'top-left'\n | 'top-center'\n | 'bottom-right'\n | 'bottom-left'\n | 'bottom-center';\n\n/**\n * Comptoir toast region — V2 successor to PrimeNG `<p-toast>`.\n *\n * Mounts once at the app root (or any layout shell) and renders the\n * live `EfToastService.toasts` queue. Auto-dismiss timers + manual\n * close button + optional inline action buttons. Severity styling\n * comes from the `.toast.<severity>` rules in `_patterns.scss`,\n * mapped 1:1 to the Comptoir status spectrum.\n *\n * ```html\n * <!-- App root -->\n * <ef-toast-region position=\"bottom-right\" />\n * ```\n */\n@Component({\n selector: 'ef-toast-region',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n templateUrl: './ef-toast-region.component.html',\n styleUrl: './ef-toast-region.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfToastRegionComponent {\n private readonly toastService = inject(EfToastService);\n private readonly destroyRef = inject(DestroyRef);\n\n /** Anchor position. Default: bottom-right. */\n readonly position = input<EfToastRegionPosition>('bottom-right');\n\n /** Cap the visible stack — older toasts get auto-dismissed. */\n readonly maxStack = input<number>(5);\n\n /** Hide the bottom progress bar across all toasts. */\n readonly hideProgress = input(false, { transform: booleanAttribute });\n\n /** Toasts currently mid-exit-animation (kept around for the\n * duration of the CSS transition before being removed from DOM). */\n readonly exiting = signal<ReadonlySet<number>>(new Set());\n\n /** Live queue from the service — direct read so the template\n * re-renders when a toast is pushed or dismissed. */\n readonly toasts = this.toastService.toasts;\n\n /** Per-toast lifespan timers (manual setTimeout — robust against\n * Angular zoneless mode and visible across HMR reloads). */\n private readonly timers = new Map<number, ReturnType<typeof setTimeout>>();\n\n constructor() {\n // Whenever the queue changes, schedule auto-dismiss timers for\n // newly added toasts and trim the stack to maxStack.\n effect(() => {\n const list = this.toasts();\n untracked(() => this.syncTimers(list));\n untracked(() => this.enforceMaxStack(list));\n });\n\n this.destroyRef.onDestroy(() => {\n for (const t of this.timers.values()) clearTimeout(t);\n this.timers.clear();\n });\n }\n\n /* ── Class plumbing ────────────────────────────────────────── */\n\n severityClass(t: EfToast): string {\n return `toast ${t.severity}` + (this.exiting().has(t.id) ? ' out' : '');\n }\n\n iconClass(t: EfToast): string {\n switch (t.severity) {\n case 'success':\n return 'pi pi-check';\n case 'warn':\n return 'pi pi-exclamation-triangle';\n case 'error':\n return 'pi pi-times';\n case 'info':\n default:\n return 'pi pi-info-circle';\n }\n }\n\n progressStyle(t: EfToast): { [k: string]: string } | null {\n if (t.life <= 0) return null;\n return { '--toast-life': `${t.life}ms` };\n }\n\n /* ── Interactions ──────────────────────────────────────────── */\n\n onClose(t: EfToast): void {\n this.beginExit(t.id);\n }\n\n onActionClick(t: EfToast, action: EfToastAction): void {\n action.command?.();\n if (action.dismissOnClick !== false) this.beginExit(t.id);\n }\n\n trackById = (_: number, t: EfToast): number => t.id;\n\n /* ── Internals ─────────────────────────────────────────────── */\n\n private syncTimers(list: ReadonlyArray<EfToast>): void {\n const visibleIds = new Set(list.map((t) => t.id));\n\n // Drop timers for toasts no longer in the queue.\n for (const [id, handle] of this.timers) {\n if (!visibleIds.has(id)) {\n clearTimeout(handle);\n this.timers.delete(id);\n }\n }\n\n // Schedule timers for new toasts (skip sticky `life: 0`).\n for (const t of list) {\n if (this.timers.has(t.id) || t.life <= 0) continue;\n const handle = setTimeout(() => this.beginExit(t.id), t.life);\n this.timers.set(t.id, handle);\n }\n }\n\n private enforceMaxStack(list: ReadonlyArray<EfToast>): void {\n const cap = this.maxStack();\n if (cap <= 0) return;\n const overflow = list.length - cap;\n if (overflow <= 0) return;\n // Drop oldest entries first.\n for (let i = 0; i < overflow; i++) {\n this.beginExit(list[i].id);\n }\n }\n\n /** Mark the toast as exiting → wait for the CSS animation → tell\n * the service to remove it. Keeps the DOM around for the\n * out-animation duration. */\n private beginExit(id: number): void {\n if (this.exiting().has(id)) return;\n this.exiting.update((set) => {\n const next = new Set(set);\n next.add(id);\n return next;\n });\n const handle = this.timers.get(id);\n if (handle) {\n clearTimeout(handle);\n this.timers.delete(id);\n }\n // 260ms matches `--t-base`; wait one frame longer to be safe.\n setTimeout(() => {\n this.exiting.update((set) => {\n const next = new Set(set);\n next.delete(id);\n return next;\n });\n this.toastService.dismiss(id);\n }, 280);\n }\n}\n","<div\n class=\"toast-region\"\n [class.top-right]=\"position() === 'top-right'\"\n [class.top-left]=\"position() === 'top-left'\"\n [class.top-center]=\"position() === 'top-center'\"\n [class.bottom-right]=\"position() === 'bottom-right'\"\n [class.bottom-left]=\"position() === 'bottom-left'\"\n [class.bottom-center]=\"position() === 'bottom-center'\"\n role=\"region\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'ef_toast_region_aria' | translate\"\n>\n @for (toast of toasts(); track trackById($index, toast)) {\n <div\n [class]=\"severityClass(toast)\"\n [style]=\"progressStyle(toast)\"\n role=\"status\"\n >\n <div class=\"toast__ico\">\n <i [class]=\"iconClass(toast)\" aria-hidden=\"true\"></i>\n </div>\n\n <div class=\"toast__body\">\n @if (toast.title) {\n <div class=\"toast__title\">{{ toast.title }}</div>\n }\n @if (toast.text) {\n <div class=\"toast__text\">{{ toast.text }}</div>\n }\n\n @if (toast.actions?.length) {\n <div class=\"toast__actions\">\n @for (action of toast.actions; track action.label || action.labelKey) {\n <button\n type=\"button\"\n class=\"btn btn-sm\"\n [class.btn-primary]=\"action.severity === 'primary'\"\n [class.btn-ghost]=\"(action.severity ?? 'ghost') === 'ghost'\"\n (click)=\"onActionClick(toast, action)\"\n >\n {{ action.labelKey ? (action.labelKey | translate) : action.label }}\n </button>\n }\n </div>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"toast__close\"\n [attr.aria-label]=\"'ef_toast_close' | translate\"\n (click)=\"onClose(toast)\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n\n @if (toast.life > 0 && !hideProgress()) {\n <div class=\"toast__progress\"></div>\n }\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/**\n * 12-column form-grid primitive. Children use `.col-2/3/4/6/8/9/12`\n * to claim spans; on viewports < 720px every span collapses to 12.\n *\n * ```html\n * <ef-form-grid>\n * <div class=\"col-6 ef-field\">\n * <label>Client</label>\n * <ef-select … />\n * </div>\n * <div class=\"col-3 ef-field\">\n * <label>Date</label>\n * <ef-datepicker … />\n * </div>\n * <div class=\"col-3 ef-field\">\n * <label>Total</label>\n * <span class=\"read strong\">12 350,00 MAD</span>\n * </div>\n * </ef-form-grid>\n * ```\n */\n@Component({\n selector: 'ef-form-grid',\n standalone: true,\n template: '<ng-content></ng-content>',\n host: { class: 'ef-form-grid' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfFormGridComponent {}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ScreenContext } from '@elasticias/screens';\nimport { Permissions } from '@elasticias/types';\nimport { EfButtonComponent } from '../ef-button/ef-button.component';\nimport { EfDetailToolbarAction } from './ef-detail-toolbar.types';\n\n/**\n * Sticky detail-screen toolbar. Two slots and an optional declarative\n * action API:\n *\n * - default — entity identity (ref / name / status chip / meta).\n * - `[customActions]` input — declarative array of EfDetailToolbarAction;\n * rendered at the start of the right group,\n * before the standard actions.\n * - `[actions]` slot — full-template escape hatch (rendered after\n * `[customActions]`, before the separator).\n * - Standard actions — Print, Duplicate, Delete, Save (in that order),\n * shown via `[showPrintAction]` / `[showDuplicateAction]`\n * / `[showDeleteAction]` / `[showSaveAction]` and\n * gated by `[context]`'s permissions.\n *\n * Layout: `…identity (left) | …customActions [actions] | print duplicate delete save…`\n *\n * ```html\n * <ef-detail-toolbar\n * [customActions]=\"screenActions()\"\n * [context]=\"context\"\n * [showPrintAction]=\"editionState()\"\n * [showDuplicateAction]=\"editionState()\"\n * [showDeleteAction]=\"editionState()\"\n * [saving]=\"loading()\"\n * [saveLabelKey]=\"editionState() ? 'common_save' : 'common_create'\"\n * (print)=\"print()\"\n * (duplicate)=\"duplicate()\"\n * (delete)=\"delete()\"\n * (save)=\"save()\"\n * >\n * <span class=\"ref\">{{ ref() }}</span>\n * <ef-status-chip referenceKey=\"…\" [code]=\"status()\" />\n * </ef-detail-toolbar>\n * ```\n *\n * Custom actions can declare `permission` and `visible` like\n * `EfRowAction`. With `[context]` bound, the toolbar filters them\n * against `ScreenContext.isGranted()` automatically.\n */\n@Component({\n selector: 'ef-detail-toolbar',\n standalone: true,\n imports: [CommonModule, TranslateModule, EfButtonComponent],\n templateUrl: './ef-detail-toolbar.component.html',\n host: { class: 'detail-toolbar' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfDetailToolbarComponent {\n /* ── Inputs ─────────────────────────────────────────────────── */\n\n /** Custom screen-specific actions, rendered before the standard\n * set in the right group. Each one gets the same permission /\n * visibility filtering used by EfRowAction. */\n readonly customActions = input<ReadonlyArray<EfDetailToolbarAction>>([]);\n\n /** Optional ScreenContext — when present, custom actions with a\n * `permission` field and standard actions Print / Duplicate /\n * Delete are filtered against `context.isGranted(...)`. */\n readonly context = input<ScreenContext | undefined>(undefined);\n\n /** Render the standard Print action (left of the standard group). */\n readonly showPrintAction = input(false, { transform: booleanAttribute });\n\n /** Render the standard Duplicate action. */\n readonly showDuplicateAction = input(false, { transform: booleanAttribute });\n\n /** Render the standard Delete action (danger-tinted). */\n readonly showDeleteAction = input(false, { transform: booleanAttribute });\n\n /** Render the standard Save action (rightmost, tenant-styled). */\n readonly showSaveAction = input(true, { transform: booleanAttribute });\n\n /** Disable Save while a save round-trip is in flight. */\n readonly saving = input(false, { transform: booleanAttribute });\n\n /** i18n key for the Save button label. Screens typically pass\n * `'common_create'` in create mode and `'common_save'` in edit. */\n readonly saveLabelKey = input<string>('common_save');\n\n /* ── Outputs ────────────────────────────────────────────────── */\n\n /** Fired when a `customActions` button is clicked. The toast\n * service or screen handler should consume `id`. The `command`\n * callback on the action is also invoked. */\n readonly customAction = output<EfDetailToolbarAction>();\n\n readonly print = output<void>();\n readonly duplicate = output<void>();\n readonly delete = output<void>();\n readonly save = output<void>();\n\n /* ── Computed visibility ────────────────────────────────────── */\n\n /** Custom actions after permission + `visible` filtering. */\n readonly visibleCustomActions = computed<\n ReadonlyArray<EfDetailToolbarAction>\n >(() => {\n const ctx = this.context();\n return this.customActions().filter((a) => this.isCustomVisible(a, ctx));\n });\n\n readonly canPrint = computed(() =>\n this.checkStandard(this.showPrintAction(), Permissions.Print),\n );\n readonly canDuplicate = computed(() =>\n this.checkStandard(this.showDuplicateAction(), Permissions.Duplicate),\n );\n readonly canDelete = computed(() =>\n this.checkStandard(this.showDeleteAction(), Permissions.Delete),\n );\n readonly canSave = computed(() => this.showSaveAction());\n\n readonly hasStandardActions = computed(\n () =>\n this.canPrint() ||\n this.canDuplicate() ||\n this.canDelete() ||\n this.canSave(),\n );\n readonly hasCustomActions = computed(\n () => this.visibleCustomActions().length > 0,\n );\n\n /** Whether the `|` separator should render — both groups present. */\n readonly showSeparator = computed(\n () => this.hasCustomActions() && this.hasStandardActions(),\n );\n\n /* ── Click bridge ───────────────────────────────────────────── */\n\n onCustomClick(action: EfDetailToolbarAction): void {\n if (action.disabled) return;\n action.command?.();\n this.customAction.emit(action);\n }\n\n /* ── Internals ──────────────────────────────────────────────── */\n\n private isCustomVisible(\n action: EfDetailToolbarAction,\n ctx: ScreenContext | undefined,\n ): boolean {\n if (action.visible === false) return false;\n if (action.permission && ctx && !ctx.isGranted(action.permission))\n return false;\n return true;\n }\n\n /** Standard action visibility: `show*Action` flag AND permission\n * granted by `context` (or no context bound). */\n private checkStandard(\n flag: boolean,\n perm:\n | Permissions.Duplicate\n | Permissions.Print\n | Permissions.Delete,\n ): boolean {\n if (!flag) return false;\n const ctx = this.context();\n if (!ctx) return true;\n switch (perm) {\n case Permissions.Print:\n return ctx.hasPrintPermission;\n case Permissions.Duplicate:\n return ctx.hasDuplicatePermission;\n case Permissions.Delete:\n return ctx.hasDeletePermission;\n }\n }\n\n /** Stable trackBy across renders. */\n trackByAction = (i: number, a: EfDetailToolbarAction): unknown =>\n a.id ?? a.labelKey ?? a.label ?? i;\n}\n","<div class=\"left\">\n <ng-content></ng-content>\n</div>\n\n<div class=\"right\">\n <!-- Custom screen actions (before the standard group). -->\n @for (action of visibleCustomActions(); track trackByAction($index, action)) {\n <ef-button\n variant=\"comptoir\"\n size=\"small\"\n [severity]=\"action.severity ?? 'ghost'\"\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n [labelKey]=\"action.labelKey\"\n [disabled]=\"!!action.disabled\"\n (clickEvent)=\"onCustomClick(action)\"\n />\n }\n\n <!-- Full-template escape hatch — anything projected here renders\n after the customActions array, before the standard group. -->\n <ng-content select=\"[actions]\"></ng-content>\n\n <!-- Separator between custom and standard groups. -->\n @if (showSeparator()) {\n <span class=\"sep\" aria-hidden=\"true\">|</span>\n }\n\n <!-- Standard actions: Print → Duplicate → Delete → Save. -->\n @if (canPrint()) {\n <ef-button\n variant=\"comptoir\"\n severity=\"ghost\"\n size=\"small\"\n icon=\"pi pi-print\"\n labelKey=\"common_print\"\n (clickEvent)=\"print.emit()\"\n />\n }\n\n @if (canDuplicate()) {\n <ef-button\n variant=\"comptoir\"\n severity=\"ghost\"\n size=\"small\"\n icon=\"pi pi-clone\"\n labelKey=\"common_duplicate\"\n (clickEvent)=\"duplicate.emit()\"\n />\n }\n\n @if (canDelete()) {\n <ef-button\n variant=\"comptoir\"\n severity=\"danger\"\n size=\"small\"\n icon=\"pi pi-trash\"\n labelKey=\"common_delete\"\n (clickEvent)=\"delete.emit()\"\n />\n }\n\n @if (canSave()) {\n <ef-button\n variant=\"comptoir\"\n severity=\"tenant\"\n size=\"small\"\n icon=\"pi pi-save\"\n [labelKey]=\"saveLabelKey()\"\n [disabled]=\"saving()\"\n [loading]=\"saving()\"\n (clickEvent)=\"save.emit()\"\n />\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ScreenContext } from '@elasticias/screens';\nimport { Permissions } from '@elasticias/types';\nimport { EfButtonComponent } from '../ef-button/ef-button.component';\nimport { EfSearchToolbarAction } from './ef-search-toolbar.types';\n\n/**\n * Page-level toolbar for list / search screens. Mirrors the\n * {@link EfDetailToolbarComponent} concept — two slots and a\n * declarative action API — but ships with the search-screen\n * default actions instead of the detail-screen ones.\n *\n * - default — page identity (title / meta / status pills).\n * - `[customActions]` input — declarative array of\n * EfSearchToolbarAction; rendered at the\n * start of the right group, before the\n * standard actions.\n * - `[actions]` slot — full-template escape hatch (rendered after\n * `[customActions]`, before the separator).\n * - Standard actions — Export, Add (in that order), shown via\n * `[showExportAction]` / `[showAddAction]` and\n * gated by `[context]`'s permissions.\n *\n * Search / Clear deliberately do **not** live here — those belong\n * to `ef-smart-bar` (its built-in `(search)` / `(clear)` outputs).\n * This toolbar owns the page-level actions, not the filter actions.\n *\n * Layout: `…title (left) | …customActions [actions] | export add`\n *\n * ```html\n * <ef-search-toolbar\n * [context]=\"context\"\n * [customActions]=\"screenActions()\"\n * showExportAction\n * (export)=\"exportItems()\"\n * (add)=\"add()\"\n * >\n * <div class=\"title-meta\">\n * <h1>{{ 'catalog_products_title' | translate }}</h1>\n * <p class=\"meta\">{{ totalCount() }} items</p>\n * </div>\n * </ef-search-toolbar>\n * ```\n *\n * Custom actions can declare `permission` and `visible` like\n * `EfRowAction`. With `[context]` bound, the toolbar filters them\n * against `ScreenContext.isGranted()` automatically.\n */\n@Component({\n selector: 'ef-search-toolbar',\n standalone: true,\n imports: [CommonModule, TranslateModule, EfButtonComponent],\n templateUrl: './ef-search-toolbar.component.html',\n host: { class: 'search-toolbar' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfSearchToolbarComponent {\n /* ── Inputs ─────────────────────────────────────────────────── */\n\n /** Custom screen-specific actions, rendered before the standard\n * set in the right group. Each one gets the same permission /\n * visibility filtering used by EfRowAction. */\n readonly customActions = input<ReadonlyArray<EfSearchToolbarAction>>([]);\n\n /** Optional ScreenContext — when present, custom actions with a\n * `permission` field and standard actions Export / Add are\n * filtered against `context.isGranted(...)`. */\n readonly context = input<ScreenContext | undefined>(undefined);\n\n /** Render the standard Export action (left of the standard group). */\n readonly showExportAction = input(false, { transform: booleanAttribute });\n\n /** Render the standard Add action (rightmost, tenant-styled). */\n readonly showAddAction = input(true, { transform: booleanAttribute });\n\n /** Disable Add while a navigation / fetch is in flight. */\n readonly busy = input(false, { transform: booleanAttribute });\n\n /** i18n key for the Add button label. Screens typically pass\n * `'common_new'` (default) or a screen-specific\n * `'catalog_products_new'`. */\n readonly addLabelKey = input<string>('common_new');\n\n /** i18n key for the Export button label. */\n readonly exportLabelKey = input<string>('common_export');\n\n /* ── Outputs ────────────────────────────────────────────────── */\n\n /** Fired when a `customActions` button is clicked. The toast\n * service or screen handler should consume `id`. The `command`\n * callback on the action is also invoked. */\n readonly customAction = output<EfSearchToolbarAction>();\n\n readonly export = output<void>();\n readonly add = output<void>();\n\n /* ── Computed visibility ────────────────────────────────────── */\n\n /** Custom actions after permission + `visible` filtering. */\n readonly visibleCustomActions = computed<\n ReadonlyArray<EfSearchToolbarAction>\n >(() => {\n const ctx = this.context();\n return this.customActions().filter((a) => this.isCustomVisible(a, ctx));\n });\n\n readonly canExport = computed(() =>\n this.checkStandard(this.showExportAction(), Permissions.Export),\n );\n readonly canAdd = computed(() =>\n this.checkStandard(this.showAddAction(), Permissions.Create),\n );\n\n readonly hasStandardActions = computed(\n () => this.canExport() || this.canAdd(),\n );\n readonly hasCustomActions = computed(\n () => this.visibleCustomActions().length > 0,\n );\n\n /** Whether the `|` separator should render — both groups present. */\n readonly showSeparator = computed(\n () => this.hasCustomActions() && this.hasStandardActions(),\n );\n\n /* ── Click bridge ───────────────────────────────────────────── */\n\n onCustomClick(action: EfSearchToolbarAction): void {\n if (action.disabled) return;\n action.command?.();\n this.customAction.emit(action);\n }\n\n /* ── Internals ──────────────────────────────────────────────── */\n\n private isCustomVisible(\n action: EfSearchToolbarAction,\n ctx: ScreenContext | undefined,\n ): boolean {\n if (action.visible === false) return false;\n if (action.permission && ctx && !ctx.isGranted(action.permission))\n return false;\n return true;\n }\n\n /** Standard action visibility: `show*Action` flag AND permission\n * granted by `context` (or no context bound). */\n private checkStandard(\n flag: boolean,\n perm: Permissions.Export | Permissions.Create,\n ): boolean {\n if (!flag) return false;\n const ctx = this.context();\n if (!ctx) return true;\n switch (perm) {\n case Permissions.Export:\n return ctx.hasExportPermission;\n case Permissions.Create:\n return ctx.hasCreatePermission;\n }\n }\n\n /** Stable trackBy across renders. */\n trackByAction = (i: number, a: EfSearchToolbarAction): unknown =>\n a.id ?? a.labelKey ?? a.label ?? i;\n}\n","<div class=\"left\">\n <ng-content></ng-content>\n</div>\n\n<div class=\"right\">\n <!-- Custom screen actions (before the standard group). -->\n @for (action of visibleCustomActions(); track trackByAction($index, action)) {\n <ef-button\n variant=\"comptoir\"\n size=\"small\"\n [severity]=\"action.severity ?? 'ghost'\"\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n [labelKey]=\"action.labelKey\"\n [disabled]=\"!!action.disabled\"\n (clickEvent)=\"onCustomClick(action)\"\n />\n }\n\n <!-- Full-template escape hatch — anything projected here renders\n after the customActions array, before the standard group. -->\n <ng-content select=\"[actions]\"></ng-content>\n\n <!-- Separator between custom and standard groups. -->\n @if (showSeparator()) {\n <span class=\"sep\" aria-hidden=\"true\">|</span>\n }\n\n <!-- Standard actions: Export → Add. -->\n @if (canExport()) {\n <ef-button\n variant=\"comptoir\"\n severity=\"ghost\"\n size=\"small\"\n icon=\"pi pi-download\"\n [labelKey]=\"exportLabelKey()\"\n [disabled]=\"busy()\"\n (clickEvent)=\"export.emit()\"\n />\n }\n\n @if (canAdd()) {\n <ef-button\n variant=\"comptoir\"\n severity=\"tenant\"\n size=\"small\"\n icon=\"pi pi-plus\"\n [labelKey]=\"addLabelKey()\"\n [disabled]=\"busy()\"\n (clickEvent)=\"add.emit()\"\n />\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfTotalsGrand, EfTotalsRow } from './ef-totals.types';\n\n/**\n * Sidebar totals stack — key-value rows with optional display-size\n * grand-row (Bricolage Grotesque, ~28px). Lives inside an `<ef-card>`\n * on order / invoice / quote detail screens.\n *\n * ```html\n * <ef-card titleKey=\"orders_totals\">\n * <ef-totals\n * [rows]=\"[\n * { labelKey: 'totals_subtotal', value: '12 350,00', unit: 'MAD' },\n * { labelKey: 'totals_discount', value: '-450,00', unit: 'MAD', tone: 'discount' },\n * { labelKey: 'totals_tax', value: '2 372,40', unit: 'MAD' },\n * ]\"\n * [grand]=\"{ labelKey: 'totals_grand', value: '14 272,40', currency: 'MAD' }\"\n * />\n * </ef-card>\n * ```\n */\n@Component({\n selector: 'ef-totals',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n @for (row of rows(); track row.labelKey || row.label) {\n <div class=\"row\" [class.discount]=\"row.tone === 'discount'\">\n <span class=\"lbl\">\n {{ row.labelKey ? (row.labelKey | translate) : row.label }}\n </span>\n <span class=\"v\">\n {{ row.value }}@if (row.unit) {<span class=\"currency\"> {{ row.unit }}</span>}\n </span>\n </div>\n }\n\n @if (grand(); as g) {\n <hr />\n <div class=\"row grand-row\">\n <span class=\"lbl\">\n {{ g.labelKey ? (g.labelKey | translate) : g.label }}\n </span>\n <span class=\"v\">\n {{ g.value }}@if (g.currency) {<span class=\"currency\">{{ g.currency }}</span>}\n </span>\n </div>\n }\n `,\n host: { class: 'totals' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfTotalsComponent {\n readonly rows = input<ReadonlyArray<EfTotalsRow>>([]);\n readonly grand = input<EfTotalsGrand | undefined>(undefined);\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfStatsRow } from './ef-stats.types';\n\n/**\n * Sidebar mini-KPI stack. Lives inside an `<ef-card>` on detail\n * screens; rule-soft separators between rows, optional `.big` row\n * swaps the value to a Bricolage display number.\n *\n * ```html\n * <ef-card titleKey=\"clients_stats\">\n * <ef-stats\n * [rows]=\"[\n * { labelKey: 'stats_revenue_ytd', value: '128 450', unit: 'MAD', big: true },\n * { labelKey: 'stats_orders_count', value: 42 },\n * { labelKey: 'stats_last_order', value: 'Il y a 3 jours' },\n * ]\"\n * />\n * </ef-card>\n * ```\n *\n * Stats are sidebar-only — never on list/search screens (KPIs there\n * are forbidden, see CLAUDE.md memory).\n */\n@Component({\n selector: 'ef-stats',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n @for (row of rows(); track row.labelKey || row.label) {\n <div class=\"row\" [class.big]=\"row.big\">\n <span class=\"l\">\n {{ row.labelKey ? (row.labelKey | translate) : row.label }}\n </span>\n <span class=\"v\">\n {{ row.value }}@if (row.unit) {<span class=\"unit\">{{ row.unit }}</span>}\n </span>\n </div>\n }\n `,\n host: { class: 'stats' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfStatsComponent {\n readonly rows = input<ReadonlyArray<EfStatsRow>>([]);\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfTimelineItem } from './ef-timeline.types';\n\n/**\n * Vertical timeline — used on order / user / client detail screens\n * to surface the entity's history. Three dot states (`done` / `now`\n * / `upcoming`) line up with the prototype.\n *\n * ```html\n * <ef-card titleKey=\"orders_history\">\n * <ef-timeline\n * [items]=\"[\n * { state: 'done', label: 'Commande créée', meta: 'Karim · 12 mai 14:30' },\n * { state: 'done', label: 'Paiement reçu', meta: 'Stripe · 12 mai 14:32' },\n * { state: 'now', label: 'Préparation', meta: 'En cours' },\n * { state: 'upcoming', label: 'Expédition' },\n * ]\"\n * />\n * </ef-card>\n * ```\n *\n * The `'now'` dot picks up `var(--module)` so each module's accent\n * tints its own active step.\n */\n@Component({\n selector: 'ef-timeline',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n @for (item of items(); track item.id ?? item.labelKey ?? item.label) {\n <div\n class=\"item\"\n [class.done]=\"item.state === 'done'\"\n [class.now]=\"item.state === 'now'\"\n >\n <span class=\"dot\" aria-hidden=\"true\"></span>\n <div class=\"body\">\n <div class=\"label\">\n {{ item.labelKey ? (item.labelKey | translate) : item.label }}\n </div>\n @if (item.metaKey || item.meta) {\n <div class=\"meta\">\n {{ item.metaKey ? (item.metaKey | translate) : item.meta }}\n </div>\n }\n </div>\n </div>\n }\n `,\n host: { class: 'timeline' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfTimelineComponent {\n readonly items = input<ReadonlyArray<EfTimelineItem>>([]);\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfKpiDeltaTone, EfKpiSparkline } from './ef-kpi-card.types';\n\n/**\n * Dashboard headline KPI tile — the one place KPIs are allowed in\n * the design system. List/search screens stay focused on results;\n * KPIs live on per-module dashboards (and detail-screen sidebars\n * via `ef-stats`).\n *\n * ```html\n * <ef-kpi-card\n * labelKey=\"kpi_revenue_7d\"\n * value=\"52 480\"\n * unit=\"MAD\"\n * delta=\"▲ 12%\"\n * deltaTone=\"up\"\n * [spark]=\"[22, 20, 17, 18, 12, 14, 9, 11, 7, 10, 5, 8, 4, 3, 2]\"\n * />\n * ```\n *\n * Sparkline values are normalized to a fixed 200×28 viewBox; the\n * stroke colour follows the active module's color (`--module`, e.g.\n * Sales blue) by default — the convention for report/dashboard\n * accents — override via `[sparkColor]=\"'var(--st-pending-fg)'\"` for\n * variants. Pass an empty array to hide the sparkline.\n */\n@Component({\n selector: 'ef-kpi-card',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n <div class=\"kpi-head\">\n <span class=\"label\">\n {{ labelKey() ? (labelKey() | translate) : label() }}\n </span>\n @if (delta()) {\n <span class=\"delta\" [class]=\"'delta ' + deltaTone()\">{{ delta() }}</span>\n }\n </div>\n\n <div class=\"kpi-value\">\n {{ value() }}@if (unit()) {<span class=\"unit\">{{ unit() }}</span>}\n </div>\n\n @if (sparkPoints()) {\n <svg class=\"spark\" viewBox=\"0 0 200 28\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\n <polyline\n fill=\"none\"\n [attr.stroke]=\"sparkColor()\"\n stroke-width=\"2\"\n [attr.points]=\"sparkPoints()\"\n />\n </svg>\n }\n `,\n host: { class: 'kpi' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfKpiCardComponent {\n /** Translation key for the small label above the headline number. */\n readonly labelKey = input<string>('');\n /** Direct label fallback. */\n readonly label = input<string>('');\n\n /** Pre-formatted headline value (e.g. `'52 480'`, `'603'`). */\n readonly value = input<string | number>('');\n\n /** Optional small unit suffix (e.g. `'MAD'`, `'%'`). */\n readonly unit = input<string>('');\n\n /** Pre-formatted delta text including the arrow glyph (`'▲ 12%'`). */\n readonly delta = input<string>('');\n\n /** Delta tone — drives the arrow color. */\n readonly deltaTone = input<EfKpiDeltaTone>('up');\n\n /** Raw series for the sparkline. */\n readonly spark = input<EfKpiSparkline>([]);\n\n /** Stroke color for the sparkline polyline. Defaults to the active\n * module's color (report-accent convention); SVG resolves the CSS\n * custom property natively. */\n readonly sparkColor = input<string>('var(--module)');\n\n /** Computed `points=\"x,y x,y …\"` attribute, normalized into the\n * 200×28 viewBox so the polyline always fits. Returns null\n * when the series is empty. */\n readonly sparkPoints = computed<string | null>(() => {\n const series = this.spark();\n if (!series || series.length < 2) return null;\n\n const min = Math.min(...series);\n const max = Math.max(...series);\n const range = max - min || 1;\n const xStep = 200 / (series.length - 1);\n\n return series\n .map((v, i) => {\n const x = +(i * xStep).toFixed(2);\n // Higher values → smaller y (origin top-left). Inset\n // by 2px so the stroke doesn't clip at the edges.\n const y = +(26 - ((v - min) / range) * 24).toFixed(2);\n return `${x},${y}`;\n })\n .join(' ');\n });\n}\n","import type { ChartConfiguration, ChartType } from 'chart.js';\n\nexport type EfChartType = 'line' | 'bar' | 'donut';\n\nexport interface EfChartSeries {\n label?: string;\n data: ReadonlyArray<number>;\n color?: string;\n /** Per-point colors (donut slices / bars). Sparse entries fall back to\n * `color`, then the palette — use for status-keyed charts so slices\n * reuse the exact status-chip tokens (`--st-*-fg`) instead of accents. */\n colors?: ReadonlyArray<string | undefined>;\n}\n\n/** Concrete hexes (canvas can't resolve CSS var() strings). Order matches the tenant accents.\n *\n * Convention: the DOMINANT color of report/dashboard visuals is the **active\n * module's color** (`--module`, e.g. Sales blue `--m-sales`). `ef-chart`\n * resolves the token at render time and passes it as `moduleColor`, which\n * takes the palette's first slot — these accents only color secondary\n * series/slices. A series' explicit `color` always wins. */\nexport const EF_CHART_PALETTE: ReadonlyArray<string> = [\n '#0d9488', '#6366f1', '#f59e0b', '#ef4444', '#0ea5e9', '#a855f7',\n];\n\nexport function buildChartConfig(\n type: EfChartType,\n labels: ReadonlyArray<string>,\n series: ReadonlyArray<EfChartSeries>,\n /** Resolved `--module` color — becomes the palette's first (dominant) slot. */\n moduleColor?: string,\n): ChartConfiguration {\n const palette: ReadonlyArray<string> = moduleColor\n ? [moduleColor, ...EF_CHART_PALETTE.filter((c) => c.toLowerCase() !== moduleColor.toLowerCase())]\n : EF_CHART_PALETTE;\n const chartType: ChartType = type === 'donut' ? 'doughnut' : type;\n const datasets = series.map((s, i) => {\n const color = s.color ?? palette[i % palette.length];\n if (type === 'donut') {\n return {\n label: s.label,\n data: [...s.data],\n backgroundColor: s.data.map(\n (_, j) => s.colors?.[j] ?? s.color ?? palette[j % palette.length],\n ),\n borderWidth: 0,\n };\n }\n if (type === 'line') {\n return {\n label: s.label,\n data: [...s.data],\n borderColor: color,\n backgroundColor: `${color}22`,\n fill: true,\n tension: 0.35,\n pointRadius: 2,\n borderWidth: 2,\n };\n }\n return {\n label: s.label,\n data: [...s.data],\n backgroundColor: s.colors ? s.data.map((_, j) => s.colors?.[j] ?? color) : color,\n borderRadius: 4,\n };\n });\n\n return {\n type: chartType,\n data: { labels: [...labels], datasets },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n ...(type === 'donut' ? { cutout: '62%' } : {}),\n plugins: { legend: { display: type === 'donut', position: 'bottom' } },\n scales:\n type === 'donut'\n ? undefined\n : {\n x: { grid: { display: false } },\n y: { beginAtZero: true, grid: { color: 'rgba(0,0,0,0.06)' } },\n },\n },\n } as ChartConfiguration;\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy, Component, ElementRef, OnDestroy, effect, input, viewChild,\n} from '@angular/core';\nimport {\n ArcElement, BarController, BarElement, CategoryScale, Chart, DoughnutController, Filler,\n Legend, LineController, LineElement, LinearScale, PointElement, Tooltip,\n} from 'chart.js';\nimport type { ChartConfiguration } from 'chart.js';\nimport { buildChartConfig, type EfChartSeries, type EfChartType } from './ef-chart.config';\n\nChart.register(\n ArcElement, BarController, BarElement, CategoryScale, DoughnutController, Filler,\n Legend, LineController, LineElement, LinearScale, PointElement, Tooltip,\n);\n\n/**\n * Thin chart.js wrapper for report/dashboard visuals (line, bar, donut).\n * Labels/series are data — i18n happens in the parent. Zoneless-safe: the\n * effect below re-renders whenever inputs change; instance destroyed on cleanup.\n *\n * Color convention: the dominant series/slice color defaults to the **active\n * module's color** — the component resolves `--module` (set by `ef-app-main`'s\n * `[data-module]`, e.g. Sales blue) from the canvas at render time, since the\n * chart.js canvas can't consume CSS `var()` strings. Secondary series fall back\n * to `EF_CHART_PALETTE`; a series' explicit `color` always wins.\n */\n@Component({\n selector: 'ef-chart',\n standalone: true,\n imports: [CommonModule],\n template: `<div class=\"ef-chart\" [style.height.px]=\"height()\"><canvas #canvas></canvas></div>`,\n styles: [`.ef-chart { position: relative; width: 100%; }`],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfChartComponent implements OnDestroy {\n readonly type = input.required<EfChartType>();\n readonly labels = input<ReadonlyArray<string>>([]);\n readonly series = input<ReadonlyArray<EfChartSeries>>([]);\n readonly height = input(260);\n\n private readonly canvas = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\n private chart: Chart | null = null;\n\n constructor() {\n effect(() => {\n // Resolve the module color from the inherited `--module` custom property\n // (empty string outside any [data-module] scope → palette fallback).\n const moduleColor =\n getComputedStyle(this.canvas().nativeElement).getPropertyValue('--module').trim() ||\n undefined;\n const cfg = buildChartConfig(this.type(), this.labels(), this.series(), moduleColor);\n // Chart#config is a union that includes per-dataset-typed configs; ours is always a plain ChartConfiguration.\n if (this.chart && (this.chart.config as ChartConfiguration).type === cfg.type) {\n this.chart.data = cfg.data;\n this.chart.update();\n } else {\n this.chart?.destroy();\n this.chart = new Chart(this.canvas().nativeElement, cfg);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.chart?.destroy();\n this.chart = null;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\nexport interface EfRankRow {\n label: string;\n value: string;\n secondary?: string;\n pct: number;\n}\n\n/** Top-N ranked rows (label · proportional bar · value). Lives inside an ef-card. */\n@Component({\n selector: 'ef-rank-list',\n standalone: true,\n imports: [CommonModule],\n template: `\n <ol class=\"rank\">\n @for (row of rows(); track $index; let i = $index) {\n <li class=\"rank-row\">\n <span class=\"rank-idx\">{{ i + 1 }}</span>\n <span class=\"rank-main\">\n <span class=\"rank-label\" [title]=\"row.label\">{{ row.label }}</span>\n @if (row.secondary) { <span class=\"rank-secondary\">{{ row.secondary }}</span> }\n <span class=\"rank-bar\"><i [style.width.%]=\"clampPct(row.pct)\"></i></span>\n </span>\n <span class=\"rank-value\">{{ row.value }}</span>\n </li>\n }\n </ol>\n `,\n styles: [`\n :host { display: block; }\n .rank { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }\n .rank-row { display: grid; grid-template-columns: 22px 1fr auto; gap: 10px; align-items: center; }\n .rank-idx { font-size: 12px; font-weight: 700; color: var(--ink-soft, #64748b); text-align: center; }\n .rank-main { display: grid; gap: 3px; min-width: 0; }\n .rank-label { font-size: 13px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .rank-secondary { font-size: 11px; color: var(--ink-soft, #64748b); }\n .rank-bar { height: 4px; border-radius: 999px; background: var(--paper-alt, #f1f5f9); overflow: hidden; }\n .rank-bar i { display: block; height: 100%; border-radius: inherit; background: var(--tenant-500, #0d9488); }\n .rank-value { font-size: 13px; font-weight: 700; font-variant-numeric: tabular-nums; }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfRankListComponent {\n readonly rows = input<ReadonlyArray<EfRankRow>>([]);\n\n clampPct(pct: number): number {\n return Math.min(100, Math.max(0, pct));\n }\n}\n","import {\n booleanAttribute,\n Component,\n HostBinding,\n inject,\n Input,\n Output,\n EventEmitter,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { EfClearButtonComponent } from '../ef-clear-button/ef-clear-button.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n@Component({\n selector: 'ef-input-text',\n standalone: true,\n templateUrl: './ef-input-text.component.html',\n styleUrls: ['./ef-input-text.component.scss'],\n imports: [InputTextModule, FormsModule, TranslateModule, EfLabelComponent, EfClearButtonComponent],\n})\nexport class EfInputTextComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor\n{\n /* Identity / label / placeholder / aria / required / readonly /\n disabled all inherited from AbstractEfFormControl. */\n\n @Input() size: 'small' | 'large' = 'small';\n @Input() type = 'text';\n @Input() maxlength?: number;\n @Input({ transform: booleanAttribute }) fluid = true;\n @Input({ transform: booleanAttribute }) inline = false;\n @Input() autocomplete?: string;\n\n /** Clearable (showClear / canClear) is inherited from AbstractEfFormControl;\n * we only supply the value predicate + the reset. */\n protected override get hasValue(): boolean {\n return !!this.value;\n }\n\n override clearValue(): void {\n this.handleInput('');\n }\n\n /**\n * Rendering variant — same dual-mode pattern as `ef-button`.\n * - `'comptoir'` (default) — native `<input class=\"ef-input\">` against\n * the Comptoir pattern styles. Renders at the\n * canonical `--hit-base` (40px) control height.\n * Required for `prefix` / `suffix`.\n * - `'primeng'` — wraps `<input pInputText>` (v1). Opt in when\n * you specifically need PrimeNG input behaviour.\n * See ADR-009 for why comptoir is the height-consistent default.\n */\n @Input() variant: 'primeng' | 'comptoir' = 'comptoir';\n\n /** Inline prefix addon — e.g. `'/p/'` for slugs, `'$'` for prices.\n * Renders only in the Comptoir variant; ignored otherwise. */\n @Input() prefix?: string;\n\n /** Inline suffix addon — e.g. `'MAD'`, `'cm'`. Renders only in the\n * Comptoir variant; ignored otherwise. */\n @Input() suffix?: string;\n\n @HostBinding('class.ef-inline') get isInline() { return this.inline; }\n\n @Output() valueChangeEvent = new EventEmitter<string>();\n\n /** Two-way-bindable as `[value]` (one-way) or\n * `[(value)]=\"signal()\"` (set + listen via `valueChangeEvent`). */\n @Input() value = '';\n\n private onChange: (value: string) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? this.ngControl?.control?.errors?.['serverError'] ?? null;\n }\n\n get isInvalid(): boolean {\n if (this.resolvedExternalErrors()?.length) return true;\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.invalid && (ctrl?.touched || ctrl?.dirty));\n }\n\n writeValue(value: string): void {\n this.value = value ?? '';\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n handleInput(value: string): void {\n this.value = value;\n this.onChange(value);\n this.valueChangeEvent.emit(value);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n}\n","@if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" [for]=\"effectiveId\" [required]=\"required()\" />\n}\n<div class=\"ef-field-control\">\n @if (variant === 'comptoir') {\n @if (prefix || suffix) {\n <!-- Comptoir variant with prefix/suffix — wraps the input in\n an .ef-input-group so the addons share the border + focus\n ring with the input. -->\n <div class=\"ef-input-group\" [class.is-invalid]=\"isInvalid\">\n @if (prefix) {\n <span class=\"ef-input-addon is-prefix\" aria-hidden=\"true\">{{ prefix }}</span>\n }\n <input\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [type]=\"type\"\n [value]=\"value\"\n (input)=\"handleInput($any($event.target).value)\"\n (blur)=\"handleBlur()\"\n [attr.placeholder]=\"effectivePlaceholder || null\"\n [attr.maxlength]=\"maxlength ?? null\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete ?? null\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n />\n @if (canClear) {\n <ef-clear-button\n class=\"ef-group-clear\"\n [ariaLabel]=\"'action.clear' | translate\"\n (clear)=\"clearValue()\"\n />\n }\n @if (suffix) {\n <span class=\"ef-input-addon is-suffix\" aria-hidden=\"true\">{{ suffix }}</span>\n }\n </div>\n } @else {\n <!-- Comptoir variant — bare native input (+ optional inline clear). -->\n <div class=\"ef-input-wrap\">\n <input\n class=\"ef-input\"\n [class.has-clear]=\"canClear\"\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [type]=\"type\"\n [value]=\"value\"\n (input)=\"handleInput($any($event.target).value)\"\n (blur)=\"handleBlur()\"\n [attr.placeholder]=\"effectivePlaceholder || null\"\n [attr.maxlength]=\"maxlength ?? null\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete ?? null\"\n [class.is-invalid]=\"isInvalid\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n />\n @if (canClear) {\n <ef-clear-button\n class=\"ef-input-clear\"\n [ariaLabel]=\"'action.clear' | translate\"\n (clear)=\"clearValue()\"\n />\n }\n </div>\n }\n } @else {\n <!-- PrimeNG variant (default) — v1 styling. -->\n <input\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [type]=\"type\"\n pInputText\n [pSize]=\"size\"\n [value]=\"value\"\n (input)=\"handleInput($any($event.target).value)\"\n (blur)=\"handleBlur()\"\n [attr.placeholder]=\"effectivePlaceholder || null\"\n [attr.maxlength]=\"maxlength ?? null\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete ?? null\"\n [class.ng-invalid]=\"isInvalid\"\n [class.ng-touched]=\"ngControl?.touched\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n fluid\n />\n }\n @if (showRequired || serverErrors) {\n <div [id]=\"errorsId\" role=\"alert\" aria-live=\"polite\">\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n </div>\n }\n</div>\n","import {\n booleanAttribute,\n Component,\n inject,\n Input,\n Output,\n EventEmitter,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport { CheckboxModule } from 'primeng/checkbox';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n/**\n * Comptoir checkbox.\n *\n * Two render variants share the same API:\n * - `'primeng'` (default) — wraps `p-checkbox`. Stock PrimeNG visuals.\n * - `'comptoir'` — native `<input type=\"checkbox\">` styled\n * against `.ef-checkbox-native`. Lean, no animation, fits dense\n * grids (variants table, role / permission lists, etc.).\n *\n * Identity / label / aria / required / readonly / disabled inherited\n * from `AbstractEfFormControl`. `binary` flips between boolean mode\n * (`checked: true/false`) and value-mode (`checked` is the bound\n * value when ticked, `null` when unticked) — the latter pairs with\n * a parent NgModel array for multi-select scenarios.\n *\n * ```html\n * <ef-checkbox\n * labelKey=\"catalog.is_active\"\n * variant=\"comptoir\"\n * [(checked)]=\"variant.isActive\"\n * binary />\n * ```\n */\n@Component({\n selector: 'ef-checkbox',\n standalone: true,\n templateUrl: './ef-checkbox.component.html',\n styleUrls: ['./ef-checkbox.component.scss'],\n imports: [CheckboxModule, FormsModule, TranslateModule, EfLabelComponent],\n})\nexport class EfCheckboxComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor\n{\n /* Identity / label / aria / required / readonly / disabled all\n inherited from AbstractEfFormControl. */\n\n /** Underlying checkbox value when ticked (non-binary mode). */\n @Input() value?: any;\n\n /** Binary mode — checked becomes a boolean rather than the\n * `value` input. Default for new code. */\n @Input({ transform: booleanAttribute }) binary = false;\n\n /**\n * Render variant.\n * - `'primeng'` (default) — wraps `p-checkbox`.\n * - `'comptoir'` — native `<input type=\"checkbox\">`\n * styled against `.ef-checkbox-native`.\n */\n @Input() variant: 'primeng' | 'comptoir' = 'primeng';\n\n /** Two-way bindable `[(checked)]`. */\n @Input() checked: any = false;\n @Output() checkedChange = new EventEmitter<any>();\n\n private onChange: (value: any) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n /* effectiveId / effectiveAriaLabel / errorsId all inherited from\n AbstractEfFormControl. */\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? this.ngControl?.control?.errors?.['serverError'] ?? null;\n }\n\n get isInvalid(): boolean {\n if (this.resolvedExternalErrors()?.length) return true;\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.invalid && (ctrl?.touched || ctrl?.dirty));\n }\n\n writeValue(value: any): void {\n this.checked = value;\n }\n\n registerOnChange(fn: (value: any) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n /** Handler for PrimeNG's onChange event. */\n handleChange(event: any): void {\n this.checked = event.checked;\n this.onChange(event.checked);\n this.checkedChange.emit(event.checked);\n this.onTouched();\n }\n\n /** Handler for the native checkbox change event (Comptoir variant). */\n handleNativeChange(rawChecked: boolean): void {\n const next = this.binary ? rawChecked : (rawChecked ? this.value : null);\n this.checked = next;\n this.onChange(next);\n this.checkedChange.emit(next);\n this.onTouched();\n }\n}\n","@if (variant === 'comptoir') {\n <label class=\"ef-checkbox-native\" [class.is-disabled]=\"disabled\">\n <input\n type=\"checkbox\"\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [checked]=\"!!checked\"\n [disabled]=\"isDisabled()\"\n [class.is-invalid]=\"isInvalid\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n (change)=\"handleNativeChange($any($event.target).checked)\"\n />\n <span class=\"ef-checkbox-box\" aria-hidden=\"true\"></span>\n @if (labelKey() || label()) {\n <span class=\"ef-checkbox-label\">\n {{ labelKey() ? (labelKey() | translate) : label() }}\n @if (required()) {\n <span class=\"ef-checkbox-required\" aria-hidden=\"true\">*</span>\n }\n </span>\n }\n </label>\n} @else {\n <p-checkbox\n [inputId]=\"effectiveId\"\n [name]=\"name()\"\n [ngModel]=\"checked\"\n [ngModelOptions]=\"{standalone: true}\"\n (onChange)=\"handleChange($event)\"\n [value]=\"value\"\n [binary]=\"binary\"\n [disabled]=\"isDisabled()\"\n [ariaLabel]=\"effectiveAriaLabel || undefined\"\n />\n @if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" [for]=\"effectiveId\" styleClass=\"form-label-left cursor-pointer\" />\n }\n}\n@if (showRequired || serverErrors) {\n <div [id]=\"errorsId\" role=\"alert\" aria-live=\"polite\">\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n </div>\n}\n","import { Component, inject, Input, Output, EventEmitter } from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport { ToggleSwitchModule } from 'primeng/toggleswitch';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n/**\n * Comptoir toggle switch — wraps `p-toggleswitch`, boolean-only.\n *\n * Identity / label / aria / required / readonly / disabled inherited\n * from `AbstractEfFormControl`. Use for on/off state that applies\n * immediately (row activation toggles, settings), `ef-checkbox` for\n * form fields that are saved with the enclosing form.\n *\n * ```html\n * <ef-toggleswitch\n * [checked]=\"row.isActive\"\n * [disabled]=\"!context.hasEditPermission\"\n * ariaLabelKey=\"sales_clients_toggle_active_aria\"\n * (checkedChange)=\"setActive(row, $event)\" />\n * ```\n */\n@Component({\n selector: 'ef-toggleswitch',\n standalone: true,\n imports: [ToggleSwitchModule, FormsModule, TranslateModule, EfLabelComponent],\n template: `\n <p-toggleswitch\n [inputId]=\"effectiveId\"\n [name]=\"name() || undefined\"\n [ngModel]=\"checked\"\n [ngModelOptions]=\"{ standalone: true }\"\n [disabled]=\"isDisabled()\"\n [ariaLabel]=\"effectiveAriaLabel || undefined\"\n (onChange)=\"handleChange($event)\"\n />\n @if (labelKey() || label()) {\n <ef-label\n [labelKey]=\"labelKey()\"\n [label]=\"label()\"\n [for]=\"effectiveId\"\n styleClass=\"form-label-left cursor-pointer\"\n />\n }\n `,\n})\nexport class EfToggleSwitchComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor\n{\n /** Two-way bindable `[(checked)]` — boolean only. */\n @Input() checked = false;\n @Output() checkedChange = new EventEmitter<boolean>();\n\n private onChange: (value: boolean) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n writeValue(value: unknown): void {\n this.checked = !!value;\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n handleChange(event: { checked: boolean }): void {\n this.checked = event.checked;\n this.onChange(event.checked);\n this.checkedChange.emit(event.checked);\n this.onTouched();\n }\n}\n","import {\n booleanAttribute,\n Component,\n HostBinding,\n inject,\n Input,\n Output,\n EventEmitter,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport { DatePickerModule } from 'primeng/datepicker';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\n\n/**\n * @deprecated Wraps PrimeNG `p-datepicker`, which does not follow the\n * Comptoir design system. Prefer `ef-datepicker-advanced` in **field\n * mode** (`mode=\"field\"`, `selectionMode=\"single\" | \"range\"`) — it is a\n * Comptoir-native form control (ControlValueAccessor) with the same\n * `[(ngModel)]` / `formControlName` binding and a `Date` / `[start, end]`\n * value shape. This wrapper is kept only for legacy V1 screens and will\n * be removed once they are migrated.\n */\n@Component({\n selector: 'ef-datepicker',\n standalone: true,\n templateUrl: './ef-datepicker.component.html',\n styleUrls: ['./ef-datepicker.component.scss'],\n imports: [DatePickerModule, FormsModule, TranslateModule, EfLabelComponent],\n})\nexport class EfDatepickerComponent implements ControlValueAccessor {\n @Input() label?: string;\n @Input() labelKey?: string;\n @Input() inputId?: string;\n @Input() name?: string;\n @Input() placeholder?: string;\n @Input() placeholderKey?: string;\n @Input() size: 'small' | 'large' = 'small';\n @Input({ transform: booleanAttribute }) required = false;\n @Input({ transform: booleanAttribute }) fluid = true;\n @Input({ transform: booleanAttribute }) inline = false;\n @Input({ transform: booleanAttribute }) disabled = false;\n @Input({ transform: booleanAttribute }) showIcon = true;\n @Input() iconDisplay: 'input' | 'button' = 'input';\n @Input() selectionMode: 'single' | 'multiple' | 'range' = 'single';\n @Input() dateFormat?: string;\n @Input() appendTo?: string;\n @Input({ transform: booleanAttribute }) showTime = false;\n @Input({ transform: booleanAttribute }) showButtonBar = false;\n @Input() minDate?: Date;\n @Input() maxDate?: Date;\n\n @HostBinding('class.ef-inline') get isInline() { return this.inline; }\n\n @Output() dateSelectEvent = new EventEmitter<any>();\n\n value: any = null;\n\n private onChange: (value: any) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n private readonly translateService = inject(TranslateService);\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n get effectivePlaceholder(): string {\n return this.placeholderKey ? this.translateService.instant(this.placeholderKey) : (this.placeholder ?? '');\n }\n\n get effectiveId(): string {\n return this.inputId ?? this.name ?? '';\n }\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return ctrl?.hasError('required') && ctrl?.touched;\n }\n\n get serverErrors(): string[] | null {\n return this.ngControl?.control?.errors?.serverError ?? null;\n }\n\n get isInvalid(): boolean {\n const ctrl = this.ngControl?.control;\n return ctrl?.invalid && (ctrl?.touched || ctrl?.dirty);\n }\n\n writeValue(value: any): void {\n this.value = value;\n }\n\n registerOnChange(fn: (value: any) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n handleChange(value: any): void {\n this.value = value;\n this.onChange(value);\n this.dateSelectEvent.emit(value);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n}\n","@if (labelKey || label) {\n <ef-label [labelKey]=\"labelKey\" [label]=\"label\" [for]=\"effectiveId\" [required]=\"required\" />\n}\n<div class=\"ef-field-control\">\n <p-datepicker\n [inputId]=\"effectiveId\"\n [name]=\"name\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"handleChange($event)\"\n (onBlur)=\"handleBlur()\"\n [placeholder]=\"effectivePlaceholder\"\n [size]=\"size\"\n [disabled]=\"disabled\"\n [showIcon]=\"showIcon\"\n [iconDisplay]=\"iconDisplay\"\n [selectionMode]=\"selectionMode\"\n [dateFormat]=\"dateFormat\"\n [appendTo]=\"appendTo\"\n [showTime]=\"showTime\"\n [showButtonBar]=\"showButtonBar\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [fluid]=\"fluid\"\n [class.ng-invalid]=\"isInvalid\"\n [class.ng-touched]=\"ngControl?.touched\"\n />\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n</div>\n","import {\n booleanAttribute,\n Component,\n HostBinding,\n inject,\n Input,\n Output,\n EventEmitter,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport { PasswordModule } from 'primeng/password';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n@Component({\n selector: 'ef-password',\n standalone: true,\n templateUrl: './ef-password.component.html',\n styleUrls: ['./ef-password.component.scss'],\n imports: [PasswordModule, FormsModule, TranslateModule, EfLabelComponent],\n})\nexport class EfPasswordComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor\n{\n /* identity / label / placeholder / aria / required / readonly / disabled /\n errors (resolvedExternalErrors) / showClear all inherited from\n AbstractEfFormControl. */\n\n @Input() size?: 'small' | 'large';\n @Input({ transform: booleanAttribute }) fluid = true;\n @Input({ transform: booleanAttribute }) inline = false;\n @Input({ transform: booleanAttribute }) toggleMask = true;\n @Input({ transform: booleanAttribute }) feedback = false;\n @Input() autocomplete?: string;\n\n @HostBinding('class.ef-inline') get isInline() { return this.inline; }\n\n @Output() valueChangeEvent = new EventEmitter<string>();\n\n value = '';\n\n private onChange: (value: string) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? this.ngControl?.control?.errors?.serverError ?? null;\n }\n\n get isInvalid(): boolean {\n if (this.resolvedExternalErrors()?.length) return true;\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.invalid && (ctrl?.touched || ctrl?.dirty));\n }\n\n /** Clearable hooks (showClear / canClear inherited from the base). */\n protected override get hasValue(): boolean {\n return !!this.value;\n }\n\n override clearValue(): void {\n this.handleChange('');\n }\n\n writeValue(value: string): void {\n this.value = value ?? '';\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n handleChange(value: string): void {\n this.value = value;\n this.onChange(value);\n this.valueChangeEvent.emit(value);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n}\n","@if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" [for]=\"effectiveId\" [required]=\"required()\" />\n}\n<div class=\"ef-field-control\">\n <p-password\n [inputId]=\"effectiveId\"\n [name]=\"name()\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"handleChange($event)\"\n (onBlur)=\"handleBlur()\"\n [toggleMask]=\"toggleMask\"\n [feedback]=\"feedback\"\n [placeholder]=\"effectivePlaceholder\"\n [size]=\"size\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete\"\n [class.ng-invalid]=\"isInvalid\"\n [class.ng-touched]=\"ngControl?.touched\"\n [showClear]=\"canClear\"\n (onClear)=\"clearValue()\"\n styleClass=\"ef-password-field\"\n fluid\n >\n <ng-template #clearicon>\n <span class=\"ef-clear\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </span>\n </ng-template>\n </p-password>\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n</div>\n","import { booleanAttribute, Component, HostBinding, inject, Input, Output, EventEmitter, OnChanges } from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NgControl } from '@angular/forms';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n@Component({\n selector: 'ef-multi-select',\n templateUrl: 'ef-multi-select.component.html',\n styleUrls: ['./ef-multi-select.component.scss'],\n standalone: true,\n imports: [FormsModule, MultiSelectModule, TranslateModule, EfLabelComponent],\n})\nexport class EfMultiSelectComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor, OnChanges\n{\n /* identity (inputId / name) / label / labelKey / placeholder / placeholderKey /\n required / disabled (isDisabled) / showClear / errors (resolvedExternalErrors)\n all inherited from AbstractEfFormControl. The clear ✕ is rendered by\n PrimeNG's own `[showClear]` (bound below), so the base's custom\n `ef-clear-button` hooks (`hasValue`/`clearValue`) are left at their no-op\n defaults — `(onClear)` drives `handleClear()` instead. */\n\n @Output() changeEvent = new EventEmitter<string[]>();\n\n @Input() optionLabel = 'name';\n @Input() optionValue = 'id';\n @Input() options: any;\n @Input() filteredOptions: any;\n @Input() maxSelectedLabels = 3;\n @Input() display: 'comma' | 'chip' = 'comma';\n @Input() size: 'large' | 'small';\n @Input() selectionLimit: any;\n @Input() filters: any;\n @Input({ transform: booleanAttribute }) inline = false;\n\n @HostBinding('class.ef-inline') get isInline() { return this.inline; }\n @HostBinding('class.ef-required') get isRequired() { return this.required(); }\n\n selectedValues: any[] = [];\n\n private propagateChange: (value: any[]) => void = () => { /* noop */ };\n private propagateTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? this.ngControl?.control?.errors?.['serverError'] ?? null;\n }\n\n writeValue(value: string[]): void {\n if (Array.isArray(value) && value.length > 0 && this.options) {\n this.selectedValues = value\n .map(v => this.options.find((opt: any) => opt[this.optionValue] === v)?.[this.optionValue])\n .filter((opt: any) => !!opt);\n } else {\n this.selectedValues = [];\n }\n }\n\n registerOnChange(fn: (value: any[]) => void): void {\n this.propagateChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.propagateTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n onInternalModelChange(val: any[]): void {\n const value = val ?? [];\n this.selectedValues = value;\n this.propagateChange(value);\n this.changeEvent.emit(value);\n this.propagateTouched();\n }\n\n handleClear(): void {\n this.selectedValues = [];\n this.propagateChange([]);\n this.changeEvent.emit([]);\n this.propagateTouched();\n }\n\n ngOnChanges(): void {\n if (this.options && this.filters && typeof this.filters === 'object') {\n this.applyFilters(this.filters);\n } else {\n this.filteredOptions = this.options;\n }\n }\n\n private applyFilters(filters: { [key: string]: any }): void {\n this.filteredOptions = this.options.filter((option: any) =>\n Object.keys(filters).every(key => option[key] === filters[key])\n );\n this.selectedValues = [];\n }\n}\n","@if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" [for]=\"effectiveId\" [required]=\"required()\" />\n}\n<div class=\"ef-field-control\">\n <p-multiSelect\n [id]=\"effectiveId\"\n [name]=\"name()\"\n [placeholder]=\"effectivePlaceholder\"\n [options]=\"filteredOptions\"\n [optionLabel]=\"optionLabel\"\n [optionValue]=\"optionValue\"\n [maxSelectedLabels]=\"maxSelectedLabels\"\n [ngModel]=\"selectedValues\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onInternalModelChange($event)\"\n (onClear)=\"handleClear()\"\n [disabled]=\"isDisabled()\"\n [display]=\"display\"\n [size]=\"size\"\n [selectionLimit]=\"selectionLimit\"\n [showClear]=\"showClear()\"\n fluid\n />\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n</div>\n","import {\n booleanAttribute,\n Component,\n inject,\n Input,\n TemplateRef,\n ContentChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport { SelectButtonModule } from 'primeng/selectbutton';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { CommonModule } from '@angular/common';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n@Component({\n selector: 'ef-selectbutton',\n standalone: true,\n templateUrl: './ef-selectbutton.component.html',\n imports: [SelectButtonModule, FormsModule, TranslateModule, CommonModule, EfLabelComponent],\n})\nexport class EfSelectButtonComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor\n{\n /* identity / label / labelKey / disabled (isDisabled) all inherited from\n AbstractEfFormControl. A selectbutton has no clearable concept, so the\n base's `hasValue`/`clearValue` defaults (no ✕) are left untouched. */\n\n @Input() options: any[] = [];\n @Input() optionLabel = 'label';\n @Input() optionValue = 'value';\n @Input({ transform: booleanAttribute }) multiple = false;\n @Input({ transform: booleanAttribute }) allowEmpty = true;\n @Input() size: 'small' | 'large' = 'small';\n @Input() styleClass?: string;\n\n @ContentChild('item') itemTemplate?: TemplateRef<any>;\n\n value: any = null;\n\n private onChange: (value: any) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n writeValue(value: any): void {\n this.value = value;\n }\n\n registerOnChange(fn: (value: any) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n handleChange(event: any): void {\n this.value = event.value;\n this.onChange(event.value);\n this.onTouched();\n }\n}\n","@if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" />\n}\n<p-selectbutton\n [ngModel]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n (onChange)=\"handleChange($event)\"\n [options]=\"options\"\n [optionLabel]=\"optionLabel\"\n [optionValue]=\"optionValue\"\n [multiple]=\"multiple\"\n [allowEmpty]=\"allowEmpty\"\n [disabled]=\"isDisabled()\"\n [size]=\"size\"\n [styleClass]=\"styleClass\"\n>\n @if (itemTemplate) {\n <ng-template let-item pTemplate=\"item\">\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\" />\n </ng-template>\n }\n</p-selectbutton>\n","// Form components\nexport { EfInputTextComponent } from './ef-input-text/ef-input-text.component';\nexport { EfSelectComponent } from './ef-select/ef-select.component';\nexport { EfCheckboxComponent } from './ef-checkbox/ef-checkbox.component';\nexport { EfToggleSwitchComponent } from './ef-toggleswitch/ef-toggleswitch.component';\nexport { EfDatepickerComponent } from './ef-datepicker/ef-datepicker.component';\nexport { EfInputNumberComponent } from './ef-inputnumber/ef-inputnumber.component';\nexport { EfPasswordComponent } from './ef-password/ef-password.component';\nexport { EfMultiSelectComponent } from './ef-multi-select/ef-multi-select.component';\nexport { EfSelectButtonComponent } from './ef-selectbutton/ef-selectbutton.component';\nexport { EfQuantityStepperComponent } from './ef-quantity-stepper/ef-quantity-stepper.component';\n","import { TemplateRef } from '@angular/core';\n\n/**\n * Column alignment options for ef-datatable\n */\nexport type EfDatatableColumnAlign = 'start' | 'center' | 'end';\n\n/**\n * Column data types for automatic formatting\n */\nexport type EfDatatableColumnType =\n | 'text'\n | 'number'\n | 'money'\n | 'date'\n | 'datetime'\n | 'boolean'\n | 'reference';\n\n/**\n * Column definition interface for ef-datatable\n */\nexport interface EfDatatableColumn {\n /** Property name in data object */\n field: string;\n\n /** Column header text */\n header: string;\n\n /** Data type for automatic formatting (default: 'text') */\n type?: EfDatatableColumnType;\n\n /** Text alignment (default: 'start' except money/number = 'end') */\n align?: EfDatatableColumnAlign;\n\n /** Enable sorting for this column (default: true) */\n sortable?: boolean;\n\n /** Enable resizing for this column (default: true) */\n resizable?: boolean;\n\n /** CSS width (e.g., '100px', 'w-[200px]') */\n width?: string;\n\n /** Custom Tailwind or CSS classes */\n styleClass?: string;\n\n // Type-specific formatting options\n\n /** Date format string for DatePipe (default: 'shortDate') */\n dateFormat?: string;\n\n /** Currency code for money type (default: 'EUR') */\n currencyCode?: string;\n\n /** Currency display format (default: 'symbol') */\n currencyDisplay?: 'symbol' | 'code' | 'name';\n\n /** Locale for number/date/currency formatting (default: 'fr-FR') */\n locale?: string;\n\n /** Minimum fraction digits for numbers (default: 2) */\n minFractionDigits?: number;\n\n /** Maximum fraction digits for numbers (default: 2) */\n maxFractionDigits?: number;\n\n // Reference data integration\n\n /** Key for context.ref.get() to lookup reference data */\n referenceKey?: string;\n\n /** Field to match in reference data (default: 'code') */\n referenceValueField?: string;\n\n /** Field to display from reference data (default: 'name') */\n referenceLabelField?: string;\n\n // Template support\n\n /** Custom cell template (receives rowData and column) */\n template?: TemplateRef<unknown>;\n\n /** Custom header template (receives column) */\n headerTemplate?: TemplateRef<unknown>;\n}\n\n/**\n * Action column configuration for edit/delete/duplicate buttons\n */\nexport interface EfDatatableActions {\n /** Show action column (default: true if config provided) */\n show?: boolean;\n\n /** Action column width (default: 'w-20') */\n width?: string;\n\n /** Show edit button (default: true) */\n showEdit?: boolean;\n\n /** Show delete button (default: true) */\n showDelete?: boolean;\n\n /** Show duplicate button (default: false) */\n showDuplicate?: boolean;\n\n /** Position of action column (default: 'end') */\n position?: 'start' | 'end';\n}\n\n/**\n * Main table configuration options\n */\nexport interface EfDatatableConfig {\n // Data binding\n\n /** Enable lazy loading (default: true) */\n lazy?: boolean;\n\n /** Unique identifier field name (default: 'id') */\n dataKey?: string;\n\n // Pagination\n\n /** Enable pagination (default: true) */\n paginator?: boolean;\n\n /** Rows per page (default: 10) */\n rows?: number;\n\n /** Page size options (default: [5, 10, 25, 50]) */\n rowsPerPageOptions?: number[];\n\n // Scrolling\n\n /** Enable scrolling (default: true) */\n scrollable?: boolean;\n\n /** Scroll viewport height (default: '300px') */\n scrollHeight?: string;\n\n // Column features\n\n /** Enable column resizing (default: true) */\n resizableColumns?: boolean;\n\n /** Column resize behavior (default: 'expand') */\n columnResizeMode?: 'fit' | 'expand';\n\n // State persistence\n\n /** State storage location (default: 'local') */\n stateStorage?: 'local' | 'session';\n\n /** State storage key (auto-generated if not provided) */\n stateKey?: string;\n\n // Styling\n\n /** Table size (default: 'small') */\n size?: 'small' | 'large';\n\n /** Custom CSS classes (default: 'text-sm') */\n styleClass?: string;\n\n /** Inline table styles */\n tableStyle?: Record<string, string>;\n\n // i18n\n\n /** Message when no data (default: 'Aucune entree trouvee') */\n emptyMessage?: string;\n\n /** Pagination report template */\n currentPageReportTemplate?: string;\n}\n\n/**\n * Default table configuration values\n */\nexport const EF_DATATABLE_DEFAULTS: Required<EfDatatableConfig> = {\n lazy: true,\n dataKey: 'id',\n paginator: true,\n rows: 10,\n rowsPerPageOptions: [5, 10, 25, 50],\n scrollable: true,\n scrollHeight: '300px',\n resizableColumns: true,\n columnResizeMode: 'expand',\n stateStorage: 'local',\n stateKey: '',\n size: 'small',\n styleClass: 'text-sm',\n tableStyle: { 'min-width': '50rem' },\n emptyMessage: 'Aucune entree trouvee',\n currentPageReportTemplate: '{currentPage} de {totalPages}',\n};\n\n/**\n * Default column configuration values\n */\nexport const EF_DATATABLE_COLUMN_DEFAULTS: Partial<EfDatatableColumn> = {\n type: 'text',\n sortable: true,\n resizable: true,\n dateFormat: 'shortDate',\n currencyCode: 'MAD',\n currencyDisplay: 'symbol',\n locale: 'fr-FR',\n minFractionDigits: 2,\n maxFractionDigits: 2,\n referenceValueField: 'code',\n referenceLabelField: 'label',\n};\n\n/**\n * Default action column configuration\n */\nexport const EF_DATATABLE_ACTIONS_DEFAULTS: Required<EfDatatableActions> = {\n show: true,\n width: 'w-20',\n showEdit: true,\n showDelete: true,\n showDuplicate: false,\n position: 'end',\n};\n\n/**\n * Helper function to determine column alignment based on type\n * @param column - The column configuration\n * @returns The computed alignment\n */\nexport function getColumnAlignment(\n column: EfDatatableColumn,\n): EfDatatableColumnAlign {\n if (column.align) return column.align;\n if (column.type === 'money' || column.type === 'number') return 'end';\n return 'start';\n}\n\n/**\n * Helper function to merge column configuration with defaults\n * @param column - The column configuration\n * @returns Column with defaults applied\n */\nexport function mergeColumnDefaults(\n column: EfDatatableColumn,\n): EfDatatableColumn {\n return { ...EF_DATATABLE_COLUMN_DEFAULTS, ...column };\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ScreenContext } from '@elasticias/screens';\nimport { Permissions } from '@elasticias/types';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfButtonComponent } from '../../layout/ef-button/ef-button.component';\n\n@Component({\n selector: 'ef-datatable-actionbar',\n standalone: true,\n templateUrl: 'ef-datatable-actionbar.component.html',\n imports: [\n EfButtonComponent,\n TranslateModule,\n ],\n})\nexport class EfDatatableActionBarComponent {\n @Input() context?: ScreenContext;\n\n @Input() state?: string;\n\n @Output() duplicate = new EventEmitter();\n @Output() edit = new EventEmitter();\n @Output() delete = new EventEmitter();\n\n // Flags\n @Input() duplicateButton = true;\n @Input() editButton = true;\n @Input() deleteButton = true;\n\n get hasReadPermission(): boolean {\n return this.context?.isGranted(Permissions.Read) ?? false;\n }\n\n get hasEditPermission(): boolean {\n return this.context?.isGranted(Permissions.Edit) ?? false;\n }\n\n get hasDeletePermission(): boolean {\n return this.context?.isGranted(Permissions.Delete) ?? false;\n }\n\n duplicateAction() {\n this.duplicate.emit();\n }\n\n editAction() {\n this.edit.emit();\n }\n\n deleteAction() {\n this.delete.emit();\n }\n}\n","<div class=\"flex justify-end\" role=\"toolbar\" tabindex=\"0\" (click)=\"$event.stopPropagation()\" (keyup.enter)=\"$event.stopPropagation()\">\n @if (duplicateButton) {\n <ef-button\n icon=\"pi pi-copy\"\n severity=\"primary\"\n styleClass=\"action-btn\"\n tooltipKey=\"common.duplicate\"\n (clickEvent)=\"duplicateAction()\" />\n }\n @if (editButton && hasEditPermission) {\n <ef-button\n icon=\"pi pi-pencil\"\n severity=\"primary\"\n styleClass=\"action-btn\"\n size=\"small\"\n tooltipKey=\"common.edit\"\n (clickEvent)=\"editAction()\" />\n }\n @if (deleteButton && hasDeletePermission) {\n <ef-button\n icon=\"pi pi-trash\"\n severity=\"primary\"\n styleClass=\"action-btn\"\n size=\"small\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.delete\"\n (clickEvent)=\"deleteAction()\" />\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n LOCALE_ID,\n OnInit,\n output,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule, CurrencyPipe, DatePipe, DecimalPipe } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { Table, TableLazyLoadEvent, TableModule } from 'primeng/table';\nimport {\n EfDatatableActions,\n EfDatatableColumn,\n EfDatatableColumnAlign,\n EfDatatableConfig,\n EF_DATATABLE_ACTIONS_DEFAULTS,\n EF_DATATABLE_DEFAULTS,\n getColumnAlignment,\n mergeColumnDefaults,\n} from './ef-datatable.component.types';\nimport { ScreenContext } from '@elasticias/screens';\nimport { EfDatatableActionBarComponent } from '../ef-datatable-actionbar/ef-datatable-actionbar.component';\n\n/**\n * SearchEntity interface for datatable consumption.\n * Matches the shape expected from the consuming application's SearchEntity.\n */\nexport interface DatatableSearchEntity {\n items?: Record<string, unknown>[];\n totalCount?: number;\n pagination?: {\n pageNumber: number;\n pageSize: number;\n };\n sort?: Array<{\n field: string;\n sortDirection: string;\n }>;\n}\n\n/**\n * ef-datatable - Reusable table component wrapping PrimeNG Table\n *\n * Features:\n * - Typed columns with automatic formatting (text, number, money, date, datetime, boolean, reference)\n * - Built-in action column with edit/delete/duplicate buttons\n * - Support for custom templates\n * - PassThrough (PT) support for deep customization\n * - Lazy loading, pagination, sorting, column resizing\n * - State persistence (localStorage/sessionStorage)\n * - Reference data integration via ScreenContext\n *\n * @example\n * ```html\n * <ef-datatable\n * [columns]=\"tableColumns\"\n * [searchEntity]=\"searchEntity\"\n * [context]=\"context\"\n * [screenStateKey]=\"screenStateKey\"\n * [actions]=\"{ showDuplicate: true }\"\n * (editRow)=\"edit($event)\"\n * (deleteRow)=\"delete($event)\"\n * (lazyLoad)=\"search($event)\">\n * </ef-datatable>\n * ```\n */\n@Component({\n selector: 'ef-datatable',\n standalone: true,\n templateUrl: './ef-datatable.component.html',\n styleUrl: './ef-datatable.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TableModule,\n TranslateModule,\n EfDatatableActionBarComponent,\n ],\n})\nexport class EfDatatableComponent implements OnInit {\n /**\n * Reference to the underlying PrimeNG Table component\n */\n @ViewChild('pTable') pTable?: Table;\n\n selectedItem: Record<string, unknown> | undefined;\n\n // ============================================================================\n // INPUTS\n // ============================================================================\n\n /**\n * Column definitions with type, alignment, and formatting options\n */\n columns = input<EfDatatableColumn[]>([]);\n\n /**\n * Table configuration (pagination, scrolling, sizing, etc.)\n */\n config = input<EfDatatableConfig>({});\n\n /**\n * Action column configuration (edit/delete/duplicate buttons)\n */\n actions = input<EfDatatableActions | undefined>();\n\n /**\n * SearchEntity containing items, pagination, etc.\n */\n searchEntity = input<DatatableSearchEntity | undefined>();\n\n /**\n * ScreenContext for reference data access\n */\n context = input<ScreenContext | undefined>();\n\n /**\n * PassThrough options for deep DOM customization\n */\n pt = input<Record<string, unknown>>();\n\n /**\n * Screen state key for state persistence (auto-generates stateKey if not provided in config)\n */\n screenStateKey = input<string | undefined>();\n\n // ============================================================================\n // OUTPUTS\n // ============================================================================\n\n /**\n * Emitted when edit button is clicked (emits row ID)\n */\n editRow = output<unknown>();\n\n /**\n * Emitted when delete button is clicked (emits row ID)\n */\n deleteRow = output<unknown>();\n\n /**\n * Emitted when duplicate button is clicked (emits row ID)\n */\n duplicateRow = output<unknown>();\n\n /**\n * Emitted on lazy load events (pagination, sorting, filtering)\n */\n lazyLoad = output<TableLazyLoadEvent>();\n\n /**\n * Emitted when a row is selected\n */\n rowSelect = output<unknown>();\n\n // ============================================================================\n // INTERNAL STATE\n // ============================================================================\n\n /**\n * Loading indicator\n */\n loading = signal(false);\n\n /**\n * Merged configuration with defaults\n */\n mergedConfig!: Required<EfDatatableConfig>;\n\n /**\n * Merged action configuration with defaults\n */\n mergedActions!: Required<EfDatatableActions>;\n\n /**\n * Processed columns with defaults and computed alignment\n * Reactive to changes in columns input\n */\n processedColumns = computed(() => {\n return this.columns().map(col => {\n const merged = mergeColumnDefaults(col);\n return {\n ...merged,\n align: getColumnAlignment(merged)\n };\n });\n });\n\n /**\n * Computed sort field from searchEntity for restoring table state\n */\n sortField = computed(() => {\n const sort = this.searchEntity()?.sort;\n return sort && sort.length > 0 ? sort[0].field : undefined;\n });\n\n /**\n * Computed sort order from searchEntity for restoring table state\n * 1 = ascending, -1 = descending\n */\n sortOrder = computed(() => {\n const sort = this.searchEntity()?.sort;\n if (sort && sort.length > 0) {\n return sort[0].sortDirection === 'Ascending' ? 1 : -1;\n }\n return 1;\n });\n\n // Angular pipes for formatting (use app's configured locale)\n private readonly locale = inject(LOCALE_ID);\n private readonly datePipe = new DatePipe(this.locale);\n private readonly decimalPipe = new DecimalPipe(this.locale);\n private readonly currencyPipe = new CurrencyPipe(this.locale);\n\n // ============================================================================\n // LIFECYCLE HOOKS\n // ============================================================================\n\n ngOnInit(): void {\n // Merge config with defaults\n this.mergedConfig = { ...EF_DATATABLE_DEFAULTS, ...this.config() };\n\n // Merge action config with defaults (only if actions are provided)\n if (this.actions()) {\n this.mergedActions = { ...EF_DATATABLE_ACTIONS_DEFAULTS, ...this.actions() };\n } else {\n this.mergedActions = { ...EF_DATATABLE_ACTIONS_DEFAULTS, show: false };\n }\n\n // Auto-generate state key if not provided\n if (!this.mergedConfig.stateKey && this.screenStateKey()) {\n this.mergedConfig.stateKey = `APP_TABLE_${this.screenStateKey()}`;\n }\n }\n\n // ============================================================================\n // EVENT HANDLERS\n // ============================================================================\n\n /**\n * Handle lazy loading events from PrimeNG Table\n * Prevents duplicate events caused by reactive sortField/sortOrder binding updates\n * @param event - Table lazy load event containing pagination, sorting, filtering info\n */\n handleLazyLoad(event: TableLazyLoadEvent): void {\n // Skip if this event matches the current searchEntity state exactly.\n // This indicates a reactive binding echo: after parent updates searchEntity,\n // our sortField()/sortOrder() computed signals update, PrimeNG detects the\n // binding change and fires onLazyLoad again with the same values.\n if (this.isBindingEcho(event)) {\n return;\n }\n\n this.lazyLoad.emit(event);\n }\n\n /**\n * Detects if the event is a reactive binding echo (matches current searchEntity state)\n */\n private isBindingEcho(event: TableLazyLoadEvent): boolean {\n const entity = this.searchEntity();\n if (!entity?.sort || entity.sort.length === 0) {\n return false;\n }\n\n const currentSort = entity.sort[0];\n const eventSortField = Array.isArray(event.sortField)\n ? event.sortField[0]\n : event.sortField;\n const eventSortOrder = event.sortOrder ?? 1;\n const currentSortOrder = currentSort.sortDirection === 'Ascending' ? 1 : -1;\n\n // Calculate current and event page numbers\n const currentPage = entity.pagination?.pageNumber || 1;\n const currentPageSize = entity.pagination?.pageSize || 10;\n const eventFirst = event.first ?? 0;\n const eventRows = event.rows ?? 10;\n const eventPage = Math.floor(eventFirst / eventRows) + 1;\n\n // If event matches current state exactly, it's a binding echo\n return (\n currentSort.field === eventSortField &&\n currentSortOrder === eventSortOrder &&\n currentPage === eventPage &&\n currentPageSize === eventRows\n );\n }\n\n /**\n * Handle edit button click\n * @param rowData - The row data object\n */\n handleEdit(rowData: Record<string, unknown>): void {\n const id = rowData[this.mergedConfig.dataKey];\n this.editRow.emit(id);\n }\n\n handleDelete(rowData: Record<string, unknown>): void {\n const id = rowData[this.mergedConfig.dataKey];\n this.deleteRow.emit(id);\n }\n\n handleDuplicate(rowData: Record<string, unknown>): void {\n const id = rowData[this.mergedConfig.dataKey];\n this.duplicateRow.emit(id);\n }\n\n // ============================================================================\n // FORMATTING METHODS\n // ============================================================================\n\n /**\n * Format cell value based on column type\n * @param rowData - The row data object\n * @param column - The column configuration\n * @returns Formatted string value\n */\n formatCellValue(rowData: Record<string, unknown>, column: EfDatatableColumn): string | null {\n const value = rowData[column.field];\n if (value == null) return '';\n\n switch (column.type) {\n case 'date':\n return this.datePipe.transform(value as string | number | Date, column.dateFormat);\n\n case 'datetime':\n return this.datePipe.transform(value as string | number | Date, 'short');\n\n case 'number':\n return this.decimalPipe.transform(\n value as string | number,\n `1.${column.minFractionDigits}-${column.maxFractionDigits}`\n );\n\n case 'money':\n return this.currencyPipe.transform(\n value as string | number,\n column.currencyCode,\n column.currencyDisplay,\n `1.${column.minFractionDigits}-${column.maxFractionDigits}`\n );\n\n case 'boolean':\n return value ? 'Oui' : 'Non';\n\n case 'reference':\n return this.resolveReferenceValue(rowData, column);\n\n default:\n return String(value);\n }\n }\n\n /**\n * Resolve reference data value to display label\n * @param rowData - The row data object\n * @param column - The column configuration\n * @returns Display label from reference data\n */\n private resolveReferenceValue(rowData: Record<string, unknown>, column: EfDatatableColumn): string {\n const ctx = this.context();\n if (!ctx || !column.referenceKey) {\n return String(rowData[column.field]);\n }\n\n const refData = ctx.ref.get(column.referenceKey)();\n const value = rowData[column.field];\n\n if (!refData || !Array.isArray(refData)) {\n return String(value);\n }\n\n const valueField = column.referenceValueField ?? 'code';\n const labelField = column.referenceLabelField ?? 'name';\n const match = refData.find(\n (item: Record<string, unknown>) => item[valueField] === value\n );\n\n return match ? String(match[labelField]) : String(value);\n }\n\n /**\n * Get CSS class for text alignment\n * @param align - Alignment option\n * @returns CSS class name\n */\n getAlignmentClass(align?: EfDatatableColumnAlign): string {\n switch (align) {\n case 'start':\n return 'text-start';\n case 'center':\n return 'text-center';\n case 'end':\n return 'text-end';\n default:\n return 'text-start';\n }\n }\n\n // ============================================================================\n // PUBLIC API\n // ============================================================================\n\n /**\n * Reset table to first page and clear filters\n */\n reset(): void {\n this.pTable?.reset();\n }\n\n /**\n * Export table data as CSV\n */\n exportCSV(): void {\n this.pTable?.exportCSV();\n }\n\n /**\n * Get the current filter state\n */\n getFilters(): Record<string, unknown> | undefined {\n return this.pTable?.filters as Record<string, unknown> | undefined;\n }\n}\n","<p-table #pTable\n [value]=\"searchEntity()?.items || []\"\n [columns]=\"processedColumns()\"\n [dataKey]=\"mergedConfig.dataKey\"\n\n [lazy]=\"mergedConfig.lazy\"\n (onLazyLoad)=\"handleLazyLoad($event)\"\n\n [paginator]=\"mergedConfig.paginator\"\n [rows]=\"searchEntity()?.pagination?.pageSize || mergedConfig.rows\"\n [rowsPerPageOptions]=\"mergedConfig.rowsPerPageOptions\"\n [totalRecords]=\"searchEntity()?.totalCount || 0\"\n [first]=\"searchEntity()?.pagination ? (searchEntity()!.pagination!.pageNumber - 1) * searchEntity()!.pagination!.pageSize : 0\"\n\n [scrollable]=\"mergedConfig.scrollable\"\n [scrollHeight]=\"mergedConfig.scrollHeight\"\n\n [resizableColumns]=\"mergedConfig.resizableColumns\"\n [columnResizeMode]=\"mergedConfig.columnResizeMode\"\n\n [stateStorage]=\"mergedConfig.stateStorage\"\n [stateKey]=\"mergedConfig.stateKey\"\n\n [size]=\"mergedConfig.size\"\n [class]=\"mergedConfig.styleClass\"\n [tableStyle]=\"mergedConfig.tableStyle\"\n\n [currentPageReportTemplate]=\"searchEntity()?.totalCount ? 'Affichage de {first} a {last} sur {totalRecords} entrees' : mergedConfig.emptyMessage\"\n [showCurrentPageReport]=\"true\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n [loading]=\"loading()\"\n\n [pt]=\"pt()\"\n\n selectionMode=\"single\" [(selection)]=\"selectedItem\">\n\n <!-- Header Template -->\n <ng-template #header>\n <tr>\n <!-- Action column at start if configured -->\n @if (mergedActions.show && mergedActions.position === 'start') {\n <th [class]=\"mergedActions.width\"></th>\n }\n\n <!-- Data columns -->\n @for (column of processedColumns(); track column.field) {\n @if (column.sortable && column.resizable) {\n <th\n [pSortableColumn]=\"column.field\"\n pResizableColumn\n [class]=\"column.width || ''\"\n [ngClass]=\"column.styleClass\">\n\n @if (column.headerTemplate) {\n <ng-container *ngTemplateOutlet=\"column.headerTemplate; context: { $implicit: column }\"></ng-container>\n } @else {\n {{ column.header | translate }}\n <p-sortIcon [field]=\"column.field\" />\n }\n </th>\n } @else if (column.sortable) {\n <th\n [pSortableColumn]=\"column.field\"\n [class]=\"column.width || ''\"\n [ngClass]=\"column.styleClass\">\n\n @if (column.headerTemplate) {\n <ng-container *ngTemplateOutlet=\"column.headerTemplate; context: { $implicit: column }\"></ng-container>\n } @else {\n {{ column.header | translate }}\n <p-sortIcon [field]=\"column.field\" />\n }\n </th>\n } @else if (column.resizable) {\n <th\n pResizableColumn\n [class]=\"column.width || ''\"\n [ngClass]=\"column.styleClass\">\n\n @if (column.headerTemplate) {\n <ng-container *ngTemplateOutlet=\"column.headerTemplate; context: { $implicit: column }\"></ng-container>\n } @else {\n {{ column.header | translate }}\n }\n </th>\n } @else {\n <th\n [class]=\"column.width || ''\"\n [ngClass]=\"column.styleClass\">\n\n @if (column.headerTemplate) {\n <ng-container *ngTemplateOutlet=\"column.headerTemplate; context: { $implicit: column }\"></ng-container>\n } @else {\n {{ column.header | translate }}\n }\n </th>\n }\n }\n\n <!-- Action column at end if configured -->\n @if (mergedActions.show && mergedActions.position === 'end') {\n <th [class]=\"mergedActions.width\"></th>\n }\n </tr>\n </ng-template>\n\n <!-- Body Template -->\n <ng-template #body let-rowData let-rowIndex=\"rowIndex\">\n <tr (dblclick)=\"handleEdit(rowData)\" style=\"cursor: pointer\"\n [pSelectableRow]=\"rowData\" [pSelectableRowIndex]=\"rowIndex\">\n <!-- Action column at start if configured -->\n @if (mergedActions.show && mergedActions.position === 'start') {\n <td>\n <ef-datatable-actionbar\n [context]=\"context()\"\n (edit)=\"handleEdit(rowData)\"\n (delete)=\"handleDelete(rowData)\"\n (duplicate)=\"handleDuplicate(rowData)\">\n </ef-datatable-actionbar>\n </td>\n }\n\n <!-- Data columns -->\n @for (column of processedColumns(); track column.field) {\n <td [ngClass]=\"getAlignmentClass(column.align)\">\n @if (column.template) {\n <ng-container *ngTemplateOutlet=\"column.template; context: { $implicit: rowData, column: column }\"></ng-container>\n } @else {\n {{ formatCellValue(rowData, column) }}\n }\n </td>\n }\n\n <!-- Action column at end if configured -->\n @if (mergedActions.show && mergedActions.position === 'end') {\n <td>\n <ef-datatable-actionbar\n [context]=\"context()\"\n (edit)=\"handleEdit(rowData)\"\n (delete)=\"handleDelete(rowData)\"\n (duplicate)=\"handleDuplicate(rowData)\">\n </ef-datatable-actionbar>\n </td>\n }\n </tr>\n </ng-template>\n</p-table>\n","import { InjectionToken } from '@angular/core';\n\n/**\n * How `ef-data-card` presents a row once the table becomes a list.\n *\n * - `row` — a dense two-line row: the primary field, a muted secondary line,\n * a status badge and the actions menu. Roughly eight to a screen,\n * which is what a list of thousands needs.\n * - `card` — one card per record, every field on its own labelled line.\n * Easier to read a single record, at about a record and a half\n * per screen.\n *\n * Both expand to the same labelled detail; they differ only in the collapsed\n * state.\n */\nexport type EfDataCardMobileLayout = 'row' | 'card';\n\n/**\n * App-wide default, so screens don't drift apart. Provide it once at the\n * application root; a screen that genuinely needs the other shape overrides\n * it with `[mobileLayout]`.\n *\n * ```ts\n * { provide: EF_DATA_CARD_MOBILE_LAYOUT, useValue: 'card' }\n * ```\n */\nexport const EF_DATA_CARD_MOBILE_LAYOUT = new InjectionToken<EfDataCardMobileLayout>(\n 'EF_DATA_CARD_MOBILE_LAYOUT',\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfSelectComponent } from '../../forms/ef-select/ef-select.component';\n\ninterface PageBtn {\n kind: 'page' | 'ellipsis';\n value: number;\n}\n\n/**\n * Pagination control matching the Comptoir prototype's `.pager`\n * shape (lines-per-page selector · range · page buttons).\n *\n * ```html\n * <ef-pager\n * [pageNumber]=\"criteria().pagination.pageNumber\"\n * [pageSize]=\"criteria().pagination.pageSize\"\n * [totalCount]=\"totalCount()\"\n * (pageChange)=\"setPage($event)\"\n * (pageSizeChange)=\"setPage(1, $event)\"\n * />\n * ```\n *\n * Renders a windowed page list (first / current ±1 / last with\n * ellipsis) for total > 7 pages. Below 7 pages all buttons show.\n */\n@Component({\n selector: 'ef-pager',\n standalone: true,\n imports: [CommonModule, TranslateModule, EfSelectComponent],\n templateUrl: './ef-pager.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfPagerComponent {\n readonly pageNumber = input<number>(1);\n readonly pageSize = input<number>(25);\n readonly totalCount = input<number>(0);\n readonly pageSizeOptions = input<ReadonlyArray<number>>([10, 25, 50, 100]);\n\n /** Translation keys (preferred — consumer-side i18n). */\n readonly linesPerPageLabelKey = input<string>('common_lines_per_page');\n readonly ofLabelKey = input<string>('common_of');\n readonly prevLabelKey = input<string>('common_page_previous');\n readonly nextLabelKey = input<string>('common_page_next');\n\n /** Hide the lines-per-page selector + range when only paging is wanted. */\n readonly hideSize = input<boolean>(false);\n\n readonly pageChange = output<number>();\n readonly pageSizeChange = output<number>();\n\n /** Falls back to the first configured option if the value ever goes empty. */\n private get defaultSize(): number {\n return this.pageSizeOptions()[0] ?? this.pageSize();\n }\n\n /** `pageSizeOptions` shaped for `ef-select`, which reads a label and a\n * value off each option rather than taking bare primitives. */\n readonly sizeOptions = computed(() =>\n this.pageSizeOptions().map(n => ({ label: String(n), value: n })),\n );\n\n readonly totalPages = computed(() => {\n const size = this.pageSize();\n return size > 0 ? Math.max(1, Math.ceil(this.totalCount() / size)) : 1;\n });\n\n readonly range = computed(() => {\n const total = this.totalCount();\n if (total === 0) return { start: 0, end: 0 };\n const start = (this.pageNumber() - 1) * this.pageSize() + 1;\n const end = Math.min(this.pageNumber() * this.pageSize(), total);\n return { start, end };\n });\n\n /** First page · current ±1 · last page, with ellipsis fillers. */\n readonly pageButtons = computed<ReadonlyArray<PageBtn>>(() => {\n const total = this.totalPages();\n const current = this.pageNumber();\n const out: PageBtn[] = [];\n if (total <= 7) {\n for (let i = 1; i <= total; i++) out.push({ kind: 'page', value: i });\n return out;\n }\n out.push({ kind: 'page', value: 1 });\n if (current > 3) out.push({ kind: 'ellipsis', value: 0 });\n const start = Math.max(2, current - 1);\n const end = Math.min(total - 1, current + 1);\n for (let i = start; i <= end; i++) out.push({ kind: 'page', value: i });\n if (current < total - 2) out.push({ kind: 'ellipsis', value: 0 });\n out.push({ kind: 'page', value: total });\n return out;\n });\n\n goToPage(page: number): void {\n const total = this.totalPages();\n if (page < 1 || page > total || page === this.pageNumber()) return;\n this.pageChange.emit(page);\n }\n\n onSizeChange(value: number | string | null): void {\n const size = typeof value === 'number' ? value : parseInt(value ?? '', 10);\n\n if (Number.isNaN(size) || size <= 0) {\n // \"No page size\" has no meaning. The control is not clearable\n // (see the template), so this only guards a value arriving empty\n // from somewhere else: fall back to the first configured option.\n const fallback = this.defaultSize;\n if (fallback !== this.pageSize()) this.pageSizeChange.emit(fallback);\n return;\n }\n\n if (size !== this.pageSize()) this.pageSizeChange.emit(size);\n }\n\n trackBtn(index: number, btn: PageBtn): string {\n return btn.kind === 'page' ? `p${btn.value}` : `e${index}`;\n }\n}\n","<div class=\"pager\">\n @if (!hideSize()) {\n <div class=\"size\">\n <span>{{ linesPerPageLabelKey() | translate }}</span>\n <ef-select\n size=\"small\"\n appendTo=\"body\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [options]=\"sizeOptions()\"\n [value]=\"pageSize()\"\n [ariaLabelKey]=\"linesPerPageLabelKey()\"\n [showClear]=\"false\"\n (selectionChangeEvent)=\"onSizeChange($event)\"\n />\n @if (totalCount() > 0) {\n <span>· {{ range().start }}–{{ range().end }} {{ ofLabelKey() | translate }} {{ totalCount() }}</span>\n }\n </div>\n } @else {\n <span></span>\n }\n\n <div class=\"pages\">\n <button\n class=\"pg\"\n type=\"button\"\n [disabled]=\"pageNumber() <= 1\"\n [attr.aria-label]=\"prevLabelKey() | translate\"\n (click)=\"goToPage(pageNumber() - 1)\"\n >‹</button>\n\n @for (btn of pageButtons(); track trackBtn($index, btn)) {\n @if (btn.kind === 'page') {\n <button\n class=\"pg\"\n type=\"button\"\n [class.active]=\"btn.value === pageNumber()\"\n (click)=\"goToPage(btn.value)\"\n >{{ btn.value }}</button>\n } @else {\n <span class=\"pg\" aria-hidden=\"true\" style=\"cursor: default;\">…</span>\n }\n }\n\n <button\n class=\"pg\"\n type=\"button\"\n [disabled]=\"pageNumber() >= totalPages()\"\n [attr.aria-label]=\"nextLabelKey() | translate\"\n (click)=\"goToPage(pageNumber() + 1)\"\n >›</button>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ScreenContext } from '@elasticias/screens';\nimport { EfRowAction } from './ef-row-actions.types';\n\n/**\n * Row-actions dropdown — V2 successor to `ef-datatable-actionbar`.\n *\n * Renders a discreet trailing-cell ⋯ trigger (34×28 pill) that opens\n * a small Comptoir-styled menu with the items declared in TS:\n *\n * ```ts\n * actions: ReadonlyArray<EfRowAction> = [\n * { id: 'view', labelKey: 'common_view', icon: 'pi pi-eye', kbd: '↵',\n * permission: Permissions.Read, command: () => view(row) },\n * { id: 'edit', labelKey: 'common_edit', icon: 'pi pi-pencil', kbd: 'E',\n * permission: Permissions.Edit, command: () => edit(row) },\n * { id: 'duplicate', labelKey: 'common_duplicate', icon: 'pi pi-copy',\n * command: () => duplicate(row) },\n * { separator: true },\n * { id: 'delete', labelKey: 'common_delete', icon: 'pi pi-trash', severity: 'danger',\n * permission: Permissions.Delete, command: () => delete(row) },\n * ];\n * ```\n *\n * ```html\n * <ng-template efColumnTemplate=\"actions\" let-row>\n * <ef-row-actions [items]=\"rowActions(row)\" [context]=\"context\" />\n * </ng-template>\n * ```\n *\n * Behaviour:\n * - Click the trigger to toggle. Trigger gets `.open` (ink-active) while the menu is open.\n * - Only one row menu is open at a time — opening one closes the last.\n * - The menu flips above the trigger when there isn't room below it.\n * - Click outside or press `Escape` to close.\n * - Clicking an item runs its `command` then closes the menu.\n * - dblclick on the trigger or menu does NOT propagate, so the data-card's\n * `rowDoubleClickable` won't fire from this column.\n *\n * Permission filtering: pass `[context]=\"...\"` (a `ScreenContext`); items\n * declaring a `permission` are hidden unless that permission is granted.\n * Items with no `permission` always show.\n */\n@Component({\n selector: 'ef-row-actions',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n templateUrl: './ef-row-actions.component.html',\n styleUrl: './ef-row-actions.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfRowActionsComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Action descriptors. */\n readonly items = input<ReadonlyArray<EfRowAction>>([]);\n\n /** Optional context — when present, items with a `permission` are\n * filtered against `context.isGranted(permission)`. */\n readonly context = input<ScreenContext | undefined>(undefined);\n\n /** Override the trigger icon (default ellipsis). */\n readonly triggerIcon = input<string>('pi pi-ellipsis-h');\n\n /** Override the trigger aria-label translation key. */\n readonly triggerAriaKey = input<string>('common_actions');\n\n /** Disable the entire trigger (e.g., row not actionable). */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Pin the menu to the inline-start edge of the trigger instead of\n * inline-end. Use when the actions cell sits at the start of the row.\n */\n readonly menuLeft = input(false, { transform: booleanAttribute });\n\n /** Forwarded when the menu opens (e.g., for a data-card to lift overflow). */\n readonly opened = output<void>();\n /** Forwarded when the menu closes. */\n readonly closed = output<void>();\n\n /** Visible items (after permission + visible filtering). */\n readonly visibleItems = computed<ReadonlyArray<EfRowAction>>(() => {\n const ctx = this.context();\n return this.items().filter(a => this.isVisible(a, ctx));\n });\n\n /** Open state. */\n readonly open = signal(false);\n\n /** Menu renders above the trigger instead of below it. */\n readonly dropUp = signal(false);\n\n /**\n * The one menu currently open, app-wide.\n *\n * The trigger click is stopped from reaching `document` so it can't\n * select or open the row, which also means no other instance's\n * outside-click listener ever sees it. Without an explicit hand-off\n * every menu clicked stays open and they stack up on screen.\n */\n private static openInstance: EfRowActionsComponent | null = null;\n\n toggle(event: MouseEvent): void {\n event.stopPropagation();\n if (this.disabled() || this.visibleItems().length === 0) return;\n this.open.update(v => !v);\n const isOpen = this.open();\n\n if (isOpen) {\n EfRowActionsComponent.openInstance?.close();\n EfRowActionsComponent.openInstance = this;\n // Place it from an estimate first so it never renders in the\n // wrong direction, then correct against the real height once\n // the menu is in the DOM.\n this.dropUp.set(this.shouldDropUp(this.estimateMenuHeight()));\n this.correctPlacementAfterRender();\n }\n\n this.dispatchToggle(isOpen);\n if (isOpen) this.opened.emit();\n else this.closed.emit();\n }\n\n runCommand(action: EfRowAction, event: MouseEvent): void {\n event.stopPropagation();\n if (action.disabled || action.separator) return;\n action.command?.();\n this.close();\n }\n\n close(): void {\n if (!this.open()) return;\n this.open.set(false);\n if (EfRowActionsComponent.openInstance === this) {\n EfRowActionsComponent.openInstance = null;\n }\n this.dispatchToggle(false);\n this.closed.emit();\n }\n\n /* ── Placement ──────────────────────────────────────────────── */\n\n /** Gap between the trigger and the menu, plus a little breathing room\n * against the viewport edge. Matches `top: calc(100% + 8px)`. */\n private static readonly EDGE_GAP = 16;\n\n /**\n * Drop upward when the menu would not fit below the trigger and there\n * is more room above. On a short viewport where it fits neither way,\n * below wins, which is where it has always been.\n */\n private shouldDropUp(menuHeight: number): boolean {\n const rect = this.host.nativeElement.getBoundingClientRect();\n const below = window.innerHeight - rect.bottom;\n const above = rect.top;\n return below < menuHeight + EfRowActionsComponent.EDGE_GAP && above > below;\n }\n\n /** Rough height before the menu exists: item padding + line box, with\n * dividers and the menu's own padding and border. */\n private estimateMenuHeight(): number {\n const items = this.visibleItems();\n const separators = items.filter(a => a.separator).length;\n return 14 + (items.length - separators) * 39 + separators * 10;\n }\n\n /** Re-decide against the rendered height — item labels wrap, and the\n * estimate can't know that. */\n private correctPlacementAfterRender(): void {\n requestAnimationFrame(() => {\n if (!this.open()) return;\n const menu = this.host.nativeElement.querySelector<HTMLElement>('.row-actions__menu');\n if (!menu) return;\n this.dropUp.set(this.shouldDropUp(menu.offsetHeight));\n });\n }\n\n /** Bubbling DOM event so ancestors (e.g. ef-data-card) can react —\n * see `.tbl-wrap.has-open-menu { overflow: visible }`. */\n private dispatchToggle(open: boolean): void {\n this.host.nativeElement.dispatchEvent(\n new CustomEvent('ef-row-actions-toggle', {\n bubbles: true,\n composed: true,\n detail: { open },\n }),\n );\n }\n\n /** Outside click — closes the menu. */\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node | null;\n if (target && this.host.nativeElement.contains(target)) return;\n this.close();\n }\n\n /** Escape closes the menu. */\n @HostListener('document:keydown.escape')\n onEscape(): void {\n this.close();\n }\n\n /** Swallow dblclick so row-double-click doesn't fire from this column. */\n onDblClick(event: MouseEvent): void {\n event.stopPropagation();\n }\n\n private isVisible(action: EfRowAction, ctx: ScreenContext | undefined): boolean {\n if (action.separator) return true;\n if (action.visible === false) return false;\n if (action.permission && ctx && !ctx.isGranted(action.permission)) return false;\n return true;\n }\n\n /** Stable trackBy across renders. */\n trackByItem = (i: number, action: EfRowAction): unknown =>\n action.id ?? (action.separator ? `__sep_${i}` : action.label ?? action.labelKey ?? i);\n}\n","<div class=\"row-actions\">\n <button\n type=\"button\"\n class=\"row-actions__trigger\"\n [class.open]=\"open()\"\n [disabled]=\"disabled() || visibleItems().length === 0\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-label]=\"triggerAriaKey() | translate\"\n (click)=\"toggle($event)\"\n (dblclick)=\"onDblClick($event)\"\n >\n <i [class]=\"triggerIcon()\" aria-hidden=\"true\"></i>\n </button>\n\n @if (open()) {\n <div\n class=\"row-actions__menu open\"\n [class.left]=\"menuLeft()\"\n [class.up]=\"dropUp()\"\n role=\"menu\"\n [attr.aria-label]=\"triggerAriaKey() | translate\"\n (dblclick)=\"onDblClick($event)\"\n >\n @for (action of visibleItems(); track trackByItem($index, action)) {\n @if (action.separator) {\n <div class=\"row-actions__divider\" role=\"separator\"></div>\n } @else {\n <button\n type=\"button\"\n class=\"row-actions__item\"\n [class.danger]=\"action.severity === 'danger'\"\n [disabled]=\"action.disabled\"\n role=\"menuitem\"\n (click)=\"runCommand(action, $event)\"\n >\n @if (action.icon) {\n <i class=\"ico\" [class]=\"'ico ' + action.icon\" aria-hidden=\"true\"></i>\n }\n <span class=\"lbl\">\n {{ action.labelKey ? (action.labelKey | translate) : action.label }}\n </span>\n @if (action.kbd) {\n <span class=\"kbd\" aria-hidden=\"true\">{{ action.kbd }}</span>\n }\n </button>\n }\n }\n </div>\n }\n</div>\n","import { Directive, Input, TemplateRef, inject } from '@angular/core';\n\n/**\n * Marks an `<ng-template>` as the body cell renderer for a given\n * column id on `<ef-data-card>`.\n *\n * ```html\n * <ng-template efColumnTemplate=\"status\" let-row let-col=\"col\">\n * <span class=\"chip\" [class]=\"'chip chip-' + row.status\">…</span>\n * </ng-template>\n * ```\n *\n * Context:\n * - `$implicit` — the row data\n * - `col` — the column config (`EfDataCardColumn`)\n * - `index` — the row index in the current page\n */\n@Directive({\n selector: '[efColumnTemplate]',\n standalone: true,\n})\nexport class EfColumnTemplateDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n\n @Input({ alias: 'efColumnTemplate', required: true })\n columnId!: string;\n}\n\n/**\n * Marks an `<ng-template>` as the **header** cell renderer for a\n * given column id. Use this when the header needs richer markup\n * than a translated string (e.g. a select-all checkbox).\n *\n * ```html\n * <ng-template efColumnHeaderTemplate=\"select\">\n * <input type=\"checkbox\" class=\"cb\"\n * [checked]=\"allSelected()\" (change)=\"toggleAll()\" />\n * </ng-template>\n * ```\n */\n@Directive({\n selector: '[efColumnHeaderTemplate]',\n standalone: true,\n})\nexport class EfColumnHeaderTemplateDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n\n @Input({ alias: 'efColumnHeaderTemplate', required: true })\n columnId!: string;\n}\n","import {\n AfterContentInit,\n ChangeDetectionStrategy,\n Component,\n ContentChildren,\n HostListener,\n QueryList,\n TemplateRef,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport {\n SCREEN_REF_DATA_SERVICE,\n ScreenContext,\n ScreenReferenceDataService,\n} from '@elasticias/screens';\nimport { Permissions } from '@elasticias/types';\nimport { StorageUtils } from '@elasticias/utils';\nimport { EfViewportService } from '@elasticias/core';\nimport {\n EF_DATA_CARD_MOBILE_LAYOUT,\n EfDataCardMobileLayout,\n} from './ef-data-card.mobile';\nimport { EfPagerComponent } from '../ef-pager/ef-pager.component';\nimport { EfStatusChipComponent } from '../../feedback/ef-status-chip/ef-status-chip.component';\nimport { EfRowActionsComponent } from '../ef-row-actions/ef-row-actions.component';\nimport { EfRowAction } from '../ef-row-actions/ef-row-actions.types';\nimport {\n EfColumnHeaderTemplateDirective,\n EfColumnTemplateDirective,\n} from './ef-column-template.directive';\nimport {\n EfDataCardColumn,\n EfDataCardSort,\n EfDataCardSortDirection,\n} from './ef-data-card.types';\n\n/** Action identifier emitted by `ef-data-card`'s auto row-actions cell. */\nexport type EfDataCardRowAction = 'view' | 'edit' | 'duplicate' | 'delete';\n\n/** Row height presets offered by the Density control. */\nexport type EfTableDensity = 'compact' | 'default' | 'comfortable';\n\n/**\n * Comptoir data card — column-driven `.tbl-wrap` with header (count\n * info + actions) and integrated pager.\n *\n * Two consumer surfaces:\n * 1. **Columns + rows + templates** (preferred): declare columns in\n * TS as `EfDataCardColumn[]`, project body / header templates via\n * `*efColumnTemplate` / `*efColumnHeaderTemplate` for cells that\n * need rich HTML. Built-in cell renderers handle text / number /\n * money / date / datetime / boolean / mono / chip / reference.\n * 2. **`tbl-head-info` / `tbl-head-actions` slots**: still projected\n * so the consumer can render the count text + density / columns /\n * view-toggle buttons next to the table header.\n *\n * ```html\n * <ef-data-card\n * [columns]=\"cols\"\n * [rows]=\"orders()\"\n * [pageNumber]=\"criteria().pagination.pageNumber\"\n * [pageSize]=\"criteria().pagination.pageSize\"\n * [totalCount]=\"totalCount()\"\n * [loading]=\"loading()\"\n * [sort]=\"currentSort()\"\n * (pageChange)=\"setPage($event)\"\n * (sortChange)=\"setSort($event.field, $event.direction)\"\n * trackByField=\"id\"\n * >\n * <span tbl-head-info>…count…</span>\n *\n * <ng-template efColumnTemplate=\"status\" let-row>\n * <span class=\"chip\" [class]=\"'chip chip-' + row.status\">…</span>\n * </ng-template>\n * </ef-data-card>\n * ```\n */\n@Component({\n selector: 'ef-data-card',\n standalone: true,\n imports: [\n CommonModule,\n TranslateModule,\n EfPagerComponent,\n EfStatusChipComponent,\n EfRowActionsComponent,\n ],\n templateUrl: './ef-data-card.component.html',\n styleUrl: './ef-data-card.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfDataCardComponent<TRow = any> implements AfterContentInit {\n /* ── Mobile presentation ─────────────────────────────────────\n Under 768px a table stops being readable: six columns on a\n 390px screen either overflow or squeeze to nothing. The rows\n become a list instead, driven by the same column config —\n each column declares (or is given) a role. */\n\n private readonly viewport = inject(EfViewportService);\n private readonly configuredMobileLayout = inject(EF_DATA_CARD_MOBILE_LAYOUT, { optional: true });\n\n readonly isMobile = this.viewport.isMobile;\n\n /** Per-screen override of the app-wide default. */\n readonly mobileLayout = input<EfDataCardMobileLayout | null>(null);\n\n protected readonly effectiveMobileLayout = computed<EfDataCardMobileLayout>(\n () => this.mobileLayout() ?? this.configuredMobileLayout ?? 'row',\n );\n\n /** Rows currently showing their detail, keyed the same way as trackByRow. */\n private readonly expandedRows = signal<ReadonlySet<unknown>>(new Set());\n\n protected isExpanded(row: unknown, index: number): boolean {\n return this.expandedRows().has(this.rowKey(row, index));\n }\n\n /**\n * The row head is the expander, but the actions menu lives inside it.\n * Filtering here rather than stopping propagation on a wrapper keeps the\n * wrapper a plain span — a click handler on one would need a keyboard\n * equivalent and a tabindex to be usable, which a decorative box should\n * not have.\n */\n protected onRowHeadActivate(row: unknown, index: number, event: Event): void {\n if (!this.hasDetail()) return;\n const target = event.target as HTMLElement | null;\n if (target?.closest('.mrow__actions')) return;\n this.toggleExpanded(row, index);\n }\n\n protected toggleExpanded(row: unknown, index: number): void {\n const key = this.rowKey(row, index);\n const next = new Set(this.expandedRows());\n if (!next.delete(key)) next.add(key);\n this.expandedRows.set(next);\n }\n\n private rowKey(row: unknown, index: number): unknown {\n const id = (row as Record<string, unknown> | null)?.['id'];\n return id ?? index;\n }\n\n /**\n * Columns that carry data on mobile, in role order. Structural columns\n * (select, actions) are handled by the row chrome, not as fields.\n */\n private readonly mobileColumns = computed(() =>\n this.effectiveColumns().filter(c => c.id !== 'select' && c.id !== 'actions'),\n );\n\n /**\n * The role a column plays on mobile. An explicit `mobile` wins; otherwise\n * it is derived so every existing screen gets a sensible list without\n * touching its column definitions: the first text-ish column is what you\n * scan for, a status chip is a badge, money and dates sit on the muted\n * line, and the rest waits behind the expander.\n */\n protected roleOf(col: { id: string; mobile?: string; type?: string }): string {\n if (col.mobile) return col.mobile;\n if (col.type === 'status' || col.type === 'chip') return 'status';\n if (col.id === this.derivedPrimaryId()) return 'primary';\n if (col.type === 'money' || col.type === 'date' || col.type === 'datetime') return 'secondary';\n return 'detail';\n }\n\n private readonly derivedPrimaryId = computed(() => {\n const cols = this.mobileColumns();\n // Screens already mark the row's identity column `cellClass: 'strong'`\n // so it reads as the row's title in the table — that is a better\n // signal than position. Products, for one, leads with an external\n // reference that is usually blank; its title is second.\n const strong = cols.find(c => (c.cellClass ?? '').split(/\\s+/).includes('strong'));\n if (strong) return strong.id;\n const textish = cols.find(c => !c.type || c.type === 'text' || c.type === 'mono');\n return (textish ?? cols[0])?.id ?? '';\n });\n\n protected readonly primaryColumn = computed(() =>\n this.mobileColumns().find(c => this.roleOf(c) === 'primary'),\n );\n\n protected readonly statusColumn = computed(() =>\n this.mobileColumns().find(c => this.roleOf(c) === 'status'),\n );\n\n protected readonly secondaryColumns = computed(() =>\n this.mobileColumns().filter(c => this.roleOf(c) === 'secondary'),\n );\n\n /**\n * Fields shown once a row opens. The primary column is excluded: the\n * header already carries it, and repeating it is the first thing you\n * notice. Status is excluded for the same reason.\n */\n protected readonly detailColumns = computed(() =>\n this.mobileColumns().filter(c => {\n const role = this.roleOf(c);\n return role === 'detail' || role === 'secondary';\n }),\n );\n\n /** How many fields a card shows before \"view more\". */\n private static readonly CARD_PREVIEW_FIELDS = 4;\n\n /** Fields a collapsed card shows. A row shows none until it opens. */\n protected readonly cardPreviewColumns = computed(() =>\n this.detailColumns().slice(0, EfDataCardComponent.CARD_PREVIEW_FIELDS),\n );\n\n protected readonly hasDetail = computed(() => this.detailColumns().length > 0);\n\n /** Only worth a toggle when opening actually reveals something. */\n protected readonly hasMoreThanPreview = computed(\n () => this.detailColumns().length > EfDataCardComponent.CARD_PREVIEW_FIELDS,\n );\n\n /** Fields visible for a row right now, given layout and open state. */\n protected visibleDetail(row: unknown, index: number): ReadonlyArray<{ id: string }> {\n const open = this.isExpanded(row, index);\n if (this.effectiveMobileLayout() === 'card') {\n return open ? this.detailColumns() : this.cardPreviewColumns();\n }\n return open ? this.detailColumns() : [];\n }\n\n private readonly refDataService = inject<ScreenReferenceDataService | null>(\n SCREEN_REF_DATA_SERVICE,\n { optional: true },\n );\n\n /* ── Data inputs ────────────────────────────────────────────── */\n\n readonly columns = input<ReadonlyArray<EfDataCardColumn>>([]);\n readonly rows = input<ReadonlyArray<TRow>>([]);\n\n /** Field path on each row used as the trackBy key. */\n readonly trackByField = input<string>('id');\n\n /* ── Pagination ─────────────────────────────────────────────── */\n\n readonly pageNumber = input<number>(1);\n readonly pageSize = input<number>(25);\n readonly totalCount = input<number>(0);\n readonly pageSizeOptions = input<ReadonlyArray<number>>([10, 25, 50, 100]);\n readonly hidePager = input(false, { transform: booleanAttribute });\n\n /* ── Sorting ────────────────────────────────────────────────── */\n\n /** Currently active sort. Header click toggles asc / desc. */\n readonly sort = input<EfDataCardSort | undefined>(undefined);\n\n /* ── State ──────────────────────────────────────────────────── */\n\n readonly loading = input(false, { transform: booleanAttribute });\n /** Empty string = no error. Non-empty triggers an error chip in tbl-head. */\n readonly errorMsg = input<string>('');\n readonly loadingKey = input<string>('common_loading_msg');\n\n /* ── Row interactions ──────────────────────────────────────── */\n\n /**\n * When `true`, double-clicking anywhere on a `<tr>` emits the row\n * via `rowDoubleClick` and the body rows render with\n * `cursor: pointer`. Consumers typically wire the output to\n * `navigateToDetails(row.id)` from {@link AbstractSearchScreenV2}.\n *\n * Double-clicks that originate inside an interactive child\n * (checkbox, button, link, form control) are ignored — those keep\n * their native behaviour (toggle selection, run an action, …).\n */\n readonly rowDoubleClickable = input(false, { transform: booleanAttribute });\n\n /* ── Auto row-actions cell ─────────────────────────────────────\n When `[hasActionsColumn]` is set, ef-data-card appends a 48px\n `actions` column at the right edge with a built-in\n `<ef-row-actions>` per row. The standard four CRUD actions are\n wired via the show* flags; emitted commands flip back through\n `(rowAction)`. Permission filtering happens through the bound\n `[rowActionsContext]` (a ScreenContext).\n\n Consumers that want a custom actions cell can keep declaring\n their own `'actions'` column + projected template — the\n built-in cell only auto-appears when this flag is on AND no\n column with id 'actions' is already declared. */\n\n readonly hasActionsColumn = input(false, { transform: booleanAttribute });\n readonly rowActionsContext = input<ScreenContext | undefined>(undefined);\n\n readonly showViewAction = input(true, { transform: booleanAttribute });\n readonly showEditAction = input(true, { transform: booleanAttribute });\n readonly showDuplicateAction = input(true, { transform: booleanAttribute });\n readonly showDeleteAction = input(true, { transform: booleanAttribute });\n\n /* ── Table tools (density / column picker) ──────────────────── */\n\n /** Render the Density control in the head row. */\n readonly showDensityControl = input(false, { transform: booleanAttribute });\n\n /** Render the Columns picker in the head row. */\n readonly showColumnPicker = input(false, { transform: booleanAttribute });\n\n /**\n * Stable key used to remember density and hidden columns for this\n * table. Preferences are a per-viewer convenience, so they live in\n * localStorage and are read defensively -- a private window or\n * cleared site data simply falls back to the defaults.\n */\n readonly tableKey = input<string>('');\n\n /* ── Outputs ────────────────────────────────────────────────── */\n\n readonly pageChange = output<number>();\n readonly pageSizeChange = output<number>();\n readonly sortChange = output<EfDataCardSort>();\n readonly rowDoubleClick = output<TRow>();\n\n /** Emitted by the auto row-actions cell — `{ action, row }`. */\n readonly rowAction = output<{ action: EfDataCardRowAction; row: TRow }>();\n\n /* ── Content children ──────────────────────────────────────── */\n\n @ContentChildren(EfColumnTemplateDirective)\n private readonly bodyTemplates!: QueryList<EfColumnTemplateDirective>;\n\n @ContentChildren(EfColumnHeaderTemplateDirective)\n private readonly headerTemplates!: QueryList<EfColumnHeaderTemplateDirective>;\n\n private readonly bodyTemplateMap = signal<Map<string, TemplateRef<unknown>>>(new Map());\n private readonly headerTemplateMap = signal<Map<string, TemplateRef<unknown>>>(new Map());\n\n ngAfterContentInit(): void {\n this.loadPreferences();\n this.bodyTemplateMap.set(toMap(this.bodyTemplates));\n this.headerTemplateMap.set(toMap(this.headerTemplates));\n this.bodyTemplates.changes.subscribe(() =>\n this.bodyTemplateMap.set(toMap(this.bodyTemplates)),\n );\n this.headerTemplates.changes.subscribe(() =>\n this.headerTemplateMap.set(toMap(this.headerTemplates)),\n );\n }\n\n /* ── Computed views ─────────────────────────────────────────── */\n\n /** Columns enriched with effective alignment / sortField defaults\n * + the auto `'actions'` column when `[hasActionsColumn]` is on\n * and the consumer hasn't declared one already. */\n readonly effectiveColumns = computed<ReadonlyArray<EfDataCardColumn>>(() => {\n const hidden = this.hiddenColumnIds();\n const declared = this.columns()\n .filter(col => !hidden.includes(col.id))\n .map(col => ({\n ...col,\n type: col.type ?? 'text',\n align:\n col.align ??\n (col.type === 'number' || col.type === 'money' ? 'end' : 'start'),\n sortField: col.sortField ?? col.field ?? col.id,\n }));\n\n if (!this.hasActionsColumn()) return declared;\n if (declared.some(c => c.id === 'actions')) return declared;\n return [...declared, { id: 'actions', width: '48px' } as EfDataCardColumn];\n });\n\n /** Items array for the auto row-actions cell. Rebuilt per call so\n * the ef-row-actions component receives a fresh closure per row.\n * Visibility is filtered later by ef-row-actions against\n * `rowActionsContext` (ScreenContext.isGranted). */\n defaultRowActions(row: TRow): ReadonlyArray<EfRowAction> {\n const items: EfRowAction[] = [];\n\n if (this.showViewAction()) {\n items.push({\n id: 'view',\n labelKey: 'common_view',\n icon: 'pi pi-eye',\n kbd: '↵',\n permission: Permissions.Read,\n command: () => this.rowAction.emit({ action: 'view', row }),\n });\n }\n if (this.showEditAction()) {\n items.push({\n id: 'edit',\n labelKey: 'common_edit',\n icon: 'pi pi-pencil',\n kbd: 'E',\n permission: Permissions.Edit,\n command: () => this.rowAction.emit({ action: 'edit', row }),\n });\n }\n if (this.showDuplicateAction()) {\n items.push({\n id: 'duplicate',\n labelKey: 'common_duplicate',\n icon: 'pi pi-copy',\n kbd: '⌘D',\n permission: Permissions.Duplicate,\n command: () => this.rowAction.emit({ action: 'duplicate', row }),\n });\n }\n if (this.showDeleteAction()) {\n if (items.length > 0) items.push({ separator: true });\n items.push({\n id: 'delete',\n labelKey: 'common_delete',\n icon: 'pi pi-trash',\n kbd: '⌫',\n severity: 'danger',\n permission: Permissions.Delete,\n command: () => this.rowAction.emit({ action: 'delete', row }),\n });\n }\n\n return items;\n }\n\n /* ── Cell helpers (used in template) ───────────────────────── */\n\n bodyTemplate(columnId: string): TemplateRef<unknown> | undefined {\n return this.bodyTemplateMap().get(columnId);\n }\n\n headerTemplate(columnId: string): TemplateRef<unknown> | undefined {\n return this.headerTemplateMap().get(columnId);\n }\n\n /** Pluck `column.field` (or `column.id`) from a row, dotted-path safe. */\n cellValue(row: TRow, col: EfDataCardColumn): unknown {\n const path = col.field ?? col.id;\n if (!path) return undefined;\n return path.split('.').reduce<any>((obj, key) => (obj == null ? obj : obj[key]), row);\n }\n\n headerAlignClass(col: EfDataCardColumn): string {\n if (col.align === 'end') return 'num';\n return '';\n }\n\n cellAlignClass(col: EfDataCardColumn): string {\n const align = col.align ?? (col.type === 'number' || col.type === 'money' ? 'end' : 'start');\n const classes: string[] = [];\n if (align === 'end') classes.push('num');\n if (col.cellClass) classes.push(col.cellClass);\n return classes.join(' ');\n }\n\n /** Sort indicator: '↑' / '↓' / '' for the given column. */\n sortIndicator(col: EfDataCardColumn): string {\n const s = this.sort();\n if (!s) return '';\n const field = col.sortField ?? col.field ?? col.id;\n if (s.field !== field) return '';\n return s.direction === 'asc' ? '↑' : '↓';\n }\n\n /**\n * Resolve a reference cell — looks up the row's value in\n * `referenceKey`, finds the entry where\n * `entry[referenceValueField] === value`, returns\n * `entry[referenceLabelField]`. Falls back to the raw value when\n * no match is found.\n */\n resolveReference(value: unknown, col: EfDataCardColumn): string {\n if (value == null) return '';\n if (!this.refDataService || !col.referenceKey) return String(value);\n\n const list = this.refDataService.getReference(col.referenceKey)();\n const valueField = col.referenceValueField || 'code';\n const labelField = col.referenceLabelField || 'label';\n const match = list.find((item: any) => item?.[valueField] === value);\n if (!match) return String(value);\n return String(match[labelField] ?? value);\n }\n\n /** Build an Angular DigitInfo string from min/max fraction-digit hints. */\n numberFormat(col: EfDataCardColumn): string {\n const min = col.minFractionDigits ?? 2;\n const max = col.maxFractionDigits ?? 2;\n return `1.${min}-${max}`;\n }\n\n /* ── Table tools state ──────────────────────────────────────── */\n\n /** Which tools panel is open, if any. */\n readonly openTool = signal<'density' | 'columns' | null>(null);\n\n /** Row density. Applied as a class on `.tbl-wrap`. */\n readonly density = signal<EfTableDensity>('default');\n\n /** Column ids the viewer has hidden. */\n readonly hiddenColumnIds = signal<ReadonlyArray<string>>([]);\n\n readonly densityOptions: ReadonlyArray<{\n value: EfTableDensity;\n labelKey: string;\n icon: string;\n }> = [\n { value: 'compact', labelKey: 'common_density_compact', icon: 'pi-align-justify' },\n { value: 'default', labelKey: 'common_density_default', icon: 'pi-bars' },\n { value: 'comfortable', labelKey: 'common_density_comfortable', icon: 'pi-list' },\n ];\n\n /** Columns the viewer may hide -- structural ones stay put, since\n * hiding the selection checkbox or the row-actions cell would strand\n * the bulk bar and the per-row menu with no way back. */\n readonly hideableColumns = computed(() =>\n // Derived from the DECLARED columns, not `effectiveColumns` --\n // that one already drops hidden columns, so a hidden column would\n // vanish from its own picker and could never be restored.\n this.columns().filter(\n c => c.id !== 'select' && c.id !== 'actions' && c.hideable !== false,\n ),\n );\n\n toggleTool(tool: 'density' | 'columns'): void {\n this.openTool.update(cur => (cur === tool ? null : tool));\n }\n\n setDensity(value: EfTableDensity): void {\n this.density.set(value);\n this.openTool.set(null);\n this.savePreferences();\n }\n\n isColumnHidden(id: string): boolean {\n return this.hiddenColumnIds().includes(id);\n }\n\n toggleColumn(id: string): void {\n this.hiddenColumnIds.update(ids =>\n ids.includes(id) ? ids.filter(x => x !== id) : [...ids, id],\n );\n this.savePreferences();\n }\n\n resetColumns(): void {\n this.hiddenColumnIds.set([]);\n this.savePreferences();\n }\n\n /** Close an open panel on an outside click or Escape. */\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.openTool()) return;\n const target = event.target as HTMLElement | null;\n if (target?.closest('.tbl-tools')) return;\n this.openTool.set(null);\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n this.openTool.set(null);\n }\n\n private storageKey(): string | null {\n const key = this.tableKey();\n return key ? `TABLE_PREFS_${key}` : null;\n }\n\n private loadPreferences(): void {\n const key = this.storageKey();\n if (!key) return;\n try {\n const saved = StorageUtils.getLocal<{\n density?: EfTableDensity;\n hiddenColumnIds?: string[];\n }>(key);\n if (!saved) return;\n if (saved.density) this.density.set(saved.density);\n if (Array.isArray(saved.hiddenColumnIds))\n this.hiddenColumnIds.set(saved.hiddenColumnIds);\n } catch {\n // Storage can throw outright (blocked site data, previews) --\n // the defaults are a perfectly good table.\n }\n }\n\n private savePreferences(): void {\n const key = this.storageKey();\n if (!key) return;\n try {\n StorageUtils.setLocal(key, {\n density: this.density(),\n hiddenColumnIds: this.hiddenColumnIds(),\n });\n } catch {\n // Preferences are a convenience; losing them must never break\n // the table.\n }\n }\n\n /** Tracks how many `ef-row-actions` are currently open inside this\n * card. When > 0, `.tbl-wrap` lifts its `overflow: hidden` so the\n * popup can escape its rounded edges. */\n readonly openMenuCount = signal(0);\n\n @HostListener('ef-row-actions-toggle', ['$event'])\n onRowActionsToggle(event: Event): void {\n const detail = (event as CustomEvent<{ open: boolean }>).detail;\n this.openMenuCount.update(c => Math.max(0, c + (detail?.open ? 1 : -1)));\n }\n\n /** Fires `rowDoubleClick` unless the dblclick originated on an\n * interactive child (checkbox, button, link, form control). */\n onRowDoubleClick(row: TRow, event: MouseEvent): void {\n if (!this.rowDoubleClickable()) return;\n const target = event.target as HTMLElement | null;\n if (target?.closest('button, a, input, select, textarea, label')) return;\n this.rowDoubleClick.emit(row);\n }\n\n onHeaderClick(col: EfDataCardColumn): void {\n if (!col.sortable) return;\n const field = col.sortField ?? col.field ?? col.id;\n const current = this.sort();\n const direction: EfDataCardSortDirection =\n current?.field === field && current.direction === 'desc' ? 'asc' : 'desc';\n this.sortChange.emit({ field, direction });\n }\n\n trackByRow = (_: number, row: TRow): unknown => {\n const f = this.trackByField();\n return f ? (row as any)?.[f] : row;\n };\n\n trackByColumn = (_: number, col: EfDataCardColumn): string => col.id;\n}\n\nfunction toMap<T extends { columnId: string; templateRef: TemplateRef<unknown> }>(\n list: QueryList<T>,\n): Map<string, TemplateRef<unknown>> {\n const m = new Map<string, TemplateRef<unknown>>();\n list.forEach(d => m.set(d.columnId, d.templateRef));\n return m;\n}\n","<!-- One cell renderer, shared by the table, the mobile row and the mobile\n detail. A new column type is added here once, not three times. -->\n<ng-template #cellTpl let-row let-col=\"col\">\n @if (bodyTemplate(col.id); as bodyTpl) {\n <ng-container *ngTemplateOutlet=\"bodyTpl; context: { $implicit: row, col: col }\"></ng-container>\n } @else {\n @switch (col.type) {\n @case ('number') {\n {{ $any(cellValue(row, col)) | number:numberFormat(col):col.locale }}\n }\n @case ('money') {\n {{ $any(cellValue(row, col)) | currency:(col.currencyCode || 'EUR'):(col.currencyDisplay || 'symbol'):numberFormat(col):col.locale }}\n }\n @case ('date') {\n {{ $any(cellValue(row, col)) | date:(col.dateFormat || 'dd/MM/yyyy'):undefined:col.locale }}\n }\n @case ('datetime') {\n {{ $any(cellValue(row, col)) | date:(col.dateFormat || 'dd/MM/yyyy HH:mm'):undefined:col.locale }}\n }\n @case ('boolean') {\n @if (cellValue(row, col)) {\n <span class=\"bool yes\"><span class=\"dot\"></span> ✓</span>\n } @else {\n <span class=\"bool no\"><span class=\"dot\"></span> —</span>\n }\n }\n @case ('mono') {\n <span class=\"ref\">{{ cellValue(row, col) }}</span>\n }\n @case ('chip') {\n <span [class]=\"'chip ' + (col.chipPrefix || 'chip-') + cellValue(row, col)\">\n ● {{ cellValue(row, col) }}\n </span>\n }\n @case ('status') {\n <ef-status-chip\n [referenceKey]=\"col.referenceKey || ''\"\n [code]=\"$any(cellValue(row, col))\"\n />\n }\n @case ('reference') {\n {{ resolveReference(cellValue(row, col), col) }}\n }\n @default {\n {{ cellValue(row, col) }}\n }\n }\n }\n</ng-template>\n\n<div class=\"tbl-wrap\" [class.has-open-menu]=\"openMenuCount() > 0 || openTool() !== null\" [attr.data-density]=\"density()\">\n <!-- ── HEAD ROW ────────────────────────────────────────────── -->\n <div class=\"tbl-head\">\n <div class=\"count small\">\n @if (loading()) {\n <span>{{ loadingKey() | translate }}</span>\n } @else if (errorMsg()) {\n <span style=\"color: var(--st-cancelled-fg); font-weight: 600;\">⚠ {{ errorMsg() }}</span>\n } @else {\n <ng-content select=\"[tbl-head-info]\"></ng-content>\n }\n </div>\n <div class=\"tbl-tools\">\n <ng-content select=\"[tbl-head-actions]\"></ng-content>\n\n @if (showDensityControl()) {\n <div class=\"tbl-tool\">\n <button\n class=\"btn btn-ghost btn-sm\"\n type=\"button\"\n [class.open]=\"openTool() === 'density'\"\n [attr.aria-expanded]=\"openTool() === 'density'\"\n aria-haspopup=\"menu\"\n (click)=\"toggleTool('density')\"\n >\n <i class=\"pi pi-bars\" aria-hidden=\"true\"></i>\n {{ 'common_density' | translate }}\n </button>\n @if (openTool() === 'density') {\n <div class=\"tbl-tool__menu\" role=\"menu\">\n @for (opt of densityOptions; track opt.value) {\n <button\n type=\"button\"\n role=\"menuitemradio\"\n [attr.aria-checked]=\"density() === opt.value\"\n [class.is-active]=\"density() === opt.value\"\n (click)=\"setDensity(opt.value)\"\n >\n <i class=\"pi\" [ngClass]=\"opt.icon\" aria-hidden=\"true\"></i>\n <span class=\"tbl-tool__label\">{{ opt.labelKey | translate }}</span>\n @if (density() === opt.value) {\n <i class=\"pi pi-check tbl-tool__check\" aria-hidden=\"true\"></i>\n }\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (showColumnPicker()) {\n <div class=\"tbl-tool\">\n <button\n class=\"btn btn-ghost btn-sm\"\n type=\"button\"\n [class.open]=\"openTool() === 'columns'\"\n [attr.aria-expanded]=\"openTool() === 'columns'\"\n aria-haspopup=\"menu\"\n (click)=\"toggleTool('columns')\"\n >\n <i class=\"pi pi-th-large\" aria-hidden=\"true\"></i>\n {{ 'common_columns' | translate }}\n </button>\n @if (openTool() === 'columns') {\n <div class=\"tbl-tool__menu tbl-tool__menu--wide\" role=\"menu\">\n @for (col of hideableColumns(); track col.id) {\n <button\n type=\"button\"\n role=\"menuitemcheckbox\"\n [attr.aria-checked]=\"!isColumnHidden(col.id)\"\n [class.is-active]=\"!isColumnHidden(col.id)\"\n (click)=\"toggleColumn(col.id)\"\n >\n <i class=\"pi\" [class.pi-check]=\"!isColumnHidden(col.id)\" aria-hidden=\"true\"></i>\n <span class=\"tbl-tool__label\">{{\n col.headerKey ? (col.headerKey | translate) : (col.header || col.id)\n }}</span>\n </button>\n }\n <div class=\"tbl-tool__sep\"></div>\n <button type=\"button\" role=\"menuitem\" (click)=\"resetColumns()\">\n <i class=\"pi pi-refresh\" aria-hidden=\"true\"></i>\n <span class=\"tbl-tool__label\">{{ 'common_columns_reset' | translate }}</span>\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- ── TABLE ─────────────────────────────────────────────── -->\n @if (isMobile()) {\n <!-- ── MOBILE LIST ──────────────────────────────────────────\n A six-column table on a 390px screen either overflows or\n squeezes every column to nothing, so the rows become a list.\n Same columns, same cell renderers; each column just declares\n (or is given) a role. Both shapes expand to the same detail —\n they differ only in how much they show collapsed. -->\n <ul class=\"mlist\" [attr.data-layout]=\"effectiveMobileLayout()\">\n @for (row of rows(); track trackByRow($index, row); let i = $index) {\n <li class=\"mrow\" [class.is-open]=\"isExpanded(row, i)\">\n <div\n class=\"mrow__head\"\n [class.is-tappable]=\"hasDetail()\"\n [attr.role]=\"hasDetail() ? 'button' : null\"\n [attr.tabindex]=\"hasDetail() ? 0 : null\"\n [attr.aria-expanded]=\"hasDetail() ? isExpanded(row, i) : null\"\n (click)=\"onRowHeadActivate(row, i, $event)\"\n (keydown.enter)=\"onRowHeadActivate(row, i, $event)\"\n (keydown.space)=\"onRowHeadActivate(row, i, $event)\"\n >\n <div class=\"mrow__lead\">\n @if (primaryColumn(); as pc) {\n <span class=\"mrow__primary\">\n <ng-container *ngTemplateOutlet=\"cellTpl; context: { $implicit: row, col: pc }\"></ng-container>\n </span>\n }\n @if (effectiveMobileLayout() === 'row' && secondaryColumns().length) {\n <span class=\"mrow__secondary\">\n @for (sc of secondaryColumns(); track sc.id) {\n <span class=\"mrow__sec-part\">\n <ng-container *ngTemplateOutlet=\"cellTpl; context: { $implicit: row, col: sc }\"></ng-container>\n </span>\n }\n </span>\n }\n </div>\n\n <div class=\"mrow__trail\">\n @if (statusColumn(); as st) {\n <ng-container *ngTemplateOutlet=\"cellTpl; context: { $implicit: row, col: st }\"></ng-container>\n }\n @if (hasActionsColumn()) {\n <span class=\"mrow__actions\">\n <ef-row-actions [items]=\"defaultRowActions(row)\" [context]=\"rowActionsContext()\" />\n </span>\n }\n @if (hasDetail() && effectiveMobileLayout() === 'row') {\n <!-- Says the row opens, and which way it is now. Decorative:\n the whole head is the control, and it carries the state. -->\n <i\n class=\"pi pi-chevron-down mrow__chevron\"\n [class.is-open]=\"isExpanded(row, i)\"\n aria-hidden=\"true\"\n ></i>\n }\n </div>\n </div>\n\n @if (visibleDetail(row, i).length) {\n <dl class=\"mrow__detail\">\n @for (col of visibleDetail(row, i); track col.id) {\n <div class=\"mrow__field\">\n <dt>{{ $any(col).headerKey ? ($any(col).headerKey | translate) : $any(col).header }}</dt>\n <dd [class]=\"cellAlignClass($any(col))\">\n <ng-container *ngTemplateOutlet=\"cellTpl; context: { $implicit: row, col: col }\"></ng-container>\n </dd>\n </div>\n }\n </dl>\n }\n\n @if (hasMoreThanPreview() && effectiveMobileLayout() === 'card') {\n <button class=\"mrow__more\" type=\"button\" (click)=\"toggleExpanded(row, i)\">\n <span>{{ (isExpanded(row, i) ? 'common_view_less' : 'common_view_more') | translate }}</span>\n <i class=\"pi pi-chevron-down mrow__chevron\" [class.is-open]=\"isExpanded(row, i)\" aria-hidden=\"true\"></i>\n </button>\n }\n </li>\n } @empty {\n <li class=\"mrow mrow--empty\">\n <ng-content select=\"[empty-state-mobile]\"></ng-content>\n </li>\n }\n </ul>\n } @else {\n <table class=\"tbl\">\n <thead>\n <tr>\n @for (col of effectiveColumns(); track trackByColumn($index, col)) {\n <th\n [class]=\"headerAlignClass(col)\"\n [class.is-sortable]=\"col.sortable\"\n [style.width]=\"col.width || null\"\n [attr.data-col]=\"col.id\"\n (click)=\"onHeaderClick(col)\"\n [style.cursor]=\"col.sortable ? 'pointer' : null\"\n >\n @if (headerTemplate(col.id); as headerTpl) {\n <ng-container *ngTemplateOutlet=\"headerTpl; context: { $implicit: col, col: col }\"></ng-container>\n } @else if (col.headerKey) {\n <span>{{ col.headerKey | translate }}</span>\n } @else if (col.header) {\n <span>{{ col.header }}</span>\n }\n @if (col.sortable && sortIndicator(col)) {\n <span aria-hidden=\"true\" style=\"margin-inline-start: 4px; opacity: 0.7;\">{{ sortIndicator(col) }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @for (row of rows(); track trackByRow($index, row)) {\n <tr\n [class.is-row-clickable]=\"rowDoubleClickable()\"\n (dblclick)=\"onRowDoubleClick(row, $event)\"\n >\n @for (col of effectiveColumns(); track trackByColumn($index, col); let colIdx = $index) {\n <td [class]=\"cellAlignClass(col)\" [attr.data-col]=\"col.id\">\n @if (col.id === 'actions' && hasActionsColumn()) {\n <!-- Auto row-actions cell: View / Edit / Duplicate / Delete,\n gated by [show*Action] flags + ScreenContext perms. -->\n <ef-row-actions\n [items]=\"defaultRowActions(row)\"\n [context]=\"rowActionsContext()\"\n />\n } @else {\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: { $implicit: row, col: col }\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n } @empty {\n <tr>\n <td [attr.colspan]=\"effectiveColumns().length\">\n <ng-content select=\"[empty-state]\"></ng-content>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- ── PAGER ─────────────────────────────────────────────── -->\n @if (!hidePager()) {\n <ef-pager\n [pageNumber]=\"pageNumber()\"\n [pageSize]=\"pageSize()\"\n [totalCount]=\"totalCount()\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n (pageChange)=\"pageChange.emit($event)\"\n (pageSizeChange)=\"pageSizeChange.emit($event)\"\n />\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Comptoir bulk-action bar — ink-active pill that shows a selection\n * count + projected action buttons. Auto-hides when count is 0.\n *\n * ```html\n * <ef-bulk-bar [count]=\"selectionCount()\">\n * <button class=\"btn\">{{ 'common_export' | translate }}</button>\n * <button class=\"btn\">{{ 'sales_orders_bulk_approve' | translate }}</button>\n * </ef-bulk-bar>\n * ```\n */\n@Component({\n selector: 'ef-bulk-bar',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n @if (count() > 0) {\n <div class=\"bulk\">\n <span>\n <strong>{{ count() }}</strong>\n <span class=\"count\">\n {{ (suffixKey() ? (suffixKey() | translate) : suffix()) }}\n </span>\n </span>\n <ng-content></ng-content>\n </div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfBulkBarComponent {\n readonly count = input<number>(0);\n /** Translation key for the suffix word (\"selected\"). */\n readonly suffixKey = input<string>('common_selected');\n /** Direct suffix text (used only when `suffixKey` is empty). */\n readonly suffix = input<string>('');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Comptoir empty-state — circular dashed icon + title + optional\n * message + projected actions slot. Drop into a data-card body when\n * results are zero.\n *\n * ```html\n * <ef-empty-state\n * icon=\"pi pi-inbox\"\n * titleKey=\"sales_orders_empty_title\"\n * messageKey=\"sales_orders_empty_msg\">\n * <button class=\"btn btn-tenant btn-sm\">{{ 'sales_orders_new' | translate }}</button>\n * </ef-empty-state>\n * ```\n */\n@Component({\n selector: 'ef-empty-state',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n <div class=\"empty\">\n <span class=\"ic\" aria-hidden=\"true\">\n <i [class]=\"icon()\"></i>\n </span>\n\n @if (titleKey() || title()) {\n <span class=\"title\">\n {{ (titleKey() ? (titleKey() | translate) : title()) }}\n </span>\n }\n\n @if (messageKey() || message()) {\n <span class=\"small\">\n {{ (messageKey() ? (messageKey() | translate) : message()) }}\n </span>\n }\n\n <div class=\"actions\" style=\"display: inline-flex; gap: 8px; flex-wrap: wrap; justify-content: center; margin-top: 4px;\">\n <ng-content></ng-content>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfEmptyStateComponent {\n readonly icon = input<string>('pi pi-inbox');\n readonly titleKey = input<string>('');\n readonly title = input<string>('');\n readonly messageKey = input<string>('');\n readonly message = input<string>('');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n input,\n model,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Comptoir smart bar — the search/filter card every list screen\n * starts with. Composes:\n * 1. Search input (with `⌘K` kbd hint) + Effacer / Rechercher\n * action buttons.\n * 2. A filter-row slot for `[filters]` (pill-group + filter-pill +\n * preset-pill + \"+ Plus de filtres\").\n * 3. A drawer slot for `[drawer]` (advanced filters via\n * `ef-filter-drawer`).\n *\n * The `searchText` is a `model()` so consumers can `[(searchText)]`\n * for two-way binding, or watch the (search) output for explicit\n * Rechercher clicks.\n *\n * ```html\n * <ef-smart-bar\n * [(searchText)]=\"searchQuery\"\n * placeholderKey=\"sales_orders_search_placeholder\"\n * (search)=\"setSearchText($event)\"\n * (clear)=\"clearAll()\"\n * >\n * <ng-container filters>\n * <ef-pill-group …/>\n * <ef-filter-pill …/>\n * <ef-preset-pill …/>\n * </ng-container>\n * <ng-container drawer>\n * <ef-filter-drawer …/>\n * </ng-container>\n * </ef-smart-bar>\n * ```\n */\n@Component({\n selector: 'ef-smart-bar',\n standalone: true,\n imports: [CommonModule, FormsModule, TranslateModule],\n template: `\n <div class=\"screen-search\">\n <div class=\"smart-bar\">\n <label class=\"search\">\n <input\n type=\"text\"\n [placeholder]=\"(placeholderKey() ? (placeholderKey() | translate) : placeholder())\"\n [ngModel]=\"searchText()\"\n (ngModelChange)=\"searchText.set($event)\"\n (keydown.enter)=\"onSubmit()\"\n />\n @if (showKbdHint()) {\n <span class=\"kbd\">⌘K</span>\n }\n </label>\n <div class=\"actions\">\n @if (!hideClear()) {\n <button\n class=\"btn btn-ghost btn-sm\"\n type=\"button\"\n [attr.title]=\"clearTitleKey() | translate\"\n (click)=\"onClear()\"\n >\n {{ clearLabelKey() | translate }}\n </button>\n }\n @if (!hideSearch()) {\n <button\n class=\"btn btn-primary btn-sm\"\n type=\"button\"\n [disabled]=\"loading()\"\n (click)=\"onSubmit()\"\n >\n {{ searchLabelKey() | translate }}\n </button>\n }\n </div>\n </div>\n\n <div class=\"filter-row\">\n <ng-content select=\"[filters]\"></ng-content>\n </div>\n\n <ng-content select=\"[drawer]\"></ng-content>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfSmartBarComponent {\n /** Two-way bound search input. */\n readonly searchText = model<string>('');\n\n readonly placeholderKey = input<string>('');\n readonly placeholder = input<string>('');\n\n readonly clearLabelKey = input<string>('common_clear');\n readonly clearTitleKey = input<string>('common_clear');\n readonly searchLabelKey = input<string>('common_search');\n\n readonly showKbdHint = input(true, { transform: booleanAttribute });\n readonly hideClear = input(false, { transform: booleanAttribute });\n readonly hideSearch = input(false, { transform: booleanAttribute });\n readonly loading = input(false, { transform: booleanAttribute });\n\n // `search` shadows a native DOM event name. Renaming this output would\n // churn every consumer template, so the name stays and the rule is\n // suppressed here deliberately.\n // eslint-disable-next-line @angular-eslint/no-output-native\n readonly search = output<string>();\n readonly clear = output<void>();\n\n onSubmit(): void {\n this.search.emit(this.searchText());\n }\n\n onClear(): void {\n this.searchText.set('');\n this.clear.emit();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Comptoir filter pill — value-bearing button used in the smart-bar's\n * filter row. Three tones (`neutral` / `active` / `tenant`), optional\n * caret (when the pill toggles a popover), optional ✕ clear button.\n *\n * The popover content is consumer-projected via the `[popover]` slot\n * — the pill positions it absolutely below itself per the prototype's\n * `.popover` class. Visibility is driven by the `popoverOpen` input.\n *\n * ```html\n * <!-- value-bearing, removable -->\n * <ef-filter-pill\n * icon=\"pi pi-user\"\n * labelKey=\"filter_client\"\n * value=\"Leila Bennani\"\n * tone=\"active\"\n * hasClear\n * (clearClick)=\"removeFilter('client')\"\n * />\n *\n * <!-- with popover (consumer renders preset list inside) -->\n * <ef-filter-pill\n * icon=\"pi pi-calendar\"\n * labelKey=\"filter_date\"\n * [value]=\"activeDatePreset().labelKey | translate\"\n * hasPopover\n * [popoverOpen]=\"datePopoverOpen()\"\n * (pillClick)=\"toggleDatePopover()\"\n * >\n * <ng-container popover>\n * @for (p of presets; track p.key) {\n * <div class=\"preset\" [class.active]=\"p === active\">…</div>\n * }\n * </ng-container>\n * </ef-filter-pill>\n * ```\n */\n@Component({\n selector: 'ef-filter-pill',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n templateUrl: './ef-filter-pill.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfFilterPillComponent {\n /** PrimeNG icon class (e.g. `pi pi-calendar`). */\n readonly icon = input<string>('');\n\n /** Translation key — preferred. */\n readonly labelKey = input<string>('');\n /** Direct label text (used only when `labelKey` is empty). */\n readonly label = input<string>('');\n\n /** Current value displayed after the label. */\n readonly value = input<string>('');\n\n /** `'active'` paints ink-active; `'tenant'` paints the tenant-50 surface. */\n readonly tone = input<'neutral' | 'active' | 'tenant'>('neutral');\n\n /** Show the ✕ clear button at the end of the pill. */\n readonly hasClear = input(false, { transform: booleanAttribute });\n\n /** Show a chevron + position the projected `[popover]` slot. */\n readonly hasPopover = input(false, { transform: booleanAttribute });\n\n /** Whether the popover is currently open (consumer-controlled). */\n readonly popoverOpen = input(false, { transform: booleanAttribute });\n\n /** Translation key for the ✕ clear button's aria-label. */\n readonly clearAriaKey = input<string>('filter_remove_aria');\n\n /** Emitted when the pill body is clicked (open popover, etc.). */\n readonly pillClick = output<void>();\n\n /** Emitted when the ✕ clear button is clicked (stops propagation). */\n readonly clearClick = output<void>();\n\n onPillClick(): void {\n this.pillClick.emit();\n }\n\n onClearClick(event: Event): void {\n event.stopPropagation();\n this.clearClick.emit();\n }\n}\n","<button\n type=\"button\"\n class=\"f-pill\"\n [class.active]=\"tone() === 'active'\"\n [class.tenant]=\"tone() === 'tenant'\"\n [class.has-pop]=\"hasPopover()\"\n [attr.aria-haspopup]=\"hasPopover() ? 'listbox' : null\"\n [attr.aria-expanded]=\"hasPopover() ? popoverOpen() : null\"\n (click)=\"onPillClick()\"\n>\n @if (icon()) {\n <i class=\"ico\" [class]=\"icon()\" aria-hidden=\"true\"></i>\n }\n\n @if (labelKey() || label()) {\n <span class=\"lbl\">\n {{ labelKey() ? (labelKey() | translate) : label() }}\n </span>\n }\n\n @if (value()) {\n <span class=\"val\">{{ value() }}</span>\n }\n\n @if (hasClear()) {\n <span\n class=\"clear\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"clearAriaKey() | translate\"\n (click)=\"onClearClick($event)\"\n (keydown.enter)=\"onClearClick($event)\"\n (keydown.space)=\"onClearClick($event)\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\" style=\"font-size: 8px;\"></i>\n </span>\n } @else if (hasPopover()) {\n <i class=\"caret pi pi-chevron-down\" aria-hidden=\"true\"></i>\n }\n\n @if (hasPopover()) {\n <div class=\"popover\" [class.open]=\"popoverOpen()\" role=\"listbox\">\n <ng-content select=\"[popover]\"></ng-content>\n </div>\n }\n</button>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { EfClearButtonComponent } from '../ef-clear-button/ef-clear-button.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n/**\n * Native Comptoir textarea — no PrimeNG wrapper. Pairs with the\n * `.ef-textarea` rule in `@elasticias/ui/styles/patterns` (focus\n * ring, paper-alt bg, rule border).\n *\n * Identity / label / placeholder / aria / required / readonly /\n * disabled inherited from `AbstractEfFormControl`. Implements\n * ControlValueAccessor so it slots into reactive forms AND works\n * with `[(value)]` two-way binding via `(valueChangeEvent)`.\n *\n * ```html\n * <ef-textarea\n * labelKey=\"products_details_description_label\"\n * placeholderKey=\"products_details_description_placeholder\"\n * [rows]=\"4\"\n * [(value)]=\"description\"\n * />\n * ```\n */\n@Component({\n selector: 'ef-textarea',\n standalone: true,\n templateUrl: './ef-textarea.component.html',\n imports: [FormsModule, TranslateModule, EfLabelComponent, EfClearButtonComponent],\n})\nexport class EfTextareaComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor\n{\n @Input() rows = 4;\n @Input() maxlength?: number;\n @Input({ transform: booleanAttribute }) autofocus = false;\n\n @Output() valueChangeEvent = new EventEmitter<string>();\n\n /** Two-way-bindable as `[value]` (one-way) or\n * `[(value)]=\"signal()\"` (set + listen via `valueChangeEvent`). */\n @Input() value = '';\n\n /** Clearable (showClear / canClear) inherited from AbstractEfFormControl. */\n protected override get hasValue(): boolean {\n return !!this.value;\n }\n\n override clearValue(): void {\n this.handleInput('');\n }\n\n private onChange: (value: string) => void = () => {\n /* noop */\n };\n private onTouched: () => void = () => {\n /* noop */\n };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n get isInvalid(): boolean {\n if (this.resolvedExternalErrors()?.length) return true;\n const ctrl = this.ngControl?.control;\n return !!ctrl?.invalid && (!!ctrl?.touched || !!ctrl?.dirty);\n }\n\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? this.ngControl?.control?.errors?.['serverError'] ?? null;\n }\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n\n writeValue(value: string): void {\n this.value = value ?? '';\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n handleInput(value: string): void {\n this.value = value;\n this.onChange(value);\n this.valueChangeEvent.emit(value);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n}\n","@if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" [for]=\"effectiveId\" [required]=\"required()\" />\n}\n<div class=\"ef-field-control\">\n <div class=\"ef-textarea-wrap\">\n <textarea\n class=\"ef-textarea\"\n [class.has-clear]=\"canClear\"\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [rows]=\"rows\"\n [value]=\"value\"\n [attr.placeholder]=\"effectivePlaceholder || null\"\n [attr.maxlength]=\"maxlength ?? null\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [class.is-invalid]=\"isInvalid\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n (input)=\"handleInput($any($event.target).value)\"\n (blur)=\"handleBlur()\"\n ></textarea>\n @if (canClear) {\n <ef-clear-button\n class=\"ef-textarea-clear\"\n [ariaLabel]=\"'action.clear' | translate\"\n (clear)=\"clearValue()\"\n />\n }\n </div>\n @if (showRequired || serverErrors) {\n <div [id]=\"errorsId\" role=\"alert\" aria-live=\"polite\">\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { EfFilterPillComponent } from '../ef-filter-pill/ef-filter-pill.component';\n\nexport interface EfPresetItem<T = string> {\n /** Stable identifier (used as the `value`). */\n key: T;\n /** Translation key for the row label (preferred). */\n labelKey?: string;\n /** Direct label (used only when `labelKey` is empty). */\n label?: string;\n /** Mono hint to the right (date range, count, …). */\n hint?: string;\n}\n\n/**\n * Filter pill that opens a list of presets on click. Consumer-side\n * use cases: date ranges (`Aujourd'hui · 30 derniers jours · …`),\n * non-date enums (`Jamais connecté`), any short canned list.\n *\n * State model: `open` is a `model()` so callers can let the pill\n * manage its own visibility (default) or hoist it into a parent\n * signal for fully controlled use (`[(open)]`).\n *\n * ```html\n * <ef-preset-pill\n * icon=\"pi pi-calendar\"\n * labelKey=\"filter_date\"\n * [presets]=\"datePresets\"\n * [(activeKey)]=\"activeDateKey\"\n * (presetChange)=\"onDateRangeChange($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'ef-preset-pill',\n standalone: true,\n imports: [CommonModule, TranslateModule, EfFilterPillComponent],\n template: `\n <ef-filter-pill\n [icon]=\"icon()\"\n [labelKey]=\"labelKey()\"\n [label]=\"label()\"\n [value]=\"activeLabel()\"\n [tone]=\"tone()\"\n [hasPopover]=\"true\"\n [popoverOpen]=\"open()\"\n (pillClick)=\"toggle()\"\n >\n <ng-container popover>\n @for (preset of presets(); track preset.key) {\n <div\n class=\"preset\"\n role=\"button\"\n tabindex=\"0\"\n [class.active]=\"preset.key === activeKey()\"\n (click)=\"select(preset); $event.stopPropagation()\"\n (keydown.enter)=\"select(preset); $event.stopPropagation()\"\n (keydown.space)=\"select(preset); $event.stopPropagation()\"\n >\n <span>\n {{ preset.labelKey ? (preset.labelKey | translate) : (preset.label ?? '') }}\n </span>\n @if (preset.hint) {\n <span class=\"hint\">{{ preset.hint }}</span>\n }\n </div>\n }\n </ng-container>\n </ef-filter-pill>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfPresetPillComponent<T = string> {\n private readonly translate = inject(TranslateService);\n\n readonly icon = input<string>('pi pi-list');\n readonly labelKey = input<string>('');\n readonly label = input<string>('');\n readonly tone = input<'neutral' | 'active' | 'tenant'>('neutral');\n\n readonly presets = input.required<ReadonlyArray<EfPresetItem<T>>>();\n readonly activeKey = model<T | null>(null);\n\n /** Two-way; consumer can hoist for controlled mode. */\n readonly open = model<boolean>(false);\n\n /** Auto-close the popover after selection (default on). */\n readonly closeOnSelect = input(true, { transform: booleanAttribute });\n\n readonly presetChange = output<EfPresetItem<T>>();\n\n /** Displayed value — translates `labelKey` of the active preset if present. */\n readonly activeLabel = computed(() => {\n const key = this.activeKey();\n const match = this.presets().find(p => p.key === key);\n if (!match) return '';\n if (match.labelKey) return this.translate.instant(match.labelKey);\n return match.label ?? '';\n });\n\n toggle(): void {\n this.open.update(o => !o);\n }\n\n select(preset: EfPresetItem<T>): void {\n this.activeKey.set(preset.key);\n this.presetChange.emit(preset);\n if (this.closeOnSelect()) this.open.set(false);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Comptoir advanced-filter drawer — collapsible card that lives at\n * the bottom of the smart-bar. Consumer projects their grid of\n * `<div class=\"field\">` controls; the component handles the open\n * animation, the footer Reset / Apply buttons, and the optional hint\n * line on the left of the footer.\n *\n * ```html\n * <ef-filter-drawer\n * [open]=\"drawerOpen()\"\n * hintKey=\"sales_orders_adv_hint\"\n * (apply)=\"runSearch()\"\n * (reset)=\"clearAll()\"\n * >\n * <div class=\"field\">\n * <label for=\"adv-employee\">{{ 'sales_orders_adv_employee' | translate }}</label>\n * <select id=\"adv-employee\">…</select>\n * </div>\n * …\n * </ef-filter-drawer>\n * ```\n */\n@Component({\n selector: 'ef-filter-drawer',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n <div class=\"f-drawer\" [class.open]=\"open()\" [attr.aria-hidden]=\"!open()\">\n <div class=\"grid\">\n <ng-content></ng-content>\n </div>\n <div class=\"foot\">\n <span class=\"left\">\n @if (hintKey()) {\n {{ hintKey() | translate }}\n } @else {\n {{ hint() }}\n }\n </span>\n <div style=\"display: flex; gap: 8px;\">\n <button class=\"btn btn-ghost btn-sm\" type=\"button\" (click)=\"reset.emit()\">\n {{ resetLabelKey() | translate }}\n </button>\n @if (!hideApply()) {\n <button class=\"btn btn-primary btn-sm\" type=\"button\" (click)=\"apply.emit()\">\n {{ applyLabelKey() | translate }}\n </button>\n }\n </div>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfFilterDrawerComponent {\n readonly open = input(false, { transform: booleanAttribute });\n readonly hintKey = input<string>('');\n readonly hint = input<string>('');\n readonly resetLabelKey = input<string>('common_reset');\n readonly applyLabelKey = input<string>('common_apply');\n readonly hideApply = input(false, { transform: booleanAttribute });\n\n readonly apply = output<void>();\n // `reset` shadows a native DOM event name. Renaming this output would\n // churn every consumer template, so the name stays and the rule is\n // suppressed here deliberately.\n // eslint-disable-next-line @angular-eslint/no-output-native\n readonly reset = output<void>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Comptoir activation tri-state filter — a `.field`-anatomy pill group\n * (all / active / inactive) for boolean activation criteria\n * (`IsActive: bool?` pattern).\n *\n * `value` is the criteria value itself: `true`, `false`, or\n * `undefined`/`null` for \"all\". `valueChange` emits the same shape, so\n * the component binds straight onto a search screen's advanced-filter\n * state; pair with `AbstractSearchScreenV2.activationFilterKey` for\n * apply / baseline-clear / cache-restore.\n *\n * ```html\n * <ef-activation-filter\n * [value]=\"advancedValues()['isActive']\"\n * (valueChange)=\"setAdvancedValue('isActive', $event)\"\n * />\n * ```\n */\n@Component({\n selector: 'ef-activation-filter',\n standalone: true,\n imports: [TranslateModule],\n template: `\n <div class=\"field\">\n <span class=\"field-label\" [id]=\"labelId\">{{ labelKey() | translate }}</span>\n <div class=\"pill-group\" role=\"tablist\" [attr.aria-labelledby]=\"labelId\">\n @for (bucket of buckets(); track bucket.key) {\n <button\n type=\"button\"\n role=\"tab\"\n [class.active]=\"selected() === bucket.key\"\n [attr.aria-selected]=\"selected() === bucket.key\"\n (click)=\"valueChange.emit(bucket.value)\"\n >\n {{ bucket.labelKey | translate }}\n </button>\n }\n </div>\n </div>\n `,\n styles: `\n :host {\n display: block;\n }\n /* Center the pills on the 40px control line so the field aligns\n with sibling comptoir selects/inputs in a drawer row. */\n .pill-group {\n min-height: var(--hit-base, 40px);\n align-items: center;\n align-self: start;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfActivationFilterComponent {\n private static nextId = 0;\n readonly labelId = `ef-activation-filter-label-${++EfActivationFilterComponent.nextId}`;\n\n /** Current criteria value: `true` / `false` / `undefined` (= all). */\n readonly value = input<unknown>();\n\n readonly labelKey = input('common_activation');\n readonly allLabelKey = input('common_all');\n readonly activeLabelKey = input('common_active');\n readonly inactiveLabelKey = input('common_inactive');\n\n readonly valueChange = output<boolean | undefined>();\n\n readonly selected = computed(() => {\n const v = this.value();\n return v === true ? 'active' : v === false ? 'inactive' : 'all';\n });\n\n readonly buckets = computed(() => [\n { key: 'all', labelKey: this.allLabelKey(), value: undefined },\n { key: 'active', labelKey: this.activeLabelKey(), value: true },\n { key: 'inactive', labelKey: this.inactiveLabelKey(), value: false },\n ]);\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, Input, OnInit, PLATFORM_ID } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { $t, updatePreset, updateSurfacePalette } from '@primeng/themes';\nimport Aura from '@primeng/themes/aura';\nimport Lara from '@primeng/themes/lara';\nimport Material from '@primeng/themes/material';\nimport Nora from '@primeng/themes/nora';\nimport { PrimeNG } from 'primeng/config';\nimport { SelectButton } from 'primeng/selectbutton';\nimport { ToggleSwitchModule } from 'primeng/toggleswitch';\nimport { EfThemeConfigService } from '@elasticias/core';\n\nconst PRESETS: Record<string, Record<string, unknown>> = {\n Aura,\n Lara,\n Material,\n Nora,\n};\n\n/**\n * Theme configurator panel for switching PrimeNG presets, primary colors,\n * surface palettes, ripple effect, and RTL direction.\n *\n * All labels use translation keys (ngx-translate). Pass keys via inputs.\n *\n * Usage:\n * ```html\n * <ef-theme-configurator\n * primaryLabelKey=\"configurator.primary_color\"\n * surfaceLabelKey=\"configurator.surface\"\n * presetLabelKey=\"configurator.preset\"\n * rippleLabelKey=\"configurator.ripple\"\n * rtlLabelKey=\"configurator.rtl\"\n * [presetsDisplayNameKeys]=\"{ Aura: 'configurator.preset_compact', Lara: 'configurator.preset_modern', Material: 'configurator.preset_google', Nora: 'configurator.preset_classic' }\"\n * />\n * ```\n */\n@Component({\n selector: 'ef-theme-configurator',\n standalone: true,\n template: `\n <div class=\"config-panel-content\">\n <div class=\"config-panel-colors\">\n <span class=\"config-panel-label\">{{ primaryLabelKey | translate }}</span>\n <div>\n @for (primaryColor of primaryColors(); track primaryColor.name) {\n <button\n type=\"button\"\n [title]=\"primaryColor.name\"\n (click)=\"updateColors($event, 'primary', primaryColor)\"\n [ngClass]=\"{ 'active-color': primaryColor.name === selectedPrimaryColor() }\"\n [style]=\"{\n 'background-color': primaryColor.name === 'noir' ? 'var(--text-color)' : primaryColor?.palette['500']\n }\"\n ></button>\n }\n </div>\n </div>\n\n <div class=\"config-panel-colors\">\n <span class=\"config-panel-label\">{{ surfaceLabelKey | translate }}</span>\n <div>\n @for (surface of surfaces; track surface.name) {\n <button\n type=\"button\"\n [title]=\"surface.name\"\n (click)=\"updateColors($event, 'surface', surface)\"\n [ngClass]=\"{ 'active-color': selectedSurfaceColor() ? selectedSurfaceColor() === surface.name : configService.appState().darkTheme ? surface.name === 'zinc' : surface.name === 'slate' }\"\n [style]=\"{\n 'background-color': surface.name === 'noir' ? 'var(--text-color)' : surface?.palette['500']\n }\"\n ></button>\n }\n </div>\n </div>\n\n <div class=\"config-panel-settings\">\n <span class=\"config-panel-label\">{{ presetLabelKey | translate }}</span>\n <p-selectbutton\n [options]=\"presetsOptions\"\n [ngModel]=\"selectedPreset()\"\n (ngModelChange)=\"onPresetChange($event)\"\n [allowEmpty]=\"false\"\n size=\"small\"\n >\n <ng-template #item let-item>\n {{ (presetsDisplayNameKeys[item] || item) | translate }}\n </ng-template>\n </p-selectbutton>\n </div>\n\n <div class=\"flex\">\n <div class=\"flex-1\">\n <div class=\"config-panel-settings\">\n <span class=\"config-panel-label\">{{ rippleLabelKey | translate }}</span>\n <p-toggleswitch [(ngModel)]=\"ripple\" />\n </div>\n </div>\n <div class=\"flex-1\">\n <div class=\"config-panel-settings items-end\">\n <span class=\"config-panel-label\">{{ rtlLabelKey | translate }}</span>\n <p-toggleswitch [ngModel]=\"isRTL\" (ngModelChange)=\"onRTLChange($event)\" />\n </div>\n </div>\n </div>\n </div>\n `,\n host: {},\n imports: [\n CommonModule,\n FormsModule,\n TranslateModule,\n SelectButton,\n ToggleSwitchModule,\n ],\n})\nexport class EfThemeConfiguratorComponent implements OnInit {\n @Input() primaryLabelKey = 'configurator.primary_color';\n @Input() surfaceLabelKey = 'configurator.surface';\n @Input() presetLabelKey = 'configurator.preset';\n @Input() rippleLabelKey = 'configurator.ripple';\n @Input() rtlLabelKey = 'configurator.rtl';\n @Input() presetsDisplayNameKeys: Record<string, string> = {\n Aura: 'configurator.preset_compact',\n Lara: 'configurator.preset_modern',\n Material: 'configurator.preset_google',\n Nora: 'configurator.preset_classic',\n };\n\n get ripple() {\n return this.config.ripple();\n }\n\n set ripple(value: boolean) {\n this.config.ripple.set(value);\n }\n\n get isRTL() {\n return this.configService.appState().RTL;\n }\n\n config: PrimeNG = inject(PrimeNG);\n configService: EfThemeConfigService = inject(EfThemeConfigService);\n platformId = inject(PLATFORM_ID);\n\n presetsOptions = Object.keys(PRESETS);\n\n onRTLChange(value: boolean) {\n this.configService.appState.update((state) => ({ ...state, RTL: value }));\n }\n\n ngOnInit() {\n this.onPresetChange(this.configService.appState().preset);\n }\n\n surfaces = [\n { name: 'slate', palette: { 0: '#ffffff', 50: '#f8fafc', 100: '#f1f5f9', 200: '#e2e8f0', 300: '#cbd5e1', 400: '#94a3b8', 500: '#64748b', 600: '#475569', 700: '#334155', 800: '#1e293b', 900: '#0f172a', 950: '#020617' } },\n { name: 'gray', palette: { 0: '#ffffff', 50: '#f9fafb', 100: '#f3f4f6', 200: '#e5e7eb', 300: '#d1d5db', 400: '#9ca3af', 500: '#6b7280', 600: '#4b5563', 700: '#374151', 800: '#1f2937', 900: '#111827', 950: '#030712' } },\n { name: 'zinc', palette: { 0: '#ffffff', 50: '#fafafa', 100: '#f4f4f5', 200: '#e4e4e7', 300: '#d4d4d8', 400: '#a1a1aa', 500: '#71717a', 600: '#52525b', 700: '#3f3f46', 800: '#27272a', 900: '#18181b', 950: '#09090b' } },\n { name: 'neutral', palette: { 0: '#ffffff', 50: '#fafafa', 100: '#f5f5f5', 200: '#e5e5e5', 300: '#d4d4d4', 400: '#a3a3a3', 500: '#737373', 600: '#525252', 700: '#404040', 800: '#262626', 900: '#171717', 950: '#0a0a0a' } },\n { name: 'stone', palette: { 0: '#ffffff', 50: '#fafaf9', 100: '#f5f5f4', 200: '#e7e5e4', 300: '#d6d3d1', 400: '#a8a29e', 500: '#78716c', 600: '#57534e', 700: '#44403c', 800: '#292524', 900: '#1c1917', 950: '#0c0a09' } },\n { name: 'soho', palette: { 0: '#ffffff', 50: '#ececec', 100: '#dedfdf', 200: '#c4c4c6', 300: '#adaeb0', 400: '#97979b', 500: '#7f8084', 600: '#6a6b70', 700: '#55565b', 800: '#3f4046', 900: '#2c2c34', 950: '#16161d' } },\n { name: 'viva', palette: { 0: '#ffffff', 50: '#f3f3f3', 100: '#e7e7e8', 200: '#cfd0d0', 300: '#b7b8b9', 400: '#9fa1a1', 500: '#87898a', 600: '#6e7173', 700: '#565a5b', 800: '#3e4244', 900: '#262b2c', 950: '#0e1315' } },\n { name: 'ocean', palette: { 0: '#ffffff', 50: '#fbfcfc', 100: '#F7F9F8', 200: '#EFF3F2', 300: '#DADEDD', 400: '#B1B7B6', 500: '#828787', 600: '#5F7274', 700: '#415B61', 800: '#29444E', 900: '#183240', 950: '#0c1920' } },\n ];\n\n selectedPrimaryColor = computed(() => this.configService.appState().primary);\n selectedSurfaceColor = computed(() => this.configService.appState().surface);\n selectedPreset = computed(() => this.configService.appState().preset);\n\n primaryColors = computed(() => {\n const presetPalette = (PRESETS[this.configService.appState().preset ?? ''] as Record<string, Record<string, unknown>> | undefined)?.primitive;\n const colors = ['emerald', 'green', 'lime', 'orange', 'amber', 'yellow', 'teal', 'cyan', 'sky', 'blue', 'indigo', 'violet', 'purple', 'fuchsia', 'pink', 'rose'];\n const palettes: { name: string; palette: Record<string, string> }[] = [{ name: 'noir', palette: {} }];\n\n colors.forEach((color) => {\n if (presetPalette?.[color]) {\n palettes.push({ name: color, palette: presetPalette[color] as Record<string, string> });\n }\n });\n\n return palettes;\n });\n\n getPresetExt(): Record<string, unknown> {\n const color = this.primaryColors().find((c) => c.name === this.selectedPrimaryColor());\n\n if (color?.name === 'noir') {\n return {\n semantic: {\n primary: {\n 50: '{surface.50}', 100: '{surface.100}', 200: '{surface.200}', 300: '{surface.300}',\n 400: '{surface.400}', 500: '{surface.500}', 600: '{surface.600}', 700: '{surface.700}',\n 800: '{surface.800}', 900: '{surface.900}', 950: '{surface.950}',\n },\n colorScheme: {\n light: {\n primary: { color: '{primary.950}', contrastColor: '#ffffff', hoverColor: '{primary.800}', activeColor: '{primary.700}' },\n highlight: { background: '{primary.950}', focusBackground: '{primary.700}', color: '#ffffff', focusColor: '#ffffff' },\n },\n dark: {\n primary: { color: '{primary.50}', contrastColor: '{primary.950}', hoverColor: '{primary.200}', activeColor: '{primary.300}' },\n highlight: { background: '{primary.50}', focusBackground: '{primary.300}', color: '{primary.950}', focusColor: '{primary.950}' },\n },\n },\n },\n };\n }\n\n const preset = this.configService.appState().preset;\n if (preset === 'Nora') {\n return {\n semantic: {\n primary: color?.palette,\n colorScheme: {\n light: {\n primary: { color: '{primary.600}', contrastColor: '#ffffff', hoverColor: '{primary.700}', activeColor: '{primary.800}' },\n highlight: { background: '{primary.600}', focusBackground: '{primary.700}', color: '#ffffff', focusColor: '#ffffff' },\n },\n dark: {\n primary: { color: '{primary.500}', contrastColor: '{surface.900}', hoverColor: '{primary.400}', activeColor: '{primary.300}' },\n highlight: { background: '{primary.500}', focusBackground: '{primary.400}', color: '{surface.900}', focusColor: '{surface.900}' },\n },\n },\n },\n };\n } else if (preset === 'Material') {\n return {\n semantic: {\n primary: color?.palette,\n colorScheme: {\n light: {\n primary: { color: '{primary.500}', contrastColor: '#ffffff', hoverColor: '{primary.400}', activeColor: '{primary.300}' },\n highlight: { background: 'color-mix(in srgb, {primary.color}, transparent 88%)', focusBackground: 'color-mix(in srgb, {primary.color}, transparent 76%)', color: '{primary.700}', focusColor: '{primary.800}' },\n },\n dark: {\n primary: { color: '{primary.400}', contrastColor: '{surface.900}', hoverColor: '{primary.300}', activeColor: '{primary.200}' },\n highlight: { background: 'color-mix(in srgb, {primary.400}, transparent 84%)', focusBackground: 'color-mix(in srgb, {primary.400}, transparent 76%)', color: 'rgba(255,255,255,.87)', focusColor: 'rgba(255,255,255,.87)' },\n },\n },\n },\n };\n }\n\n return {\n semantic: {\n primary: color?.palette,\n colorScheme: {\n light: {\n primary: { color: '{primary.500}', contrastColor: '#ffffff', hoverColor: '{primary.600}', activeColor: '{primary.700}' },\n highlight: { background: '{primary.50}', focusBackground: '{primary.100}', color: '{primary.700}', focusColor: '{primary.800}' },\n },\n dark: {\n primary: { color: '{primary.400}', contrastColor: '{surface.900}', hoverColor: '{primary.300}', activeColor: '{primary.200}' },\n highlight: { background: 'color-mix(in srgb, {primary.400}, transparent 84%)', focusBackground: 'color-mix(in srgb, {primary.400}, transparent 76%)', color: 'rgba(255,255,255,.87)', focusColor: 'rgba(255,255,255,.87)' },\n },\n },\n },\n };\n }\n\n updateColors(event: Event, type: string, color: { name: string; palette: Record<string, string> }) {\n if (type === 'primary') {\n this.configService.appState.update((state) => ({ ...state, primary: color.name }));\n } else if (type === 'surface') {\n this.configService.appState.update((state) => ({ ...state, surface: color.name }));\n }\n this.applyTheme(type, color);\n event.stopPropagation();\n }\n\n applyTheme(type: string, color: { name: string; palette: Record<string, string> }) {\n if (type === 'primary') {\n updatePreset(this.getPresetExt());\n } else if (type === 'surface') {\n updateSurfacePalette(color.palette);\n }\n }\n\n onPresetChange(event: string) {\n this.configService.appState.update((state) => ({ ...state, preset: event }));\n const preset = PRESETS[event];\n const surfacePalette = this.surfaces.find((s) => s.name === this.selectedSurfaceColor())?.palette;\n\n if (this.configService.appState().preset === 'Material') {\n document.body.classList.add('material');\n this.config.ripple.set(true);\n } else {\n document.body.classList.remove('material');\n this.config.ripple.set(false);\n }\n\n $t()\n .preset(preset)\n .preset(this.getPresetExt())\n .surfacePalette(surfacePalette)\n .use({ useDefaultOptions: true });\n\n // Lara gets fully rounded (pill-shaped) components; others use default preset radius\n updatePreset({\n primitive: {\n borderRadius: event === 'Lara'\n ? { none: '0', xs: '6px', sm: '12px', md: '16px', lg: '20px', xl: '28px' }\n : { none: '0', xs: '2px', sm: '4px', md: '6px', lg: '8px', xl: '12px' },\n },\n });\n }\n}\n","import { Component, computed, input, output } from '@angular/core';\nimport { CommonModule, DecimalPipe, DatePipe } from '@angular/common';\nimport { CardModule } from 'primeng/card';\nimport { TableModule } from 'primeng/table';\nimport { TagModule } from 'primeng/tag';\nimport { ButtonModule } from 'primeng/button';\nimport { SelectButtonModule } from 'primeng/selectbutton';\nimport { FormsModule } from '@angular/forms';\nimport type { EmailMetrics, EmailEventRecord, EmailEventKind } from '@elasticias/types';\n\ntype RangeKey = '7d' | '30d' | '90d';\n\n/**\n * Manager dashboard widget: email engagement KPIs, category breakdown, recent events.\n * Keep this presentational — host app fetches metrics + supplies `rangeChange` callback.\n *\n * @example\n * <ef-email-metrics-card\n * [metrics]=\"metrics()\"\n * [recentEvents]=\"events()\"\n * [loading]=\"loading()\"\n * (rangeChange)=\"reload($event)\"\n * />\n */\n@Component({\n selector: 'ef-email-metrics-card',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n CardModule,\n TableModule,\n TagModule,\n ButtonModule,\n SelectButtonModule,\n DecimalPipe,\n DatePipe,\n ],\n templateUrl: './ef-email-metrics-card.component.html',\n styleUrl: './ef-email-metrics-card.component.scss',\n})\nexport class EfEmailMetricsCardComponent {\n metrics = input<EmailMetrics | null>(null);\n recentEvents = input<EmailEventRecord[]>([]);\n loading = input<boolean>(false);\n title = input<string>('Email engagement');\n\n selectedRange: RangeKey = '7d';\n rangeOptions = [\n { label: '7 j', value: '7d' },\n { label: '30 j', value: '30d' },\n { label: '90 j', value: '90d' },\n ];\n\n hasData = computed(() => (this.metrics()?.sent ?? 0) > 0);\n\n kpis = computed(() => {\n const m = this.metrics();\n if (!m) return [];\n return [\n { label: 'Envoyés', value: m.sent, tone: 'neutral' as const },\n { label: 'Taux d’ouverture', value: m.openRate, rate: true, tone: this.rateTone(m.openRate, 0.2, 0.35) },\n { label: 'Taux de clic', value: m.clickRate, rate: true, tone: this.rateTone(m.clickRate, 0.02, 0.05) },\n { label: 'Taux de rebond', value: m.bounceRate, rate: true, tone: this.rateTone(m.bounceRate, 0.05, 0.02, true) },\n ];\n });\n\n onRangeChange(value: RangeKey) {\n this.selectedRange = value;\n this.rangeChange.emit(value);\n }\n\n readonly rangeChange = output<RangeKey>();\n\n kindSeverity(kind: EmailEventKind): 'success' | 'info' | 'warn' | 'danger' | 'secondary' {\n switch (kind) {\n case 'Open': return 'success';\n case 'Click': return 'info';\n case 'SoftBounce': return 'warn';\n case 'HardBounce':\n case 'Spam': return 'danger';\n default: return 'secondary';\n }\n }\n\n private rateTone(rate: number, warnThreshold: number, goodThreshold: number, lowerIsBetter = false): 'good' | 'warn' | 'neutral' {\n if (lowerIsBetter) {\n if (rate > warnThreshold) return 'warn';\n if (rate < goodThreshold) return 'good';\n return 'neutral';\n }\n if (rate >= goodThreshold) return 'good';\n if (rate >= warnThreshold) return 'neutral';\n return 'warn';\n }\n}\n","<p-card styleClass=\"ef-email-metrics-card\">\n <ng-template pTemplate=\"header\">\n <div class=\"ef-email-metrics-card__header\">\n <div>\n <h3 class=\"ef-email-metrics-card__title\">{{ title() }}</h3>\n @if (metrics(); as m) {\n <p class=\"ef-email-metrics-card__subtitle\">\n {{ m.from | date: 'dd MMM' }} – {{ m.to | date: 'dd MMM yyyy' }}\n </p>\n }\n </div>\n <p-selectButton\n [options]=\"rangeOptions\"\n [(ngModel)]=\"selectedRange\"\n optionLabel=\"label\"\n optionValue=\"value\"\n styleClass=\"ef-email-metrics-card__range\"\n (onChange)=\"onRangeChange($event.value)\"\n />\n </div>\n </ng-template>\n\n @if (metrics(); as m) {\n <div class=\"ef-email-metrics-card__kpis\">\n @for (kpi of kpis(); track kpi.label) {\n <div class=\"ef-email-metrics-card__kpi\" [attr.data-tone]=\"kpi.tone\">\n <span class=\"ef-email-metrics-card__kpi-label\">{{ kpi.label }}</span>\n <span class=\"ef-email-metrics-card__kpi-value\">\n @if (kpi.rate) {\n {{ kpi.value | number: '1.1-1' : 'fr' }}\n <span class=\"ef-email-metrics-card__kpi-unit\">%</span>\n } @else {\n {{ kpi.value | number: '1.0-0' : 'fr' }}\n }\n </span>\n </div>\n }\n </div>\n\n @if (m.categories.length > 0) {\n <div class=\"ef-email-metrics-card__section\">\n <h4 class=\"ef-email-metrics-card__section-title\">Par catégorie</h4>\n <p-table [value]=\"m.categories\" styleClass=\"ef-email-metrics-card__table\" [scrollable]=\"true\" scrollHeight=\"180px\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th>Catégorie</th>\n <th class=\"ef-email-metrics-card__num\">Envoyés</th>\n <th class=\"ef-email-metrics-card__num\">Ouverts</th>\n <th class=\"ef-email-metrics-card__num\">Cliqués</th>\n <th class=\"ef-email-metrics-card__num\">Rebonds</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-row>\n <tr>\n <td class=\"ef-email-metrics-card__category\">{{ row.category }}</td>\n <td class=\"ef-email-metrics-card__num\">{{ row.sent }}</td>\n <td class=\"ef-email-metrics-card__num\">{{ row.opened }}</td>\n <td class=\"ef-email-metrics-card__num\">{{ row.clicked }}</td>\n <td class=\"ef-email-metrics-card__num\" [class.ef-email-metrics-card__num--danger]=\"row.bounced > 0\">{{ row.bounced }}</td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n }\n\n @if (recentEvents().length > 0) {\n <div class=\"ef-email-metrics-card__section\">\n <h4 class=\"ef-email-metrics-card__section-title\">Événements récents</h4>\n <p-table [value]=\"recentEvents()\" styleClass=\"ef-email-metrics-card__table\" [scrollable]=\"true\" scrollHeight=\"240px\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th>Quand</th>\n <th>Destinataire</th>\n <th>Catégorie</th>\n <th>Type</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-row>\n <tr>\n <td class=\"ef-email-metrics-card__when\">{{ row.occurredAt | date: 'dd/MM HH:mm' }}</td>\n <td class=\"ef-email-metrics-card__recipient\">{{ row.recipient }}</td>\n <td>{{ row.category || '—' }}</td>\n <td>\n <p-tag [severity]=\"kindSeverity(row.kind)\" [value]=\"row.kind\" styleClass=\"ef-email-metrics-card__kind\" />\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n }\n } @else {\n <div class=\"ef-email-metrics-card__empty\">\n <p-button label=\"Aucune donnée encore\" [text]=\"true\" icon=\"pi pi-envelope\" [disabled]=\"true\" />\n </div>\n }\n</p-card>\n","// Pipes\nexport { EfCurrencyPipe } from './lib/pipes/ef-currency.pipe';\nexport { TruncatePipe } from './lib/pipes/truncate.pipe';\nexport { EfCompactPipe } from './lib/pipes/ef-compact.pipe';\n\n// Commerce\nexport { EfPriceDisplayComponent } from './lib/commerce/ef-price-display.component';\nexport { EfQuantitySelectorComponent } from './lib/commerce/ef-quantity-selector.component';\nexport { EfOrderBuilderComponent } from './lib/commerce/ef-order-builder/ef-order-builder.component';\nexport * from './lib/commerce/ef-order-builder/ef-order-builder.component.types';\nexport { EfProductTypeaheadComponent } from './lib/commerce/ef-product-typeahead/ef-product-typeahead.component';\nexport * from './lib/commerce/ef-product-typeahead/ef-product-typeahead.component.types';\nexport { EfOrderSummaryComponent } from './lib/commerce/ef-order-summary/ef-order-summary.component';\nexport type { ProductCountGroup, ProductCountGroupLabel, ProductWithCountGroup } from './lib/commerce/ef-order-summary/ef-order-summary.component';\nexport { EfProductCatalogueFilterComponent } from './lib/commerce/ef-product-catalogue-filter/ef-product-catalogue-filter.component';\nexport type { CategoryItem, CategoryGroup, CategoryAssignment, SelectedFilter } from './lib/commerce/ef-product-catalogue-filter/ef-product-catalogue-filter.component';\nexport { EfProductCatalogueComponent } from './lib/commerce/ef-product-catalogue/ef-product-catalogue.component';\nexport type { CatalogueProduct, CatalogueProductVariant } from './lib/commerce/ef-product-catalogue/ef-product-catalogue.component';\n\n// Layout components\nexport { EfDialogComponent } from './lib/layout/ef-dialog/ef-dialog.component';\nexport { EfConfirmDialogComponent } from './lib/layout/ef-confirm-dialog/ef-confirm-dialog.component';\nexport { EfThemeToggleComponent } from './lib/layout/ef-theme-toggle/ef-theme-toggle.component';\nexport { EfBuildStampComponent } from './lib/layout/ef-build-stamp/ef-build-stamp.component';\nexport { EfTooltipDirective } from './lib/overlays/ef-tooltip.directive';\nexport type {\n EfDialogAction,\n EfDialogSeverity,\n EfDialogSize,\n} from './lib/layout/ef-dialog/ef-dialog.component';\nexport { EfFieldsetComponent } from './lib/layout/ef-fieldset/ef-fieldset.component';\nexport { EfButtonComponent } from './lib/layout/ef-button/ef-button.component';\nexport type {\n EfButtonSeverity,\n EfButtonPrimeNGSeverity,\n EfButtonComptoirSeverity,\n} from './lib/layout/ef-button/ef-button.component';\nexport { EfButtonGroupComponent } from './lib/layout/ef-button-group/ef-button-group.component';\nexport { EfLabelComponent } from './lib/layout/ef-label/ef-label.component';\nexport { EfBadgeComponent } from './lib/layout/ef-badge/ef-badge.component';\nexport * from './lib/layout/ef-badge/ef-badge.component.types';\nexport { EfToolbarComponent } from './lib/layout/ef-toolbar/ef-toolbar.component';\n\n// Comptoir shell components (Phase 2)\nexport { EfAppShellComponent } from './lib/layout/ef-app-shell/ef-app-shell.component';\nexport { EfAppShellMobileComponent } from './lib/layout/ef-app-shell-mobile/ef-app-shell-mobile.component';\nexport { EfAppMainComponent } from './lib/layout/ef-app-main/ef-app-main.component';\nexport { EfAppTopComponent } from './lib/layout/ef-app-top/ef-app-top.component';\nexport { EfModuleRailComponent } from './lib/layout/ef-module-rail/ef-module-rail.component';\nexport { EfModuleSideComponent } from './lib/layout/ef-module-side/ef-module-side.component';\nexport { EfBottomSheetComponent } from './lib/layout/ef-bottom-sheet/ef-bottom-sheet.component';\nexport { EfFabComponent } from './lib/layout/ef-fab/ef-fab.component';\nexport type { EfFabPosition } from './lib/layout/ef-fab/ef-fab.component';\nexport { EfPillGroupComponent } from './lib/layout/ef-pill-group/ef-pill-group.component';\nexport type { EfPillItem } from './lib/layout/ef-pill-group/ef-pill-group.component';\nexport { EfTabsComponent } from './lib/layout/ef-tabs/ef-tabs.component';\nexport type {\n EfTabItem,\n EfTabsVariant,\n EfTabsModule,\n} from './lib/layout/ef-tabs/ef-tabs.component';\nexport { EfTabPanelDirective } from './lib/layout/ef-tabs/ef-tab-panel.directive';\nexport { EfProfileChipComponent } from './lib/layout/ef-profile-chip/ef-profile-chip.component';\n\n// Feedback components\nexport { EfBlockUiComponent } from './lib/feedback/ef-block-ui/ef-block-ui.component';\nexport { EfBlockableDivComponent } from './lib/feedback/ef-blockable-div/ef-blockable-div.component';\nexport { EfPulseComponent } from './lib/feedback/ef-pulse/ef-pulse.component';\nexport { EfPdfPreviewComponent } from './lib/feedback/ef-pdf-preview/ef-pdf-preview.component';\nexport { EfStatusChipComponent } from './lib/feedback/ef-status-chip/ef-status-chip.component';\nexport type { EfStatusColor, EfStatusReferenceItem } from './lib/feedback/ef-status-chip/ef-status-chip.types';\nexport {\n EF_STATUS_COLORS,\n EF_STATUS_COLOR_ALIASES,\n resolveEfStatusColor,\n} from './lib/feedback/ef-status-chip/ef-status-chip.types';\nexport { EfToastRegionComponent } from './lib/feedback/ef-toast-region/ef-toast-region.component';\nexport type { EfToastRegionPosition } from './lib/feedback/ef-toast-region/ef-toast-region.component';\nexport { EfSkeletonComponent } from './lib/feedback/ef-skeleton/ef-skeleton.component';\nexport type { EfSkeletonVariant } from './lib/feedback/ef-skeleton/ef-skeleton.component';\n\n// Phase 7 — detail-screen primitives\nexport { EfCardComponent } from './lib/layout/ef-card/ef-card.component';\nexport { EfFormGridComponent } from './lib/layout/ef-form-grid/ef-form-grid.component';\nexport { EfDetailToolbarComponent } from './lib/layout/ef-detail-toolbar/ef-detail-toolbar.component';\nexport type { EfDetailToolbarAction } from './lib/layout/ef-detail-toolbar/ef-detail-toolbar.types';\nexport { EfSearchToolbarComponent } from './lib/layout/ef-search-toolbar/ef-search-toolbar.component';\nexport type { EfSearchToolbarAction } from './lib/layout/ef-search-toolbar/ef-search-toolbar.types';\nexport { EfTotalsComponent } from './lib/data/ef-totals/ef-totals.component';\nexport type { EfTotalsRow, EfTotalsGrand } from './lib/data/ef-totals/ef-totals.types';\nexport { EfStatsComponent } from './lib/data/ef-stats/ef-stats.component';\nexport type { EfStatsRow } from './lib/data/ef-stats/ef-stats.types';\nexport { EfTimelineComponent } from './lib/data/ef-timeline/ef-timeline.component';\nexport type { EfTimelineItem, EfTimelineState } from './lib/data/ef-timeline/ef-timeline.types';\nexport { EfChangeHistoryComponent } from './lib/data/ef-change-history/ef-change-history.component';\nexport type { EfChangeHistoryEntry, EfChangeHistoryFieldChange } from './lib/data/ef-change-history/ef-change-history.types';\nexport { EfKpiCardComponent } from './lib/data/ef-kpi-card/ef-kpi-card.component';\nexport type { EfKpiSparkline, EfKpiDeltaTone } from './lib/data/ef-kpi-card/ef-kpi-card.types';\nexport { EfChartComponent } from './lib/data/ef-chart/ef-chart.component';\nexport { buildChartConfig, EF_CHART_PALETTE } from './lib/data/ef-chart/ef-chart.config';\nexport type { EfChartSeries, EfChartType } from './lib/data/ef-chart/ef-chart.config';\nexport { EfRankListComponent } from './lib/data/ef-rank-list/ef-rank-list.component';\nexport type { EfRankRow } from './lib/data/ef-rank-list/ef-rank-list.component';\n\n// Forms\nexport * from './lib/forms';\n\n// Data components\nexport { EfDatatableComponent } from './lib/data/ef-datatable/ef-datatable.component';\nexport type { DatatableSearchEntity } from './lib/data/ef-datatable/ef-datatable.component';\nexport * from './lib/data/ef-datatable/ef-datatable.component.types';\nexport { EfDatatableActionBarComponent } from './lib/data/ef-datatable-actionbar/ef-datatable-actionbar.component';\n\n// Comptoir data primitives (Phase 6)\nexport { EfDataCardComponent } from './lib/data/ef-data-card/ef-data-card.component';\nexport { EF_DATA_CARD_MOBILE_LAYOUT } from './lib/data/ef-data-card/ef-data-card.mobile';\nexport type { EfDataCardMobileLayout } from './lib/data/ef-data-card/ef-data-card.mobile';\nexport type { EfDataCardRowAction } from './lib/data/ef-data-card/ef-data-card.component';\nexport {\n EfColumnTemplateDirective,\n EfColumnHeaderTemplateDirective,\n} from './lib/data/ef-data-card/ef-column-template.directive';\nexport type {\n EfDataCardColumn,\n EfDataCardColumnType,\n EfDataCardColumnMobileRole,\n EfDataCardColumnAlign,\n EfDataCardSort,\n EfDataCardSortDirection,\n} from './lib/data/ef-data-card/ef-data-card.types';\nexport { EfRowActionsComponent } from './lib/data/ef-row-actions/ef-row-actions.component';\nexport type { EfRowAction } from './lib/data/ef-row-actions/ef-row-actions.types';\nexport { EfPagerComponent } from './lib/data/ef-pager/ef-pager.component';\nexport { EfBulkBarComponent } from './lib/data/ef-bulk-bar/ef-bulk-bar.component';\nexport { EfEmptyStateComponent } from './lib/feedback/ef-empty-state/ef-empty-state.component';\nexport { EfSmartBarComponent } from './lib/data/ef-smart-bar/ef-smart-bar.component';\nexport { EfFilterPillComponent } from './lib/forms/ef-filter-pill/ef-filter-pill.component';\nexport { EfServerErrorsDirective } from './lib/forms/ef-server-errors.directive';\nexport { EfClearButtonComponent } from './lib/forms/ef-clear-button/ef-clear-button.component';\nexport { EfInputTextComponent } from './lib/forms/ef-input-text/ef-input-text.component';\nexport { EfPasswordComponent } from './lib/forms/ef-password/ef-password.component';\nexport { EfCheckboxComponent } from './lib/forms/ef-checkbox/ef-checkbox.component';\nexport { EfTextareaComponent } from './lib/forms/ef-textarea/ef-textarea.component';\nexport { EfSelectComponent } from './lib/forms/ef-select/ef-select.component';\nexport { EfPresetPillComponent } from './lib/forms/ef-preset-pill/ef-preset-pill.component';\nexport type { EfPresetItem } from './lib/forms/ef-preset-pill/ef-preset-pill.component';\nexport {\n EfDatepickerAdvancedComponent,\n type EfDateFieldValue,\n} from './lib/forms/ef-datepicker-advanced/ef-datepicker-advanced.component';\nexport type {\n EfDatePreset,\n EfDatePresetKey,\n EfDateRange,\n} from './lib/forms/ef-datepicker-advanced/ef-datepicker-advanced.types';\nexport { EfFilterDrawerComponent } from './lib/forms/ef-filter-drawer/ef-filter-drawer.component';\nexport { EfActivationFilterComponent } from './lib/forms/ef-activation-filter/ef-activation-filter.component';\n\n// Theme\nexport { EfThemeConfiguratorComponent } from './lib/ef-theme-configurator/ef-theme-configurator.component';\n\n// Analytics\nexport { EfEmailMetricsCardComponent } from './lib/analytics/ef-email-metrics-card/ef-email-metrics-card.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i3","i4","i5","i2","i6","i7","i8","i9","i10","Tooltip"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA;;;;AAIG;MAEU,cAAc,CAAA;IACzB,SAAS,CAAC,KAAgC,EAAE,QAAQ,GAAG,KAAK,EAAE,MAAM,GAAG,OAAO,EAAA;QAC5E,IAAI,KAAK,IAAI,IAAI;AAAE,YAAA,OAAO,EAAE;AAC5B,QAAA,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AACnC,YAAA,KAAK,EAAE,UAAU;YACjB,QAAQ;AACR,YAAA,qBAAqB,EAAE,CAAC;AACxB,YAAA,qBAAqB,EAAE,CAAC;AACzB,SAAA,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAClB;wGATW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA;;4FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE;;;MCJjC,YAAY,CAAA;IACvB,SAAS,CAAC,KAAa,EAAE,SAAS,GAAG,EAAE,EAAE,MAAM,GAAG,KAAK,EAAA;AACrD,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;QACrB,OAAO,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,MAAM,GAAG,KAAK;IAC9E;wGAJW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE;;;ACC5C;;;AAGG;MAEU,aAAa,CAAA;AACxB,IAAA,SAAS,CAAC,KAAgC,EAAE,WAAW,GAAG,CAAC,EAAA;QACzD,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,GAAG,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC;IACjG;wGAHW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA;;4FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,IAAI;mBAAC,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;;;MCE5C,uBAAuB,CAAA;AACzB,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAU;wGAD/B,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAFxB,CAAA,4DAAA,CAA8D,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAD9D,cAAc,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,CAAA;;4FAGb,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBANnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,cAAc,CAAC;AACzB,oBAAA,QAAQ,EAAE,CAAA,4DAAA,CAA8D;AACzE,iBAAA;;;MCoBY,2BAA2B,CAAA;AAC7B,IAAA,QAAQ,GAAG,KAAK,CAAC,CAAC,+EAAC;IACnB,cAAc,GAAG,MAAM,EAAU;IAE1C,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC/C;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC/C;IACF;wGAZW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArB5B;;;;;;;;;;;;;;;;;;;AAmBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EApBS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAsBX,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAzBvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,YAAY,CAAC;AACvB,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;AAmBT,EAAA,CAAA;AACF,iBAAA;;;AC4FD;;AAEG;MACU,mBAAmB,CAAA;AAC9B;;AAEG;IACH,OAAO,iBAAiB,CAAC,IAAmB,EAAA;QAC1C,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,QAAQ;AACtD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC;QACnC,OAAO,QAAQ,GAAG,CAAC,QAAQ,GAAG,QAAQ,IAAI,GAAG;IAC/C;AAEA;;AAEG;IACH,OAAO,kBAAkB,CAAC,IAAmB,EAAA;QAC3C,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAC7C,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG;IACxC;AAEA;;AAEG;IACH,OAAO,oBAAoB,CAAC,IAAmB,EAAA;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;QAC/C,OAAO,QAAQ,GAAG,SAAS;IAC7B;AAEA;;;;;;AAMG;AACH,IAAA,OAAO,kBAAkB,CACvB,OAAmD,EACnD,OAAiC,EAAA;AAEjC,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,EAAE;AACvB,QAAA,MAAM,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAW;AACxE,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;AACpB,QAAA,MAAM,KAAK,GAAG,OAAO,GAAG,OAAO,CAAuB;QACtD,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACpC,YAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,KAAK,GAAG;QAC7B;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;AACH,IAAA,OAAO,eAAe,GAAA;QACpB,OAAO;AACL,YAAA,EAAE,EAAE,SAAS,CAAC,UAAU,EAAE;AAC1B,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,gBAAgB,EAAE,CAAC;AACnB,YAAA,QAAQ,EAAE,CAAC;AACX,YAAA,QAAQ,EAAE,CAAC;AACX,YAAA,WAAW,EAAE,CAAC;AACd,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,YAAY,EAAE,IAAI;SACnB;IACH;AAEA;;;AAGG;AACH,IAAA,OAAO,iBAAiB,CAAC,OAAgC,EAAE,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,IAAI,EAAE,SAAkB,EAAA;;AAE1G,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAA+C;AAClF,QAAA,MAAM,OAAO,GAAG,SAAS,IAAI,QAAQ,EAAE;AACrC,cAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,KAAK,SAAS;cACjD,SAAS;AAEb,QAAA,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC;AACnF,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC;AACpC,QAAA,MAAM,UAAU,IAAI,OAAO,GAAG,YAAY,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAW;AAErF,QAAA,MAAM,IAAI,GAAkB;AAC1B,YAAA,EAAE,EAAE,SAAS,CAAC,UAAU,EAAE;AAC1B,YAAA,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAW;YACtC,SAAS,EAAE,SAAS,IAAI,IAAI;AAC5B,YAAA,UAAU,EAAE,UAAU;AACtB,YAAA,OAAO,EAAE,OAAO;YAChB,kBAAkB,EAAE,mBAAmB,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC;AAC5E,YAAA,gBAAgB,EAAE,SAAmB;AACrC,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,QAAQ,EAAE,CAAC;AACX,YAAA,WAAW,EAAE,CAAC;AACd,YAAA,MAAM,EAAE,CAAC;AACT,YAAA,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAkB;AACjD,YAAA,OAAO,EAAE,OAAiB;AAC1B,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,YAAY,EAAE,IAAI;SACnB;;QAGD,IAAI,CAAC,WAAW,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAC9D,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,IAAI,CAAC;QAC7D,IAAI,CAAC,MAAM,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,IAAI,CAAC;AAE5D,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;IACH,OAAO,kBAAkB,CAAC,IAAmB,EAAA;QAC3C,OAAO;AACL,YAAA,GAAG,IAAI;AACP,YAAA,WAAW,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AACzC,YAAA,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;AACxC,YAAA,MAAM,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;SACxC;IACH;AAEA;;AAEG;IACH,OAAO,QAAQ,CAAC,IAAmB,EAAA;QACjC,MAAM,MAAM,GAAgC,EAAE;QAE9C,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACpC,YAAA,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAuB,CAAC;QAC/C;QAEA,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,EAAE;AACxD,YAAA,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,yCAAyC,CAAC;QAC1E;QAEA,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE;AACxC,YAAA,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,sCAAsC,CAAC;QAC/D;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,EAAE;AAC/D,YAAA,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,oCAAoC,CAAC;QAC7D;QAEA,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;YACzC,MAAM;SACP;IACH;AAEA;;AAEG;AACH,IAAA,OAAO,QAAQ,CAAC,KAAoB,EAAE,KAAoB,EAAA;AACxD,QAAA,QACE,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;AACnC,YAAA,KAAK,CAAC,gBAAgB,KAAK,KAAK,CAAC,gBAAgB;AACjD,YAAA,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;AACjC,YAAA,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;AACjC,YAAA,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;IAEnC;AACD;AAED;;AAEG;MACU,iBAAiB,CAAA;AAC5B;;AAEG;AACH,IAAA,OAAO,WAAW,CAChB,YAAA,GAA8C,OAAO,EAAA;QAErD,OAAO;YACL,YAAY;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE;AACrB,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,aAAa,EAAE,CAAC;AAChB,YAAA,QAAQ,EAAE,CAAC;AACX,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,MAAM,EAAE,OAAO;SAChB;IACH;AAEA;;AAEG;IACH,OAAO,eAAe,CAAC,KAAkB,EAAA;AACvC,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CACxC,CAAC,KAAK,EAAE,IAAI,KACV,KAAK,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,EAC7D,CAAC,CACF;AAED,QAAA,MAAM,aAAa,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,KAAI;AAC5D,YAAA,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;AACrE,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC;YACnC,OAAO,KAAK,GAAG,CAAC,SAAS,GAAG,QAAQ,IAAI,GAAG;QAC7C,CAAC,EAAE,CAAC,CAAC;AAEL,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,KAAI;YACvD,OAAO,KAAK,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;QACtC,CAAC,EAAE,CAAC,CAAC;AAEL,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,aAAa,GAAG,QAAQ;QAExD,OAAO;AACL,YAAA,GAAG,KAAK;YACR,UAAU;YACV,aAAa;YACb,QAAQ;YACR,UAAU;SACX;IACH;AAEA;;AAEG;IACH,OAAO,QAAQ,CAAC,KAAkB,EAAA;QAChC,MAAM,MAAM,GAAgC,EAAE;QAC9C,MAAM,QAAQ,GAAgC,EAAE;;AAGhD,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACrB,YAAA,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,sBAAsB,CAAC;QACjD;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACpB,YAAA,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,qBAAqB,CAAC;QAC/C;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;AACtD,YAAA,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,gCAAgC,CAAC;QAC3D;;QAGA,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;YACvC,MAAM,cAAc,GAAG,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC;AACzD,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;AAC3B,gBAAA,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACjD,oBAAA,MAAM,CAAC,CAAA,WAAA,EAAc,KAAK,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC;AACpE,gBAAA,CAAC,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,EAAE;AACzB,YAAA,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,+BAA+B,CAAC;QAC5D;QAEA,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;YACzC,MAAM;YACN,QAAQ;SACT;IACH;AAEA;;AAEG;IACH,OAAO,KAAK,CAAC,KAAkB,EAAA;QAC7B,OAAO;AACL,YAAA,GAAG,KAAK;AACR,YAAA,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AACpC,YAAA,YAAY,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,IAAI;AACtE,YAAA,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI;AACvD,YAAA,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;SAC1D;IACH;AAEA;;AAEG;AACH,IAAA,OAAO,aAAa,CAClB,QAAqB,EACrB,OAAoB,EAAA;AAEpB,QAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU;;AAGxC,QAAA,MAAM,eAAe,GAA0B;YAC7C,YAAY;YACZ,WAAW;YACX,cAAc;YACd,SAAS;YACT,OAAO;YACP,eAAe;YACf,QAAQ;SACT;AAED,QAAA,eAAe,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;YAChC,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,EAAE;AACtC,gBAAA,cAAc,CAAC,GAAG,CAAC,KAAe,CAAC;YACrC;AACF,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE;AAC5D,YAAA,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;QAClC;aAAO;AACL,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACnD,IACE,CAAC,mBAAmB,CAAC,QAAQ,CAC3B,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EACtB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CACtB,EACD;AACA,oBAAA,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;oBAChC;gBACF;YACF;QACF;QAEA,OAAO;AACL,YAAA,UAAU,EAAE,cAAc,CAAC,IAAI,GAAG,CAAC;YACnC,YAAY,EAAE,IAAI,IAAI,EAAE;YACxB,cAAc;SACf;IACH;AACD;;ACzbD;;;;;;;;;;;;;;;;;AAiBG;MAaU,gBAAgB,CAAA;;AAElB,IAAA,KAAK;;AAEL,IAAA,QAAQ;;AAER,IAAA,GAAG;AACZ;;AAE0B;IACjB,UAAU,GAAG,YAAY;;IAEM,QAAQ,GAAG,KAAK;AAExD;;AAEkE;AAClE,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC;QAC1B,IAAI,IAAI,CAAC,UAAU;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;QAChD,IAAI,IAAI,CAAC,QAAQ;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;AAC5C,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACxB;wGAtBW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,GAAA,EAAA,KAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAYP,gBAAgB,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArB1B;;;;;AAKT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,2BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAES,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAEd,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAZ5B,SAAS;+BACE,UAAU,EAAA,UAAA,EACR,IAAI,EAAA,QAAA,EACN;;;;;GAKT,EAAA,OAAA,EAEQ,CAAC,eAAe,CAAC,EAAA,MAAA,EAAA,CAAA,2BAAA,CAAA,EAAA;;sBAIzB;;sBAEA;;sBAEA;;sBAIA;;sBAEA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;;AC3CxC;;;;;;;;;;;;;;;;;;;;;;;AAuBG;MAKU,uBAAuB,CAAA;;IAEzB,MAAM,GAAG,KAAK,CAAqC,IAAI,8EAC9D,KAAK,EAAE,gBAAgB,EAAA,CACvB;;AAGF,IAAA,SAAS,CAAC,IAA+B,EAAA;AACvC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;AACzB,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;AAC9B,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;IAC1B;wGAXW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAJnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;AAeD;;;;;;;;;AASG;SACa,qBAAqB,CACnC,QAAqC,EACrC,KAAqC,EACrC,IAA+B,EAAA;AAE/B,IAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM;AAAE,QAAA,OAAO,QAAQ;IAChD,OAAO,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI;AACvC;;ACzDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCG;MAEmB,qBAAqB,CAAA;AACvC;;;;AAI0B;AAE1B;AACoD;AAC3C,IAAA,OAAO,GAAG,KAAK,CAAS,EAAE,8EAAC;;AAG3B,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,2EAAC;AAEjC;;;AAGwC;AAChC,IAAA,OAAO,OAAO,GAAG,CAAC;AACP,IAAA,OAAO,GAAG,CAAA,QAAA,EAAW,EAAE,qBAAqB,CAAC,OAAO,EAAE;;;AAKhE,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AAElC;AACkD;AACzC,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;;AAI5B,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,kFAAC;AAC/B,IAAA,cAAc,GAAG,KAAK,CAAS,EAAE,qFAAC;;AAIlC,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,gFAAC;AAC7B,IAAA,YAAY,GAAG,KAAK,CAAS,EAAE,mFAAC;;IAIhC,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEjE;AAC2E;IAClE,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEjE;AAC2E;AAC1D,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,mFAAC;AAE7C;AACsE;AAC7D,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,iFAAC;;AAGlE,IAAA,mBAAmB,CAAC,QAAiB,EAAA;AAC3C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnC;;AAIA;;;;;AAKG;IACM,SAAS,GAAG,KAAK,CAAC,IAAI,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEjE;AACmE;AACnE,IAAA,IAAI,QAAQ,GAAA;QACR,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;IACtF;AAEA;AACyE;AACzE,IAAA,IAAc,QAAQ,GAAA;AAClB,QAAA,OAAO,KAAK;IAChB;AAEA;AACsD;IACtD,UAAU,GAAA;;IAEV;AAEA;;;;;;;;;;;;;;;;AAgBG;AACM,IAAA,MAAM,GAAG,KAAK,CAA8B,SAAS,6EAAC;;IAG9C,iBAAiB,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAExF;;;;;;AAMG;IACM,sBAAsB,GAAG,QAAQ,CAAkB,MACxD,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,wBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC5E;;AAIkB,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAE9D;AAC4C;AAC5C,IAAA,IAAI,WAAW,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO;IACxD;;AAGA,IAAA,IAAI,oBAAoB,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;YACvB,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAC/D;AACA,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;IACnC;AAEA;;;;;AAKG;AACH,IAAA,IAAI,kBAAkB,GAAA;QAClB,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,OAAO,IAAI;AAChD,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACrB,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7D;AACA,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI;IACnC;AAEA;;AAE2D;AAC3D,IAAA,IAAI,QAAQ,GAAA;AACR,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,WAAW,SAAS;IACvC;wGAhKkB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,gvDADpB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;4FACH,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAD1C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;;;ACnB7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCG;AAoBG,MAAO,iBACX,SAAQ,qBAAqB,CAAA;AAG7B;AACwD;;IAI/C,OAAO,GAAU,EAAE;IACnB,WAAW,GAAG,MAAM;AACpB,IAAA,WAAW;AACX,IAAA,cAAc;;AAEd,IAAA,OAAO;;IAGwB,KAAK,GAAG,KAAK;IAC5C,gBAAgB,GAAG,OAAO;IAC1B,mBAAmB,GAAG,OAAO;;AAItC;;AAE6D;AACpD,IAAA,IAAI;IAC2B,KAAK,GAAG,IAAI;IACZ,MAAM,GAAG,KAAK;AAC7C,IAAA,QAAQ;;;IAKuB,QAAQ,GAAG,KAAK;IAEhB,MAAM,GAAG,KAAK;AACtD;AACsC;AAC7B,IAAA,QAAQ;AACR,IAAA,iBAAiB;AACjB,IAAA,oBAAoB;;IAEW,eAAe,GAAG,IAAI;AAE9D;AAC4E;IACpC,QAAQ,GAAG,KAAK;IAChB,OAAO,GAAG,KAAK;AAEvD;AAC8C;IACN,aAAa,GAAG,KAAK;IACpD,qBAAqB,GAAG,EAAE;IAC1B,YAAY,GAAG,OAAO;AAE/B;AAC4D;IACnD,YAAY,GAAqB,MAAM;AAEhD;;AAEsC;IACE,aAAa,GAAG,KAAK;;AAIpD,IAAA,YAAY;AACZ,IAAA,eAAe;AACf,IAAA,kBAAkB;AAClB,IAAA,qBAAqB;;AAIrB,IAAA,UAAU;AACV,IAAA,eAAe;AAExB;AACiE;AACxD,IAAA,YAAY;AAErB;;;;;;;;;;;;;;;AAeG;IACM,OAAO,GAA2B,SAAS;IAEpD,IAAoC,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,SAAS,GAAG,IAAI;;IAIxC,YAAY,GAA4B,IAAI;IACpC,oBAAoB,GAA4B,IAAI;IAC3D,aAAa,GAA4B,IAAI;IAC5C,cAAc,GAA4B,IAAI;IAC9C,cAAc,GAA4B,IAAI;IAC/C,aAAa,GAA4B,IAAI;IACvC,mBAAmB,GAA4B,IAAI;IACxD,cAAc,GAA4B,IAAI;IAC9C,cAAc,GAA4B,IAAI;;AAI5D,IAAA,oBAAoB,GAAG,IAAI,YAAY,EAAO;AAC9C,IAAA,iBAAiB,GAAG,IAAI,YAAY,EAAU;AAC9C,IAAA,cAAc,GAAG,IAAI,YAAY,EAAQ;AACzC,IAAA,cAAc,GAAG,IAAI,YAAY,EAAQ;AAEnD;AAC6D;IACpD,KAAK,GAAQ,IAAI;IAC1B,eAAe,GAAU,EAAE;AAEnB,IAAA,QAAQ,GAAyB,MAAK,EAAc,CAAC;AACrD,IAAA,SAAS,GAAe,MAAK,EAAc,CAAC;;IAGpD,SAAS,GAAqB,IAAI;AACjB,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAE5C,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC;QACnD,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA;AACwD;AAExD;AAC4D;AAC5D,IAAA,IAAI,0BAA0B,GAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC7B,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC;QACjE;AACA,QAAA,OAAO,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,8BAA8B,CAAC;IAChG;AAEA,IAAA,IAAI,qBAAqB,GAAA;QACvB,IAAI,IAAI,CAAC,eAAe;YAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC;AACpF,QAAA,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,iBAAiB,CAAC;IAC9E;AAEA,IAAA,IAAI,2BAA2B,GAAA;QAC7B,IAAI,IAAI,CAAC,qBAAqB;YAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC;AAChG,QAAA,OAAO,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,wBAAwB,CAAC;IAC3F;AAEA;;AAEwC;AACxC,IAAA,IAAI,mBAAmB,GAAA;QACrB,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,QAAQ,GAAG,IAAI,EAAE,IAAI,CAAC,UAAU;aACnE,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9B;AAEA,IAAA,IAAI,wBAAwB,GAAA;AAC1B,QAAA,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IACtE;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,OAAO,CAAC;IACxD;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,IAAI,IAAI;IAClG;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI;AACtD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5D;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,EAAE;YACjD,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;AAEA,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI;IAC5B;AAEA,IAAA,gBAAgB,CAAC,EAAwB,EAAA;AACvC,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,mBAAmB,CAAC,UAAU,CAAC;IACtC;AAEA,IAAA,qBAAqB,CAAC,KAA4C,EAAA;AAChE,QAAA,MAAM,GAAG,GAAG,KAAK,EAAE,KAAK,IAAI,IAAI;AAChC,QAAA,IAAI,CAAC,KAAK,GAAG,GAAG;AAChB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAClB,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC;IACrC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI;AACtC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5C;AAEA,IAAA,YAAY,CAAC,KAAgD,EAAA;QAC3D,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;IAClD;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;IAC5B;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;QAC1B,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA;;AAE2D;AAC3D,IAAA,wBAAwB,CAAC,QAAgB,EAAA;QACvC,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,IAAI,IAAI,EAAE;YACvC,IAAI,CAAC,WAAW,EAAE;YAClB;QACF;QACA,IAAI,QAAQ,GAAQ,QAAQ;AAC5B,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;;;YAGpB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CACrC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAY,CAAC,CAAC,KAAK,QAAQ,CACrD;AACD,YAAA,IAAI,KAAK;AAAE,gBAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;QAC/C;AACA,QAAA,IAAI,CAAC,KAAK,GAAG,QAAQ;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvB,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC1C;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE;AAC9E,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAC/C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAa,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,YAAa,CAAC,GAAG,CAAC,CAAC,CACtF;QACH;aAAO;YACL,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE;QAC3C;IACF;wGA5QW,iBAAiB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAiBR,gBAAgB,CAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAUhB,gBAAgB,gCAChB,gBAAgB,CAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAMhB,gBAAgB,CAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAEhB,gBAAgB,uKAOhB,gBAAgB,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAIhB,gBAAgB,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAChB,gBAAgB,qDAIhB,gBAAgB,CAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,CAAA,eAAA,EAAA,eAAA,EAWhB,gBAAgB,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,SAAA,EArEzB,CAAC;AACV,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,iBAAiB,CAAC;AAChD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA,CAAC,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChFJ,u5SAsPA,EAAA,MAAA,EAAA,CAAA,sMAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjLI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,cAAA,EAAA,QAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,YAAA,EAAA,UAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,gBAAgB,oHAChB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAQH,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAnB7B,SAAS;+BACE,WAAW,EAAA,UAAA,EACT,IAAI,EAAA,OAAA,EAGP;wBACP,YAAY;wBACZ,iBAAiB;wBACjB,WAAW;wBACX,eAAe;wBACf,gBAAgB;wBAChB,YAAY;AACb,qBAAA,EAAA,SAAA,EACU,CAAC;AACV,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,uBAAuB,CAAC;AAChD,4BAAA,KAAK,EAAE,IAAI;yBACZ,CAAC,EAAA,QAAA,EAAA,u5SAAA,EAAA,MAAA,EAAA,CAAA,sMAAA,CAAA,EAAA;;sBAWD;;sBACA;;sBACA;;sBACA;;sBAEA;;sBAGA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBACA;;sBAOA;;sBACA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBAKA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAErC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAGrC;;sBACA;;sBACA;;sBAEA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAIrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAIrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBACA;;sBAIA;;sBAKA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAIrC;;sBACA;;sBACA;;sBACA;;sBAIA;;sBACA;;sBAIA;;sBAkBA;;sBAEA,WAAW;uBAAC,iBAAiB;;sBAC7B,WAAW;uBAAC,sBAAsB;;sBAIlC,YAAY;uBAAC,MAAM;;sBACnB,YAAY;uBAAC,cAAc;;sBAC3B,YAAY;uBAAC,OAAO;;sBACpB,YAAY;uBAAC,QAAQ;;sBACrB,YAAY;uBAAC,QAAQ;;sBACrB,YAAY;uBAAC,OAAO;;sBACpB,YAAY;uBAAC,aAAa;;sBAC1B,YAAY;uBAAC,QAAQ;;sBACrB,YAAY;uBAAC,QAAQ;;sBAIrB;;sBACA;;sBACA;;sBACA;;sBAIA;;;AErMH;;;;;;;;;;;AAWG;MAoBU,sBAAsB,CAAA;IACxB,SAAS,GAAG,OAAO;IACnB,QAAQ,GAAG,KAAK;AACf,IAAA,KAAK,GAAG,IAAI,YAAY,EAAS;wGAHhC,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAfvB;;;;;;;;;;;;;AAaT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEU,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAnBlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;AAaT,EAAA,CAAA;AACF,iBAAA;;sBAEE;;sBACA;;sBACA;;;ACFH;;;;;;;;;;;;;;;;;;;;;;AAsBG;AAUG,MAAO,6BACT,SAAQ,qBAAqB,CAAA;AAEZ,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;AAClD,IAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;AAC1B,IAAA,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC9B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAEhD;;;;;;AAMG;AACM,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEtE;AAC2E;AAEnE,IAAA,QAAQ;;AAIR,IAAA,QAAQ;;IAGR,SAAS,GAAoC,IAAI;IACjD,SAAS,GAAuB,IAAI;IACpC,aAAa,GAAwB,IAAI;AAEjD,IAAA,WAAA,GAAA;AACI,QAAA,KAAK,EAAE;;QAEP,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;;QAGvD,MAAM,CAAC,MAAK;YACR,IAAI,IAAI,CAAC,IAAI,EAAE;gBAAE,IAAI,CAAC,YAAY,EAAE;;gBAC/B,IAAI,CAAC,YAAY,EAAE;AAC5B,QAAA,CAAC,CAAC;;;AAIF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IACxD;IAEA,eAAe,GAAA;;;;;;;;;AASX,QAAA,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE;cACnB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACzC,SAAS,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IACjD;;;AAKS,IAAA,eAAe,GAAG,KAAK,CAAS,aAAa,sFAAC;;AAE9C,IAAA,YAAY,GAAG,KAAK,CAAS,EAAE,mFAAC;AAEzC;;;;;AAKG;AACM,IAAA,OAAO,GAAG,KAAK,CAA0C,SAAS,8EAAC;;AAGnE,IAAA,YAAY,GAAG,KAAK,CAA8B,SAAS,mFAAC;;AAG5D,IAAA,KAAK,GAAG,KAAK,CAA0B,SAAS,4EAAC;;AAEjD,IAAA,GAAG,GAAG,KAAK,CAA0B,SAAS,0EAAC;;;IAK/C,gBAAgB,GAAG,KAAK,CAAC,IAAI,wFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAExE;;;;;;AAMwC;;AAG/B,IAAA,IAAI,GAAG,KAAK,CAAqB,QAAQ,2EAAC;;AAG1C,IAAA,aAAa,GAAG,KAAK,CAAqB,OAAO,oFAAC;AAE3D;AAC4C;AACnC,IAAA,OAAO,GAAG,KAAK,CAAmB,OAAO,8EAAC;AAEnD;;;;;;AAMG;IACM,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEjE;;AAE2C;;;IAKlC,WAAW,GAAG,MAAM,EAAe;;IAEnC,MAAM,GAAG,MAAM,EAAQ;IACvB,MAAM,GAAG,MAAM,EAAQ;;AAIvB,IAAA,IAAI,GAAG,MAAM,CAAC,KAAK,2EAAC;AACpB,IAAA,IAAI,GAAG,MAAM,CAAuB,SAAS,2EAAC;AAEvD;;;;;AAKG;AACM,IAAA,OAAO,GAAG,MAAM,CAA8B,MAAM,8EAAC;;AAGrD,IAAA,eAAe,GAAG,MAAM,CAAS,IAAI,CAAC,iBAAiB,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,sFAAC;;AAGlF,IAAA,YAAY,GAAG,MAAM,CAAO,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAG1D,IAAA,UAAU,GAAG,MAAM,CAAc,IAAI,iFAAC;AACtC,IAAA,QAAQ,GAAG,MAAM,CAAc,IAAI,+EAAC;;AAGpC,IAAA,gBAAgB,GAAG,QAAQ,CAChC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,cAAc,uFAC9C;;AAGQ,IAAA,aAAa,GAAG,QAAQ,CAAc,MAAK;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,cAAc;AACjD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE;AAClC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE;AAC9B,QAAA,IAAI,aAAa,IAAI,WAAW,EAAE;YAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,aAAa,EAAE,WAAW,CAAC;QAC3D;AACA,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;AACvC,IAAA,CAAC,oFAAC;;AAGO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,mFAAC;;IAGvE,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAGjD,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE;QAC7B,OAAO,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM;AACnC,aAAA,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5C,IAAA,CAAC,iFAAC;IACO,SAAS,GAAG,QAAQ,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,gFAAC;;AAGhF,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,OAAO,GAAG,KAAK,CAAA,GAAA,EAAM,KAAK,GAAG,EAAE,EAAE;AACrC,IAAA,CAAC,sFAAC;;AAGO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACxB,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM;AACzC,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,KAAK,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM;iBACrD,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AACxC,YAAA,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,QAAQ,EAAE;AAChC,YAAA,KAAK,EAAE,CAAC,KAAK,KAAK,CAAC,QAAQ,EAAE,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE;AACjF,SAAA,CAAC,CAAC;AACP,IAAA,CAAC,iFAAC;;AAGO,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE;QACrD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AAC1C,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAI;AACvC,YAAA,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC;AACtB,YAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,KAAK,WAAW,EAAE,KAAK,EAAE,IAAI,KAAK,SAAS,EAAE;AAC5E,QAAA,CAAC,CAAC;AACN,IAAA,CAAC,gFAAC;AAEF;AACkE;AACzD,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AACvC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;AAC3B,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,CAAC;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;AAC9B,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC;AACrG,IAAA,CAAC,wFAAC;;AAGO,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,+EAAC;AACjE,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,6EAAC;AAEtE;;AAEyE;;AAGxD,IAAA,UAAU,GAAG,MAAM,CAAmB,IAAI,iFAAC;AAE5D;AAC+C;;AAGtC,IAAA,UAAU,GAAG,QAAQ,CAAc,MAAK;AAC7C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;AAC3B,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI;AACnB,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;AAC9C,IAAA,CAAC,iFAAC;AACO,IAAA,QAAQ,GAAG,QAAQ,CAAc,MAAK;AAC3C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;QAC3B,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,IAAI;AACtD,IAAA,CAAC,+EAAC;;AAGO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,oFAAC;;AAGzD,IAAA,YAAY,GAAG,QAAQ,CAAS,MAAK;AAC1C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;AAC3B,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,EAAE;AACjB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,kBAAkB,GAAG,YAAY;AAC/D,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;AAC5C,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,QAAQ;AAAE,YAAA,OAAO,IAAI;AAClD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE;QACzB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAA,GAAA,EAAM,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI;AACpE,IAAA,CAAC,mFAAC;AAEF;;AAEqE;AAC5D,IAAA,cAAc,GAAG,MAAM,CAA2B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,qFAAC;AACjE,IAAA,YAAY,GAAG,MAAM,CAA2B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,mFAAC;;AAG/D,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,mFAAC;AACrE,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,iFAAC;AAElE,IAAA,QAAQ,GAAsC,MAAK,EAAc,CAAC;AAClE,IAAA,SAAS,GAAe,MAAK,EAAc,CAAC;;;AAKpD,IAAA,IAAI,YAAY,GAAA;AACZ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,OAAO,CAAC;IAC1D;;AAEA,IAAA,IAAI,YAAY,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,IAAK,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAAc,IAAI,IAAI;IAClH;;AAEA,IAAA,IAAI,SAAS,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI;AACtD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9D;;AAIA,IAAA,UAAU,CAAC,KAAyD,EAAA;AAChE,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAChD;AACA,IAAA,gBAAgB,CAAC,EAAqC,EAAA;AAClD,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACtB;AACA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC5B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACvB;AACA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAChC,QAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;IACxC;AAEA;;;AAG+C;AAC/C,IAAA,IAAuB,QAAQ,GAAA;QAC3B,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE;IACpE;IAES,UAAU,GAAA;AACf,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE;IACpB;AAEA;;AAEkD;AAC1C,IAAA,WAAW,CAAC,KAAyD,EAAA;QACzE,IAAI,KAAK,IAAI,IAAI;AAAE,YAAA,OAAO,IAAI;AAC9B,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,YAAA,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,IAAI;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACjC,YAAA,OAAO,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,KAAK;QACrC;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC7B;AAEQ,IAAA,MAAM,CAAC,CAAU,EAAA;;;;QAIrB,IAAI,CAAC,IAAI,IAAI;AAAE,YAAA,OAAO,IAAI;QAC1B,IAAI,CAAC,YAAY,IAAI;AAAE,YAAA,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC;QAC3D,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AAChD,YAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;AACrB,YAAA,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC;QACxC;AACA,QAAA,OAAO,IAAI;IACf;AAEA;AAC0E;AAClE,IAAA,WAAW,CAAC,KAA0B,EAAA;AAC1C,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,KAAK,EAAE;IAChB;AAEA;AACmD;IAC3C,eAAe,CAAC,GAAS,EAAE,IAA8B,EAAA;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACjC,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACxD,QAAA,OAAO,IAAI;IACf;;AAGQ,IAAA,UAAU,CAAC,CAA2B,EAAA;AAC1C,QAAA,OAAO,CAAA,EAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;IAC5E;;AAGQ,IAAA,cAAc,CAAC,GAAW,EAAA;QAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,uBAAuB,CAAC;AACnD,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI;AACnB,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACf,QAAA,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjB,QAAA,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE;AAAE,YAAA,OAAO,IAAI;AACnC,QAAA,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE;IACxB;;IAGA,aAAa,CAAC,KAAoB,EAAE,EAAoB,EAAA;AACpD,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YACvB,EAAE,CAAC,IAAI,EAAE;YACT;QACJ;QACA,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM;YAAE;AACpD,QAAA,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE;QAC1B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,cAAc,EAAE;IACzD;;IAGA,eAAe,CAAC,KAAsB,EAAE,EAAoB,EAAA;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE;YACT,EAAE,CAAC,KAAK,GAAG,KAAK,KAAK,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;YACtE;QACJ;QACA,IAAI,KAAK,KAAK,OAAO;AAAE,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;;AACjD,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;QAClC,EAAE,CAAC,KAAK,GAAG,KAAK,KAAK,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;IAC1E;;AAIA,IAAA,MAAM,CAAC,KAAiB,EAAA;QACpB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACzB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AACb,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AACxB,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE;;AAEzB,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACvB,IAAI,CAAC,kBAAkB,EAAE;gBACzB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,IAAI,EAAE;AAC9C,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACpD;AAAO,iBAAA,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,QAAQ,EAAE;;;;gBAIzC,IAAI,CAAC,cAAc,EAAE;YACzB;iBAAO;AACH,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBACxB,IAAI,CAAC,kBAAkB,EAAE;YAC7B;AACA,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QACtB;aAAO;YACH,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QACtB;IACJ;IAEA,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACtB;AAGA,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE;AAClB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,IAAI,CAAC,MAAM;YAAE;;QAEb,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE;;QAE9C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE;QACvD,IAAI,CAAC,KAAK,EAAE;IAChB;IAGA,QAAQ,GAAA;;;AAGJ,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE;AACvD,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YACxB;QACJ;;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE;YACrD,IAAI,CAAC,aAAa,EAAE;YACpB;QACJ;QACA,IAAI,CAAC,KAAK,EAAE;IAChB;;AAIA,IAAA,YAAY,CAAC,MAAoB,EAAA;AAC7B,QAAA,IAAI,MAAM,CAAC,GAAG,KAAK,QAAQ,EAAE;YACzB,IAAI,CAAC,cAAc,EAAE;YACrB;QACJ;QACA,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC;AACjD,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE;IAChB;AAEA,IAAA,cAAc,CAAC,GAAoB,EAAA;QAC/B,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,cAAc,MAAM,GAAG;IAC1D;AAEA,IAAA,UAAU,CAAC,MAAoB,EAAA;QAC3B,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;IACvC;;IAIA,cAAc,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QACxB,IAAI,CAAC,kBAAkB,EAAE;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,IAAI,EAAE;AAC9C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACpD;IAEA,aAAa,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;IAC5B;AAEA;;AAEyD;IAEzD,UAAU,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACvB;IAEA,UAAU,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACtB;AAEQ,IAAA,UAAU,CAAC,GAAW,EAAA;AAC1B,QAAA,QAAQ,IAAI,CAAC,OAAO,EAAE;AAClB,YAAA,KAAK,MAAM;AACP,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACrD;AACJ,YAAA,KAAK,QAAQ;gBACT,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;gBAC1D;AACJ,YAAA,KAAK,OAAO;AACR,gBAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;gBAC9C;;IAEZ;;;IAKA,eAAe,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC9B;;IAGA,cAAc,GAAA;AACV,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACnF,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IAC7B;;AAGA,IAAA,WAAW,CAAC,KAAa,EAAA;QACrB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAClE,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;IAC5B;;AAGA,IAAA,UAAU,CAAC,IAAY,EAAA;QACnB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9D,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;IAC5B;AAEA;;;;AAI0E;;IAG1E,aAAa,CAAC,KAAoB,EAAE,EAAoB,EAAA;AACpD,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YACvB,EAAE,CAAC,IAAI,EAAE;YACT;QACJ;QACA,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM;YAAE;;AAEpD,QAAA,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE;QAC1B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,cAAc,EAAE;IACzD;;IAGA,eAAe,CAAC,KAAsB,EAAE,EAAoB,EAAA;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE;;YAET,EAAE,CAAC,KAAK,GAAG,KAAK,KAAK,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;YAC9D;QACJ;AAEA,QAAA,IAAI,KAAK,KAAK,OAAO,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;AAC3B,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;;YAE3B,IAAI,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACxE;aAAO;AACH,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;AAC/B,YAAA,IAAI,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE;;AAE7C,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;AAC3B,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YAC5B;iBAAO;AACH,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7B;QACJ;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;;QAEhD,EAAE,CAAC,KAAK,GAAG,KAAK,KAAK,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;IAClE;;IAIQ,YAAY,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AAEtC,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC3D,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE;AAE9B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CACtC,CAAC,CAAO,KAAuB,CAAC,YAAY,WAAW,CAC1D;AACD,QAAA,IAAI,CAAC,IAAI;YAAE;AAEX,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,aAAa,EAAE;;;QAIpB,IAAI,CAAC,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE;QAC/C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC;IACzD;IAEQ,YAAY,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACpB,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC;AACxD,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAC7B;QACA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;YAC7C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC;QACzD;AACA,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AACxB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACzB;IACJ;AAEA;;;;AAIyE;IACjE,aAAa,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,qBAAqB,EAAE;QAChE,MAAM,MAAM,GAAG,CAAC;AAChB,QAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,eAAe,CAAC,WAAW;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,GAAG;;AAGpD,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI;;;QAGpB,IAAI,IAAI,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,EAAE;AAC5C,YAAA,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,UAAU;QAClC;;QAEA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;QAE7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AAChC,YAAA,QAAQ,EAAE,UAAU;YACpB,GAAG,EAAE,CAAA,EAAG,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA,EAAA,CAAI;AAC5C,YAAA,IAAI,EAAE,CAAA,EAAG,MAAM,CAAC,OAAO,GAAG,IAAI,CAAA,EAAA,CAAI;AAClC,YAAA,cAAc,EAAE,MAAM;AACzB,SAAA,CAAC;IACN;AAEA;AAC0E;AAC1E,IAAA,SAAS,CAAC,GAAS,EAAA;AACf,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,QAAQ,EAAE;YAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AACnC,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;AAC3B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;;YAEvB,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAAE;AACrB,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACxB;QACJ;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;AAC/B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;;QAG3B,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,GAAG,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACzC,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YACvB;QACJ;;QAGA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACnC,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE;AACpC,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;AAC3B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B;aAAO;AACH,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;QAC7B;IACJ;IAEA,gBAAgB,GAAA;AACZ,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE;AACd,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE;;;YAGzB,IAAI,CAAC,WAAW,CACZ,IAAI,CAAC,aAAa,EAAE,KAAK;kBACnB,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE;AAC/C,kBAAE;oBACI,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;oBAC9C,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AAC/C,iBAAA,CACV;YACD;QACJ;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,EAAE;IAChB;AAEA;AAC0E;AAC1E,IAAA,iBAAiB,CAAC,EAAoB,EAAA;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE;AACT,YAAA,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;YAC1B;QACJ;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AAChD,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACjB,YAAA,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;YAC1B;QACJ;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IAC5B;;;AAKiB,IAAA,cAAc,GAAgC;AAC3D,QAAA,EAAE,GAAG,EAAE,OAAO,EAAU,QAAQ,EAAE,mBAAmB,EAAE;AACvD,QAAA,EAAE,GAAG,EAAE,WAAW,EAAM,QAAQ,EAAE,uBAAuB,EAAE;AAC3D,QAAA,EAAE,GAAG,EAAE,YAAY,EAAK,QAAQ,EAAE,wBAAwB,EAAE;AAC5D,QAAA,EAAE,GAAG,EAAE,cAAc,EAAG,QAAQ,EAAE,0BAA0B,EAAE;AAC9D,QAAA,EAAE,GAAG,EAAE,cAAc,EAAG,QAAQ,EAAE,0BAA0B,EAAE;AAC9D,QAAA,EAAE,GAAG,EAAE,cAAc,EAAG,QAAQ,EAAE,0BAA0B,EAAE;AAC9D,QAAA,EAAE,GAAG,EAAE,WAAW,EAAM,QAAQ,EAAE,uBAAuB,EAAE;KAC9D;IAEO,kBAAkB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE;;AAEzB,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;AAC3B,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE;YACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YAClD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAChD,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACpF,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAClF;QACJ;AACA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;AAClC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD;;AAGQ,IAAA,kBAAkB,CAAC,GAAoB,EAAA;AAC3C,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACxB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;QAC/D,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE;AAC3B,cAAE,MAAM,CAAC,OAAO,CAAC,KAAK;cACpB,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC;QACnC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;IAC3C;AAEA;AACmE;AAC3D,IAAA,UAAU,CAAC,GAAoB,EAAE,KAAW,EAAE,GAAS,EAAA;AAC3D,QAAA,IAAI,GAAG,KAAK,QAAQ,EAAE;YAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE;YAC1D,MAAM,GAAG,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY;YAC7C,OAAO;AACH,gBAAA,KAAK,EAAE,GAAG;AACV,gBAAA,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA,GAAA,EAAM,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA,CAAE;aACzF;QACL;AACA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;QAC/D,OAAO;AACH,YAAA,KAAK,EAAE,GAAG;AACV,YAAA,SAAS,EAAE,GAAG;YACd,QAAQ,EAAE,MAAM,EAAE,QAAQ;YAC1B,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;SAChD;IACL;IAEQ,YAAY,CAAC,GAAoB,EAAE,KAAW,EAAA;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAChC,QAAQ,GAAG;AACP,YAAA,KAAK,OAAO;gBACR,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;YAC/B,KAAK,WAAW,EAAE;AACd,gBAAA,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;AACnC,gBAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE;YAC5B;AACA,YAAA,KAAK,YAAY;AACb,gBAAA,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;AAClD,YAAA,KAAK,cAAc;AACf,gBAAA,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;AAClD,YAAA,KAAK,cAAc;AACf,gBAAA,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;YAClD,KAAK,cAAc,EAAE;AACjB,gBAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AACtC,gBAAA,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjD,gBAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE;YAC5B;AACA,YAAA,KAAK,WAAW;gBACZ,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;AAC7D,YAAA;;gBAEI,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;;IAEvC;AAEQ,IAAA,WAAW,CAAC,GAAoB,EAAA;AACpC,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC;QACvC,QAAQ,GAAG;AACP,YAAA,KAAK,OAAO;gBACR,OAAO,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;AAClD,YAAA,KAAK,WAAW;AAChB,YAAA,KAAK,YAAY;AACb,gBAAA,OAAO,CAAA,EAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI;AAClD,YAAA,KAAK,cAAc;AACnB,YAAA,KAAK,cAAc;gBACf,OAAO,CAAA,EAAG,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA,GAAA,EAAM,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA,CAAE;AACtG,YAAA,KAAK,cAAc;AACf,gBAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;AACrD,YAAA,KAAK,WAAW;gBACZ,OAAO,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;AACjD,YAAA;AACI,gBAAA,OAAO,EAAE;;IAErB;;AAGQ,IAAA,cAAc,CAAC,KAAW,EAAA;QAS9B,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AAC7C,QAAA,MAAM,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC;AACzC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;AAC5B,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;AAE1B,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAI;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,QAAQ,EAAE;YAChD,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAC/B,MAAM,OAAO,GAAG,CAAC,CAAc,EAAE,CAAO,KACpC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE;YAEtC,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE;YACnF,OAAO;AACH,gBAAA,IAAI,EAAE,CAAC;AACP,gBAAA,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE;gBACnB,GAAG;gBACH,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE;gBACtC,OAAO,EAAE,CAAC,CAAC,MAAM;AACjB,gBAAA,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1B,gBAAA,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;aAC3B;AACL,QAAA,CAAC,CAAC;IACN;IAEQ,cAAc,GAAA;;;AAGlB,QAAA,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACpC,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAClC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AAC/D,aAAA,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAC3C;IACL;;AAIQ,IAAA,UAAU,CAAC,CAAO,EAAA;AACtB,QAAA,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/D;AAEQ,IAAA,YAAY,CAAC,CAAO,EAAA;AACxB,QAAA,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACrD;IAEQ,OAAO,CAAC,CAAO,EAAE,CAAS,EAAA;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;QACvB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC9B,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;IAC/B;IAEQ,SAAS,CAAC,CAAO,EAAE,CAAS,EAAA;AAChC,QAAA,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACzD;IAEQ,WAAW,CAAC,CAAO,EAAE,CAAO,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC;IACrG;AAEQ,IAAA,cAAc,CAAC,CAA0B,EAAA;AAC7C,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,EAAE;QACjB,OAAO,UAAU,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC;IACnD;AAEA;AAC+D;AACvD,IAAA,aAAa,CAAC,GAAW,EAAA;QAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,iCAAiC,CAAC;AAC7D,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI;AACnB,QAAA,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjB,QAAA,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACnB,QAAA,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAClB,QAAA,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE;AAAE,YAAA,OAAO,IAAI;AAC/D,QAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC;;QAExC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,GAAG,EAAE;AAC/E,YAAA,OAAO,IAAI;QACf;AACA,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7B;;AAGQ,IAAA,iBAAiB,CAAC,IAAY,EAAA;;AAElC,QAAA,OAAO,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;IAC7C;;IAGA,aAAa,GAAG,CAAC,CAAS,EAAE,CAAe,KAAa,CAAC,CAAC,GAAG;AAC7D,IAAA,UAAU,GAAG,CAAC,CAAS,EAAE,GAAmB,KAAa,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;IAC3E,UAAU,GAAG,CAAC,CAAS,EAAE,KAAa,KAAa,KAAK;wGAz7B/C,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,EAAA,UAAA,EAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxE1C,m8kBA8XA,EAAA,MAAA,EAAA,CAAA,uFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED5Tc,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,KAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAMxE,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBATzC,SAAS;+BACI,wBAAwB,EAAA,UAAA,EACtB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,CAAC,EAAA,eAAA,EAGjE,uBAAuB,CAAC,MAAM,QACzC,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,EAAA,QAAA,EAAA,m8kBAAA,EAAA,MAAA,EAAA,CAAA,uFAAA,CAAA,EAAA;;sBAsBvD,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;sBAItC,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;sBA8ZtC,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;;sBAYzC,YAAY;uBAAC,yBAAyB;;;AEpf3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BG;AAQG,MAAO,sBACX,SAAQ,qBAAqB,CAAA;AAGgB,IAAA,WAAW;AAExD;AACwD;;AAI/C,IAAA,KAAK;IACL,OAAO,GAAG,KAAK;;IAIf,MAAM,GAAG,IAAI;IACkB,WAAW,GAAG,KAAK;IAClD,YAAY,GAA0C,SAAS;AAC/D,IAAA,oBAAoB;AACpB,IAAA,oBAAoB;AACpB,IAAA,mBAAmB;AACnB,IAAA,mBAAmB;AACnB,IAAA,MAAM;AACN,IAAA,MAAM;AACN,IAAA,QAAQ;AACR,IAAA,eAAe;AACf,IAAA,MAAM;AACN,IAAA,aAAa;IACb,IAAI,GAA2B,SAAS;IACxC,WAAW,GAAG,IAAI;AAClB,IAAA,iBAAiB;AACjB,IAAA,iBAAiB;;AAIjB,IAAA,GAAG;AACH,IAAA,GAAG;IACH,IAAI,GAAG,CAAC;IACR,UAAU,GAAG,IAAI;;AAIjB,IAAA,SAAS;;AAET,IAAA,IAAI;AACJ,IAAA,SAAS;AACT,IAAA,SAAS;AACT,IAAA,OAAO;AACP,IAAA,QAAQ;AACR,IAAA,KAAK;AACL,IAAA,cAAc;AACd,IAAA,UAAU;AACV,IAAA,eAAe;AACf,IAAA,KAAK;AACL,IAAA,UAAU;;AAEnB;AACkD;AACzC,IAAA,cAAc;IACiB,SAAS,GAAG,KAAK;AAChD,IAAA,YAAY;IACZ,KAAK,GAAG,IAAI;IACmB,MAAM,GAAG,KAAK;AAEtD;;;;;;;;;AASG;IACM,OAAO,GAA2B,UAAU;IAErD,IAAoC,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;;AAI5D,IAAA,EAAE;AACF,IAAA,SAAS;AACT,IAAA,EAAE;AACF,IAAA,QAAQ;;AAIP,IAAA,UAAU,GAAG,IAAI,YAAY,EAAyB;AACtD,IAAA,gBAAgB,GAAgC,IAAI,YAAY,EAAiB;AACjF,IAAA,UAAU,GAAG,IAAI,YAAY,EAAS;AACtC,IAAA,SAAS,GAAG,IAAI,YAAY,EAAS;AACrC,IAAA,YAAY,GAAG,IAAI,YAAY,EAAiB;AAChD,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;;;AAK/C,IAAA,IAAuB,QAAQ,GAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI;IAC3B;IAES,UAAU,GAAA;QACjB,IAAI,CAAC,WAAW,EAAE;IACpB;;AAIQ,IAAA,QAAQ,GAAyB,MAAK,EAAc,CAAC;AACrD,IAAA,SAAS,GAAe,MAAK,EAAc,CAAC;AAE3C,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEtE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACrC;IACF;AAEA;AACwD;AAExD,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,OAAO,CAAC;IACxD;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,IAAI,IAAI;IAClG;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI;AACtD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;QACpC,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5E;AAEA,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;IACpB;AAEA,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;IACtC;;AAIA,IAAA,WAAW,CAAC,KAA4B,EAAA;QACtC,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAkB;AACnD,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClC;AAEA;AACsE;AACtE,IAAA,iBAAiB,CAAC,GAAW,EAAA;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;AACzC,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClC;AAEA;;;;;;;;AAQG;AACK,IAAA,kBAAkB,CAAC,GAAW,EAAA;QACpC,IAAI,GAAG,IAAI,IAAI;AAAE,YAAA,OAAO,IAAI;AAC5B,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;QAC5D,IAAI,UAAU,KAAK,EAAE;AAAE,YAAA,OAAO,IAAI;AAClC,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;AACjC,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI;IAChD;AAEA;;;;;;AAMG;AACK,IAAA,eAAe,CAAC,EAA2B,EAAA;AACjD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI;QAClC,IAAI,IAAI,GAAG,OAAO;AAClB,QAAA,IAAI,IAAI,IAAI,IAAI,EAAE;YAChB,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG;AAAE,gBAAA,IAAI,GAAG,IAAI,CAAC,GAAG;YACxD,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG;AAAE,gBAAA,IAAI,GAAG,IAAI,CAAC,GAAG;QAC1D;AACA,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;AACpB,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACnB,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC;AACA,QAAA,IAAI,EAAE;AAAE,YAAA,EAAE,CAAC,KAAK,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACrD;AAEA;AACgC;AAChC,IAAA,KAAK,CAAC,SAAiB,EAAA;AACrB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;AAC/B,QAAA,IAAI,IAAI,GAAG,OAAO,GAAG,SAAS,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;AACjD,QAAA,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI;YAAE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;AACrD,QAAA,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI;YAAE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;AACrD,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClC;AAEA,IAAA,WAAW,CAAC,KAAY,EAAA;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;AAEA,IAAA,UAAU,CAAC,KAAY,EAAA;AACrB,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE;YAC/B,IAAI,CAAC,eAAe,CAAE,KAAK,CAAC,MAAkC,IAAI,IAAI,CAAC;QACzE;QACA,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5B;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;IACjD;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;QAC1B;QACA,IAAI,CAAC,WAAW,EAAE;IACpB;wGAhQW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,8JAiBb,gBAAgB,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,aAAA,EAAA,eAAA,EAAA,IAAA,EAAA,MAAA,EAAA,WAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,GAAA,EAAA,KAAA,EAAA,GAAA,EAAA,KAAA,EAAA,IAAA,EAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EA2ChB,gBAAgB,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAGhB,gBAAgB,CAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,EAAA,IAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,EAAA,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,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5HtC,i0NAoLA,EAAA,MAAA,EAAA,CAAA,0tBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDzHY,iBAAiB,8sBAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,sEAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,qHAAE,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAExF,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EAGP,CAAC,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,CAAC,EAAA,QAAA,EAAA,i0NAAA,EAAA,MAAA,EAAA,CAAA,0tBAAA,CAAA,EAAA;;sBAMnG,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;sBAO1C;;sBACA;;sBAIA;;sBACA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAIA;;sBACA;;sBACA;;sBACA;;sBAIA;;sBAEA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAIA;;sBACA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBACA;;sBACA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAYrC;;sBAEA,WAAW;uBAAC,iBAAiB;;sBAI7B;;sBACA;;sBACA;;sBACA;;sBAIA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;;AE1IH;;;;;;;;;;;;AAYG;MAgBU,0BAA0B,CAAA;AACrC;;AAEG;IACM,KAAK,GAAqB,CAAC;AAEpC;;AAEG;IACM,GAAG,GAAG,CAAC;AAEhB;;AAEG;IACM,GAAG,GAAG,GAAG;AAElB;;AAEG;IACM,IAAI,GAAG,CAAC;AAEjB;;AAEG;AACM,IAAA,iBAAiB;AAE1B;;AAEG;AACM,IAAA,iBAAiB;AAE1B;;AAEG;AACM,IAAA,MAAM;AAEf;;AAEG;IACM,QAAQ,GAAG,KAAK;AAEzB;;AAEG;AACO,IAAA,WAAW,GAAG,IAAI,YAAY,EAAU;AAElD;;AAEG;AACH,IAAA,QAAQ,GAAG;AACT,QAAA,IAAI,EAAE;AACJ,YAAA,KAAK,EAAE,wCAAwC;AAChD,SAAA;AACD,QAAA,WAAW,EAAE;AACX,YAAA,IAAI,EAAE;AACJ,gBAAA,KAAK,EACH,gHAAgH;AACnH,aAAA;AACF,SAAA;AACD,QAAA,eAAe,EAAE;AACf,YAAA,KAAK,EACH,qIAAqI;AACxI,SAAA;AACD,QAAA,eAAe,EAAE;AACf,YAAA,KAAK,EACH,qIAAqI;AACxI,SAAA;AACD,QAAA,mBAAmB,EAAE;AACnB,YAAA,SAAS,EAAE,GAAG;AACf,SAAA;AACD,QAAA,mBAAmB,EAAE;AACnB,YAAA,SAAS,EAAE,GAAG;AACf,SAAA;KACF;;;;IAMO,QAAQ,GAAyB,MAAK;;AAE9C,IAAA,CAAC;IACO,SAAS,GAAe,MAAK;;AAErC,IAAA,CAAC;;;;AAMD,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;IACpB;AAEA,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;IAC5B;;;;AAMA,IAAA,iBAAiB,CAAC,KAAoB,EAAA;AACpC,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9B;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,SAAS,EAAE;IAClB;wGAtHW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,GAAA,EAAA,KAAA,EAAA,GAAA,EAAA,KAAA,EAAA,IAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,SAAA,EAR1B;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,0BAA0B,CAAC;AACzD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1CH,8pBAsBA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDaY,sBAAsB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,aAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,KAAA,EAAA,MAAA,EAAA,YAAA,EAAA,WAAA,EAAA,MAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,UAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FASlC,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAftC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,eAAA,EAGd,uBAAuB,CAAC,MAAM,EAAA,UAAA,EACnC,IAAI,EAAA,OAAA,EACP,CAAC,sBAAsB,EAAE,WAAW,CAAC,EAAA,SAAA,EACnC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,gCAAgC,CAAC;AACzD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,8pBAAA,EAAA;;sBAMA;;sBAKA;;sBAKA;;sBAKA;;sBAKA;;sBAKA;;sBAKA;;sBAKA;;sBAKA;;;AE3DH;;;;;;;;;;;;;;;;;AAiBG;MAOU,iBAAiB,CAAA;;AAEnB,IAAA,KAAK;;AAEL,IAAA,QAAQ;AAER,IAAA,IAAI;AAEb;;;;AAIG;IACM,OAAO,GAA2B,SAAS;IAE3C,QAAQ,GAAqB,SAAS;IACtC,IAAI,GAAsB,OAAO;IAEF,QAAQ,GAAG,KAAK;IAChB,OAAO,GAAG,KAAK;IACf,QAAQ,GAAG,KAAK;IAChB,MAAM,GAAG,KAAK;IACd,IAAI,GAAG,KAAK;IACZ,OAAO,GAAG,KAAK;AAC9C,IAAA,UAAU;IACV,IAAI,GAAwB,QAAQ;AACpC,IAAA,KAAK;AACL,IAAA,aAAa;AAUtB;AACsD;AAC7C,IAAA,OAAO;AAChB;;;AAG6D;AACpD,IAAA,UAAU;IACV,eAAe,GAAwC,KAAK;AAErE;;;AAGY;AACZ,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ;IACzC;AAEA;;AAEW;AACX,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK;IACnC;AAEU,IAAA,UAAU,GAAG,IAAI,YAAY,EAAS;AAEhD;AACyE;AACzE,IAAA,IAAI,aAAa,GAAA;;;AAGf,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,QAAQ,GAAG,WAAW,GAAG,CAAA,IAAA,EAAO,IAAI,CAAC,QAAQ,EAAE;AAClF,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,QAAQ,GAAG,EAAE;AACvD,QAAA,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;aACtD,MAAM,CAAC,OAAO;aACd,IAAI,CAAC,GAAG,CAAC;IACd;;AAGA,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,GAAG,wBAAwB,GAAG,IAAI;IACrE;AAEA,IAAA,WAAW,CAAC,KAAY,EAAA;AACtB,QAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO;YAAE;AACnC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;wGApFW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,sMAkBR,gBAAgB,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAChB,gBAAgB,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAChB,gBAAgB,gCAChB,gBAAgB,CAAA,EAAA,IAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAChB,gBAAgB,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAChB,gBAAgB,8OC5EtC,4zDA8CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDKY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,wbAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAE3C,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;+BACE,WAAW,EAAA,UAAA,EACT,IAAI,EAAA,OAAA,EAEP,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,4zDAAA,EAAA;;sBAItD;;sBAEA;;sBAEA;;sBAOA;;sBAEA;;sBACA;;sBAEA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBACA;;sBACA;;sBACA;;sBAYA;;sBAKA;;sBACA;;sBAiBA;;;AE9GH;;;;;;;;;;;;;;;;;;;;AAoBG;MA+BU,mBAAmB,CAAA;;AAEnB,IAAA,OAAO,GAAG,KAAK,CAAoB,MAAM,8EAAC;;AAG1C,IAAA,IAAI,GAAG,KAAK,CAAC,CAAC,2EAAC;;AAGf,IAAA,MAAM,GAAG,KAAK,CAAC,GAAG,6EAAC;AAEnB,IAAA,KAAK,GAAG,QAAQ,CAAC,MACtB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,4EAChE;wGAZQ,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,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,aAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3BlB;;;;;;;;;;;;;;;;;;;;;;AAsBT,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,uuBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKQ,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBA9B/B,SAAS;+BACI,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,QAAA,EACN;;;;;;;;;;;;;;;;;;;;;;KAsBT,EAAA,IAAA,EAEK,EAAE,aAAa,EAAE,MAAM,EAAE,EAAA,eAAA,EACd,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,uuBAAA,CAAA,EAAA;;;ACjDnD;;;;;;;;;;;;;;;;;;;;;;;AAuBG;MAgFU,eAAe,CAAA;;AAEf,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;;AAE5B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;;AAGzB,IAAA,OAAO,GAAG,KAAK,CAAS,EAAE,8EAAC;AAC3B,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,2EAAC;;AAGxB,IAAA,IAAI,GAAG,KAAK,CAAuB,SAAS,2EAAC;AAEtD;AACgE;IACvD,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGzD,OAAO,GAAG,KAAK,CAAC,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGvD,WAAW,GAAG,KAAK,CAAC,KAAK,mFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEpE;;AAE6E;IACpE,eAAe,GAAG,KAAK,CAAC,KAAK,uFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAExE;;;AAGkD;IACzC,OAAO,GAAG,KAAK,CAAC,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAGvD,IAAA,QAAQ,GAAG,KAAK,CAAoB,MAAM,+EAAC;;AAG3C,IAAA,YAAY,GAAG,KAAK,CAAC,CAAC,mFAAC;;AAGvB,IAAA,cAAc,GAAG,KAAK,CAAC,GAAG,qFAAC;;AAG3B,IAAA,SAAS,GAAG,KAAK,CAAC,KAAK,gFAAC;IAExB,QAAQ,GAAG,QAAQ,CACxB,MACI,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE;AACjB,QAAA,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE;AACd,QAAA,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE;AAChB,QAAA,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,+EACpB;IAEQ,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;IAGlD,MAAM,GAAA;QACF,IAAI,IAAI,CAAC,WAAW,EAAE;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACjE;AAEA;AAC2C;IAC3C,WAAW,GAAA;QACP,IAAI,CAAC,MAAM,EAAE;IACjB;wGAnES,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,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,SAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,2BAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1Ed;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsET,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,qzBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAvES,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FA2EnD,eAAe,EAAA,UAAA,EAAA,CAAA;kBA/E3B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,cACP,IAAI,EAAA,IAAA,EACV,EAAE,6BAA6B,EAAE,mBAAmB,EAAE,EAAA,OAAA,EACnD,CAAC,YAAY,EAAE,eAAe,EAAE,mBAAmB,CAAC,EAAA,QAAA,EACnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsET,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,qzBAAA,CAAA,EAAA;;;ACtDnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCG;MAOU,iBAAiB,CAAA;AACX,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;;;AAK5C,IAAA,MAAM;;AAEN,IAAA,SAAS;;AAGT,IAAA,QAAQ;;AAER,IAAA,WAAW;;IAIoB,OAAO,GAAG,KAAK;IACf,KAAK,GAAG,IAAI;IACZ,QAAQ,GAAG,IAAI;IACf,SAAS,GAAG,KAAK;IACjB,SAAS,GAAG,KAAK;;IAEjB,eAAe,GAAG,KAAK;;IAEvB,aAAa,GAAG,IAAI;;AAI5D;AAC0E;IACjE,QAAQ,GAAqB,SAAS;;AAEtC,IAAA,IAAI;;IAEJ,IAAI,GAAiB,IAAI;;AAIzB,IAAA,KAAK;AACL,IAAA,UAAU;IAEV,QAAQ,GAE2C,QAAQ;AAC3D,IAAA,QAAQ;AAEjB;;;;;;;;AAQG;IACM,OAAO,GAA2B,UAAU;;AAIrD;AAC8C;AACrC,IAAA,OAAO;;AAIhB;;;;AAIG;IACqC,cAAc,GAAG,IAAI;IACpD,YAAY,GAAG,aAAa;IAC5B,cAAc,GAAG,eAAe;AAChC,IAAA,SAAS;AACT,IAAA,WAAW;IACX,QAAQ,GAAG,aAAa;AACxB,IAAA,UAAU;IACqB,YAAY,GAAG,KAAK;AACnD,IAAA,cAAc;AACd,IAAA,gBAAgB;IAChB,YAAY,GAA8C,SAAS;IACnE,cAAc,GAA8C,OAAO;;AAIlE,IAAA,aAAa,GAAG,IAAI,YAAY,EAAW;AAC3C,IAAA,SAAS,GAAG,IAAI,YAAY,EAAQ;AACpC,IAAA,SAAS,GAAG,IAAI,YAAY,EAAQ;AACpC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;AACrC,IAAA,YAAY,GAAG,IAAI,YAAY,EAAQ;AACjD;AACwD;AAC9C,IAAA,WAAW,GAAG,IAAI,YAAY,EAA6C;AAErF;AACsD;AACR,IAAA,gBAAgB;;;IAKtD,OAAgB,SAAS,GAAqC;AACpE,QAAA,MAAM,EAAG,aAAa;AACtB,QAAA,IAAI,EAAK,4BAA4B;AACrC,QAAA,IAAI,EAAK,mBAAmB;AAC5B,QAAA,OAAO,EAAE,aAAa;AACtB,QAAA,MAAM,EAAG,qBAAqB;AAC9B,QAAA,OAAO,EAAE,EAAE;KACZ;AAED,IAAA,IAAI,mBAAmB,GAAA;QACrB,MAAM,KAAK,GAAa,EAAE;AAC1B,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE;YAC/B,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA,WAAA,EAAc,IAAI,CAAC,IAAI,CAAA,CAAE,CAAC;AAClD,YAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAA,WAAA,EAAc,IAAI,CAAC,QAAQ,CAAA,CAAE,CAAC;QAC5E;QACA,IAAI,IAAI,CAAC,UAAU;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AAChD,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACxB;AAEA,IAAA,IAAI,cAAc,GAAA;QAChB,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;AACjE,QAAA,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE;IAC1B;AAEA,IAAA,IAAI,iBAAiB,GAAA;QACnB,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;AACrE,QAAA,OAAO,IAAI,CAAC,QAAQ,IAAI,EAAE;IAC5B;AAEA,IAAA,IAAI,aAAa,GAAA;QACf,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI;QAC/B,OAAO,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI;IAC3D;;AAGA,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;IAC/D;;AAGA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,cAAc;IACtD;AAEA,IAAA,WAAW,CAAC,CAAiB,EAAA;QAC3B,IAAI,CAAC,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AACzD,QAAA,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE;IACtB;AAEA,IAAA,WAAW,CAAC,CAAiB,EAAA;AAC3B,QAAA,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,OAAO;QACjC,MAAM,YAAY,IAChB,GAAG,KAAK,SAAS,GAAG;AACpB,cAAE,GAAG,KAAK,QAAQ,GAAG;AACrB,kBAAE,GAAG,KAAK,QAAQ,GAAG;sBACnB,WAAW,CACd;AACD,QAAA,OAAO,CAAA,IAAA,EAAO,YAAY,CAAA,OAAA,EAAU,CAAC,CAAC,OAAO,GAAG,aAAa,GAAG,EAAE,CAAA,EAAG,CAAC,CAAC,UAAU,GAAG,GAAG,GAAG,CAAC,CAAC,UAAU,GAAG,EAAE,EAAE;IAC/G;;IAIA,iBAAiB,CAAC,CAAiB,EAAE,KAAa,EAAA;AAChD,QAAA,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO;YAAE;AAC7B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAE3C,QAAA,IAAI,MAAe;AACnB,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,CAAC,CAAC,OAAO,IAAI;QACxB;AAAE,QAAA,MAAM;;;QAGR;QAEA,MAAM,UAAU,GAAG,MAAM,IAAI,OAAQ,MAA2B,CAAC,IAAI,KAAK,UAAU;QACpF,IAAI,UAAU,EAAE;AACd,YAAA,CAAC,CAAC,OAAO,GAAG,IAAI;AACf,YAAA,MAA2B,CAAC,OAAO,CAAC,MAAK;AACxC,gBAAA,CAAC,CAAC,OAAO,GAAG,KAAK;AACjB,gBAAA,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK;AAAE,oBAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;AAC1D,YAAA,CAAC,CAAC;QACJ;AAAO,aAAA,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,EAAE;AAC9B,YAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;QACjC;IACF;AAEA,IAAA,mBAAmB,CAAC,KAAc,EAAA;AAChC,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;IAChC;IAEA,UAAU,GAAA,EAAW,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,UAAU,GAAA,EAAW,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;;IAG5C,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;IACjC;;IAGA,aAAa,GAAA;QACX,IAAI,IAAI,CAAC,YAAY;YAAE;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;wGA9MW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAiBR,gBAAgB,CAAA,EAAA,KAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAChB,gBAAgB,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAChB,gBAAgB,CAAA,EAAA,SAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAChB,gBAAgB,CAAA,EAAA,SAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAChB,gBAAgB,CAAA,EAAA,eAAA,EAAA,CAAA,iBAAA,EAAA,iBAAA,EAEhB,gBAAgB,CAAA,EAAA,aAAA,EAAA,CAAA,eAAA,EAAA,eAAA,EAEhB,gBAAgB,CAAA,EAAA,QAAA,EAAA,UAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,gBAAA,EAAA,gBAAA,EA8ChB,gBAAgB,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,CAAA,cAAA,EAAA,cAAA,EAOhB,gBAAgB,CAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/KtC,wuIAwHA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDzBY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,aAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,MAAA,EAAA,MAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,cAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,eAAA,EAAA,cAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,SAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAE7D,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;+BACE,WAAW,EAAA,UAAA,EACT,IAAI,EAAA,OAAA,EAEP,CAAC,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,CAAC,EAAA,QAAA,EAAA,wuIAAA,EAAA;;sBAQxE;;sBAEA;;sBAGA;;sBAEA;;sBAIA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAErC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAErC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAMrC;;sBAEA;;sBAEA;;sBAIA;;sBACA;;sBAEA;;sBAGA;;sBAWA;;sBAMA;;sBASA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBACA;;sBACA;;sBACA;;sBAIA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAGA;;sBAIA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;;AE/K9C;;AAE2D;AAC3D,MAAM,OAAO,GAA2B;AACpC,IAAA,OAAO,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE;AAC9B,IAAA,OAAO,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE;AAC9B,IAAA,cAAc,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE;AACpC,IAAA,OAAO,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE;AAC9B,IAAA,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE;CAC3B;AACD,MAAM,YAAY,GAAW,EAAE,GAAG,EAAE,YAAY,EAAE;AAElD;;;;;;;;;;AAUG;MAeU,wBAAwB,CAAA;AAChB,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAE5C,IAAA,OAAO,GAAG,KAAK,CAAsC,EAAE,8EAAC;AACxD,IAAA,QAAQ,GAAG,KAAK,CAAS,qBAAqB,+EAAC;AAC/C,IAAA,QAAQ,GAAG,KAAK,CAAS,aAAa,+EAAC;;AAEvC,IAAA,KAAK,GAAG,KAAK,CAAS,CAAC,4EAAC;AACjC;AACmD;AAC1C,IAAA,YAAY,GAAG,KAAK,CAAS,CAAC,mFAAC;;AAE/B,IAAA,WAAW,GAAG,KAAK,CAAC,IAAI,kFAAC;;AAEzB,IAAA,cAAc,GAAG,KAAK,CAAC,KAAK,qFAAC;;AAG7B,IAAA,aAAa,GAAG,MAAM,CAAC,KAAK,oFAAC;;AAG7B,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE;AACvB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE;AAC7B,QAAA,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG;AACxC,IAAA,CAAC,kFAAC;;IAGO,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,8EAAC;AAEjF,IAAA,UAAU,CAAC,KAAa,EAAA;QACpB,KAAK,EAAE,eAAe,EAAE;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC;AAES,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;AACrE,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AACzB,YAAA,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,IAAI,EAAE;YAChC,OAAO;gBACH,KAAK;AACL,gBAAA,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,YAAY;gBACjC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAA,CAAE,EAAE,EAAE,CAAC;aAC1D;AACL,QAAA,CAAC,CAAC;AACN,IAAA,CAAC,2EAAC;AAEF;;;AAG8E;AAC9E,IAAA,UAAU,CAAC,KAAyB,EAAA;AAChC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;;;AAGrB,QAAA,MAAM,GAAG,GAAG,CAAA,YAAA,EAAe,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA,CAAE;QACtD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC;IACxC;AAEA;AACiE;IACzD,YAAY,CAAC,GAAW,EAAE,MAAc,EAAA;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;AAC9C,QAAA,OAAO,UAAU,KAAK,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,UAAU;IAClE;;AAGQ,IAAA,QAAQ,CAAC,KAAa,EAAA;QAC1B,MAAM,KAAK,GAAG;AACT,aAAA,OAAO,CAAC,oBAAoB,EAAE,OAAO;AACrC,aAAA,OAAO,CAAC,SAAS,EAAE,GAAG;AACtB,aAAA,IAAI;AACJ,aAAA,WAAW,EAAE;QAClB,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;IACtE;AAEA;AACwD;AACxD,IAAA,UAAU,CAAC,KAAuC,EAAA;AAC9C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;AACrB,QAAA,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK;QAC7D,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAAE,YAAA,OAAO,EAAE;AACvC,QAAA,MAAM,GAAG,GAAG,CAAC,CAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACrD,QAAA,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI,CAAC,CAAC,WAAW,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE;IACxH;wGApFS,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxDrC,mpHA2FA,EAAA,MAAA,EAAA,CAAA,qkDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7CQ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,eAAe,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,MAAA,EAAA,WAAA,EAAA,SAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,UAAA,EAAA,aAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,SAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAMZ,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAdpC,SAAS;+BACI,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP;wBACL,YAAY;wBACZ,eAAe;wBACf,eAAe;wBACf,iBAAiB;wBACjB,iBAAiB;qBACpB,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,mpHAAA,EAAA,MAAA,EAAA,CAAA,qkDAAA,CAAA,EAAA;;;AEpCnD;;;;;;;;;;;AAWG;MASU,2BAA2B,CAAA;AACtC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAA6B;AACtD,IAAA,eAAe,GAAG,KAAK,CAAS,IAAI,sFAAC;AACrC,IAAA,cAAc,GAAG,KAAK,CAAS,EAAE,qFAAC;IAClC,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACxD,IAAA,QAAQ,GAAG,KAAK,CAAS,KAAK,+EAAC;AAC/B,IAAA,MAAM,GAAG,KAAK,CAAS,OAAO,6EAAC;AAC/B;;;;;;;;;;AAUG;IACH,YAAY,GAAG,KAAK,CAAC,IAAI,oFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAE3D,aAAa,GAAG,MAAM,EAA6B;AAEnD,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,4EAAC;AAClB,IAAA,IAAI,GAAG,MAAM,CAAC,KAAK,2EAAC;AACpB,IAAA,gBAAgB,GAAG,MAAM,CAAC,CAAC,uFAAC;;AAE5B,IAAA,aAAa,GAAG,MAAM,CAAyB,EAAE,oFAAC;IAE1C,OAAO,IAAI,CAAC,KAAa,EAAA;AAC/B,QAAA,OAAO;AACJ,aAAA,WAAW;aACX,SAAS,CAAC,KAAK;AACf,aAAA,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC1B;AAEA,IAAA,IAAI,GAAG,QAAQ,CAAwB,MAAK;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE;AAC7B,QAAA,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,EAAE;AAC3B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;QACvC,MAAM,EAAE,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9C,QAAA,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE;QAEnC,OAAO,IAAI,CAAC,QAAQ;AACjB,aAAA,OAAO,CAAC,CAAC,OAAO,KAAI;AACnB,YAAA,MAAM,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;gBACvC,OAAO,CAAC,MAAM,CAAC;AACf,gBAAA,EAAE,CAAW;YACf,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACrC,MAAM,QAAQ,GAAG,CACd,OAAO,CAAC,UAAU,CAA2C,IAAI,EAAE,EACpE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,KAAK,CAAC;;;;;YAMxC,IAAI,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACjC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,KAAI;oBAClC,MAAM,KAAK,GAAG,CAAA,EAAG,SAAS,CAAA,GAAA,EAAM,OAAO,CAAC,OAAO,CAAC,CAAA,CAAE;AAClD,oBAAA,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;oBACtC,OAAO;AACL,wBAAA,GAAG,EAAE,SAAS,IAAI,IAAI,GAAG,CAAA,EAAG,GAAG,IAAI,SAAS,CAAA,CAAE,GAAG,GAAG,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE;wBAC/D,OAAO;wBACP,KAAK;wBACL,QAAQ,EAAE,CAAC,OAAO,CAAC;wBACnB,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC;qBACvC;AACH,gBAAA,CAAC,CAAC;YACJ;;YAGA,OAAO;AACL,gBAAA;oBACE,GAAG;oBACH,OAAO;AACP,oBAAA,KAAK,EAAE,SAAS;oBAChB,QAAQ;oBACR,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC;AAC3C,iBAAA;aACF;AACH,QAAA,CAAC;aACA,MAAM,CAAC,CAAC,GAAG,KAAK,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC9E,IAAA,CAAC,2EAAC;IAEF,aAAa,CAAC,KAAa,EAAE,KAAa,EAAA;QACxC,MAAM,MAAM,GAAG,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC;QACtD,MAAM,EAAE,GAAG,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACvE,OAAO;AACL,YAAA,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;AACzC,YAAA,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;AACrD,YAAA,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;AACnD,SAAA,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACpC;AAEA,IAAA,OAAO,CAAC,KAAa,EAAA;AACnB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B;AAEA,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAClC,IAAI,GAAG,GAAG,CAAC;YAAE;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,GAAG,KAAK,CAAC,CAAC;AACxE,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAA;AAC5B,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;YAC7B,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,YAAA,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACvB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;YAClC,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACxB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YAChC,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,iBAAiB,EAAE;QAC1B;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;AACjC,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB;IACF;;AAGA,IAAA,cAAc,CAAC,GAAwB,EAAA;QACrC,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3C;AAEA,IAAA,SAAS,CAAC,GAAwB,EAAA;AAChC,QAAA,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI;IACvD;AAEA,IAAA,OAAO,CAAC,GAAwB,EAAA;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AACnC,QAAA,QAAQ,OAAO,GAAG,OAAO,CAAC;AACxB,YAAA,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;AACxB,YAAA,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;AACxB,YAAA,CAAC;IACL;IAEA,gBAAgB,CAAC,GAAwB,EAAE,KAAa,EAAA;QACtD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;IAChE;AAEA,IAAA,SAAS,CAAC,GAAwB,EAAA;AAChC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACtB,OAAO,EAAE,GAAG,CAAC,OAAO;AACpB,YAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AAC5B,YAAA,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;AAC7B,SAAA,CAAC;;;QAGF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IACtB;IAEA,iBAAiB,GAAA;AACf,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAChD,QAAA,IAAI,GAAG;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;IAC9B;;IAGA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;IAC5B;wGAzKW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,4jCCtCxC,8uFAwEA,EAAA,MAAA,EAAA,CAAA,qoFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDtCY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,onBAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAIzC,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBARvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,WAAW,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,8uFAAA,EAAA,MAAA,EAAA,CAAA,qoFAAA,CAAA,EAAA;;;ME0C1C,uBAAuB,CAAA;IAClC,UAAU,GAAG,CAAC,CAAS,EAAE,IAAmB,KAAK,IAAI,CAAC,EAAE;IAExD,MAAM,GAAG,KAAK,CAAiB;AAC7B,QAAA,YAAY,EAAE,OAAO;AACrB,QAAA,WAAW,EAAE,UAAU;AACvB,QAAA,SAAS,EAAE,kBAAkB;AAC7B,QAAA,aAAa,EAAE,QAAQ;AACvB,QAAA,SAAS,EAAE,KAAK;AAChB,QAAA,cAAc,EAAE,IAAI;AACpB,QAAA,aAAa,EAAE,KAAK;AACpB,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,YAAY,EAAE,KAAK;AACnB,QAAA,MAAM,EAAE,OAAO;AAChB,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEF,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAe;AACrC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAA6B;AACtD,IAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,+EAA6B;AACvD,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,gBAAgB,GAAG,KAAK,CAA2B,EAAE,uFAAC;;AAEtD,IAAA,eAAe,GAAG,KAAK,CAAS,IAAI,sFAAC;AACrC,IAAA,aAAa,GAAG,KAAK,CAA8B,EAAE,oFAAC;;AAGtD,IAAA,YAAY,GAAG,KAAK,CAAyB,EAAE,mFAAC;IAEhD,aAAa,GAAG,MAAM,EAAQ;IAC9B,YAAY,GAAG,MAAM,EAAmB;IACxC,cAAc,GAAG,MAAM,EAAoB;IAC3C,aAAa,GAAG,MAAM,EAAmB;AAEjC,IAAA,aAAa,GAAG,MAAM,CAAqB,IAAI,oFAAC;AAChD,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,kFAAC;AAEnC,IAAA,iBAAiB,GAAG,MAAM,CAAmC,IAAI,wFAAC;AAClE,IAAA,aAAa,GAAG,MAAM,CAAS,CAAC,oFAAC;AACjC,IAAA,gBAAgB,GAAG,MAAM,CAAS,CAAC,uFAAC;IAEpC,gBAAgB,GAAG,QAAQ,CACzB,MACE,IAAI,CAAC,iBAAiB,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC3E;AAED,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,IAAI,EAAE,iFAAC;AAE1D,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AACzB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,KAAI;AAC9C,YAAA,OAAO,KAAK,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACpE,CAAC,EAAE,CAAC,CAAC;AACP,IAAA,CAAC,iFAAC;AAEF,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC5B,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,KAAI;AAC9C,YAAA,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;AACrE,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC;YACnC,OAAO,KAAK,GAAG,CAAC,SAAS,GAAG,QAAQ,IAAI,GAAG;QAC7C,CAAC,EAAE,CAAC,CAAC;AACP,IAAA,CAAC,oFAAC;AAEF,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AACvB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,KAAI;YAC9C,OAAO,KAAK,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;QACtC,CAAC,EAAE,CAAC,CAAC;AACP,IAAA,CAAC,+EAAC;AAEF,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AACzB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;AACnE,IAAA,CAAC,iFAAC;AAEF,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,YAAY,IAAI,KAAK,+EAAC;AAC9D,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,IAAI,OAAO,6EAAC;AACxD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,GAAG,CAAC,+EAAC;AAEvD,IAAA,eAAe,GAAG,QAAQ,CAAuB,MAAK;AACpD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACtC,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB;AAE1C,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACrB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAkC;YACvD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,OAAO,EAAE,UAAU;YAEzD,IAAI,UAAU,EAAE;gBACd,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;AAClD,gBAAA,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;YAC/D;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,KAAK,GAAuB,EAAE;QAEpC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,KAAI;YAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAC3B,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CACnD;YACD,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI;AACJ,gBAAA,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,IAAI;gBAC/B,KAAK;AACL,gBAAA,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AAClB,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC;AACpD,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC;AACpD,YAAA,MAAM,MAAM,GAAG,MAAM,EAAE,SAAS,IAAI,GAAG;AACvC,YAAA,MAAM,MAAM,GAAG,MAAM,EAAE,SAAS,IAAI,GAAG;YACvC,OAAO,MAAM,GAAG,MAAM;AACxB,QAAA,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAEnE,QAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE;AAC9B,IAAA,CAAC,sFAAC;AAEF,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACjD,IAAA,CAAC,uFAAC;AAEF,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM;AACnD,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE;AACzC,QAAA,OAAO,EAAE,GAAG,YAAY,EAAE,GAAG,YAAY,EAAE;AAC7C,IAAA,CAAC,qFAAC;IAEF,SAAS,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,gFAAC;IAEzE,OAAO,GAAG,QAAQ,CAChB,MACE,IAAI,CAAC,gBAAgB,EAAE,CAAC,OAAO;AAC/B,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,8EACjD;AAED,IAAA,UAAU,GAAG,QAAQ,CAAyB,MAAK;AACjD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;AACrC,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAAE,YAAA,OAAO,IAAI;QAEjD,OAAO,iBAAiB,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AAChE,IAAA,CAAC,iFAAC;AAEF,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,IAAI,KAAK,iFAAC;AAEnE,IAAA,SAAS,GAAG,KAAK,CAAC,IAAI,gFAAC;AACvB,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;AAExB;;;;;AAKG;AACH,IAAA,WAAW,GAAG,MAAM,CAGV,IAAI,kFAAC;;AAGf,IAAA,QAAQ,GAAG,QAAQ,CACjB,MACE,CAAC;AACD,SAAC,IAAI,CAAC,MAAM,EAAE,CAAC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC;AACtC,SAAC,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,+EACpC;IAED,aAAa,CAAC,IAAmB,EAAE,KAAwB,EAAA;AACzD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK;IACrE;IAEA,aAAa,CAAC,IAAmB,EAAE,KAAwB,EAAA;QACzD,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;IAC9C;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;AAEA,IAAA,iBAAiB,CAAC,KAAoB,EAAA;AACpC,QAAA,IACE,KAAK,CAAC,GAAG,KAAK,OAAO;YACrB,KAAK,CAAC,GAAG,KAAK,QAAQ;AACtB,YAAA,KAAK,CAAC,GAAG,KAAK,KAAK,EACnB;YACA,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC;AACA,IAAA,UAAU,CAAC,IAAc,EAAA;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC7C;AAEA,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,CAAC,+EAAC;;AAGzD,IAAA,YAAY,GAAG,QAAQ,CAAuB,MAAK;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,KAAK;AAC1C,QAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAA8B;AACnD,QAAA,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE;AACtB,YAAA,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,IAAI,CAAC;AAC1B,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,gBAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;YACvC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B;AACA,QAAA,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;AAC1E,IAAA,CAAC,mFAAC;AAEF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBAAE;YAEzB,MAAM,YAAY,GAAG,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACpE,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE;YAEtC,IACE,YAAY,CAAC,UAAU,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU;gBACnD,YAAY,CAAC,aAAa,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa;gBACzD,YAAY,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ;gBAC/C,YAAY,CAAC,UAAU,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU;AACnD,gBAAA,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EACxE;AACA,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC;YAC/D;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,YAAA,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AAC3B,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9B;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBAAE;AAEzB,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC1C,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;AACtC,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;AAEA,IAAA,eAAe,CAAC,EAA+B,EAAA;AAC7C,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,SAAS;YAAE;QAEzC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;AACvE,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;IACrC;AAEA,IAAA,aAAa,CAAC,IAAmB,EAAA;QAC/B,MAAM,WAAW,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,IAAI,CAAC;AAChE,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC;QAChC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/C;AAEA,IAAA,iBAAiB,CAAC,IAAmB,EAAA;AACnC,QAAA,OAAO,mBAAmB,CAAC,iBAAiB,CAAC,IAAI,CAAC;IACpD;IAEA,mBAAmB,GAAA;QACjB,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;IAC3B;AAEiB,IAAA,SAAS,GAAG,SAAS,CAAC,2BAA2B,gFAAC;AAEnE;;;AAGG;AACH,IAAA,iBAAiB,CAAC,SAAoC,EAAA;QACpD,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC;IAC7C;IAEA,eAAe,GAAA;AACb,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE;QAC1C,IACE,IAAI,CAAC,QAAQ,EAAE;AACf,YAAA,SAAS,KAAK,IAAI;YAClB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,EACnC;YACA;QACF;QACA,MAAM,SAAS,GACZ,SAAS,CAAC,OAAO,GAAG,WAAW,CAAwB,IAAI,SAAS;QACvE,MAAM,OAAO,GAAG,mBAAmB,CAAC,iBAAiB,CACnD,SAAS,CAAC,OAAO,EACjB,IAAI,CAAC,gBAAgB,EAAE,EACvB,IAAI,CAAC,eAAe,EAAE,EACtB,SAAS,CACV;AACD,QAAA,MAAM,UAAU,GAAG,mBAAmB,CAAC,kBAAkB,CAAC;AACxD,YAAA,GAAG,OAAO;AACV,YAAA,gBAAgB,EAAE,IAAI,CAAC,aAAa,EAAE;AACvC,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,CAAC,CAAC;QACzD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;AAErC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;AAChC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5B,QAAA,IAAI,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE;IAC3B;AAEA,IAAA,wBAAwB,CACtB,gBAIE,EAAA;AAEF,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;YACzE;QACF;QAEA,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAoB,EAAE;AAEtC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;AAEvC,QAAA,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAI;AAC5D,YAAA,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;;AAEzC,YAAA,MAAM,aAAa,GAAG,YAAY,CAAC,SAAS,CAC1C,CAAC,IAAI,KACH,IAAI,CAAC,SAAS,KAAK,eAAe;gBAClC,IAAI,CAAC,SAAS,MAAM,SAAS,IAAI,IAAI,CAAC,CACzC;AAED,YAAA,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE;;;;;;AAMxB,gBAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC;AAC5C,gBAAA,MAAM,OAAO,GAAG,mBAAmB,CAAC,kBAAkB,CAAC;AACrD,oBAAA,GAAG,QAAQ;oBACX,QAAQ;AACT,iBAAA,CAAC;AACF,gBAAA,YAAY,CAAC,aAAa,CAAC,GAAG,OAAO;YACvC;iBAAO;AACL,gBAAA,MAAM,OAAO,GAAG,mBAAmB,CAAC,iBAAiB,CACnD,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,SAAS,CACV;AACD,gBAAA,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;AAC1B,gBAAA,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;YAC1B;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;AAEnC,QAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC;QACrC;IACF;AAEA,IAAA,cAAc,CAAC,UAAyB,EAAA;QACtC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QAErB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM;AAC5B,YAAA,GAAG,KAAK;YACR,UAAU;AACV,YAAA,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;AAC/C,SAAA,CAAC,CAAC;IACL;AAEA,IAAA,eAAe,CAAC,IAAU,EAAA;QACxB,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QAErB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM;AAC5B,YAAA,GAAG,KAAK;AACR,YAAA,SAAS,EAAE,IAAI;AAChB,SAAA,CAAC,CAAC;IACL;AAEA,IAAA,kBAAkB,CAAC,IAAiB,EAAA;QAClC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QAErB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM;AAC5B,YAAA,GAAG,KAAK;AACR,YAAA,YAAY,EAAE,IAAI;AACnB,SAAA,CAAC,CAAC;IACL;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;QACvB,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QAErB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM;AAC5B,YAAA,GAAG,KAAK;YACR,KAAK;AACN,SAAA,CAAC,CAAC;IACL;IAEA,YAAY,GAAA;AACV,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;QACrC,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnD;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/D;IAEA,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE;IAChC;AAEQ,IAAA,gBAAgB,CAAC,KAAsB,EAAA;QAC7C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM;AAC5B,YAAA,GAAG,KAAK;AACR,YAAA,UAAU,EAAE,KAAK;AAClB,SAAA,CAAC,CAAC;IACL;AAEQ,IAAA,eAAe,CAAC,UAAyB,EAAA;AAC/C,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,SAAS;QAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CACpC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,KAAK,UAAU,CACtC;AACD,QAAA,QAAQ,QAAQ,GAAG,aAAa,CAAC,IAAI,QAAQ,GAAG,MAAM,CAAC;IAGzD;AAEA,IAAA,UAAU,CAAC,SAAkB,EAAA;AAC3B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;IAC5D;AAEA,IAAA,WAAW,CAAC,UAAkB,EAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,KAAK,UAAU,CAAC;IACrE;IAEA,oBAAoB,GAAA;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,IAAI,EAAE;QAE3C,MAAM,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAmB,KAAI;AACzD,YAAA,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO;YAE1B,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBACnC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3C;AAEA,YAAA,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;AACvC,gBAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAEtB;gBACb,MAAM,OAAO,GACX,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE;AAC1B,sBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,SAAS;sBACtD,SAAS;gBACf,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC,kBAAkB,CAC9D,OAAO,EACP,OAAO,CACR;YACH;YAEA,OAAO,mBAAmB,CAAC,kBAAkB,CAAC;AAC5C,gBAAA,GAAG,IAAI;gBACP,OAAO;gBACP,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,SAAS,CAAC,UAAU,EAAE;AACrC,gBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK;AAClC,gBAAA,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;AACxC,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC;IACzC;IAEA,SAAS,GAAA;QACP,OAAO;AACL,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;AACnC,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;SAC9B;IACH;IAEA,WAAW,GAAA;QACT,OAAO,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACxD;wGA/eW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA+QK,2BAA2B,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3VpE,g2cAkVA,EAAA,MAAA,EAAA,CAAA,8sVAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpRI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,iBAAiB,wqBACjB,6BAA6B,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,cAAA,EAAA,SAAA,EAAA,cAAA,EAAA,OAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC7B,sBAAsB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,aAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,KAAA,EAAA,MAAA,EAAA,YAAA,EAAA,WAAA,EAAA,MAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,UAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEtB,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,KAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,SAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,eAAe,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,MAAA,EAAA,WAAA,EAAA,SAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,cAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,2BAA2B,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAGlB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBApBnC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EAGP;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,iBAAiB;wBACjB,6BAA6B;wBAC7B,sBAAsB;wBACtB,0BAA0B;wBAC1B,gBAAgB;wBAChB,iBAAiB;wBACjB,eAAe;wBACf,wBAAwB;wBACxB,2BAA2B;AAC5B,qBAAA,EAAA,QAAA,EAAA,g2cAAA,EAAA,MAAA,EAAA,CAAA,8sVAAA,CAAA,EAAA;o7CAiRsC,2BAA2B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEvTpE;;;;;;;;;AASG;MAQU,uBAAuB,CAAA;AAClC;;AAEG;AACH,IAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,gFAAmB;AAE9C;;AAEG;AACH,IAAA,gBAAgB,GAAG,KAAK,CAA2B,EAAE,uFAAC;AAEtD;;AAEG;AACH,IAAA,MAAM,GAAG,KAAK,CAAS,eAAe,6EAAC;AAEvC;;AAEG;AACH,IAAA,aAAa,GAAG,QAAQ,CAAsB,MAAK;AACjD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAEtC,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB;AAE1C,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACrB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAgC;YACrD,MAAM,UAAU,GAAI,IAAgC,CAAC,UAAU,IAAI,OAAO,EAAE,UAAU;YAEtF,IAAI,UAAU,EAAE;gBACd,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;AAClD,gBAAA,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;YAC/D;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,MAAM,GAAwB,EAAE;QAEtC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,KAAI;YAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAC3B,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CACnD;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;AACJ,gBAAA,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,IAAI;gBAC/B,KAAK;AACL,gBAAA,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;YACnB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxB,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CACrD;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxB,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CACrD;AACD,YAAA,MAAM,MAAM,GAAG,MAAM,EAAE,SAAS,IAAI,GAAG;AACvC,YAAA,MAAM,MAAM,GAAG,MAAM,EAAE,SAAS,IAAI,GAAG;AAEvC,YAAA,IAAI,MAAM,KAAK,MAAM,EAAE;gBACrB,OAAO,MAAM,GAAG,MAAM;YACxB;YACA,OAAO,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;AACvC,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,oFAAC;AAEF;;AAEG;AACH,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;QACzB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AAC1E,IAAA,CAAC,iFAAC;AAEF;;AAEG;AACH,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC3B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAA+B;AAExD,QAAA,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AACvB,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM;YAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC5B,gBAAA,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC7B;YACA,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnC,IAAI,GAAG,EAAE;AACP,gBAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;YACjB;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACrE,QAAA,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,GAAG,CAAwB,CAAC;AAC3E,IAAA,CAAC,mFAAC;AAEF;;AAEG;AACH,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,CAAC,gFAAC;wGAtGhD,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrDpC,w1BAsBA,EAAA,MAAA,EAAA,CAAA,m5BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED2BY,YAAY,8BAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAI3B,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,cAAc,CAAC,EAAA,QAAA,EAAA,w1BAAA,EAAA,MAAA,EAAA,CAAA,m5BAAA,CAAA,EAAA;;;MEmB5B,iCAAiC,CAAA;;AAE5C,IAAA,cAAc,GAAG,KAAK,CAAC,QAAQ,oFAAmB;;AAGlD,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAyD;;AAGlF,IAAA,eAAe,GAAG,KAAK,CAAmB,EAAE,sFAAC;;IAG7C,cAAc,GAAG,MAAM,EAAoB;;AAG3C,IAAA,WAAW,GAAG,MAAM,CAAyB,EAAE,kFAAC;;IAGhD,cAAc,GAAG,QAAQ,CAAC,MACxB,IAAI,CAAC,cAAc;AAChB,SAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;SACjD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACtB;;AAGD,IAAA,mBAAmB,CAAC,KAAoB,EAAA;AACtC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE;AACrC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE;QAEtE,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;QAC3C;QAEA,OAAO,QAAQ,CAAC,MAAM,CACpB,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAChE;IACH;;IAGA,YAAY,CAAC,SAAiB,EAAE,QAAgB,EAAA;AAC9C,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,KACpC,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAC/B,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,CACtD,CACF,CAAC,MAAM;IACV;;IAGA,gBAAgB,CAAC,SAAiB,EAAE,QAAgB,EAAA;QAClD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAChC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CACnD;IACH;;IAGA,YAAY,CAAC,KAAoB,EAAE,IAAkB,EAAA;AACnD,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE;QAC7C,MAAM,aAAa,GAAG,cAAc,CAAC,SAAS,CAC5C,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CACrD;AAED,QAAA,IAAI,UAA4B;AAChC,QAAA,IAAI,aAAa,IAAI,CAAC,EAAE;AACtB,YAAA,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,aAAa,CAAC;QACnE;aAAO;AACL,YAAA,UAAU,GAAG;AACX,gBAAA,GAAG,cAAc;AACjB,gBAAA,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;aACzD;QACH;AAEA,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC;AACpC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;IACtC;;AAGA,IAAA,YAAY,CAAC,MAAsB,EAAA;AACjC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAC9C,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAC3D;AACD,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC;AACpC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;IACtC;;IAGA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IAC9B;;IAGA,gBAAgB,CAAC,SAAiB,EAAE,IAAY,EAAA;QAC9C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM;AACpC,YAAA,GAAG,OAAO;YACV,CAAC,SAAS,GAAG,IAAI;AAClB,SAAA,CAAC,CAAC;IACL;;AAGA,IAAA,aAAa,CAAC,IAAkB,EAAA;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;AACtC,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,IAAI;IACjD;;AAGA,IAAA,gBAAgB,CAAC,KAAoB,EAAA;QACnC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;IAC1C;wGA1GW,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAjC,iCAAiC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpE9C,ypIA6GA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDtDI,WAAW,onBACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,YAAY,2kBACZ,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,SAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,UAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,KAAA,EAAA,YAAA,EAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACV,eAAe,iLACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,KAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAIP,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAjB7C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,6BAA6B,EAAA,OAAA,EAE9B;wBACP,WAAW;wBACX,eAAe;wBACf,WAAW;wBACX,YAAY;wBACZ,cAAc;wBACd,UAAU;wBACV,eAAe;wBACf,eAAe;wBACf,eAAe;wBACf,gBAAgB;qBACjB,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ypIAAA,EAAA;;;MEgBpC,2BAA2B,CAAA;AACrB,IAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;IAC1B,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;;AAG7D,IAAA,QAAQ,GAAG,KAAK,CAAqB,EAAE,+EAAC;;AAGxC,IAAA,cAAc,GAAG,KAAK,CAAkB,EAAE,qFAAC;;AAG3C,IAAA,oBAAoB,GAAG,KAAK,CAC1B,EAAE,2FACH;;AAGD,IAAA,cAAc,GAAG,KAAK,CAAmB,EAAE,qFAAC;;AAG5C,IAAA,YAAY,GAAG,KAAK,CAAS,IAAI,mFAAC;;AAGlC,IAAA,YAAY,GAAG,KAAK,CAAS,KAAK,mFAAC;;AAGnC,IAAA,UAAU,GAAG,KAAK,CAAS,OAAO,iFAAC;AAEnC;;;;;;;;;;AAUG;AACH,IAAA,mBAAmB,GAAG,YAAY,CAAuB,kBAAkB,0FAAC;AAErD,IAAA,QAAQ;;IAG/B,iBAAiB,GACf,MAAM,EAA8E;AAEtF,IAAA,aAAa,GAAG,MAAM,CAAC,EAAE,oFAAC;AAC1B,IAAA,eAAe,GAAG,MAAM,CAAmB,EAAE,sFAAC;AAC9C,IAAA,YAAY,GAAG,MAAM,CAAC,SAAS,mFAAC;AAChC,IAAA,gBAAgB,GAAG,MAAM,CAEvB,EAAE,uFAAC;;AAGL,IAAA,gBAAgB,GAAG,MAAM,CAAyB,EAAE,uFAAC;AAErD,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC9B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE;AACtC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;QAE5D,IAAI,UAAU,EAAE;YACd,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;AAC/B,gBAAA,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,EAAE,WAAW,EAAE;AACvD,gBAAA,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE;AACzC,gBAAA,OAAO,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;AACtE,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,YAAA,OAAO,QAAQ;QACjB;QAEA,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAClC,CAAC,GAAG,EAAE,MAAM,KAAI;YACd,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AACrB,gBAAA,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACvB;AACA,YAAA,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AAClC,YAAA,OAAO,GAAG;QACZ,CAAC,EACD,EAA8B,CAC/B;QAED,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AACrC,YAAA,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,IAAI,EAAE;AACrD,YAAA,OAAO,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,KAAI;gBAC3D,OAAO,WAAW,CAAC,IAAI,CACrB,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CACjD;AACH,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,QAAQ;AACjB,IAAA,CAAC,uFAAC;AAEF,IAAA,WAAW,GAAG;AACZ,QAAA;AACE,YAAA,KAAK,EAAE,cAAc;AACrB,YAAA,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,MAAK;AACZ,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC;AACrC,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YACtB,CAAC;AACF,SAAA;AACD,QAAA;AACE,YAAA,KAAK,EAAE,oBAAoB;AAC3B,YAAA,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,MAAK;AACZ,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,oBAAoB,CAAC;AAC3C,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YACtB,CAAC;AACF,SAAA;AACD,QAAA;AACE,YAAA,KAAK,EAAE,oBAAoB;AAC3B,YAAA,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,MAAK;AACZ,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,oBAAoB,CAAC;AAC3C,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YACtB,CAAC;AACF,SAAA;KACF;AAED,IAAA,gBAAgB,CAAC,OAAyB,EAAA;AACxC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;IACnC;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,0BAA0B,EAAE;QACjC,IAAI,CAAC,wBAAwB,EAAE;IACjC;AAEA,IAAA,UAAU,CAAC,OAAyB,EAAA;AAClC,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;IACrC;IAEQ,0BAA0B,GAAA;AAChC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAChD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE;AAEnC,QAAA,IACE,CAAC,YAAY;YACb,YAAY,CAAC,MAAM,KAAK,CAAC;AACzB,YAAA,CAAC,WAAW;AACZ,YAAA,WAAW,CAAC,MAAM,KAAK,CAAC,EACxB;YACA;QACF;QAEA,MAAM,qBAAqB,GAItB,EAAE;AAEP,QAAA,YAAY,CAAC,OAAO,CAAC,CAAC,SAAS,KAAI;YACjC,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CACtC,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,SAAS,CAClD;YACD,IAAI,eAAe,EAAE;gBACnB,qBAAqB,CAAC,IAAI,CAAC;AACzB,oBAAA,OAAO,EAAE,eAAe;AACxB,oBAAA,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,CAAC;AACjC,oBAAA,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,SAAS;AAC5C,iBAAA,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAClD;IAEQ,wBAAwB,GAAA;AAC9B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;AACtC,QAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9D,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC;QACpC;IACF;AAEA,IAAA,cAAc,CAAC,KAAY,EAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;IAC7B;;IAGQ,YAAY,CAAC,UAAmB,EAAE,SAAkB,EAAA;AAC1D,QAAA,OAAO,SAAS,GAAG,GAAG,UAAU,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,GAAG,CAAA,EAAG,UAAU,EAAE;IACpE;;AAGA,IAAA,oBAAoB,CAAC,OAAyB,EAAA;QAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC;AAC7C,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,QAAQ;AAC7B,QAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;YACnC,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;YACtD,OAAO,OAAO,CAAC,gBAAgB,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,SAAS;QACjE;AACA,QAAA,OAAO,SAAS;IAClB;;IAGA,kBAAkB,CAAC,OAAyB,EAAE,SAAiB,EAAA;QAC7D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,SAAS,EAAE,CAAC,CAAC;IACnE;;AAGA,IAAA,iBAAiB,CAAC,OAAyB,EAAA;AACzC,QAAA,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM;IACzE;;AAGA,IAAA,iBAAiB,CAAC,OAAyB,EAAA;QACzC,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC;IACrE;;AAGA,IAAA,kBAAkB,CAAC,OAAyB,EAAA;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;AACpC,QAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;YACnC,OAAO,IAAI,CAAC,gBAAgB;AACzB,iBAAA,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG;AAClD,iBAAA,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9C;QACA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAC3C,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,CAC5C;AACD,QAAA,OAAO,QAAQ,EAAE,QAAQ,IAAI,CAAC;IAChC;;IAGA,kBAAkB,CAAC,OAAyB,EAAE,SAAiB,EAAA;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;AACpC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAC3C,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC,SAAS,KAAK,SAAS,CAC1E;AACD,QAAA,OAAO,QAAQ,EAAE,QAAQ,IAAI,CAAC;IAChC;AAEA,IAAA,UAAU,CAAC,OAAyB,EAAA;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;AACpC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO;AAC9C,cAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO;cACjC,SAAS;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC;AAChD,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAE/C,QAAA,MAAM,aAAa,GAAG,eAAe,CAAC,SAAS,CAC7C,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,MAAM,CAChF;AAED,QAAA,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE;AACxB,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACvB,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,KACxB,CAAC,KAAK,aAAa,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,EAAE,CAChE,CACF;QACH;aAAO;AACL,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;AACxB,gBAAA,GAAG,eAAe;AAClB,gBAAA,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE;AACpC,aAAA,CAAC;QACJ;IACF;AAEA,IAAA,aAAa,CAAC,OAAyB,EAAA;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;AACpC,QAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;;AAEnC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAC5B,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,CAC5C,CACF;QACH;aAAO;AACL,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAC5B,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,GAAG,CAC5C,CACF;QACH;IACF;IAEA,sBAAsB,CAAC,OAAyB,EAAE,SAAiB,EAAA;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC;AAChD,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAC5B,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,MAAM,CAChF,CACF;IACH;IAEA,qBAAqB,CAAC,OAAyB,EAAE,QAAgB,EAAA;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;AACpC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO;AAC9C,cAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO;cACjC,SAAS;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC;AAChD,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAE/C,QAAA,IAAI,QAAQ,KAAK,CAAC,EAAE;AAClB,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACvB,eAAe,CAAC,MAAM,CACpB,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,MAAM,CAChF,CACF;QACH;aAAO;AACL,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACvB,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,KACrB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK;AAC/D,kBAAE,EAAE,GAAG,EAAE,EAAE,QAAQ;AACnB,kBAAE,EAAE,CACP,CACF;QACH;IACF;AAEA,IAAA,qBAAqB,CAAC,OAAyB,EAAE,SAAiB,EAAE,QAAgB,EAAA;QAClF,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC;AAChD,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAE/C,QAAA,IAAI,QAAQ,KAAK,CAAC,EAAE;AAClB,YAAA,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC;QACjD;aAAO;AACL,YAAA,MAAM,aAAa,GAAG,eAAe,CAAC,SAAS,CAC7C,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,MAAM,CAChF;AACD,YAAA,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE;AACxB,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACvB,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,KACxB,CAAC,KAAK,aAAa,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAC/C,CACF;YACH;iBAAO;AACL,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;AACxB,oBAAA,GAAG,eAAe;AAClB,oBAAA,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE;AACjC,iBAAA,CAAC;YACJ;QACF;IACF;IAEA,iBAAiB,GAAA;AACf,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC7C,QAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YAC5B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;AAC/C,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7B,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B;IACF;AAEA,IAAA,iBAAiB,CAAC,OAAyB,EAAA;AACzC,QAAA,MAAM,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAC3D,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,KAAK,WAAW,CAChC;AACD,QAAA,OAAO,mBAAmB,EAAE,IAAI,IAAI,EAAE;IACxC;IAEA,eAAe,CAAC,OAAyB,EAAE,SAAiB,EAAA;AAC1D,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC;AACxE,QAAA,OAAO,OAAO,EAAE,KAAK,IAAI,SAAS;IACpC;AAEA,IAAA,QAAQ,CAAC,OAAyB,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;IACjC;AAEA,IAAA,WAAW,CAAC,OAAyB,EAAA;AACnC,QAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;AACpD,YAAA,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC;YACxE,IAAI,OAAO,EAAE;gBACX,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC;YAC3C;;YAEA,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;AACtD,YAAA,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC3D,IAAI,GAAG,KAAK,GAAG;AAAE,oBAAA,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AAChD,gBAAA,OAAO,CAAA,EAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA,GAAA,EAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;YACpE;QACF;AACA,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS;QAC/B,IAAI,KAAK,IAAI,IAAI;AAAE,YAAA,OAAO,EAAE;AAC5B,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;IACnC;AAEA,IAAA,kBAAkB,CAAC,OAAgC,EAAA;QACjD,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC;IAC3C;AAEQ,IAAA,cAAc,CAAC,KAAgC,EAAA;QACrD,IAAI,KAAK,IAAI,IAAI;AAAE,YAAA,OAAO,EAAE;QAC5B,QACE,IAAI,CAAC,YAAY,CAAC,SAAS,CACzB,KAAK,EACL,IAAI,CAAC,YAAY,EAAE,EACnB,eAAe,EACf,OAAO,CACR,IAAI,EAAE;IAEX;wGAnZW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClFxC,0hQAgLA,EAAA,MAAA,EAAA,CAAA,yRAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/GI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,SAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,UAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACV,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,wCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,UAAU,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACV,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,cAAA,EAAA,QAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,0BAA0B,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,KAAA,EAAA,KAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1B,iCAAiC,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,UAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,uBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjC,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAKN,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAtBvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,OAAA,EAGvB;wBACP,YAAY;wBACZ,WAAW;wBACX,WAAW;wBACX,iBAAiB;wBACjB,UAAU;wBACV,eAAe;wBACf,eAAe;wBACf,eAAe;wBACf,UAAU;wBACV,YAAY;wBACZ,0BAA0B;wBAC1B,iCAAiC;wBACjC,eAAe;AAChB,qBAAA,EAAA,aAAA,EACc,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,0hQAAA,EAAA,MAAA,EAAA,CAAA,yRAAA,CAAA,EAAA;wzBAwCU,kBAAkB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA;sBAE1E,SAAS;uBAAC,UAAU;;;AEvHvB;;;;;;;;;;;;;;;;;AAiBG;MAQU,wBAAwB,CAAA;;AAExB,IAAA,IAAI,GAAG,KAAK,CAAqB,IAAI,2EAAC;;AAGtC,IAAA,UAAU,GAAG,KAAK,CAAS,EAAE,iFAAC;IAEpB,mBAAmB,GAAG,MACrC,CAAC,WAAW,EAAE,cAAc,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,EAAE,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE;SACrE,MAAM,CAAC,OAAO;SACd,IAAI,CAAC,GAAG,CAAC;wGAVT,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAHvB,CAAA,wDAAA,CAA0D,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAD1D,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAT,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,oDAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,KAAA,EAAA,UAAA,EAAA,UAAA,EAAA,KAAA,EAAA,YAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAIpB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,mBAAmB,CAAC;AAC9B,oBAAA,QAAQ,EAAE,CAAA,wDAAA,CAA0D;oBACpE,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAClD,iBAAA;;;ACvBD;;;;;;;;;;;;;;;AAeG;MAoBU,sBAAsB,CAAA;AACd,IAAA,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAC;;AAGlD,IAAA,QAAQ,GAAG,KAAK,CAAS,YAAY,+EAAC;;AAGtC,IAAA,SAAS,GAAG,KAAK,CAAS,WAAW,gFAAC;;AAGtC,IAAA,YAAY,GAAG,KAAK,CAAS,EAAE,mFAAC;AAEhC,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,SAAS,6EAAC;IAEvD,QAAQ,GAAG,QAAQ,CAClC,MACI,IAAI,CAAC,YAAY,EAAE;AACnB,SAAC,IAAI,CAAC,MAAM,EAAE,GAAG,2BAA2B,GAAG,0BAA0B,CAAC,+EACjF;IAED,MAAM,GAAA;QACF,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1F;wGAtBS,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAfrB;;;;;;;;;;;;AAYT,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAbS,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAgBhB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAnBlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,eAAe,CAAC;AAC1B,oBAAA,QAAQ,EAAE;;;;;;;;;;;;AAYT,IAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAClD,iBAAA;;;ACnCD;;;;;;;;;;;;;;;AAeG;MAuBU,kBAAkB,CAAA;wGAAlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,eAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAtB9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,cAAc,EAAE;AACZ,wBAAA;AACI,4BAAA,SAAS,EAAE,OAAO;AAClB,4BAAA,MAAM,EAAE;gCACJ,qBAAqB;gCACrB,oCAAoC;gCACpC,oCAAoC;gCACpC,wCAAwC;gCACxC,8BAA8B;gCAC9B,+BAA+B;gCAC/B,+BAA+B;gCAC/B,6BAA6B;gCAC7B,6BAA6B;gCAC7B,yBAAyB;gCACzB,qBAAqB;AACxB,6BAAA;AACJ,yBAAA;AACJ,qBAAA;AACJ,iBAAA;;;ACpCD;;;;;;;;;;;AAWG;MAkBU,qBAAqB,CAAA;;AAErB,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;IAEf,IAAI,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEhD,IAAA,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AAElD;;;;;;;AAOG;AACgB,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;QACrC,IAAI,CAAC,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;AACzB,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACrD,QAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;aAC1D,MAAM,CAAC,OAAO;aACd,IAAI,CAAC,KAAK,CAAC;AACpB,IAAA,CAAC,4EAAC;;AAGiB,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAK;QACtC,IAAI,CAAC,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;AACzB,QAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;aAC1D,MAAM,CAAC,OAAO;aACd,IAAI,CAAC,KAAK,CAAC;AACpB,IAAA,CAAC,6EAAC;wGA9BO,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAbpB;;;;;;;;;;AAUT,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAXS,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAcnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAjBjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,kBAAkB,CAAC;AAC7B,oBAAA,QAAQ,EAAE;;;;;;;;;;AAUT,IAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAClD,iBAAA;;;MClBY,mBAAmB,CAAA;;AAErB,IAAA,MAAM;;AAEN,IAAA,SAAS;IAEsB,UAAU,GAAG,KAAK;IAClB,SAAS,GAAG,KAAK;AAChD,IAAA,UAAU;wGARR,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAMV,gBAAgB,CAAA,EAAA,SAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAChB,gBAAgB,uDCrBtC,2MAQA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDIY,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAE9B,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,cACX,IAAI,EAAA,OAAA,EAEP,CAAC,cAAc,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,2MAAA,EAAA;;sBAIzC;;sBAEA;;sBAEA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;;MEZU,sBAAsB,CAAA;wGAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAJrB,CAAA,6CAAA,CAA+C,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAE/C,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAElB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,CAAA,6CAAA,CAA+C;oBACzD,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,OAAO,EAAE,CAAC,iBAAiB,CAAC;AAC/B,iBAAA;;;ACwED;;AAEG;AACI,MAAM,iBAAiB,GAAoD;AAChF,IAAA,KAAK,EAAE,MAAM;AACb,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,OAAO,EAAE,KAAK;;AAGhB;;AAEG;AACI,MAAM,kBAAkB,GAAiC;AAC9D,IAAA,OAAO,EAAE,gBAAgB;AACzB,IAAA,KAAK,EAAE,cAAc;AACrB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,MAAM,EAAE,eAAe;AACvB,IAAA,KAAK,EAAE,cAAc;AACrB,IAAA,MAAM,EAAE,eAAe;AACvB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,GAAG,EAAE,YAAY;AACjB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,MAAM,EAAE,eAAe;AACvB,IAAA,MAAM,EAAE,eAAe;AACvB,IAAA,MAAM,EAAE,eAAe;AACvB,IAAA,OAAO,EAAE,gBAAgB;AACzB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,KAAK,EAAE,cAAc;AACrB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,OAAO,EAAE,gBAAgB;AACzB,IAAA,KAAK,EAAE,cAAc;AACrB,IAAA,GAAG,EAAE,YAAY;;AAGnB;;AAEG;AACI,MAAM,oBAAoB,GAAiC;AAChE,IAAA,OAAO,EAAE,kBAAkB;AAC3B,IAAA,KAAK,EAAE,gBAAgB;AACvB,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,MAAM,EAAE,iBAAiB;AACzB,IAAA,KAAK,EAAE,gBAAgB;AACvB,IAAA,MAAM,EAAE,iBAAiB;AACzB,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,GAAG,EAAE,cAAc;AACnB,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,MAAM,EAAE,iBAAiB;AACzB,IAAA,MAAM,EAAE,iBAAiB;AACzB,IAAA,MAAM,EAAE,iBAAiB;AACzB,IAAA,OAAO,EAAE,kBAAkB;AAC3B,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,KAAK,EAAE,gBAAgB;AACvB,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,OAAO,EAAE,kBAAkB;AAC3B,IAAA,KAAK,EAAE,gBAAgB;AACvB,IAAA,GAAG,EAAE,cAAc;;AAGrB;;AAEG;AACI,MAAM,sBAAsB,GAAiC;AAClE,IAAA,OAAO,EAAE,oBAAoB;AAC7B,IAAA,KAAK,EAAE,kBAAkB;AACzB,IAAA,IAAI,EAAE,iBAAiB;AACvB,IAAA,MAAM,EAAE,mBAAmB;AAC3B,IAAA,KAAK,EAAE,kBAAkB;AACzB,IAAA,MAAM,EAAE,mBAAmB;AAC3B,IAAA,IAAI,EAAE,iBAAiB;AACvB,IAAA,IAAI,EAAE,iBAAiB;AACvB,IAAA,GAAG,EAAE,gBAAgB;AACrB,IAAA,IAAI,EAAE,iBAAiB;AACvB,IAAA,MAAM,EAAE,mBAAmB;AAC3B,IAAA,MAAM,EAAE,mBAAmB;AAC3B,IAAA,MAAM,EAAE,mBAAmB;AAC3B,IAAA,OAAO,EAAE,oBAAoB;AAC7B,IAAA,IAAI,EAAE,iBAAiB;AACvB,IAAA,IAAI,EAAE,iBAAiB;AACvB,IAAA,KAAK,EAAE,kBAAkB;AACzB,IAAA,IAAI,EAAE,iBAAiB;AACvB,IAAA,IAAI,EAAE,iBAAiB;AACvB,IAAA,OAAO,EAAE,oBAAoB;AAC7B,IAAA,KAAK,EAAE,kBAAkB;AACzB,IAAA,GAAG,EAAE,gBAAgB;;AAGvB;;AAEG;AACI,MAAM,wBAAwB,GAAiC;AACpE,IAAA,OAAO,EAAE,gBAAgB;AACzB,IAAA,KAAK,EAAE,cAAc;AACrB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,MAAM,EAAE,eAAe;AACvB,IAAA,KAAK,EAAE,cAAc;AACrB,IAAA,MAAM,EAAE,eAAe;AACvB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,GAAG,EAAE,YAAY;AACjB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,MAAM,EAAE,eAAe;AACvB,IAAA,MAAM,EAAE,eAAe;AACvB,IAAA,MAAM,EAAE,eAAe;AACvB,IAAA,OAAO,EAAE,gBAAgB;AACzB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,KAAK,EAAE,cAAc;AACrB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,OAAO,EAAE,gBAAgB;AACzB,IAAA,KAAK,EAAE,cAAc;AACrB,IAAA,GAAG,EAAE,YAAY;;;AC3LnB;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;MAQU,gBAAgB,CAAA;AAC3B;;AAEG;IACH,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAEvB;;AAEG;AACH,IAAA,KAAK,GAAG,KAAK,CAAe,iBAAiB,CAAC,KAAK,4EAAC;AAEpD;;AAEG;AACH,IAAA,IAAI,GAAG,KAAK,CAAc,iBAAiB,CAAC,IAAI,2EAAC;AAEjD;;AAEG;AACH,IAAA,OAAO,GAAG,KAAK,CAAiB,iBAAiB,CAAC,OAAO,8EAAC;AAE1D;;AAEG;AACH,IAAA,UAAU,GAAG,KAAK,CAAS,iBAAiB,CAAC,UAAU,iFAAC;AAExD;;AAEG;IACH,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAEtB;;AAEG;AACH,IAAA,OAAO,GAAG,KAAK,CAAU,iBAAiB,CAAC,OAAO,8EAAC;AAEnD;;AAEG;AACH,IAAA,MAAM,GAAG,QAAQ,CAA0B,OAAO;AAChD,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AACzB,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,QAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACjB,QAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,QAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,KAAK;AACpD,KAAA,CAAC,6EAAC;AAEH;;AAEG;AACH,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC3B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;AACzB,QAAA,MAAM,OAAO,GAAa,CAAC,UAAU,CAAC;;QAGtC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,CAAC;;AAGrE,QAAA,QAAQ,GAAG,CAAC,IAAI;AACd,YAAA,KAAK,IAAI;gBACP,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC;gBACzC;AACF,YAAA,KAAK,IAAI;gBACP,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC;gBACzC;AACF,YAAA,KAAK,IAAI;gBACP,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC;gBAC3C;;;AAIJ,QAAA,QAAQ,GAAG,CAAC,OAAO;AACjB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACjD,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC7C;AAEF,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC/C,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC7C,gBAAA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;gBACxB;AAEF,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC7C;AAEF,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACjD,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC7C;;;AAIJ,QAAA,IAAI,GAAG,CAAC,UAAU,EAAE;AAClB,YAAA,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;QAC9B;AAEA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,mFAAC;AAEF;;AAEG;AACH,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AACzB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;QACzB,MAAM,OAAO,GAAa,CAAC,cAAc,EAAE,UAAU,EAAE,cAAc,CAAC;;AAGtE,QAAA,QAAQ,GAAG,CAAC,IAAI;AACd,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;gBAC1B;AACF,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;gBAC9B;AACF,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;gBAC1B;;;QAIJ,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAE3C,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,iFAAC;AAEF;;AAEG;AACH,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC1B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;QACzB,MAAM,OAAO,GAAa,EAAE;AAE5B,QAAA,IAAI,GAAG,CAAC,IAAI,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB;;AAGA,QAAA,QAAQ,GAAG,CAAC,IAAI;AACd,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;gBACvB;AACF,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;gBACvB;AACF,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;gBACzB;;AAGJ,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,kFAAC;wGA9JS,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjD7B,uUAgBA,EAAA,MAAA,EAAA,CAAA,oJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED+BY,YAAY,EAAA,CAAA,EAAA,CAAA;;4FAEX,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,EAAA,UAAA,EACR,IAAI,EAAA,OAAA,EAGP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,uUAAA,EAAA,MAAA,EAAA,CAAA,oJAAA,CAAA,EAAA;;;MEZZ,kBAAkB,CAAA;AACpB,IAAA,OAAO;AAEP,IAAA,KAAK;AACL,IAAA,QAAQ;;AAGP,IAAA,IAAI,GAAG,IAAI,YAAY,EAAE;AACzB,IAAA,IAAI,GAAG,IAAI,YAAY,EAAE;AACzB,IAAA,MAAM,GAAG,IAAI,YAAY,EAAE;AAC3B,IAAA,SAAS,GAAG,IAAI,YAAY,EAAE;AAC9B,IAAA,KAAK,GAAG,IAAI,YAAY,EAAE;AAC1B,IAAA,kBAAkB,GAAG,IAAI,YAAY,EAAO;;AAG5C,IAAA,GAAG,GAAG,IAAI,YAAY,EAAE;;;;;;;;AAQxB,IAAA,MAAM,GAAG,IAAI,YAAY,EAAE;AAC3B,IAAA,KAAK,GAAG,IAAI,YAAY,EAAE;IAEpC,UAAU,GAAG,EAAE;;IAGN,UAAU,GAAG,KAAK;IAClB,YAAY,GAAG,KAAK;IACpB,eAAe,GAAG,IAAI;IACtB,UAAU,GAAG,IAAI;IACjB,YAAY,GAAG,KAAK;IACpB,WAAW,GAAG,KAAK;IACnB,SAAS,GAAG,IAAI;IAChB,WAAW,GAAG,IAAI;IAClB,YAAY,GAAG,IAAI;IACnB,mBAAmB,GAAG,KAAK;AAE5B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAE/B,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,MAAM;IAC9C;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,MAAM;IAC9C;AAEA,IAAA,IAAI,iBAAiB,GAAA;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC;IACjD;AAEA,IAAA,IAAI,mBAAmB,GAAA;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;IACnD;AAEA,IAAA,IAAI,iBAAiB,GAAA;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC;IACjD;AAEA,IAAA,IAAI,mBAAmB,GAAA;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;IACnD;AAEA,IAAA,IAAI,sBAAsB,GAAA;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC;IACtD;AAEA,IAAA,IAAI,mBAAmB,GAAA;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;IACnD;AAEA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,aAAa,IAAI,KAAK;IAC7C;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAChB,IAAI,CAAC,YAAY,EAAE;IACrB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;IAClB;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACvB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;IACnB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;IACjB;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;IACjB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;IACnB;IAEA,YAAY,GAAA;AACV,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;AAClC,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC;IACjC;wGAvHW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,qnBCnC/B,u0IAkJA,EAAA,MAAA,EAAA,CAAA,iLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDzHI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,SAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,eAAe,iLACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,WAAW,8BACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAGN,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAhB9B,SAAS;+BACE,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EAGP;wBACP,YAAY;wBACZ,aAAa;wBACb,iBAAiB;wBACjB,eAAe;wBACf,eAAe;wBACf,eAAe;wBACf,WAAW;wBACX,eAAe;AAChB,qBAAA,EAAA,QAAA,EAAA,u0IAAA,EAAA,MAAA,EAAA,CAAA,iLAAA,CAAA,EAAA;;sBAGA;;sBAEA;;sBACA;;sBAGA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAGA;;sBAQA;;sBACA;;sBAKA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;;AEpDH;;;;;;;;;;;;;;;;;;AAkBG;MASU,qBAAqB,CAAA;AACb,IAAA,KAAK,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACnC,IAAA,MAAM,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACtC,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;IAG/B,MAAM,GAAiD,EAAE;AAEzD,IAAA,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc;AAC1C,IAAA,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc;;AAGrC,IAAA,IAAI,GAAG,QAAQ,CAAY,MAAK;QACrC,MAAM,IAAI,GAAc,EAAE;AAC1B,QAAA,IAAI,SAA6B;QACjC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;AACxC,YAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE;gBAC/C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAClC;YACA,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACrC,YAAA,SAAS,GAAG,MAAM,CAAC,KAAK;QAC5B;AACA,QAAA,OAAO,IAAI;AACf,IAAA,CAAC,2EAAC;AAEO,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,gFAAC;AAExE,IAAA,QAAQ,CAAC,MAAgB,EAAA;QACrB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC;IAClD;AAEA,IAAA,QAAQ,CAAC,EAAc,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1B;IAEA,QAAQ,CAAC,KAAa,EAAE,GAAY,EAAA;QAChC,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,GAAG,CAAA,EAAA,EAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAA,CAAE,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE;IACtE;wGArCS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,wGChDlC,qpCA+BA,EAAA,MAAA,EAAA,CAAA,k7DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDec,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,wbAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAE7C,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBARjC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,qpCAAA,EAAA,MAAA,EAAA,CAAA,k7DAAA,CAAA,EAAA;;sBAQtD;;;AE3CL;;;;;;;;AAQG;MAYU,qBAAqB,CAAA;AACb,IAAA,MAAM,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACtC,IAAA,KAAK,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAE3C,IAAA,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY;AACjC,IAAA,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc;AAErC,IAAA,eAAe,GAAG,QAAQ,CAAiB,MAAK;AACrD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACvB,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,EAAE;QAEjB,OAAO,CAAC,CAAC;AACJ,aAAA,GAAG,CAAC,OAAO,KAAK;AACb,YAAA,GAAG,OAAO;YACV,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,CACtD;AACJ,SAAA,CAAC;AACD,aAAA,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACpD,IAAA,CAAC,sFAAC;IAEF,YAAY,CAAC,CAAS,EAAE,CAAe,EAAA;QACnC,OAAO,CAAC,CAAC,EAAE;IACf;IAEA,SAAS,CAAC,CAAS,EAAE,CAAY,EAAA;QAC7B,OAAO,CAAC,CAAC,EAAE;IACf;wGA3BS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/BlC,w1DAqDA,EAAA,MAAA,EAAA,CAAA,m4GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3Bc,YAAY,+BAAE,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,uBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAK5D,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAXjC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,cACd,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAA,IAAA,EAChE;AACF,wBAAA,oBAAoB,EAAE,YAAY;AACrC,qBAAA,EAAA,QAAA,EAAA,w1DAAA,EAAA,MAAA,EAAA,CAAA,m4GAAA,CAAA,EAAA;;;AEvBL;;;;;;;;;;;AAWG;MASU,iBAAiB,CAAA;AAC1B;;;;;;;AAOG;IACM,WAAW,GAAG,KAAK,CAAC,IAAI,mFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEnE;;;;AAIG;IACM,MAAM,GAAG,KAAK,CAAC,IAAI,8EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG3C,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAEzD,OAAO,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;IAC1B;AAEiB,IAAA,MAAM,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAE9C,IAAA,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY;AACjC,IAAA,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa;AAEnC,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,oFAAC;wGA9BrD,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,uVC1B9B,0nCA+BA,EAAA,MAAA,EAAA,CAAA,glDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDPc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,+BAAE,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEtD,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,eAAe,EAAE,sBAAsB,CAAC,EAAA,QAAA,EAAA,0nCAAA,EAAA,MAAA,EAAA,CAAA,glDAAA,CAAA,EAAA;;;AErBpE;;;;;;;;;;;;;;;AAeG;MAWU,kBAAkB,CAAA;AACV,IAAA,YAAY,GAAG,MAAM,CAAC,qBAAqB,CAAC;;IAGrB,MAAM,GAAG,KAAK;;AAG7C,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,+EAAC;wGAP7D,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAIP,gBAAgB,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjCxC,kKAMA,EAAA,MAAA,EAAA,CAAA,geAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDuBa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAV9B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,cACX,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACF,wBAAA,oBAAoB,EAAE,YAAY;AACrC,qBAAA,EAAA,QAAA,EAAA,kKAAA,EAAA,MAAA,EAAA,CAAA,geAAA,CAAA,EAAA;;sBAMA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;;AEtB1C;;;;;;;;;;;;;AAaG;MAaU,sBAAsB,CAAA;IACS,IAAI,GAAG,KAAK;IACZ,iBAAiB,GAAG,IAAI;AAEtD,IAAA,UAAU,GAAG,IAAI,YAAY,EAAW;IAElD,eAAe,GAAA;QACX,IAAI,IAAI,CAAC,iBAAiB;YAAE,IAAI,CAAC,KAAK,EAAE;IAC5C;IAGA,QAAQ,GAAA;QACJ,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,KAAK,EAAE;IAC/B;IAEA,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK;AACjB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;wGAlBS,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,oFACX,gBAAgB,CAAA,EAAA,iBAAA,EAAA,CAAA,mBAAA,EAAA,mBAAA,EAChB,gBAAgB,CAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,MAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvCxC,qVAQA,gmCDuBc,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAMb,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAZlC,SAAS;+BACI,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,CAAC,EAAA,IAAA,EACjB;AACF,wBAAA,iBAAiB,EAAE,MAAM;AACzB,wBAAA,oBAAoB,EAAE,OAAO;AAChC,qBAAA,EAAA,QAAA,EAAA,qVAAA,EAAA,MAAA,EAAA,CAAA,yiCAAA,CAAA,EAAA;;sBAGA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAErC;;sBAMA,YAAY;uBAAC,yBAAyB;;;AE5B3C;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;MAqBU,mBAAmB,CAAA;AACX,IAAA,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC9B,IAAA,KAAK,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACnC,IAAA,MAAM,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACtC,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;IAG/B,MAAM,GAAG,IAAI;AAEb,IAAA,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO;AAC1B,IAAA,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ;AAC3B,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,+EAAC;AAEvD;;;AAG+D;AAEtD,IAAA,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc;AACrC,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,mFAAC;;IAG5B,IAAI,GAAG,QAAQ,CAAa,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,2EAAC;AAC1E,IAAA,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc;AAE/C;;;;;;;AAOG;AACM,IAAA,cAAc,GAAG,QAAQ,CAAiB,MAAK;QACpD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;AACpC,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,EAAE;QACjB,OAAO,CAAC,CAAC;AACJ,aAAA,GAAG,CAAC,OAAO,KAAK;AACb,YAAA,GAAG,OAAO;YACV,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,CACtD;AACJ,SAAA,CAAC;AACD,aAAA,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACpD,IAAA,CAAC,qFAAC;AAEF,IAAA,UAAU,CAAC,IAAe,EAAA;QACtB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;AACrC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;IAChC;IAEA,YAAY,GAAA;AACR,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/B;AAEA,IAAA,gBAAgB,CAAC,IAAa,EAAA;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/B;AAEA,IAAA,QAAQ,CAAC,MAAgB,EAAA;QACrB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC;AAC9C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;IAChC;wGA9DS,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,oKCnEhC,2/HA8GA,EAAA,MAAA,EAAA,CAAA,qjFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxDQ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,iBAAiB,0FACjB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACtB,eAAe,+BACf,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAML,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBApB/B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,cACZ,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACL,YAAY;wBACZ,qBAAqB;wBACrB,qBAAqB;wBACrB,iBAAiB;wBACjB,kBAAkB;wBAClB,sBAAsB;wBACtB,eAAe;wBACf,UAAU;qBACb,EAAA,IAAA,EACK;AACF,wBAAA,sBAAsB,EAAE,YAAY;AACvC,qBAAA,EAAA,QAAA,EAAA,2/HAAA,EAAA,MAAA,EAAA,CAAA,qjFAAA,CAAA,EAAA;;sBASA;;;AE5DL;;;;;;;;;;;;;;AAcG;MAgBU,yBAAyB,CAAA;AACjB,IAAA,KAAK,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACnC,IAAA,MAAM,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACtC,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAE/B,IAAA,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc;AACrC,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,mFAAC;IAE5B,IAAI,GAAG,QAAQ,CAAa,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,2EAAC;AAC1E,IAAA,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc;IAE/C,YAAY,GAAA,EAAW,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACpD,IAAA,gBAAgB,CAAC,IAAa,EAAA,EAAU,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAErE,IAAA,QAAQ,CAAC,MAAgB,EAAA;QACrB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC;AAC9C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;IAChC;wGAjBS,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5CtC,s3DAwDA,EAAA,MAAA,EAAA,CAAA,yvEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpBQ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,iBAAiB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,kBAAkB,4EAClB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGjB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAfrC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,cACnB,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACL,YAAY;wBACZ,eAAe;wBACf,aAAa;wBACb,iBAAiB;wBACjB,kBAAkB;wBAClB,sBAAsB;AACzB,qBAAA,EAAA,QAAA,EAAA,s3DAAA,EAAA,MAAA,EAAA,CAAA,yvEAAA,CAAA,EAAA;;;AE7BL;;;;;;;;;;;;;AAaG;MAaU,cAAc,CAAA;IACd,IAAI,GAAG,YAAY;AACnB,IAAA,KAAK;;AAEL,IAAA,QAAQ;IAER,QAAQ,GAAkB,cAAc;IAET,QAAQ,GAAG,KAAK;AAE9C,IAAA,KAAK,GAAG,IAAI,YAAY,EAAc;AAEhD,IAAA,IAAI,UAAU,GAAA;QACV,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC;IAC1C;AAEA,IAAA,OAAO,CAAC,CAAa,EAAA;QACjB,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C;wGAlBS,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,iKAQH,gBAAgB,CAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/CxC,2XAkBA,EAAA,MAAA,EAAA,CAAA,wpCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDec,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAM9B,cAAc,EAAA,UAAA,EAAA,CAAA;kBAZ1B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,QAAQ,EAAA,UAAA,EACN,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,eAAe,CAAC,EAAA,IAAA,EAClC;AACF,wBAAA,sBAAsB,EAAE,UAAU;AAClC,wBAAA,qBAAqB,EAAE,YAAY;AACtC,qBAAA,EAAA,QAAA,EAAA,2XAAA,EAAA,MAAA,EAAA,CAAA,wpCAAA,CAAA,EAAA;;sBAGA;;sBACA;;sBAEA;;sBAEA;;sBAEA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAErC;;;AEnCL;;;;;;;;;;;;;;;AAeG;MASU,oBAAoB,CAAA;IACF,KAAK,GAAiC,EAAE;IAC1D,KAAK,GAAa,IAAI;IACtB,SAAS,GAAG,SAAS;;IAErB,UAAU,GAAG,KAAK;AAER,IAAA,WAAW,GAAG,IAAI,YAAY,EAAK;AAEtD,IAAA,MAAM,CAAC,IAAmB,EAAA;QACtB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE;AAC3B,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;YACvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QACrC;IACJ;IAEA,UAAU,CAAC,CAAS,EAAE,IAAmB,EAAA;QACrC,OAAO,IAAI,CAAC,KAAK;IACrB;wGAlBS,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtCjC,0wBAwBA,EAAA,MAAA,EAAA,CAAA,sjCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDYc,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAE9B,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBARhC,SAAS;+BACI,eAAe,EAAA,UAAA,EACb,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,0wBAAA,EAAA,MAAA,EAAA,CAAA,sjCAAA,CAAA,EAAA;;sBAGvC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;sBACA;;sBAEA;;sBAEA;;;AE3CL;;;;;;;;;;;;;;;;;;;;AAoBG;MAKU,mBAAmB,CAAA;AACnB,IAAA,WAAW,GAAG,MAAM,CAAuB,WAAW,CAAC;AAGhE,IAAA,KAAK;wGAJI,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,CAAA,YAAA,EAAA,OAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAJ/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,UAAU,EAAE,IAAI;AACnB,iBAAA;;sBAII,KAAK;AAAC,gBAAA,IAAA,EAAA,CAAA,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;;;ACoBlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCG;MAeU,eAAe,CAAA;IACG,KAAK,GAAgC,EAAE;AAClE;;AAE+C;IACtC,KAAK,GAAa,IAAI;AAE/B;AACgE;IACvD,OAAO,GAAkB,MAAM;AAExC;;;AAGmD;AAC1C,IAAA,MAAM;AAEf;;AAEY;IAC4B,QAAQ,GAAG,KAAK;;IAGhB,UAAU,GAAG,KAAK;IAEjD,SAAS,GAAG,MAAM;AAE3B;;AAE6B;IACpB,aAAa,GAAG,cAAc;AAEpB,IAAA,WAAW,GAAG,IAAI,YAAY,EAAK;AAEvB,IAAA,MAAM;;AAKpB,IAAA,MAAM;AAEN,IAAA,QAAQ,GAAG,MAAM,CAAoC,IAAI,GAAG,EAAE,+EAAC;AAEhF;;AAEuC;IACvC,WAAW,GAAA;AACP,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK;AACpB,QAAA,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI;AAC9C,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;IACjD;AAEA;AACoE;IACpE,SAAS,GAAA;QACL,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC;IACnC;IAEA,kBAAkB,GAAA;AACd,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACnF;AAEA,IAAA,MAAM,CAAC,IAAkB,EAAA;QACrB,IAAI,IAAI,CAAC,QAAQ;YAAE;QACnB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE;AAC3B,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;YACvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QACrC;IACJ;IAEA,SAAS,CAAC,KAAoB,EAAE,KAAa,EAAA;AACzC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK;AACtB,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE;;QAGtB,MAAM,gBAAgB,GAAa,EAAE;AACrC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACjC,YAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ;AAAE,gBAAA,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD;AACA,QAAA,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAAE;QAEnC,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC;AAC5C,QAAA,IAAI,OAAO,GAAG,CAAC,CAAC;AAEhB,QAAA,QAAQ,KAAK,CAAC,GAAG;AACb,YAAA,KAAK,YAAY;AACb,gBAAA,OAAO,GAAG,gBAAgB,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC;gBAChE;AACJ,YAAA,KAAK,WAAW;gBACZ,OAAO;AACH,oBAAA,gBAAgB,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,gBAAgB,CAAC,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC;gBACpF;AACJ,YAAA,KAAK,MAAM;AACP,gBAAA,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC;gBAC7B;AACJ,YAAA,KAAK,KAAK;gBACN,OAAO,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;gBACvD;AACJ,YAAA;gBACI;;QAGR,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;;;AAGnB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,aAAa;QACzD,EAAE,EAAE,KAAK,EAAE;IACf;IAEA,UAAU,CAAC,CAAS,EAAE,IAAkB,EAAA;QACpC,OAAO,IAAI,CAAC,KAAK;IACrB;wGAlHS,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAoBJ,gBAAgB,CAAA,EAAA,UAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAGhB,gBAAgB,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,0BAAA,EAAA,yBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAenB,mBAAmB,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1IxC,m6CA2CA,EAAA,MAAA,EAAA,CAAA,u3IAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDiDc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAQ9B,eAAe,EAAA,UAAA,EAAA,CAAA;kBAd3B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,EAAA,UAAA,EACP,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,eAAe,CAAC,EAAA,IAAA,EAClC;AACF,wBAAA,uBAAuB,EAAE,oBAAoB;AAC7C,wBAAA,4BAA4B,EAAE,yBAAyB;AACvD,wBAAA,2BAA2B,EAAE,UAAU;AACvC,wBAAA,oBAAoB,EAAE,gBAAgB;AACzC,qBAAA,EAAA,QAAA,EAAA,m6CAAA,EAAA,MAAA,EAAA,CAAA,u3IAAA,CAAA,EAAA;;sBAGA,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBAIxB;;sBAIA;;sBAMA;;sBAKA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAGrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAErC;;sBAKA;;sBAEA;;sBAEA,YAAY;uBAAC,OAAO;;sBAIpB,eAAe;uBAAC,mBAAmB;;AA+ExC,SAAS,UAAU,CACf,MAAsC,EAAA;AAEtC,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAgC;IACnD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;AACpD,IAAA,OAAO,GAAG;AACd;;AEpNA;;;;;;;;;;;;;;;;;;;;AAoBG;MASU,sBAAsB,CAAA;;AAEtB,IAAA,IAAI;;AAGJ,IAAA,IAAI;;AAGJ,IAAA,OAAO;;AAGP,IAAA,OAAO;;IAGP,IAAI,GAAyB,QAAQ;;IAGN,QAAQ,GAAG,KAAK;AAErC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAS;AAEzD,IAAA,IAAI,eAAe,GAAA;AACf,QAAA,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE;AACvD,QAAA,OAAO,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG;IACxD;AAEA,IAAA,WAAW,CAAC,KAAY,EAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAChB,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/B;IACJ;wGA9BS,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,kLAiBX,gBAAgB,CAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzDxC,0sBAyBA,EAAA,MAAA,EAAA,CAAA,2yCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDac,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAE9B,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBARlC,SAAS;+BACI,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,0sBAAA,EAAA,MAAA,EAAA,CAAA,2yCAAA,CAAA,EAAA;;sBAIvC;;sBAGA;;sBAGA;;sBAGA;;sBAGA;;sBAGA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAErC;;;MEjDQ,kBAAkB,CAAA;IACpB,SAAS,GAAG,KAAK;AACjB,IAAA,YAAY;wGAFV,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECV/B,4zBAoBA,EAAA,MAAA,EAAA,CAAA,gIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDZY,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAEZ,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,OAAA,EAGP,CAAC,aAAa,CAAC,EAAA,QAAA,EAAA,4zBAAA,EAAA,MAAA,EAAA,CAAA,gIAAA,CAAA,EAAA;;sBAGvB;;sBACA;;;MEJU,uBAAuB,CAAA;IACzB,KAAK,GAA8B,EAAE;IACrC,QAAQ,GAAG,EAAE;AAEL,IAAA,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;IAExC,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,EAAE,CAAC,aAAa;IAC9B;AAEA,IAAA,IAA0B,cAAc,GAAA;QACtC,OAAO,IAAI,CAAC,KAAK;IACnB;AAEA,IAAA,IAA0B,cAAc,GAAA;QACtC,OAAO,IAAI,CAAC,QAAQ;IACtB;wGAhBW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,wNAFxB,CAAA,yBAAA,CAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;4FAE1B,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBALnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,CAAA,yBAAA,CAA2B;AACtC,iBAAA;;sBAEE;;sBACA;;sBAQA,WAAW;uBAAC,OAAO;;sBAInB,WAAW;uBAAC,OAAO;;;AClBtB;;;;;;;;;;;;AAYG;MASU,gBAAgB,CAAA;;AAEhB,IAAA,KAAK;;AAEL,IAAA,QAAQ;;IAER,QAAQ,GAA2C,SAAS;;IAE5D,MAAM,GAAG,IAAI;wGARb,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzB7B,mZASA,EAAA,MAAA,EAAA,CAAA,kjCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDcc,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAE9B,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAR5B,SAAS;+BACI,UAAU,EAAA,UAAA,EACR,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,mZAAA,EAAA,MAAA,EAAA,CAAA,kjCAAA,CAAA,EAAA;;sBAIvC;;sBAEA;;sBAEA;;sBAEA;;;AEbL;;;;;;;;;;;;;;;AAeG;MASU,qBAAqB,CAAA;AACf,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;;AAGjD,IAAA,IAAI,GAAG,KAAK,CAAc,IAAI,2EAAC;;AAE/B,IAAA,QAAQ,GAAG,KAAK,CAAS,cAAc,+EAAC;;AAExC,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;;AAE/B,IAAA,QAAQ,GAAG,KAAK,CAAS,mBAAmB,+EAAC;IAE7C,YAAY,GAAG,KAAK,CAAC,IAAI,oFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC3D,SAAS,GAAG,KAAK,CAAC,IAAI,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,gBAAgB,GAAG,KAAK,CAAC,IAAI,wFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAE/D,iBAAiB,GAAG,KAAK,CAAC,KAAK,yFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAEjE,IAAA,aAAa,GAAG,KAAK,CAAS,EAAE,oFAAC;AAEhB,IAAA,SAAS,GAAG,MAAM,CAAgB,IAAI,gFAAC;IAChD,UAAU,GAAkB,IAAI;AAE/B,IAAA,OAAO,GAAG,QAAQ,CAAyB,MAAK;AACvD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;AAC5B,QAAA,OAAO,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,GAAG,CAAC,GAAG,IAAI;AACxE,IAAA,CAAC,8EAAC;AAEF;AAC8D;AACrD,IAAA,OAAO,GAAG,QAAQ,CAAmB,MAAK;AACjD,QAAA,MAAM,IAAI,GAAqB;AAC7B,YAAA;AACE,gBAAA,QAAQ,EAAE,cAAc;AACxB,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,UAAU,EAAE,oBAAoB;AAChC,gBAAA,OAAO,EAAE,IAAI;AACd,aAAA;SACF;AACD,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC;AACR,gBAAA,QAAQ,EAAE,sBAAsB;AAChC,gBAAA,IAAI,EAAE,gBAAgB;AACtB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,UAAU,EAAE,cAAc;AAC1B,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,OAAO,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE;AACpC,aAAA,CAAC;QACJ;AACA,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC;AACR,gBAAA,QAAQ,EAAE,sBAAsB;AAChC,gBAAA,IAAI,EAAE,gBAAgB;AACtB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,UAAU,EAAE,cAAc;AAC1B,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,OAAO,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE;AAC/B,aAAA,CAAC;QACJ;AACA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC;AACR,gBAAA,QAAQ,EAAE,wBAAwB;AAClC,gBAAA,IAAI,EAAE,qBAAqB;AAC3B,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,OAAO,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE;AACnC,aAAA,CAAC;QACJ;AACA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB,IAAI,CAAC,IAAI,CAAC;AACR,gBAAA,QAAQ,EAAE,mBAAmB;AAC7B,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,QAAQ,EAAE,SAAS;AACnB,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,OAAO,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE;AAC5B,aAAA,CAAC;QACJ;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,8EAAC;AAEF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;YACxB,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI;YACzD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;AACrC,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;IACnD;IAEQ,MAAM,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;AACpC,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACxB;IACF;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACzB;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;QACtB,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACrC,QAAA,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU;AACxB,QAAA,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC5B,CAAC,CAAC,KAAK,EAAE;IACX;IAEA,YAAY,GAAA;QACV,IAAI,IAAI,CAAC,UAAU;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC7D;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;AACtB,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC;AAClD,QAAA,GAAG,EAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IAClD;IAEA,aAAa,GAAA;AACX,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,CAAC,IAAI;YAAE;QACX,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;QAC3E,MAAM,GAAG,GAAG,SAEX;AACD,QAAA,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YAClD;AACG,iBAAA,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE;iBAC/C,KAAK,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YACtC;QACF;QACA,IAAI,CAAC,eAAe,EAAE;IACxB;IAEQ,eAAe,GAAA;AACrB,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;QAClE,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG;AACV,cAAE,CAAA,cAAA,EAAiB,KAAK,CAAA,MAAA,EAAS,GAAG,CAAA;AACpC,cAAE,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAE;AAChC,QAAA,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;IAC5B;wGA/IW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,w0CC5ClC,wgBAiBA,EAAA,MAAA,EAAA,CAAA,6PAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDuBY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,+BAAE,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,UAAA,EAAA,aAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAI/C,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBARjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,eAAe,EAAE,iBAAiB,CAAC,EAAA,QAAA,EAAA,wgBAAA,EAAA,MAAA,EAAA,CAAA,6PAAA,CAAA,EAAA;;;AEF7D;AACO,MAAM,gBAAgB,GAAiC;IAC1D,SAAS;IACT,YAAY;IACZ,SAAS;IACT,WAAW;IACX,WAAW;IACX,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;;AAGb;;;;;;AAMG;AACI,MAAM,uBAAuB,GAA4C;AAC5E,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,MAAM,EAAE,UAAU;AAClB,IAAA,MAAM,EAAE,SAAS;AACjB,IAAA,IAAI,EAAE,YAAY;AAClB,IAAA,MAAM,EAAE,SAAS;AACjB,IAAA,KAAK,EAAE,WAAW;AAClB,IAAA,GAAG,EAAE,WAAW;;AAGpB;;;;;AAKG;AACG,SAAU,oBAAoB,CAChC,KAAgC,EAAA;AAEhC,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,SAAS;AAC5B,IAAA,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE;AAC7B,IAAA,IAAK,gBAA0C,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;AACzD,QAAA,OAAO,CAAkB;IAC7B;AACA,IAAA,OAAO,uBAAuB,CAAC,CAAC,CAAC;AACrC;;ACjEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BG;MASU,qBAAqB,CAAA;IACb,cAAc,GAAG,MAAM,CACpC,uBAAuB,EACvB,EAAE,QAAQ,EAAE,IAAI,EAAE,CACrB;;AAGQ,IAAA,YAAY,GAAG,KAAK,CAAS,EAAE,mFAAC;;AAGhC,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,2EAAC;;AAGxB,IAAA,KAAK,GAAG,KAAK,CAAqB,EAAE,4EAAC;;AAGrC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;;AAEzB,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;;IAG5B,OAAO,GAAG,KAAK,CAAC,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGvD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAGhD,IAAA,KAAK,GAAG,QAAQ,CAAoC,MAAK;QACtE,IAAI,CAAC,IAAI,CAAC,cAAc;AAAE,YAAA,OAAO,SAAS;AAC1C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;AAC/B,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,SAAS;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE;AACpD,QAAA,OAAO,IAAI,CAAC,IAAI,CACZ,CAAC,IAA2B,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAC9D;AACL,IAAA,CAAC,4EAAC;AAEF;;AAE4B;AACnB,IAAA,aAAa,GAAG,QAAQ,CAAgB,MAAK;AAClD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE;AAC3B,QAAA,IAAI,MAAM;AAAE,YAAA,OAAO,MAAuB;QAE1C,QACI,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC;AACnD,YAAA,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACjC,YAAA,SAAS;AAEjB,IAAA,CAAC,oFAAC;;AAGO,IAAA,aAAa,GAAG,QAAQ,CAAS,MAAK;AAC3C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;AACtD,IAAA,CAAC,oFAAC;;AAGO,IAAA,gBAAgB,GAAG,QAAQ,CAAS,MAAK;AAC9C,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,IAAI,EAAE;AAC1D,IAAA,CAAC,uFAAC;wGA5DO,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1DlC,wcAeA,EAAA,MAAA,EAAA,CAAA,uEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDsCc,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAK9B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBARjC,SAAS;+BACI,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,CAAC,EAAA,eAAA,EAGvB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wcAAA,EAAA,MAAA,EAAA,CAAA,uEAAA,CAAA,EAAA;;;AE9BnD;;;;;;;;;;;;;AAaG;MASU,sBAAsB,CAAA;AAChB,IAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC;AACrC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGvC,IAAA,QAAQ,GAAG,KAAK,CAAwB,cAAc,+EAAC;;AAGvD,IAAA,QAAQ,GAAG,KAAK,CAAS,CAAC,+EAAC;;IAG3B,YAAY,GAAG,KAAK,CAAC,KAAK,oFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAErE;AACqE;AAC5D,IAAA,OAAO,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAE,8EAAC;AAEzD;AACsD;AAC7C,IAAA,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM;AAE1C;AAC6D;AAC5C,IAAA,MAAM,GAAG,IAAI,GAAG,EAAyC;AAE1E,IAAA,WAAA,GAAA;;;QAGE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE;YAC1B,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtC,SAAS,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AAC7C,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;YAC7B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBAAE,YAAY,CAAC,CAAC,CAAC;AACrD,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACrB,QAAA,CAAC,CAAC;IACJ;;AAIA,IAAA,aAAa,CAAC,CAAU,EAAA;QACtB,OAAO,CAAA,MAAA,EAAS,CAAC,CAAC,QAAQ,CAAA,CAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC;IACzE;AAEA,IAAA,SAAS,CAAC,CAAU,EAAA;AAClB,QAAA,QAAQ,CAAC,CAAC,QAAQ;AAChB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,aAAa;AACtB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,4BAA4B;AACrC,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,aAAa;AACtB,YAAA,KAAK,MAAM;AACX,YAAA;AACE,gBAAA,OAAO,mBAAmB;;IAEhC;AAEA,IAAA,aAAa,CAAC,CAAU,EAAA;AACtB,QAAA,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;AAAE,YAAA,OAAO,IAAI;QAC5B,OAAO,EAAE,cAAc,EAAE,CAAA,EAAG,CAAC,CAAC,IAAI,CAAA,EAAA,CAAI,EAAE;IAC1C;;AAIA,IAAA,OAAO,CAAC,CAAU,EAAA;AAChB,QAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACtB;IAEA,aAAa,CAAC,CAAU,EAAE,MAAqB,EAAA;AAC7C,QAAA,MAAM,CAAC,OAAO,IAAI;AAClB,QAAA,IAAI,MAAM,CAAC,cAAc,KAAK,KAAK;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D;IAEA,SAAS,GAAG,CAAC,CAAS,EAAE,CAAU,KAAa,CAAC,CAAC,EAAE;;AAI3C,IAAA,UAAU,CAAC,IAA4B,EAAA;AAC7C,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;;QAGjD,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;YACtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBACvB,YAAY,CAAC,MAAM,CAAC;AACpB,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB;QACF;;AAGA,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;gBAAE;YAC1C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC;QAC/B;IACF;AAEQ,IAAA,eAAe,CAAC,IAA4B,EAAA;AAClD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC3B,IAAI,GAAG,IAAI,CAAC;YAAE;AACd,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG;QAClC,IAAI,QAAQ,IAAI,CAAC;YAAE;;AAEnB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE;YACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5B;IACF;AAEA;;AAE8B;AACtB,IAAA,SAAS,CAAC,EAAU,EAAA;QAC1B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AAC1B,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACZ,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,IAAI,MAAM,EAAE;YACV,YAAY,CAAC,MAAM,CAAC;AACpB,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB;;QAEA,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AAC1B,gBAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,gBAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACf,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,CAAC,EAAE,GAAG,CAAC;IACT;wGAtIW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChDnC,k6EA8DA,EAAA,MAAA,EAAA,CAAA,8CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDnBY,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAK5B,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBARlC,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,CAAC,EAAA,eAAA,EAGvB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,k6EAAA,EAAA,MAAA,EAAA,CAAA,8CAAA,CAAA,EAAA;;;AE5CjD;;;;;;;;;;;;;;;;;;;;AAoBG;MAQU,mBAAmB,CAAA;wGAAnB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,kHAJlB,2BAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAI5B,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,2BAA2B;AACrC,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE;oBAC/B,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAClD,iBAAA;;;ACdD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCG;MASU,wBAAwB,CAAA;;AAGnC;;AAEgD;AACvC,IAAA,aAAa,GAAG,KAAK,CAAuC,EAAE,oFAAC;AAExE;;AAE4D;AACnD,IAAA,OAAO,GAAG,KAAK,CAA4B,SAAS,8EAAC;;IAGrD,eAAe,GAAG,KAAK,CAAC,KAAK,uFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG/D,mBAAmB,GAAG,KAAK,CAAC,KAAK,2FAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGnE,gBAAgB,GAAG,KAAK,CAAC,KAAK,wFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGhE,cAAc,GAAG,KAAK,CAAC,IAAI,sFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG7D,MAAM,GAAG,KAAK,CAAC,KAAK,8EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAE/D;AACoE;AAC3D,IAAA,YAAY,GAAG,KAAK,CAAS,aAAa,mFAAC;;AAIpD;;AAE8C;IACrC,YAAY,GAAG,MAAM,EAAyB;IAE9C,KAAK,GAAG,MAAM,EAAQ;IACtB,SAAS,GAAG,MAAM,EAAQ;IAC1B,MAAM,GAAG,MAAM,EAAQ;IACvB,IAAI,GAAG,MAAM,EAAQ;;;AAKrB,IAAA,oBAAoB,GAAG,QAAQ,CAEtC,MAAK;AACL,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;QAC1B,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACzE,IAAA,CAAC,2FAAC;IAEO,QAAQ,GAAG,QAAQ,CAAC,MAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,WAAW,CAAC,KAAK,CAAC,+EAC9D;IACQ,YAAY,GAAG,QAAQ,CAAC,MAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,WAAW,CAAC,SAAS,CAAC,mFACtE;IACQ,SAAS,GAAG,QAAQ,CAAC,MAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,WAAW,CAAC,MAAM,CAAC,gFAChE;IACQ,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IAE/C,kBAAkB,GAAG,QAAQ,CACpC,MACE,IAAI,CAAC,QAAQ,EAAE;QACf,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,OAAO,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACjB;AACQ,IAAA,gBAAgB,GAAG,QAAQ,CAClC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC,MAAM,GAAG,CAAC,uFAC7C;;AAGQ,IAAA,aAAa,GAAG,QAAQ,CAC/B,MAAM,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE,oFAC3D;;AAID,IAAA,aAAa,CAAC,MAA6B,EAAA;QACzC,IAAI,MAAM,CAAC,QAAQ;YAAE;AACrB,QAAA,MAAM,CAAC,OAAO,IAAI;AAClB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;IAChC;;IAIQ,eAAe,CACrB,MAA6B,EAC7B,GAA8B,EAAA;AAE9B,QAAA,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;AAAE,YAAA,OAAO,KAAK;AAC1C,QAAA,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;AAC/D,YAAA,OAAO,KAAK;AACd,QAAA,OAAO,IAAI;IACb;AAEA;AACkD;IAC1C,aAAa,CACnB,IAAa,EACb,IAGsB,EAAA;AAEtB,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,KAAK;AACvB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;AAC1B,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;QACrB,QAAQ,IAAI;YACV,KAAK,WAAW,CAAC,KAAK;gBACpB,OAAO,GAAG,CAAC,kBAAkB;YAC/B,KAAK,WAAW,CAAC,SAAS;gBACxB,OAAO,GAAG,CAAC,sBAAsB;YACnC,KAAK,WAAW,CAAC,MAAM;gBACrB,OAAO,GAAG,CAAC,mBAAmB;;IAEpC;;IAGA,aAAa,GAAG,CAAC,CAAS,EAAE,CAAwB,KAClD,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC;wGA7HzB,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,k3CC/DrC,ysEA2EA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjBY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,+BAAE,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,SAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAK/C,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBARpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,EAAE,iBAAiB,CAAC,EAAA,IAAA,EAErD,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAA,eAAA,EAChB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ysEAAA,EAAA;;;AE9CjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCG;MASU,wBAAwB,CAAA;;AAGnC;;AAEgD;AACvC,IAAA,aAAa,GAAG,KAAK,CAAuC,EAAE,oFAAC;AAExE;;AAEiD;AACxC,IAAA,OAAO,GAAG,KAAK,CAA4B,SAAS,8EAAC;;IAGrD,gBAAgB,GAAG,KAAK,CAAC,KAAK,wFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGhE,aAAa,GAAG,KAAK,CAAC,IAAI,qFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG5D,IAAI,GAAG,KAAK,CAAC,KAAK,4EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAE7D;;AAEgC;AACvB,IAAA,WAAW,GAAG,KAAK,CAAS,YAAY,kFAAC;;AAGzC,IAAA,cAAc,GAAG,KAAK,CAAS,eAAe,qFAAC;;AAIxD;;AAE8C;IACrC,YAAY,GAAG,MAAM,EAAyB;IAE9C,MAAM,GAAG,MAAM,EAAQ;IACvB,GAAG,GAAG,MAAM,EAAQ;;;AAKpB,IAAA,oBAAoB,GAAG,QAAQ,CAEtC,MAAK;AACL,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;QAC1B,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACzE,IAAA,CAAC,2FAAC;IAEO,SAAS,GAAG,QAAQ,CAAC,MAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,WAAW,CAAC,MAAM,CAAC,gFAChE;IACQ,MAAM,GAAG,QAAQ,CAAC,MACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,MAAM,CAAC,6EAC7D;AAEQ,IAAA,kBAAkB,GAAG,QAAQ,CACpC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,yFACxC;AACQ,IAAA,gBAAgB,GAAG,QAAQ,CAClC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC,MAAM,GAAG,CAAC,uFAC7C;;AAGQ,IAAA,aAAa,GAAG,QAAQ,CAC/B,MAAM,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE,oFAC3D;;AAID,IAAA,aAAa,CAAC,MAA6B,EAAA;QACzC,IAAI,MAAM,CAAC,QAAQ;YAAE;AACrB,QAAA,MAAM,CAAC,OAAO,IAAI;AAClB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;IAChC;;IAIQ,eAAe,CACrB,MAA6B,EAC7B,GAA8B,EAAA;AAE9B,QAAA,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;AAAE,YAAA,OAAO,KAAK;AAC1C,QAAA,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;AAC/D,YAAA,OAAO,KAAK;AACd,QAAA,OAAO,IAAI;IACb;AAEA;AACkD;IAC1C,aAAa,CACnB,IAAa,EACb,IAA6C,EAAA;AAE7C,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,KAAK;AACvB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;AAC1B,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;QACrB,QAAQ,IAAI;YACV,KAAK,WAAW,CAAC,MAAM;gBACrB,OAAO,GAAG,CAAC,mBAAmB;YAChC,KAAK,WAAW,CAAC,MAAM;gBACrB,OAAO,GAAG,CAAC,mBAAmB;;IAEpC;;IAGA,aAAa,GAAG,CAAC,CAAS,EAAE,CAAwB,KAClD,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC;wGA5GzB,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,upCCjErC,ynDAqDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDOY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,+BAAE,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,SAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAK/C,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBARpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,EAAE,iBAAiB,CAAC,EAAA,IAAA,EAErD,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAA,eAAA,EAChB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ynDAAA,EAAA;;;AE1DjD;;;;;;;;;;;;;;;;;AAiBG;MAgCU,iBAAiB,CAAA;AACjB,IAAA,IAAI,GAAG,KAAK,CAA6B,EAAE,2EAAC;AAC5C,IAAA,KAAK,GAAG,KAAK,CAA4B,SAAS,4EAAC;wGAFnD,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,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,WAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3BhB;;;;;;;;;;;;;;;;;;;;;;;KAuBT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAxBS,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FA4B9B,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBA/B7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC;AACxC,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;AAuBT,IAAA,CAAA;AACD,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACzB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAClD,iBAAA;;;AChDD;;;;;;;;;;;;;;;;;;;AAmBG;MAoBU,gBAAgB,CAAA;AAChB,IAAA,IAAI,GAAG,KAAK,CAA4B,EAAE,2EAAC;wGAD3C,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAff;;;;;;;;;;;KAWT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAZS,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAgB9B,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAnB5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,UAAU;AACpB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC;AACxC,oBAAA,QAAQ,EAAE;;;;;;;;;;;AAWT,IAAA,CAAA;AACD,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;oBACxB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAClD,iBAAA;;;ACtCD;;;;;;;;;;;;;;;;;;;;AAoBG;MA6BU,mBAAmB,CAAA;AACnB,IAAA,KAAK,GAAG,KAAK,CAAgC,EAAE,4EAAC;wGADhD,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,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,aAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxBlB;;;;;;;;;;;;;;;;;;;;KAoBT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EArBS,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAyB9B,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBA5B/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC;AACxC,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;AAoBT,IAAA,CAAA;AACD,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;oBAC3B,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAClD,iBAAA;;;AChDD;;;;;;;;;;;;;;;;;;;;;;AAsBG;MAiCU,kBAAkB,CAAA;;AAElB,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;;AAE5B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;;AAGzB,IAAA,KAAK,GAAG,KAAK,CAAkB,EAAE,4EAAC;;AAGlC,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,2EAAC;;AAGxB,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;;AAGzB,IAAA,SAAS,GAAG,KAAK,CAAiB,IAAI,gFAAC;;AAGvC,IAAA,KAAK,GAAG,KAAK,CAAiB,EAAE,4EAAC;AAE1C;;AAEgC;AACvB,IAAA,UAAU,GAAG,KAAK,CAAS,eAAe,iFAAC;AAEpD;;AAEgC;AACvB,IAAA,WAAW,GAAG,QAAQ,CAAgB,MAAK;AAChD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE;AAC3B,QAAA,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;QAE7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;AAC/B,QAAA,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;QAC5B,MAAM,KAAK,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAEvC,QAAA,OAAO;AACF,aAAA,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACV,YAAA,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;;;YAGjC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;AACrD,YAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,EAAE;AACtB,QAAA,CAAC;aACA,IAAI,CAAC,GAAG,CAAC;AAClB,IAAA,CAAC,kFAAC;wGA/CO,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,KAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA5BjB;;;;;;;;;;;;;;;;;;;;;;;;KAwBT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAzBS,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FA6B9B,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAhC9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC;AACxC,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,IAAA,CAAA;AACD,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;oBACtB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAClD,iBAAA;;;AC7CD;;;;;;AAM6D;AACtD,MAAM,gBAAgB,GAA0B;IACrD,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;;SAGlD,gBAAgB,CAC9B,IAAiB,EACjB,MAA6B,EAC7B,MAAoC;AACpC;AACA,WAAoB,EAAA;IAEpB,MAAM,OAAO,GAA0B;UACnC,CAAC,WAAW,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC;UAC9F,gBAAgB;AACpB,IAAA,MAAM,SAAS,GAAc,IAAI,KAAK,OAAO,GAAG,UAAU,GAAG,IAAI;IACjE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACnC,QAAA,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;AACpD,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;YACpB,OAAO;gBACL,KAAK,EAAE,CAAC,CAAC,KAAK;AACd,gBAAA,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AACjB,gBAAA,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CACzB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAClE;AACD,gBAAA,WAAW,EAAE,CAAC;aACf;QACH;AACA,QAAA,IAAI,IAAI,KAAK,MAAM,EAAE;YACnB,OAAO;gBACL,KAAK,EAAE,CAAC,CAAC,KAAK;AACd,gBAAA,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AACjB,gBAAA,WAAW,EAAE,KAAK;gBAClB,eAAe,EAAE,CAAA,EAAG,KAAK,CAAA,EAAA,CAAI;AAC7B,gBAAA,IAAI,EAAE,IAAI;AACV,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,WAAW,EAAE,CAAC;AACd,gBAAA,WAAW,EAAE,CAAC;aACf;QACH;QACA,OAAO;YACL,KAAK,EAAE,CAAC,CAAC,KAAK;AACd,YAAA,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AACjB,YAAA,eAAe,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK;AAChF,YAAA,YAAY,EAAE,CAAC;SAChB;AACH,IAAA,CAAC,CAAC;IAEF,OAAO;AACL,QAAA,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,QAAQ,EAAE;AACvC,QAAA,OAAO,EAAE;AACP,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,mBAAmB,EAAE,KAAK;AAC1B,YAAA,IAAI,IAAI,KAAK,OAAO,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC9C,YAAA,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,KAAK,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;YACtE,MAAM,EACJ,IAAI,KAAK;AACP,kBAAE;AACF,kBAAE;oBACE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;AAC/B,oBAAA,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE;AAC9D,iBAAA;AACR,SAAA;KACoB;AACzB;;AC1EA,KAAK,CAAC,QAAQ,CACZ,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,EAChF,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAEU,SAAO,CACxE;AAED;;;;;;;;;;AAUG;MASU,gBAAgB,CAAA;AAClB,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAe;AACpC,IAAA,MAAM,GAAG,KAAK,CAAwB,EAAE,6EAAC;AACzC,IAAA,MAAM,GAAG,KAAK,CAA+B,EAAE,6EAAC;AAChD,IAAA,MAAM,GAAG,KAAK,CAAC,GAAG,6EAAC;AAEX,IAAA,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAgC,QAAQ,CAAC;IAC7E,KAAK,GAAiB,IAAI;AAElC,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;;;AAGV,YAAA,MAAM,WAAW,GACf,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE;AACjF,gBAAA,SAAS;YACX,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC;;AAEpF,YAAA,IAAI,IAAI,CAAC,KAAK,IAAK,IAAI,CAAC,KAAK,CAAC,MAA6B,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE;gBAC7E,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI;AAC1B,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACrB;iBAAO;AACL,gBAAA,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE;AACrB,gBAAA,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC;YAC1D;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACnB;wGA/BW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAJjB,CAAA,kFAAA,CAAoF,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,2CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EADpF,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKX,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAR5B,SAAS;+BACE,UAAU,EAAA,UAAA,EACR,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EACb,CAAA,kFAAA,CAAoF,EAAA,eAAA,EAE7E,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,2CAAA,CAAA,EAAA;ycAQ6B,QAAQ,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AC/BtF;MAkCa,mBAAmB,CAAA;AACrB,IAAA,IAAI,GAAG,KAAK,CAA2B,EAAE,2EAAC;AAEnD,IAAA,QAAQ,CAAC,GAAW,EAAA;AAClB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxC;wGALW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,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,cAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA7BpB;;;;;;;;;;;;;;AAcT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,ouBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAfS,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FA8BX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAjC/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,cACZ,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EACb;;;;;;;;;;;;;;GAcT,EAAA,eAAA,EAagB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,ouBAAA,CAAA,EAAA;;;ACnB3C,MAAO,oBACX,SAAQ,qBAAqB,CAAA;AAG7B;AACwD;IAE/C,IAAI,GAAsB,OAAO;IACjC,IAAI,GAAG,MAAM;AACb,IAAA,SAAS;IACsB,KAAK,GAAG,IAAI;IACZ,MAAM,GAAG,KAAK;AAC7C,IAAA,YAAY;AAErB;AACsD;AACtD,IAAA,IAAuB,QAAQ,GAAA;AAC7B,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK;IACrB;IAES,UAAU,GAAA;AACjB,QAAA,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;IACtB;AAEA;;;;;;;;;AASG;IACM,OAAO,GAA2B,UAAU;AAErD;AAC+D;AACtD,IAAA,MAAM;AAEf;AAC2C;AAClC,IAAA,MAAM;IAEf,IAAoC,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AAE3D,IAAA,gBAAgB,GAAG,IAAI,YAAY,EAAU;AAEvD;AACoE;IAC3D,KAAK,GAAG,EAAE;AAEX,IAAA,QAAQ,GAA4B,MAAK,EAAc,CAAC;AACxD,IAAA,SAAS,GAAe,MAAK,EAAc,CAAC;AAE3C,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEtE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACrC;IACF;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,OAAO,CAAC;IACxD;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,IAAI,IAAI;IAClG;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI;AACtD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5D;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;IAC1B;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,mBAAmB,CAAC,UAAU,CAAC;IACtC;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;IACnC;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,SAAS,EAAE;IAClB;wGAvGW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,KAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAUX,gBAAgB,CAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAChB,gBAAgB,2QClCtC,4uIA+GA,EAAA,MAAA,EAAA,CAAA,sMAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1FY,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAV,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,qHAAE,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAEtF,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,UAAA,EACb,IAAI,EAAA,OAAA,EAGP,CAAC,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,CAAC,EAAA,QAAA,EAAA,4uIAAA,EAAA,MAAA,EAAA,CAAA,sMAAA,CAAA,EAAA;;sBASjG;;sBACA;;sBACA;;sBACA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBAsBA;;sBAIA;;sBAIA;;sBAEA,WAAW;uBAAC,iBAAiB;;sBAE7B;;sBAIA;;;AE3DH;;;;;;;;;;;;;;;;;;;;;;AAsBG;AAQG,MAAO,mBACX,SAAQ,qBAAqB,CAAA;AAG7B;AAC2C;;AAGlC,IAAA,KAAK;AAEd;AAC2C;IACH,MAAM,GAAG,KAAK;AAEtD;;;;;AAKG;IACM,OAAO,GAA2B,SAAS;;IAG3C,OAAO,GAAQ,KAAK;AACnB,IAAA,aAAa,GAAG,IAAI,YAAY,EAAO;AAEzC,IAAA,QAAQ,GAAyB,MAAK,EAAc,CAAC;AACrD,IAAA,SAAS,GAAe,MAAK,EAAc,CAAC;AAE3C,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEtE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACrC;IACF;AAEA;AAC4B;AAE5B,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,OAAO,CAAC;IACxD;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,IAAI,IAAI;IAClG;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI;AACtD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5D;AAEA,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;IACtB;AAEA,IAAA,gBAAgB,CAAC,EAAwB,EAAA;AACvC,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,mBAAmB,CAAC,UAAU,CAAC;IACtC;;AAGA,IAAA,YAAY,CAAC,KAAU,EAAA;AACrB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;AAC5B,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,SAAS,EAAE;IAClB;;AAGA,IAAA,kBAAkB,CAAC,UAAmB,EAAA;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,UAAU,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AACxE,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,SAAS,EAAE;IAClB;wGAvFW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAYV,gBAAgB,CAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxDtC,w2DAqDA,EAAA,MAAA,EAAA,CAAA,2DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDXY,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,SAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,KAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAE7D,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;+BACE,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,OAAA,EAGP,CAAC,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,w2DAAA,EAAA,MAAA,EAAA,CAAA,2DAAA,CAAA,EAAA;;sBAUxE;;sBAIA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAQrC;;sBAGA;;sBACA;;;AE7DH;;;;;;;;;;;;;;;AAeG;AAyBG,MAAO,uBACX,SAAQ,qBAAqB,CAAA;;IAIpB,OAAO,GAAG,KAAK;AACd,IAAA,aAAa,GAAG,IAAI,YAAY,EAAW;AAE7C,IAAA,QAAQ,GAA6B,MAAK,EAAc,CAAC;AACzD,IAAA,SAAS,GAAe,MAAK,EAAc,CAAC;AAE3C,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEtE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACrC;IACF;AAEA,IAAA,UAAU,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK;IACxB;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,mBAAmB,CAAC,UAAU,CAAC;IACtC;AAEA,IAAA,YAAY,CAAC,KAA2B,EAAA;AACtC,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO;AAC5B,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,SAAS,EAAE;IAClB;wGAzCW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApBxB;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAnBS,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,iDAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,+BAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,KAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAqBjE,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAxBnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,CAAC;AAC7E,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA;AACF,iBAAA;;sBAME;;sBACA;;;ACvCH;;;;;;;;AAQG;MAQU,qBAAqB,CAAA;AACvB,IAAA,KAAK;AACL,IAAA,QAAQ;AACR,IAAA,OAAO;AACP,IAAA,IAAI;AACJ,IAAA,WAAW;AACX,IAAA,cAAc;IACd,IAAI,GAAsB,OAAO;IACF,QAAQ,GAAG,KAAK;IAChB,KAAK,GAAG,IAAI;IACZ,MAAM,GAAG,KAAK;IACd,QAAQ,GAAG,KAAK;IAChB,QAAQ,GAAG,IAAI;IAC9C,WAAW,GAAuB,OAAO;IACzC,aAAa,GAAoC,QAAQ;AACzD,IAAA,UAAU;AACV,IAAA,QAAQ;IACuB,QAAQ,GAAG,KAAK;IAChB,aAAa,GAAG,KAAK;AACpD,IAAA,OAAO;AACP,IAAA,OAAO;IAEhB,IAAoC,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AAE3D,IAAA,eAAe,GAAG,IAAI,YAAY,EAAO;IAEnD,KAAK,GAAQ,IAAI;AAET,IAAA,QAAQ,GAAyB,MAAK,EAAc,CAAC;AACrD,IAAA,SAAS,GAAe,MAAK,EAAc,CAAC;AAE3C,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACrD,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAE5D,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACrC;IACF;AAEA,IAAA,IAAI,oBAAoB,GAAA;QACtB,OAAO,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;IAC5G;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE;IACxC;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;QACpC,OAAO,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,OAAO;IACpD;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,IAAI,IAAI;IAC7D;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,CAAC;IACxD;AAEA,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;IACpB;AAEA,IAAA,gBAAgB,CAAC,EAAwB,EAAA;AACvC,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;IAC5B;AAEA,IAAA,YAAY,CAAC,KAAU,EAAA;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;IAClC;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,SAAS,EAAE;IAClB;wGAtFW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,MAAA,EAAA,WAAA,EAAA,aAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAQZ,gBAAgB,CAAA,EAAA,KAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAChB,gBAAgB,gCAChB,gBAAgB,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAChB,gBAAgB,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAChB,gBAAgB,CAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAKhB,gBAAgB,CAAA,EAAA,aAAA,EAAA,CAAA,eAAA,EAAA,eAAA,EAChB,gBAAgB,CAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChDtC,goCAoCA,EAAA,MAAA,EAAA,CAAA,sMAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDRY,gBAAgB,8uCAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,KAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAE/D,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;+BACE,eAAe,EAAA,UAAA,EACb,IAAI,EAAA,OAAA,EAGP,CAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,goCAAA,EAAA,MAAA,EAAA,CAAA,sMAAA,CAAA,EAAA;;sBAG1E;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBACA;;sBACA;;sBACA;;sBACA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBACA;;sBAEA,WAAW;uBAAC,iBAAiB;;sBAE7B;;;AEhCG,MAAO,mBACX,SAAQ,qBAAqB,CAAA;AAG7B;;AAE4B;AAEnB,IAAA,IAAI;IAC2B,KAAK,GAAG,IAAI;IACZ,MAAM,GAAG,KAAK;IACd,UAAU,GAAG,IAAI;IACjB,QAAQ,GAAG,KAAK;AAC/C,IAAA,YAAY;IAErB,IAAoC,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AAE3D,IAAA,gBAAgB,GAAG,IAAI,YAAY,EAAU;IAEvD,KAAK,GAAG,EAAE;AAEF,IAAA,QAAQ,GAA4B,MAAK,EAAc,CAAC;AACxD,IAAA,SAAS,GAAe,MAAK,EAAc,CAAC;AAE3C,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEtE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACrC;IACF;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,OAAO,CAAC;IACxD;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,IAAI,IAAI;IAC9F;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI;AACtD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5D;;AAGA,IAAA,IAAuB,QAAQ,GAAA;AAC7B,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK;IACrB;IAES,UAAU,GAAA;AACjB,QAAA,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;IACvB;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;IAC1B;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,mBAAmB,CAAC,UAAU,CAAC;IACtC;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;IACnC;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,SAAS,EAAE;IAClB;wGAjFW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,iGASV,gBAAgB,CAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAChB,gBAAgB,CAAA,EAAA,UAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAChB,gBAAgB,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAChB,gBAAgB,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClCtC,g0CAyCA,6PDrBY,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,WAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,eAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,+BAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,KAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAE7D,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;+BACE,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,OAAA,EAGP,CAAC,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,g0CAAA,EAAA,MAAA,EAAA,CAAA,sMAAA,CAAA,EAAA;;sBAUxE;;sBACA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBAEA,WAAW;uBAAC,iBAAiB;;sBAE7B;;;AEzBG,MAAO,sBACX,SAAQ,qBAAqB,CAAA;AAG7B;;;;;AAK4D;AAElD,IAAA,WAAW,GAAG,IAAI,YAAY,EAAY;IAE3C,WAAW,GAAG,MAAM;IACpB,WAAW,GAAG,IAAI;AAClB,IAAA,OAAO;AACP,IAAA,eAAe;IACf,iBAAiB,GAAG,CAAC;IACrB,OAAO,GAAqB,OAAO;AACnC,IAAA,IAAI;AACJ,IAAA,cAAc;AACd,IAAA,OAAO;IACwB,MAAM,GAAG,KAAK;IAEtD,IAAoC,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;IACrE,IAAsC,UAAU,KAAK,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE7E,cAAc,GAAU,EAAE;AAElB,IAAA,eAAe,GAA2B,MAAK,EAAc,CAAC;AAC9D,IAAA,gBAAgB,GAAe,MAAK,EAAc,CAAC;AAElD,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEtE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACrC;IACF;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,OAAO,CAAC;IACxD;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,IAAI,IAAI;IAClG;AAEA,IAAA,UAAU,CAAC,KAAe,EAAA;AACxB,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;YAC5D,IAAI,CAAC,cAAc,GAAG;AACnB,iBAAA,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;iBACzF,MAAM,CAAC,CAAC,GAAQ,KAAK,CAAC,CAAC,GAAG,CAAC;QAChC;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE;QAC1B;IACF;AAEA,IAAA,gBAAgB,CAAC,EAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;IAC3B;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;IAC5B;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;IACtC;AAEA,IAAA,qBAAqB,CAAC,GAAU,EAAA;AAC9B,QAAA,MAAM,KAAK,GAAG,GAAG,IAAI,EAAE;AACvB,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;AACxB,QAAA,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE;AACpE,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO;QACrC;IACF;AAEQ,IAAA,YAAY,CAAC,OAA+B,EAAA;AAClD,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAW,KACrD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAChE;AACD,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;IAC1B;wGApGW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,MAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAsBb,gBAAgB,CAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpCtC,6hCAgCA,EAAA,MAAA,EAAA,CAAA,mUAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpBY,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,YAAA,EAAA,UAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,KAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAEhE,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;+BACE,iBAAiB,EAAA,UAAA,EAGf,IAAI,EAAA,OAAA,EACP,CAAC,WAAW,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,6hCAAA,EAAA,MAAA,EAAA,CAAA,mUAAA,CAAA,EAAA;;sBAa3E;;sBAEA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAErC,WAAW;uBAAC,iBAAiB;;sBAC7B,WAAW;uBAAC,mBAAmB;;;AElB5B,MAAO,uBACX,SAAQ,qBAAqB,CAAA;AAG7B;;AAEwE;IAE/D,OAAO,GAAU,EAAE;IACnB,WAAW,GAAG,OAAO;IACrB,WAAW,GAAG,OAAO;IACU,QAAQ,GAAG,KAAK;IAChB,UAAU,GAAG,IAAI;IAChD,IAAI,GAAsB,OAAO;AACjC,IAAA,UAAU;AAEG,IAAA,YAAY;IAElC,KAAK,GAAQ,IAAI;AAET,IAAA,QAAQ,GAAyB,MAAK,EAAc,CAAC;AACrD,IAAA,SAAS,GAAe,MAAK,EAAc,CAAC;AAE3C,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEtE,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACrC;IACF;AAEA,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;IACpB;AAEA,IAAA,gBAAgB,CAAC,EAAwB,EAAA;AACvC,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,mBAAmB,CAAC,UAAU,CAAC;IACtC;AAEA,IAAA,YAAY,CAAC,KAAU,EAAA;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,SAAS,EAAE;IAClB;wGApDW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAWd,gBAAgB,CAAA,EAAA,UAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAChB,gBAAgB,8LCjCtC,ipBAsBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDHY,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,iDAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,wMAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,KAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAE/E,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBANnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EAEP,CAAC,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,ipBAAA,EAAA;;sBAU1F;;sBACA;;sBACA;;sBACA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBACA;;sBAEA,YAAY;uBAAC,MAAM;;;AErCtB;;ACiLA;;AAEG;AACI,MAAM,qBAAqB,GAAgC;AAChE,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,IAAI,EAAE,EAAE;IACR,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;AACnC,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,YAAY,EAAE,OAAO;AACrB,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,gBAAgB,EAAE,QAAQ;AAC1B,IAAA,YAAY,EAAE,OAAO;AACrB,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,IAAI,EAAE,OAAO;AACb,IAAA,UAAU,EAAE,SAAS;AACrB,IAAA,UAAU,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE;AACpC,IAAA,YAAY,EAAE,uBAAuB;AACrC,IAAA,yBAAyB,EAAE,+BAA+B;;AAG5D;;AAEG;AACI,MAAM,4BAA4B,GAA+B;AACtE,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,UAAU,EAAE,WAAW;AACvB,IAAA,YAAY,EAAE,KAAK;AACnB,IAAA,eAAe,EAAE,QAAQ;AACzB,IAAA,MAAM,EAAE,OAAO;AACf,IAAA,iBAAiB,EAAE,CAAC;AACpB,IAAA,iBAAiB,EAAE,CAAC;AACpB,IAAA,mBAAmB,EAAE,MAAM;AAC3B,IAAA,mBAAmB,EAAE,OAAO;;AAG9B;;AAEG;AACI,MAAM,6BAA6B,GAAiC;AACzE,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,KAAK,EAAE,MAAM;AACb,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,aAAa,EAAE,KAAK;AACpB,IAAA,QAAQ,EAAE,KAAK;;AAGjB;;;;AAIG;AACG,SAAU,kBAAkB,CAChC,MAAyB,EAAA;IAEzB,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC,KAAK;IACrC,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;AACrE,IAAA,OAAO,OAAO;AAChB;AAEA;;;;AAIG;AACG,SAAU,mBAAmB,CACjC,MAAyB,EAAA;AAEzB,IAAA,OAAO,EAAE,GAAG,4BAA4B,EAAE,GAAG,MAAM,EAAE;AACvD;;MC3Oa,6BAA6B,CAAA;AAC/B,IAAA,OAAO;AAEP,IAAA,KAAK;AAEJ,IAAA,SAAS,GAAG,IAAI,YAAY,EAAE;AAC9B,IAAA,IAAI,GAAG,IAAI,YAAY,EAAE;AACzB,IAAA,MAAM,GAAG,IAAI,YAAY,EAAE;;IAG5B,eAAe,GAAG,IAAI;IACtB,UAAU,GAAG,IAAI;IACjB,YAAY,GAAG,IAAI;AAE5B,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,KAAK;IAC3D;AAEA,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,KAAK;IAC3D;AAEA,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,KAAK;IAC7D;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACvB;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;IAClB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;wGApCW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA7B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECf1C,k5BA6BA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDlBI,iBAAiB,gTACjB,eAAe,EAAA,CAAA,EAAA,CAAA;;4FAGN,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBATzC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EACtB,IAAI,EAAA,OAAA,EAEP;wBACP,iBAAiB;wBACjB,eAAe;AAChB,qBAAA,EAAA,QAAA,EAAA,k5BAAA,EAAA;;sBAGA;;sBAEA;;sBAEA;;sBACA;;sBACA;;sBAGA;;sBACA;;sBACA;;;AEkBH;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;MAcU,oBAAoB,CAAA;AAC/B;;AAEG;AACkB,IAAA,MAAM;AAE3B,IAAA,YAAY;;;;AAMZ;;AAEG;AACH,IAAA,OAAO,GAAG,KAAK,CAAsB,EAAE,8EAAC;AAExC;;AAEG;AACH,IAAA,MAAM,GAAG,KAAK,CAAoB,EAAE,6EAAC;AAErC;;AAEG;IACH,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAkC;AAEjD;;AAEG;IACH,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAqC;AAEzD;;AAEG;IACH,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA6B;AAE5C;;AAEG;IACH,EAAE,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,IAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA2B;AAErC;;AAEG;IACH,cAAc,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;;;;AAM5C;;AAEG;IACH,OAAO,GAAG,MAAM,EAAW;AAE3B;;AAEG;IACH,SAAS,GAAG,MAAM,EAAW;AAE7B;;AAEG;IACH,YAAY,GAAG,MAAM,EAAW;AAEhC;;AAEG;IACH,QAAQ,GAAG,MAAM,EAAsB;AAEvC;;AAEG;IACH,SAAS,GAAG,MAAM,EAAW;;;;AAM7B;;AAEG;AACH,IAAA,OAAO,GAAG,MAAM,CAAC,KAAK,8EAAC;AAEvB;;AAEG;AACH,IAAA,YAAY;AAEZ;;AAEG;AACH,IAAA,aAAa;AAEb;;;AAGG;AACH,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,IAAG;AAC9B,YAAA,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC;YACvC,OAAO;AACL,gBAAA,GAAG,MAAM;AACT,gBAAA,KAAK,EAAE,kBAAkB,CAAC,MAAM;aACjC;AACH,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,uFAAC;AAEF;;AAEG;AACH,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI;QACtC,OAAO,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS;AAC5D,IAAA,CAAC,gFAAC;AAEF;;;AAGG;AACH,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI;QACtC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3B,YAAA,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,KAAK,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;QACvD;AACA,QAAA,OAAO,CAAC;AACV,IAAA,CAAC,gFAAC;;AAGe,IAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;IAC1B,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IACpC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1C,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;;;;IAM7D,QAAQ,GAAA;;AAEN,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,qBAAqB,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;;AAGlE,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AAClB,YAAA,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,6BAA6B,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE;QAC9E;aAAO;YACL,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,6BAA6B,EAAE,IAAI,EAAE,KAAK,EAAE;QACxE;;AAGA,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;YACxD,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,CAAA,UAAA,EAAa,IAAI,CAAC,cAAc,EAAE,CAAA,CAAE;QACnE;IACF;;;;AAMA;;;;AAIG;AACH,IAAA,cAAc,CAAC,KAAyB,EAAA;;;;;AAKtC,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;YAC7B;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3B;AAEA;;AAEG;AACK,IAAA,aAAa,CAAC,KAAyB,EAAA;AAC7C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,QAAA,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAC7C,YAAA,OAAO,KAAK;QACd;QAEA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAClC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS;AAClD,cAAE,KAAK,CAAC,SAAS,CAAC,CAAC;AACnB,cAAE,KAAK,CAAC,SAAS;AACnB,QAAA,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,IAAI,CAAC;AAC3C,QAAA,MAAM,gBAAgB,GAAG,WAAW,CAAC,aAAa,KAAK,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;;QAG3E,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,EAAE,UAAU,IAAI,CAAC;QACtD,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,EAAE,QAAQ,IAAI,EAAE;AACzD,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC;AACnC,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE;AAClC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC;;AAGxD,QAAA,QACE,WAAW,CAAC,KAAK,KAAK,cAAc;AACpC,YAAA,gBAAgB,KAAK,cAAc;AACnC,YAAA,WAAW,KAAK,SAAS;YACzB,eAAe,KAAK,SAAS;IAEjC;AAEA;;;AAGG;AACH,IAAA,UAAU,CAAC,OAAgC,EAAA;QACzC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAC7C,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IACvB;AAEA,IAAA,YAAY,CAAC,OAAgC,EAAA;QAC3C,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAC7C,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IACzB;AAEA,IAAA,eAAe,CAAC,OAAgC,EAAA;QAC9C,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AAC7C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAC5B;;;;AAMA;;;;;AAKG;IACH,eAAe,CAAC,OAAgC,EAAE,MAAyB,EAAA;QACzE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACnC,IAAI,KAAK,IAAI,IAAI;AAAE,YAAA,OAAO,EAAE;AAE5B,QAAA,QAAQ,MAAM,CAAC,IAAI;AACjB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAA+B,EAAE,MAAM,CAAC,UAAU,CAAC;AAEpF,YAAA,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAA+B,EAAE,OAAO,CAAC;AAE1E,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAC/B,KAAwB,EACxB,CAAA,EAAA,EAAK,MAAM,CAAC,iBAAiB,CAAA,CAAA,EAAI,MAAM,CAAC,iBAAiB,CAAA,CAAE,CAC5D;AAEH,YAAA,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAChC,KAAwB,EACxB,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,eAAe,EACtB,CAAA,EAAA,EAAK,MAAM,CAAC,iBAAiB,CAAA,CAAA,EAAI,MAAM,CAAC,iBAAiB,CAAA,CAAE,CAC5D;AAEH,YAAA,KAAK,SAAS;gBACZ,OAAO,KAAK,GAAG,KAAK,GAAG,KAAK;AAE9B,YAAA,KAAK,WAAW;gBACd,OAAO,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC;AAEpD,YAAA;AACE,gBAAA,OAAO,MAAM,CAAC,KAAK,CAAC;;IAE1B;AAEA;;;;;AAKG;IACK,qBAAqB,CAAC,OAAgC,EAAE,MAAyB,EAAA;AACvF,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;QAC1B,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;YAChC,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC;AAEA,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QAEnC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACvC,YAAA,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB;AAEA,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,mBAAmB,IAAI,MAAM;AACvD,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,mBAAmB,IAAI,MAAM;AACvD,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CACxB,CAAC,IAA6B,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,CAC9D;AAED,QAAA,OAAO,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;IAC1D;AAEA;;;;AAIG;AACH,IAAA,iBAAiB,CAAC,KAA8B,EAAA;QAC9C,QAAQ,KAAK;AACX,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,YAAY;AACrB,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,aAAa;AACtB,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,UAAU;AACnB,YAAA;AACE,gBAAA,OAAO,YAAY;;IAEzB;;;;AAMA;;AAEG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE;IACtB;AAEA;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE;IAC1B;AAEA;;AAEG;IACH,UAAU,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,OAA8C;IACpE;wGAvVW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpFjC,kwKAoJA,EAAA,MAAA,EAAA,CAAA,4LAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDtEI,YAAY,uSACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,2BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,0BAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,aAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,UAAA,EAAA,aAAA,EAAA,MAAA,EAAA,eAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,4BAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,yBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,qBAAA,EAAA,wBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,6BAA6B,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGpB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAbhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,cACZ,IAAI,EAAA,eAAA,EAGC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,6BAA6B;AAC9B,qBAAA,EAAA,QAAA,EAAA,kwKAAA,EAAA,MAAA,EAAA,CAAA,4LAAA,CAAA,EAAA;;sBAMA,SAAS;uBAAC,QAAQ;;;AEvErB;;;;;;;;AAQG;MACU,0BAA0B,GAAG,IAAI,cAAc,CACxD,4BAA4B;;ACXhC;;;;;;;;;;;;;;;;AAgBG;MAQU,gBAAgB,CAAA;AAChB,IAAA,UAAU,GAAG,KAAK,CAAS,CAAC,iFAAC;AAC7B,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;AAC5B,IAAA,UAAU,GAAG,KAAK,CAAS,CAAC,iFAAC;AAC7B,IAAA,eAAe,GAAG,KAAK,CAAwB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,sFAAC;;AAGjE,IAAA,oBAAoB,GAAG,KAAK,CAAS,uBAAuB,2FAAC;AAC7D,IAAA,UAAU,GAAG,KAAK,CAAS,WAAW,iFAAC;AACvC,IAAA,YAAY,GAAG,KAAK,CAAS,sBAAsB,mFAAC;AACpD,IAAA,YAAY,GAAG,KAAK,CAAS,kBAAkB,mFAAC;;AAGhD,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;IAEhC,UAAU,GAAG,MAAM,EAAU;IAC7B,cAAc,GAAG,MAAM,EAAU;;AAG1C,IAAA,IAAY,WAAW,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;IACvD;AAEA;AACgE;AACvD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAC5B,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,kFACpE;AAEQ,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,QAAA,OAAO,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC;AAC1E,IAAA,CAAC,iFAAC;AAEO,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;AAC3B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;QAC/B,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;AAC5C,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;AAC3D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC;AAChE,QAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE;AACzB,IAAA,CAAC,4EAAC;;AAGO,IAAA,WAAW,GAAG,QAAQ,CAAyB,MAAK;AACzD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;AAC/B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;QACjC,MAAM,GAAG,GAAc,EAAE;AACzB,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;YACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE;AAAE,gBAAA,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACrE,YAAA,OAAO,GAAG;QACd;AACA,QAAA,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACpC,IAAI,OAAO,GAAG,CAAC;AAAE,YAAA,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACzD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;AACtC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;QAC5C,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;AAAE,YAAA,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACvE,QAAA,IAAI,OAAO,GAAG,KAAK,GAAG,CAAC;AAAE,YAAA,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACjE,QAAA,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACxC,QAAA,OAAO,GAAG;AACd,IAAA,CAAC,kFAAC;AAEF,IAAA,QAAQ,CAAC,IAAY,EAAA;AACjB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;AAC/B,QAAA,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,UAAU,EAAE;YAAE;AAC5D,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B;AAEA,IAAA,YAAY,CAAC,KAA6B,EAAA;QACtC,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,CAAC;QAE1E,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE;;;;AAIjC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW;AACjC,YAAA,IAAI,QAAQ,KAAK,IAAI,CAAC,QAAQ,EAAE;AAAE,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;YACpE;QACJ;AAEA,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE;IAEA,QAAQ,CAAC,KAAa,EAAE,GAAY,EAAA;AAChC,QAAA,OAAO,GAAG,CAAC,IAAI,KAAK,MAAM,GAAG,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,EAAE,GAAG,CAAA,CAAA,EAAI,KAAK,EAAE;IAC9D;wGApFS,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,q4CCxC7B,qlDAsDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDlBc,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,+BAAE,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,uBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAIjD,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,EAAA,UAAA,EACR,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,EAAE,iBAAiB,CAAC,EAAA,eAAA,EAE1C,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,qlDAAA,EAAA;;;AErBnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCG;MASU,qBAAqB,CAAA;AACb,IAAA,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC;;AAG1D,IAAA,KAAK,GAAG,KAAK,CAA6B,EAAE,4EAAC;AAEtD;AACwD;AAC/C,IAAA,OAAO,GAAG,KAAK,CAA4B,SAAS,8EAAC;;AAGrD,IAAA,WAAW,GAAG,KAAK,CAAS,kBAAkB,kFAAC;;AAG/C,IAAA,cAAc,GAAG,KAAK,CAAS,gBAAgB,qFAAC;;IAGhD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEjE;;;AAGG;IACM,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGxD,MAAM,GAAG,MAAM,EAAQ;;IAEvB,MAAM,GAAG,MAAM,EAAQ;;AAGvB,IAAA,YAAY,GAAG,QAAQ,CAA6B,MAAK;AAC9D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;QAC1B,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3D,IAAA,CAAC,mFAAC;;AAGO,IAAA,IAAI,GAAG,MAAM,CAAC,KAAK,2EAAC;;AAGpB,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,6EAAC;AAE/B;;;;;;;AAOG;AACK,IAAA,OAAO,YAAY,GAAiC,IAAI;AAEhE,IAAA,MAAM,CAAC,KAAiB,EAAA;QACpB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE;AACzD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACzB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE;QAE1B,IAAI,MAAM,EAAE;AACR,YAAA,qBAAqB,CAAC,YAAY,EAAE,KAAK,EAAE;AAC3C,YAAA,qBAAqB,CAAC,YAAY,GAAG,IAAI;;;;AAIzC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,2BAA2B,EAAE;QACtC;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;AAC3B,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;AACzB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IAC3B;IAEA,UAAU,CAAC,MAAmB,EAAE,KAAiB,EAAA;QAC7C,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS;YAAE;AACzC,QAAA,MAAM,CAAC,OAAO,IAAI;QAClB,IAAI,CAAC,KAAK,EAAE;IAChB;IAEA,KAAK,GAAA;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,QAAA,IAAI,qBAAqB,CAAC,YAAY,KAAK,IAAI,EAAE;AAC7C,YAAA,qBAAqB,CAAC,YAAY,GAAG,IAAI;QAC7C;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACtB;;AAIA;AACkE;AAC1D,IAAA,OAAgB,QAAQ,GAAG,EAAE;AAErC;;;;AAIG;AACK,IAAA,YAAY,CAAC,UAAkB,EAAA;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE;QAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM;AAC9C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG;QACtB,OAAO,KAAK,GAAG,UAAU,GAAG,qBAAqB,CAAC,QAAQ,IAAI,KAAK,GAAG,KAAK;IAC/E;AAEA;AACsD;IAC9C,kBAAkB,GAAA;AACtB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AACjC,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM;AACxD,QAAA,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,IAAI,EAAE,GAAG,UAAU,GAAG,EAAE;IAClE;AAEA;AACgC;IACxB,2BAA2B,GAAA;QAC/B,qBAAqB,CAAC,MAAK;AACvB,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE;AAClB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAc,oBAAoB,CAAC;AACrF,YAAA,IAAI,CAAC,IAAI;gBAAE;AACX,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACzD,QAAA,CAAC,CAAC;IACN;AAEA;AAC2D;AACnD,IAAA,cAAc,CAAC,IAAa,EAAA;QAChC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CACjC,IAAI,WAAW,CAAC,uBAAuB,EAAE;AACrC,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,IAAI,EAAE;AACnB,SAAA,CAAC,CACL;IACL;;AAIA,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE;AAClB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;QAC1C,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE;QACxD,IAAI,CAAC,KAAK,EAAE;IAChB;;IAIA,QAAQ,GAAA;QACJ,IAAI,CAAC,KAAK,EAAE;IAChB;;AAGA,IAAA,UAAU,CAAC,KAAiB,EAAA;QACxB,KAAK,CAAC,eAAe,EAAE;IAC3B;IAEQ,SAAS,CAAC,MAAmB,EAAE,GAA8B,EAAA;QACjE,IAAI,MAAM,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI;AACjC,QAAA,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;AAAE,YAAA,OAAO,KAAK;AAC1C,QAAA,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;AAAE,YAAA,OAAO,KAAK;AAC/E,QAAA,OAAO,IAAI;IACf;;AAGA,IAAA,WAAW,GAAG,CAAC,CAAS,EAAE,MAAmB,KACzC,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAA,CAAE,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;wGAxKhF,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChElC,ugEAmDA,EAAA,MAAA,EAAA,CAAA,0EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDQc,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAK9B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBARjC,SAAS;+BACI,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,CAAC,EAAA,eAAA,EAGvB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ugEAAA,EAAA,MAAA,EAAA,CAAA,0EAAA,CAAA,EAAA;;sBA8I9C,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;;sBASzC,YAAY;uBAAC,yBAAyB;;;AEnN3C;;;;;;;;;;;;;;AAcG;MAKU,yBAAyB,CAAA;AACzB,IAAA,WAAW,GAAG,MAAM,CAAuB,WAAW,CAAC;AAGhE,IAAA,QAAQ;wGAJC,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAJrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,UAAU,EAAE,IAAI;AACnB,iBAAA;;sBAII,KAAK;AAAC,gBAAA,IAAA,EAAA,CAAA,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE;;AAIxD;;;;;;;;;;;AAWG;MAKU,+BAA+B,CAAA;AAC/B,IAAA,WAAW,GAAG,MAAM,CAAuB,WAAW,CAAC;AAGhE,IAAA,QAAQ;wGAJC,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA/B,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,wBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAJ3C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,0BAA0B;AACpC,oBAAA,UAAU,EAAE,IAAI;AACnB,iBAAA;;sBAII,KAAK;AAAC,gBAAA,IAAA,EAAA,CAAA,EAAE,KAAK,EAAE,wBAAwB,EAAE,QAAQ,EAAE,IAAI,EAAE;;;ACE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCG;MAeU,mBAAmB,CAAA;AAC5B;;;;AAIkD;AAEjC,IAAA,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACpC,sBAAsB,GAAG,MAAM,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEvF,IAAA,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ;;AAGjC,IAAA,YAAY,GAAG,KAAK,CAAgC,IAAI,mFAAC;AAE/C,IAAA,qBAAqB,GAAG,QAAQ,CAC/C,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,sBAAsB,IAAI,KAAK,4FACpE;;AAGgB,IAAA,YAAY,GAAG,MAAM,CAAuB,IAAI,GAAG,EAAE,mFAAC;IAE7D,UAAU,CAAC,GAAY,EAAE,KAAa,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3D;AAEA;;;;;;AAMG;AACO,IAAA,iBAAiB,CAAC,GAAY,EAAE,KAAa,EAAE,KAAY,EAAA;AACjE,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;AACvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA4B;AACjD,QAAA,IAAI,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC;YAAE;AACvC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC;IACnC;IAEU,cAAc,CAAC,GAAY,EAAE,KAAa,EAAA;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACzC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACpC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/B;IAEQ,MAAM,CAAC,GAAY,EAAE,KAAa,EAAA;AACtC,QAAA,MAAM,EAAE,GAAI,GAAsC,GAAG,IAAI,CAAC;QAC1D,OAAO,EAAE,IAAI,KAAK;IACtB;AAEA;;;AAGG;AACc,IAAA,aAAa,GAAG,QAAQ,CAAC,MACtC,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,oFAC/E;AAED;;;;;;AAMG;AACO,IAAA,MAAM,CAAC,GAAmD,EAAA;QAChE,IAAI,GAAG,CAAC,MAAM;YAAE,OAAO,GAAG,CAAC,MAAM;QACjC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;AAAE,YAAA,OAAO,QAAQ;AACjE,QAAA,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,gBAAgB,EAAE;AAAE,YAAA,OAAO,SAAS;AACxD,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU;AAAE,YAAA,OAAO,WAAW;AAC9F,QAAA,OAAO,QAAQ;IACnB;AAEiB,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AAC9C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;;;;;AAKjC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClF,QAAA,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC,EAAE;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;AACjF,QAAA,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;AACzC,IAAA,CAAC,uFAAC;IAEiB,aAAa,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC/D;IAEkB,YAAY,GAAG,QAAQ,CAAC,MACvC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC9D;IAEkB,gBAAgB,GAAG,QAAQ,CAAC,MAC3C,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACnE;AAED;;;;AAIG;AACgB,IAAA,aAAa,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,IAAG;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3B,QAAA,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,WAAW;IACpD,CAAC,CAAC,oFACL;;AAGO,IAAA,OAAgB,mBAAmB,GAAG,CAAC;;IAG5B,kBAAkB,GAAG,QAAQ,CAAC,MAC7C,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,mBAAmB,CAAC,yFACzE;AAEkB,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,CAAC,gFAAC;;AAG3D,IAAA,kBAAkB,GAAG,QAAQ,CAC5C,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,mBAAmB,CAAC,mBAAmB,yFAC9E;;IAGS,aAAa,CAAC,GAAY,EAAE,KAAa,EAAA;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;AACxC,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE,KAAK,MAAM,EAAE;AACzC,YAAA,OAAO,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE;QAClE;AACA,QAAA,OAAO,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3C;IAEiB,cAAc,GAAG,MAAM,CACpC,uBAAuB,EACvB,EAAE,QAAQ,EAAE,IAAI,EAAE,CACrB;;AAIQ,IAAA,OAAO,GAAG,KAAK,CAAkC,EAAE,8EAAC;AACpD,IAAA,IAAI,GAAG,KAAK,CAAsB,EAAE,2EAAC;;AAGrC,IAAA,YAAY,GAAG,KAAK,CAAS,IAAI,mFAAC;;AAIlC,IAAA,UAAU,GAAG,KAAK,CAAS,CAAC,iFAAC;AAC7B,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;AAC5B,IAAA,UAAU,GAAG,KAAK,CAAS,CAAC,iFAAC;AAC7B,IAAA,eAAe,GAAG,KAAK,CAAwB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,sFAAC;IACjE,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;;AAKzD,IAAA,IAAI,GAAG,KAAK,CAA6B,SAAS,2EAAC;;IAInD,OAAO,GAAG,KAAK,CAAC,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAEvD,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;AAC5B,IAAA,UAAU,GAAG,KAAK,CAAS,oBAAoB,iFAAC;;AAIzD;;;;;;;;;AASG;IACM,kBAAkB,GAAG,KAAK,CAAC,KAAK,0FAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAE3E;;;;;;;;;;;AAWmD;IAE1C,gBAAgB,GAAG,KAAK,CAAC,KAAK,wFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAChE,IAAA,iBAAiB,GAAG,KAAK,CAA4B,SAAS,wFAAC;IAE/D,cAAc,GAAG,KAAK,CAAC,IAAI,sFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC7D,cAAc,GAAG,KAAK,CAAC,IAAI,sFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC7D,mBAAmB,GAAG,KAAK,CAAC,IAAI,2FAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAClE,gBAAgB,GAAG,KAAK,CAAC,IAAI,wFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;;IAK/D,kBAAkB,GAAG,KAAK,CAAC,KAAK,0FAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGlE,gBAAgB,GAAG,KAAK,CAAC,KAAK,wFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAEzE;;;;;AAKG;AACM,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;;IAI5B,UAAU,GAAG,MAAM,EAAU;IAC7B,cAAc,GAAG,MAAM,EAAU;IACjC,UAAU,GAAG,MAAM,EAAkB;IACrC,cAAc,GAAG,MAAM,EAAQ;;IAG/B,SAAS,GAAG,MAAM,EAA8C;;AAKxD,IAAA,aAAa;AAGb,IAAA,eAAe;AAEf,IAAA,eAAe,GAAG,MAAM,CAAoC,IAAI,GAAG,EAAE,sFAAC;AACtE,IAAA,iBAAiB,GAAG,MAAM,CAAoC,IAAI,GAAG,EAAE,wFAAC;IAEzF,kBAAkB,GAAA;QACd,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACnD,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACvD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,MACjC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CACtD;QACD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,MACnC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAC1D;IACL;;AAIA;;AAEoD;AAC3C,IAAA,gBAAgB,GAAG,QAAQ,CAAkC,MAAK;AACvE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE;AACrC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO;AACxB,aAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACtC,aAAA,GAAG,CAAC,GAAG,KAAK;AACT,YAAA,GAAG,GAAG;AACN,YAAA,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,MAAM;YACxB,KAAK,EACD,GAAG,CAAC,KAAK;AACT,iBAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;YACrE,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE;AAClD,SAAA,CAAC,CAAC;AAEP,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAAE,YAAA,OAAO,QAAQ;AAC7C,QAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;AAAE,YAAA,OAAO,QAAQ;AAC3D,QAAA,OAAO,CAAC,GAAG,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAsB,CAAC;AAC9E,IAAA,CAAC,uFAAC;AAEF;;;AAGqD;AACrD,IAAA,iBAAiB,CAAC,GAAS,EAAA;QACvB,MAAM,KAAK,GAAkB,EAAE;AAE/B,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;YACvB,KAAK,CAAC,IAAI,CAAC;AACP,gBAAA,EAAE,EAAE,MAAM;AACV,gBAAA,QAAQ,EAAE,aAAa;AACvB,gBAAA,IAAI,EAAE,WAAW;AACjB,gBAAA,GAAG,EAAE,GAAG;gBACR,UAAU,EAAE,WAAW,CAAC,IAAI;AAC5B,gBAAA,OAAO,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC9D,aAAA,CAAC;QACN;AACA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;YACvB,KAAK,CAAC,IAAI,CAAC;AACP,gBAAA,EAAE,EAAE,MAAM;AACV,gBAAA,QAAQ,EAAE,aAAa;AACvB,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,GAAG,EAAE,GAAG;gBACR,UAAU,EAAE,WAAW,CAAC,IAAI;AAC5B,gBAAA,OAAO,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC9D,aAAA,CAAC;QACN;AACA,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE;YAC5B,KAAK,CAAC,IAAI,CAAC;AACP,gBAAA,EAAE,EAAE,WAAW;AACf,gBAAA,QAAQ,EAAE,kBAAkB;AAC5B,gBAAA,IAAI,EAAE,YAAY;AAClB,gBAAA,GAAG,EAAE,IAAI;gBACT,UAAU,EAAE,WAAW,CAAC,SAAS;AACjC,gBAAA,OAAO,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;AACnE,aAAA,CAAC;QACN;AACA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;AACzB,YAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC;AACP,gBAAA,EAAE,EAAE,QAAQ;AACZ,gBAAA,QAAQ,EAAE,eAAe;AACzB,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,GAAG,EAAE,GAAG;AACR,gBAAA,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,WAAW,CAAC,MAAM;AAC9B,gBAAA,OAAO,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAChE,aAAA,CAAC;QACN;AAEA,QAAA,OAAO,KAAK;IAChB;;AAIA,IAAA,YAAY,CAAC,QAAgB,EAAA;QACzB,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC/C;AAEA,IAAA,cAAc,CAAC,QAAgB,EAAA;QAC3B,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;IACjD;;IAGA,SAAS,CAAC,GAAS,EAAE,GAAqB,EAAA;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE;AAChC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,SAAS;AAC3B,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAM,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;IACzF;AAEA,IAAA,gBAAgB,CAAC,GAAqB,EAAA;AAClC,QAAA,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK;AAAE,YAAA,OAAO,KAAK;AACrC,QAAA,OAAO,EAAE;IACb;AAEA,IAAA,cAAc,CAAC,GAAqB,EAAA;QAChC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;QAC5F,MAAM,OAAO,GAAa,EAAE;QAC5B,IAAI,KAAK,KAAK,KAAK;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QACxC,IAAI,GAAG,CAAC,SAAS;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AAC9C,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;IAC5B;;AAGA,IAAA,aAAa,CAAC,GAAqB,EAAA;AAC/B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,EAAE;AACjB,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE;AAClD,QAAA,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK;AAAE,YAAA,OAAO,EAAE;AAChC,QAAA,OAAO,CAAC,CAAC,SAAS,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG;IAC5C;AAEA;;;;;;AAMG;IACH,gBAAgB,CAAC,KAAc,EAAE,GAAqB,EAAA;QAClD,IAAI,KAAK,IAAI,IAAI;AAAE,YAAA,OAAO,EAAE;QAC5B,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,GAAG,CAAC,YAAY;AAAE,YAAA,OAAO,MAAM,CAAC,KAAK,CAAC;AAEnE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;AACjE,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,mBAAmB,IAAI,MAAM;AACpD,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,mBAAmB,IAAI,OAAO;AACrD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAS,KAAK,IAAI,GAAG,UAAU,CAAC,KAAK,KAAK,CAAC;AACpE,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,MAAM,CAAC,KAAK,CAAC;QAChC,OAAO,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;IAC7C;;AAGA,IAAA,YAAY,CAAC,GAAqB,EAAA;AAC9B,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,IAAI,CAAC;AACtC,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,IAAI,CAAC;AACtC,QAAA,OAAO,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,EAAI,GAAG,EAAE;IAC5B;;;AAKS,IAAA,QAAQ,GAAG,MAAM,CAA+B,IAAI,+EAAC;;AAGrD,IAAA,OAAO,GAAG,MAAM,CAAiB,SAAS,8EAAC;;AAG3C,IAAA,eAAe,GAAG,MAAM,CAAwB,EAAE,sFAAC;AAEnD,IAAA,cAAc,GAIlB;QACD,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,wBAAwB,EAAE,IAAI,EAAE,kBAAkB,EAAE;QAClF,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,wBAAwB,EAAE,IAAI,EAAE,SAAS,EAAE;QACzE,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,4BAA4B,EAAE,IAAI,EAAE,SAAS,EAAE;KACpF;AAED;;AAE0D;AACjD,IAAA,eAAe,GAAG,QAAQ,CAAC;;;;AAIhC,IAAA,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CACjB,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,CACvE,sFACJ;AAED,IAAA,UAAU,CAAC,IAA2B,EAAA;QAClC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;IAC7D;AAEA,IAAA,UAAU,CAAC,KAAqB,EAAA;AAC5B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,eAAe,EAAE;IAC1B;AAEA,IAAA,cAAc,CAAC,EAAU,EAAA;QACrB,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC9C;AAEA,IAAA,YAAY,CAAC,EAAU,EAAA;AACnB,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,IAC3B,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,CAC9D;QACD,IAAI,CAAC,eAAe,EAAE;IAC1B;IAEA,YAAY,GAAA;AACR,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE;IAC1B;;AAIA,IAAA,eAAe,CAAC,KAAiB,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE;AACtB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA4B;AACjD,QAAA,IAAI,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC;YAAE;AACnC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;IAGA,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;IAEQ,UAAU,GAAA;AACd,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC3B,OAAO,GAAG,GAAG,CAAA,YAAA,EAAe,GAAG,CAAA,CAAE,GAAG,IAAI;IAC5C;IAEQ,eAAe,GAAA;AACnB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,IAAI,CAAC,GAAG;YAAE;AACV,QAAA,IAAI;YACA,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAGhC,GAAG,CAAC;AACP,YAAA,IAAI,CAAC,KAAK;gBAAE;YACZ,IAAI,KAAK,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AAClD,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;gBACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC;QACvD;AAAE,QAAA,MAAM;;;QAGR;IACJ;IAEQ,eAAe,GAAA;AACnB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,IAAI,CAAC,GAAG;YAAE;AACV,QAAA,IAAI;AACA,YAAA,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE;AACvB,gBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,gBAAA,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;AAC1C,aAAA,CAAC;QACN;AAAE,QAAA,MAAM;;;QAGR;IACJ;AAEA;;AAE0C;AACjC,IAAA,aAAa,GAAG,MAAM,CAAC,CAAC,oFAAC;AAGlC,IAAA,kBAAkB,CAAC,KAAY,EAAA;AAC3B,QAAA,MAAM,MAAM,GAAI,KAAwC,CAAC,MAAM;AAC/D,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E;AAEA;AACgE;IAChE,gBAAgB,CAAC,GAAS,EAAE,KAAiB,EAAA;AACzC,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAAE;AAChC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA4B;AACjD,QAAA,IAAI,MAAM,EAAE,OAAO,CAAC,2CAA2C,CAAC;YAAE;AAClE,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;IACjC;AAEA,IAAA,aAAa,CAAC,GAAqB,EAAA;QAC/B,IAAI,CAAC,GAAG,CAAC,QAAQ;YAAE;AACnB,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE;AAClD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE;QAC3B,MAAM,SAAS,GACX,OAAO,EAAE,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,SAAS,KAAK,MAAM,GAAG,KAAK,GAAG,MAAM;QAC7E,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC9C;AAEA,IAAA,UAAU,GAAG,CAAC,CAAS,EAAE,GAAS,KAAa;AAC3C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE;AAC7B,QAAA,OAAO,CAAC,GAAI,GAAW,GAAG,CAAC,CAAC,GAAG,GAAG;AACtC,IAAA,CAAC;IAED,aAAa,GAAG,CAAC,CAAS,EAAE,GAAqB,KAAa,GAAG,CAAC,EAAE;wGAzhB3D,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,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,cAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,4BAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,SAAA,EAuOX,yBAAyB,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EAGzB,+BAA+B,6BC5UpD,ivbA4SA,EAAA,MAAA,EAAA,CAAA,syHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpNQ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,qBAAqB,kJACrB,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,IAAA,EAAA,UAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAMhB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAd/B,SAAS;+BACI,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,OAAA,EACP;wBACL,YAAY;wBACZ,eAAe;wBACf,gBAAgB;wBAChB,qBAAqB;wBACrB,qBAAqB;qBACxB,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ivbAAA,EAAA,MAAA,EAAA,CAAA,syHAAA,CAAA,EAAA;;sBAyO9C,eAAe;uBAAC,yBAAyB;;sBAGzC,eAAe;uBAAC,+BAA+B;;sBA2N/C,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;;sBAQzC,YAAY;uBAAC,yBAAyB;;sBA+CtC,YAAY;uBAAC,uBAAuB,EAAE,CAAC,QAAQ,CAAC;;AAgCrD,SAAS,KAAK,CACV,IAAkB,EAAA;AAElB,IAAA,MAAM,CAAC,GAAG,IAAI,GAAG,EAAgC;IACjD,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;AACnD,IAAA,OAAO,CAAC;AACZ;;AEhoBA;;;;;;;;;;AAUG;MAoBU,kBAAkB,CAAA;AAClB,IAAA,KAAK,GAAG,KAAK,CAAS,CAAC,4EAAC;;AAExB,IAAA,SAAS,GAAG,KAAK,CAAS,iBAAiB,gFAAC;;AAE5C,IAAA,MAAM,GAAG,KAAK,CAAS,EAAE,6EAAC;wGAL1B,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAfjB;;;;;;;;;;;;KAYT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAbS,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAgB9B,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAnB9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC;AACxC,oBAAA,QAAQ,EAAE;;;;;;;;;;;;AAYT,IAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAClD,iBAAA;;;AC7BD;;;;;;;;;;;;;AAaG;MA8BU,qBAAqB,CAAA;AACrB,IAAA,IAAI,GAAG,KAAK,CAAS,aAAa,2EAAC;AACnC,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;AAC5B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AACzB,IAAA,UAAU,GAAG,KAAK,CAAS,EAAE,iFAAC;AAC9B,IAAA,OAAO,GAAG,KAAK,CAAS,EAAE,8EAAC;wGAL3B,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAzBpB;;;;;;;;;;;;;;;;;;;;;;KAsBT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAvBS,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FA0B9B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBA7BjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC;AACxC,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;AAsBT,IAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAClD,iBAAA;;;AClCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BG;MAqDU,mBAAmB,CAAA;;AAEnB,IAAA,UAAU,GAAG,KAAK,CAAS,EAAE,iFAAC;AAE9B,IAAA,cAAc,GAAG,KAAK,CAAS,EAAE,qFAAC;AAClC,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,kFAAC;AAE/B,IAAA,aAAa,GAAG,KAAK,CAAS,cAAc,oFAAC;AAC7C,IAAA,aAAa,GAAG,KAAK,CAAS,cAAc,oFAAC;AAC7C,IAAA,cAAc,GAAG,KAAK,CAAS,eAAe,qFAAC;IAE/C,WAAW,GAAG,KAAK,CAAC,IAAI,mFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC1D,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACzD,UAAU,GAAG,KAAK,CAAC,KAAK,kFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC1D,OAAO,GAAG,KAAK,CAAC,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;;;;IAMvD,MAAM,GAAG,MAAM,EAAU;IACzB,KAAK,GAAG,MAAM,EAAQ;IAE/B,QAAQ,GAAA;QACJ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IACvC;IAEA,OAAO,GAAA;AACH,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;IACrB;wGA9BS,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,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,cAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhDlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CT,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA9CS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAiD3C,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBApD/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,eAAe,CAAC;AACrD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CT,IAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAClD,iBAAA;;;ACrFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCG;MAQU,qBAAqB,CAAA;;AAErB,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,2EAAC;;AAGxB,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;;AAE5B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;;AAGzB,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;;AAGzB,IAAA,IAAI,GAAG,KAAK,CAAkC,SAAS,2EAAC;;IAGxD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGxD,UAAU,GAAG,KAAK,CAAC,KAAK,kFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG1D,WAAW,GAAG,KAAK,CAAC,KAAK,mFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAG3D,IAAA,YAAY,GAAG,KAAK,CAAS,oBAAoB,mFAAC;;IAGlD,SAAS,GAAG,MAAM,EAAQ;;IAG1B,UAAU,GAAG,MAAM,EAAQ;IAEpC,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACzB;AAEA,IAAA,YAAY,CAAC,KAAY,EAAA;QACrB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IAC1B;wGAxCS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtDlC,qyCA8CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDIc,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAI9B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;+BACI,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,CAAC,EAAA,eAAA,EAEvB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,qyCAAA,EAAA;;;AEtCnD;;;;;;;;;;;;;;;;;;AAkBG;AAOG,MAAO,mBACT,SAAQ,qBAAqB,CAAA;IAGpB,IAAI,GAAG,CAAC;AACR,IAAA,SAAS;IACsB,SAAS,GAAG,KAAK;AAE/C,IAAA,gBAAgB,GAAG,IAAI,YAAY,EAAU;AAEvD;AACoE;IAC3D,KAAK,GAAG,EAAE;;AAGnB,IAAA,IAAuB,QAAQ,GAAA;AAC3B,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK;IACvB;IAES,UAAU,GAAA;AACf,QAAA,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;IACxB;IAEQ,QAAQ,GAA4B,MAAK;;AAEjD,IAAA,CAAC;IACO,SAAS,GAAe,MAAK;;AAErC,IAAA,CAAC;AAEQ,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEtE,IAAA,WAAA,GAAA;AACI,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACvC;IACJ;AAEA,IAAA,IAAI,SAAS,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI;AACtD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,KAAK,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC;IAChE;AAEA,IAAA,IAAI,YAAY,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,sBAAsB,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,IAAI,IAAI;IACpG;AAEA,IAAA,IAAI,YAAY,GAAA;AACZ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO;AACpC,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,OAAO,CAAC;IAC1D;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;IAC5B;AAEA,IAAA,gBAAgB,CAAC,EAA2B,EAAA;AACxC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACtB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC5B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACvB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAChC,QAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;IACxC;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;IACrC;IAEA,UAAU,GAAA;QACN,IAAI,CAAC,SAAS,EAAE;IACpB;wGA9ES,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAMR,gBAAgB,CAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7CxC,2qDA6CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDRc,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,KAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAEvE,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;+BACI,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,OAAA,EAEP,CAAC,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,CAAC,EAAA,QAAA,EAAA,2qDAAA,EAAA;;sBAMhF;;sBACA;;sBACA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAErC;;sBAIA;;;AE1BL;;;;;;;;;;;;;;;;;;AAkBG;MAwCU,qBAAqB,CAAA;AACb,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAE5C,IAAA,IAAI,GAAG,KAAK,CAAS,YAAY,2EAAC;AAClC,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;AAC5B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AACzB,IAAA,IAAI,GAAG,KAAK,CAAkC,SAAS,2EAAC;AAExD,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,6EAAkC;AAC1D,IAAA,SAAS,GAAG,KAAK,CAAW,IAAI,gFAAC;;AAGjC,IAAA,IAAI,GAAG,KAAK,CAAU,KAAK,2EAAC;;IAG5B,aAAa,GAAG,KAAK,CAAC,IAAI,qFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAE5D,YAAY,GAAG,MAAM,EAAmB;;AAGxC,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;AAC5B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;AACrD,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;QACrB,IAAI,KAAK,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;AACjE,QAAA,OAAO,KAAK,CAAC,KAAK,IAAI,EAAE;AAC5B,IAAA,CAAC,kFAAC;IAEF,MAAM,GAAA;AACF,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7B;AAEA,IAAA,MAAM,CAAC,MAAuB,EAAA;QAC1B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9B,IAAI,IAAI,CAAC,aAAa,EAAE;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IAClD;wGApCS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAnCpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCT,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAjCS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAoCrD,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAvCjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,qBAAqB,CAAC;AAC/D,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCT,IAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAClD,iBAAA;;;ACxED;;;;;;;;;;;;;;;;;;;;;AAqBG;MAiCU,uBAAuB,CAAA;IACvB,IAAI,GAAG,KAAK,CAAC,KAAK,4EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACpD,IAAA,OAAO,GAAG,KAAK,CAAS,EAAE,8EAAC;AAC3B,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,2EAAC;AACxB,IAAA,aAAa,GAAG,KAAK,CAAS,cAAc,oFAAC;AAC7C,IAAA,aAAa,GAAG,KAAK,CAAS,cAAc,oFAAC;IAC7C,SAAS,GAAG,KAAK,CAAC,KAAK,iFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAEzD,KAAK,GAAG,MAAM,EAAQ;;;;;IAKtB,KAAK,GAAG,MAAM,EAAQ;wGAbtB,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA5BtB;;;;;;;;;;;;;;;;;;;;;;;;;KAyBT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA1BS,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FA6B9B,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAhCnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC;AACxC,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;AAyBT,IAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAClD,iBAAA;;;ACtDD;;;;;;;;;;;;;;;;;AAiBG;MAqCU,2BAA2B,CAAA;AAC5B,IAAA,OAAO,MAAM,GAAG,CAAC;AAChB,IAAA,OAAO,GAAG,CAAA,2BAAA,EAA8B,EAAE,2BAA2B,CAAC,MAAM,EAAE;;IAG9E,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAW;AAExB,IAAA,QAAQ,GAAG,KAAK,CAAC,mBAAmB,+EAAC;AACrC,IAAA,WAAW,GAAG,KAAK,CAAC,YAAY,kFAAC;AACjC,IAAA,cAAc,GAAG,KAAK,CAAC,eAAe,qFAAC;AACvC,IAAA,gBAAgB,GAAG,KAAK,CAAC,iBAAiB,uFAAC;IAE3C,WAAW,GAAG,MAAM,EAAuB;AAE3C,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAC9B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;QACtB,OAAO,CAAC,KAAK,IAAI,GAAG,QAAQ,GAAG,CAAC,KAAK,KAAK,GAAG,UAAU,GAAG,KAAK;AACnE,IAAA,CAAC,+EAAC;AAEO,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM;AAC9B,QAAA,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;AAC9D,QAAA,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;AAC/D,QAAA,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;AACvE,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;wGAvBO,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhC1B;;;;;;;;;;;;;;;;;AAiBT,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,yGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAlBS,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAiChB,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBApCvC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,cACpB,IAAI,EAAA,OAAA,EACP,CAAC,eAAe,CAAC,EAAA,QAAA,EAChB;;;;;;;;;;;;;;;;;KAiBT,EAAA,eAAA,EAagB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,yGAAA,CAAA,EAAA;;;AC/CnD,MAAM,OAAO,GAA4C;IACrD,IAAI;IACJ,IAAI;IACJ,QAAQ;IACR,IAAI;CACP;AAED;;;;;;;;;;;;;;;;;AAiBG;MAgFU,4BAA4B,CAAA;IAC5B,eAAe,GAAG,4BAA4B;IAC9C,eAAe,GAAG,sBAAsB;IACxC,cAAc,GAAG,qBAAqB;IACtC,cAAc,GAAG,qBAAqB;IACtC,WAAW,GAAG,kBAAkB;AAChC,IAAA,sBAAsB,GAA2B;AACtD,QAAA,IAAI,EAAE,6BAA6B;AACnC,QAAA,IAAI,EAAE,4BAA4B;AAClC,QAAA,QAAQ,EAAE,4BAA4B;AACtC,QAAA,IAAI,EAAE,6BAA6B;KACtC;AAED,IAAA,IAAI,MAAM,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;IAC/B;IAEA,IAAI,MAAM,CAAC,KAAc,EAAA;QACrB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACjC;AAEA,IAAA,IAAI,KAAK,GAAA;QACL,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,GAAG;IAC5C;AAEA,IAAA,MAAM,GAAY,MAAM,CAAC,OAAO,CAAC;AACjC,IAAA,aAAa,GAAyB,MAAM,CAAC,oBAAoB,CAAC;AAClE,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAEhC,IAAA,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;AAErC,IAAA,WAAW,CAAC,KAAc,EAAA;QACtB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E;IAEA,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC;IAC7D;AAEA,IAAA,QAAQ,GAAG;QACP,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QAC3N,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QAC1N,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QAC1N,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QAC7N,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QAC3N,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QAC1N,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QAC1N,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;KAC9N;AAED,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,OAAO,2FAAC;AAC5E,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,OAAO,2FAAC;AAC5E,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,qFAAC;AAErE,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC1B,QAAA,MAAM,aAAa,GAAI,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,EAAE,CAAyD,EAAE,SAAS;AAC7I,QAAA,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;AAChK,QAAA,MAAM,QAAQ,GAAwD,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAErG,QAAA,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AACrB,YAAA,IAAI,aAAa,GAAG,KAAK,CAAC,EAAE;AACxB,gBAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAA2B,EAAE,CAAC;YAC3F;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,QAAQ;AACnB,IAAA,CAAC,oFAAC;IAEF,YAAY,GAAA;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAEtF,QAAA,IAAI,KAAK,EAAE,IAAI,KAAK,MAAM,EAAE;YACxB,OAAO;AACH,gBAAA,QAAQ,EAAE;AACN,oBAAA,OAAO,EAAE;AACL,wBAAA,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe;AACpF,wBAAA,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe;wBACtF,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe;AACnE,qBAAA;AACD,oBAAA,WAAW,EAAE;AACT,wBAAA,KAAK,EAAE;AACH,4BAAA,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE;AACxH,4BAAA,SAAS,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE;AACxH,yBAAA;AACD,wBAAA,IAAI,EAAE;AACF,4BAAA,OAAO,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE;AAC7H,4BAAA,SAAS,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE;AACnI,yBAAA;AACJ,qBAAA;AACJ,iBAAA;aACJ;QACL;QAEA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM;AACnD,QAAA,IAAI,MAAM,KAAK,MAAM,EAAE;YACnB,OAAO;AACH,gBAAA,QAAQ,EAAE;oBACN,OAAO,EAAE,KAAK,EAAE,OAAO;AACvB,oBAAA,WAAW,EAAE;AACT,wBAAA,KAAK,EAAE;AACH,4BAAA,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE;AACxH,4BAAA,SAAS,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE;AACxH,yBAAA;AACD,wBAAA,IAAI,EAAE;AACF,4BAAA,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE;AAC9H,4BAAA,SAAS,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE;AACpI,yBAAA;AACJ,qBAAA;AACJ,iBAAA;aACJ;QACL;AAAO,aAAA,IAAI,MAAM,KAAK,UAAU,EAAE;YAC9B,OAAO;AACH,gBAAA,QAAQ,EAAE;oBACN,OAAO,EAAE,KAAK,EAAE,OAAO;AACvB,oBAAA,WAAW,EAAE;AACT,wBAAA,KAAK,EAAE;AACH,4BAAA,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE;AACxH,4BAAA,SAAS,EAAE,EAAE,UAAU,EAAE,sDAAsD,EAAE,eAAe,EAAE,sDAAsD,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE;AAClN,yBAAA;AACD,wBAAA,IAAI,EAAE;AACF,4BAAA,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE;AAC9H,4BAAA,SAAS,EAAE,EAAE,UAAU,EAAE,oDAAoD,EAAE,eAAe,EAAE,oDAAoD,EAAE,KAAK,EAAE,uBAAuB,EAAE,UAAU,EAAE,uBAAuB,EAAE;AAC9N,yBAAA;AACJ,qBAAA;AACJ,iBAAA;aACJ;QACL;QAEA,OAAO;AACH,YAAA,QAAQ,EAAE;gBACN,OAAO,EAAE,KAAK,EAAE,OAAO;AACvB,gBAAA,WAAW,EAAE;AACT,oBAAA,KAAK,EAAE;AACH,wBAAA,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE;AACxH,wBAAA,SAAS,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE;AACnI,qBAAA;AACD,oBAAA,IAAI,EAAE;AACF,wBAAA,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE;AAC9H,wBAAA,SAAS,EAAE,EAAE,UAAU,EAAE,oDAAoD,EAAE,eAAe,EAAE,oDAAoD,EAAE,KAAK,EAAE,uBAAuB,EAAE,UAAU,EAAE,uBAAuB,EAAE;AAC9N,qBAAA;AACJ,iBAAA;AACJ,aAAA;SACJ;IACL;AAEA,IAAA,YAAY,CAAC,KAAY,EAAE,IAAY,EAAE,KAAwD,EAAA;AAC7F,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;YACpB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACtF;AAAO,aAAA,IAAI,IAAI,KAAK,SAAS,EAAE;YAC3B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACtF;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;QAC5B,KAAK,CAAC,eAAe,EAAE;IAC3B;IAEA,UAAU,CAAC,IAAY,EAAE,KAAwD,EAAA;AAC7E,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACpB,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACrC;AAAO,aAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AAC3B,YAAA,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC;QACvC;IACJ;AAEA,IAAA,cAAc,CAAC,KAAa,EAAA;QACxB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5E,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC,EAAE,OAAO;QAEjG,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,KAAK,UAAU,EAAE;YACrD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC;aAAO;YACH,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACjC;AAEA,QAAA,EAAE;aACG,MAAM,CAAC,MAAM;AACb,aAAA,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE;aAC1B,cAAc,CAAC,cAAc;AAC7B,aAAA,GAAG,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;;AAGrC,QAAA,YAAY,CAAC;AACT,YAAA,SAAS,EAAE;gBACP,YAAY,EAAE,KAAK,KAAK;sBAClB,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;sBACtE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE;AAC9E,aAAA;AACJ,SAAA,CAAC;IACN;wGA9LS,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA5B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA5E3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkET,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAGG,YAAY,8HACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,YAAY,uUACZ,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,iDAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAGb,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBA/ExC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,uBAAuB;AACjC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkET,IAAA,CAAA;AACD,oBAAA,IAAI,EAAE,EAAE;AACR,oBAAA,OAAO,EAAE;wBACL,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,YAAY;wBACZ,kBAAkB;AACrB,qBAAA;AACJ,iBAAA;;sBAEI;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;;AChHL;;;;;;;;;;;AAWG;MAkBU,2BAA2B,CAAA;AACtC,IAAA,OAAO,GAAG,KAAK,CAAsB,IAAI,8EAAC;AAC1C,IAAA,YAAY,GAAG,KAAK,CAAqB,EAAE,mFAAC;AAC5C,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;AAC/B,IAAA,KAAK,GAAG,KAAK,CAAS,kBAAkB,4EAAC;IAEzC,aAAa,GAAa,IAAI;AAC9B,IAAA,YAAY,GAAG;AACb,QAAA,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;AAC7B,QAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE;AAC/B,QAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE;KAChC;AAED,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,8EAAC;AAEzD,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;AACnB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,EAAE;QACjB,OAAO;AACL,YAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,SAAkB,EAAE;AAC7D,YAAA,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE;AACxG,YAAA,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;AACvG,YAAA,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;SAClH;AACH,IAAA,CAAC,2EAAC;AAEF,IAAA,aAAa,CAAC,KAAe,EAAA;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9B;IAES,WAAW,GAAG,MAAM,EAAY;AAEzC,IAAA,YAAY,CAAC,IAAoB,EAAA;QAC/B,QAAQ,IAAI;AACV,YAAA,KAAK,MAAM,EAAE,OAAO,SAAS;AAC7B,YAAA,KAAK,OAAO,EAAE,OAAO,MAAM;AAC3B,YAAA,KAAK,YAAY,EAAE,OAAO,MAAM;AAChC,YAAA,KAAK,YAAY;AACjB,YAAA,KAAK,MAAM,EAAE,OAAO,QAAQ;AAC5B,YAAA,SAAS,OAAO,WAAW;;IAE/B;IAEQ,QAAQ,CAAC,IAAY,EAAE,aAAqB,EAAE,aAAqB,EAAE,aAAa,GAAG,KAAK,EAAA;QAChG,IAAI,aAAa,EAAE;YACjB,IAAI,IAAI,GAAG,aAAa;AAAE,gBAAA,OAAO,MAAM;YACvC,IAAI,IAAI,GAAG,aAAa;AAAE,gBAAA,OAAO,MAAM;AACvC,YAAA,OAAO,SAAS;QAClB;QACA,IAAI,IAAI,IAAI,aAAa;AAAE,YAAA,OAAO,MAAM;QACxC,IAAI,IAAI,IAAI,aAAa;AAAE,YAAA,OAAO,SAAS;AAC3C,QAAA,OAAO,MAAM;IACf;wGArDW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzCxC,ihIAgGA,EAAA,MAAA,EAAA,CAAA,ilFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpEI,YAAY,8BACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,UAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACV,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,aAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,2BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,0BAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,aAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,UAAA,EAAA,aAAA,EAAA,MAAA,EAAA,eAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,4BAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,SAAS,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,GAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACT,YAAY,6bACZ,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,iDAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA;;4FAOT,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAjBvC,SAAS;+BACE,uBAAuB,EAAA,UAAA,EACrB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,UAAU;wBACV,WAAW;wBACX,SAAS;wBACT,YAAY;wBACZ,kBAAkB;wBAClB,WAAW;wBACX,QAAQ;AACT,qBAAA,EAAA,QAAA,EAAA,ihIAAA,EAAA,MAAA,EAAA,CAAA,ilFAAA,CAAA,EAAA;;;AErCH;;ACAA;;AAEG;;;;"}
1
+ {"version":3,"file":"elasticias-ui.mjs","sources":["../../../../libs/ui/src/lib/pipes/ef-currency.pipe.ts","../../../../libs/ui/src/lib/pipes/truncate.pipe.ts","../../../../libs/ui/src/lib/pipes/ef-compact.pipe.ts","../../../../libs/ui/src/lib/commerce/ef-price-display.component.ts","../../../../libs/ui/src/lib/commerce/ef-quantity-selector.component.ts","../../../../libs/ui/src/lib/commerce/ef-order-builder/ef-order-builder.component.types.ts","../../../../libs/ui/src/lib/layout/ef-label/ef-label.component.ts","../../../../libs/ui/src/lib/forms/ef-server-errors.directive.ts","../../../../libs/ui/src/lib/forms/abstract-ef-form-control.component.ts","../../../../libs/ui/src/lib/forms/ef-select/ef-select.component.ts","../../../../libs/ui/src/lib/forms/ef-select/ef-select.component.html","../../../../libs/ui/src/lib/forms/ef-clear-button/ef-clear-button.component.ts","../../../../libs/ui/src/lib/forms/ef-datepicker-advanced/ef-datepicker-advanced.component.ts","../../../../libs/ui/src/lib/forms/ef-datepicker-advanced/ef-datepicker-advanced.component.html","../../../../libs/ui/src/lib/forms/ef-inputnumber/ef-inputnumber.component.ts","../../../../libs/ui/src/lib/forms/ef-inputnumber/ef-inputnumber.component.html","../../../../libs/ui/src/lib/forms/ef-quantity-stepper/ef-quantity-stepper.component.ts","../../../../libs/ui/src/lib/forms/ef-quantity-stepper/ef-quantity-stepper.component.html","../../../../libs/ui/src/lib/layout/ef-button/ef-button.component.ts","../../../../libs/ui/src/lib/layout/ef-button/ef-button.component.html","../../../../libs/ui/src/lib/feedback/ef-skeleton/ef-skeleton.component.ts","../../../../libs/ui/src/lib/layout/ef-card/ef-card.component.ts","../../../../libs/ui/src/lib/layout/ef-dialog/ef-dialog.component.ts","../../../../libs/ui/src/lib/layout/ef-dialog/ef-dialog.component.html","../../../../libs/ui/src/lib/data/ef-change-history/ef-change-history.component.ts","../../../../libs/ui/src/lib/data/ef-change-history/ef-change-history.component.html","../../../../libs/ui/src/lib/commerce/ef-product-typeahead/ef-product-typeahead.component.ts","../../../../libs/ui/src/lib/commerce/ef-product-typeahead/ef-product-typeahead.component.html","../../../../libs/ui/src/lib/commerce/ef-order-builder/ef-order-builder.component.ts","../../../../libs/ui/src/lib/commerce/ef-order-builder/ef-order-builder.component.html","../../../../libs/ui/src/lib/commerce/ef-order-summary/ef-order-summary.component.ts","../../../../libs/ui/src/lib/commerce/ef-order-summary/ef-order-summary.component.html","../../../../libs/ui/src/lib/commerce/ef-product-catalogue-filter/ef-product-catalogue-filter.component.ts","../../../../libs/ui/src/lib/commerce/ef-product-catalogue-filter/ef-product-catalogue-filter.component.html","../../../../libs/ui/src/lib/commerce/ef-product-catalogue/ef-product-catalogue.component.ts","../../../../libs/ui/src/lib/commerce/ef-product-catalogue/ef-product-catalogue.component.html","../../../../libs/ui/src/lib/layout/ef-confirm-dialog/ef-confirm-dialog.component.ts","../../../../libs/ui/src/lib/layout/ef-theme-toggle/ef-theme-toggle.component.ts","../../../../libs/ui/src/lib/overlays/ef-tooltip.directive.ts","../../../../libs/ui/src/lib/layout/ef-build-stamp/ef-build-stamp.component.ts","../../../../libs/ui/src/lib/layout/ef-about-dialog/ef-about-dialog.component.ts","../../../../libs/ui/src/lib/layout/ef-about-dialog/ef-about-dialog.component.html","../../../../libs/ui/src/lib/layout/ef-fieldset/ef-fieldset.component.ts","../../../../libs/ui/src/lib/layout/ef-fieldset/ef-fieldset.component.html","../../../../libs/ui/src/lib/layout/ef-button-group/ef-button-group.component.ts","../../../../libs/ui/src/lib/layout/ef-badge/ef-badge.component.types.ts","../../../../libs/ui/src/lib/layout/ef-badge/ef-badge.component.ts","../../../../libs/ui/src/lib/layout/ef-badge/ef-badge.component.html","../../../../libs/ui/src/lib/layout/ef-toolbar/ef-toolbar.component.ts","../../../../libs/ui/src/lib/layout/ef-toolbar/ef-toolbar.component.html","../../../../libs/ui/src/lib/layout/ef-module-rail/ef-module-rail.component.ts","../../../../libs/ui/src/lib/layout/ef-module-rail/ef-module-rail.component.html","../../../../libs/ui/src/lib/layout/ef-module-side/ef-module-side.component.ts","../../../../libs/ui/src/lib/layout/ef-module-side/ef-module-side.component.html","../../../../libs/ui/src/lib/layout/ef-app-top/ef-app-top.component.ts","../../../../libs/ui/src/lib/layout/ef-app-top/ef-app-top.component.html","../../../../libs/ui/src/lib/layout/ef-app-main/ef-app-main.component.ts","../../../../libs/ui/src/lib/layout/ef-app-main/ef-app-main.component.html","../../../../libs/ui/src/lib/layout/ef-bottom-sheet/ef-bottom-sheet.component.ts","../../../../libs/ui/src/lib/layout/ef-bottom-sheet/ef-bottom-sheet.component.html","../../../../libs/ui/src/lib/layout/ef-app-shell/ef-app-shell.component.ts","../../../../libs/ui/src/lib/layout/ef-app-shell/ef-app-shell.component.html","../../../../libs/ui/src/lib/layout/ef-app-shell-mobile/ef-app-shell-mobile.component.ts","../../../../libs/ui/src/lib/layout/ef-app-shell-mobile/ef-app-shell-mobile.component.html","../../../../libs/ui/src/lib/layout/ef-fab/ef-fab.component.ts","../../../../libs/ui/src/lib/layout/ef-fab/ef-fab.component.html","../../../../libs/ui/src/lib/layout/ef-pill-group/ef-pill-group.component.ts","../../../../libs/ui/src/lib/layout/ef-pill-group/ef-pill-group.component.html","../../../../libs/ui/src/lib/layout/ef-tabs/ef-tab-panel.directive.ts","../../../../libs/ui/src/lib/layout/ef-tabs/ef-tabs.component.ts","../../../../libs/ui/src/lib/layout/ef-tabs/ef-tabs.component.html","../../../../libs/ui/src/lib/layout/ef-profile-chip/ef-profile-chip.component.ts","../../../../libs/ui/src/lib/layout/ef-profile-chip/ef-profile-chip.component.html","../../../../libs/ui/src/lib/feedback/ef-block-ui/ef-block-ui.component.ts","../../../../libs/ui/src/lib/feedback/ef-block-ui/ef-block-ui.component.html","../../../../libs/ui/src/lib/feedback/ef-blockable-div/ef-blockable-div.component.ts","../../../../libs/ui/src/lib/feedback/ef-pulse/ef-pulse.component.ts","../../../../libs/ui/src/lib/feedback/ef-pulse/ef-pulse.component.html","../../../../libs/ui/src/lib/feedback/ef-pdf-preview/ef-pdf-preview.component.ts","../../../../libs/ui/src/lib/feedback/ef-pdf-preview/ef-pdf-preview.component.html","../../../../libs/ui/src/lib/feedback/ef-status-chip/ef-status-chip.types.ts","../../../../libs/ui/src/lib/feedback/ef-status-chip/ef-status-chip.component.ts","../../../../libs/ui/src/lib/feedback/ef-status-chip/ef-status-chip.component.html","../../../../libs/ui/src/lib/feedback/ef-toast-region/ef-toast-region.component.ts","../../../../libs/ui/src/lib/feedback/ef-toast-region/ef-toast-region.component.html","../../../../libs/ui/src/lib/layout/ef-form-grid/ef-form-grid.component.ts","../../../../libs/ui/src/lib/layout/ef-detail-toolbar/ef-detail-toolbar.component.ts","../../../../libs/ui/src/lib/layout/ef-detail-toolbar/ef-detail-toolbar.component.html","../../../../libs/ui/src/lib/layout/ef-search-toolbar/ef-search-toolbar.component.ts","../../../../libs/ui/src/lib/layout/ef-search-toolbar/ef-search-toolbar.component.html","../../../../libs/ui/src/lib/data/ef-totals/ef-totals.component.ts","../../../../libs/ui/src/lib/data/ef-stats/ef-stats.component.ts","../../../../libs/ui/src/lib/data/ef-timeline/ef-timeline.component.ts","../../../../libs/ui/src/lib/data/ef-kpi-card/ef-kpi-card.component.ts","../../../../libs/ui/src/lib/data/ef-chart/ef-chart.config.ts","../../../../libs/ui/src/lib/data/ef-chart/ef-chart.component.ts","../../../../libs/ui/src/lib/data/ef-rank-list/ef-rank-list.component.ts","../../../../libs/ui/src/lib/forms/ef-input-text/ef-input-text.component.ts","../../../../libs/ui/src/lib/forms/ef-input-text/ef-input-text.component.html","../../../../libs/ui/src/lib/forms/ef-checkbox/ef-checkbox.component.ts","../../../../libs/ui/src/lib/forms/ef-checkbox/ef-checkbox.component.html","../../../../libs/ui/src/lib/forms/ef-toggleswitch/ef-toggleswitch.component.ts","../../../../libs/ui/src/lib/forms/ef-datepicker/ef-datepicker.component.ts","../../../../libs/ui/src/lib/forms/ef-datepicker/ef-datepicker.component.html","../../../../libs/ui/src/lib/forms/ef-password/ef-password.component.ts","../../../../libs/ui/src/lib/forms/ef-password/ef-password.component.html","../../../../libs/ui/src/lib/forms/ef-multi-select/ef-multi-select.component.ts","../../../../libs/ui/src/lib/forms/ef-multi-select/ef-multi-select.component.html","../../../../libs/ui/src/lib/forms/ef-selectbutton/ef-selectbutton.component.ts","../../../../libs/ui/src/lib/forms/ef-selectbutton/ef-selectbutton.component.html","../../../../libs/ui/src/lib/forms/index.ts","../../../../libs/ui/src/lib/data/ef-datatable/ef-datatable.component.types.ts","../../../../libs/ui/src/lib/data/ef-datatable-actionbar/ef-datatable-actionbar.component.ts","../../../../libs/ui/src/lib/data/ef-datatable-actionbar/ef-datatable-actionbar.component.html","../../../../libs/ui/src/lib/data/ef-datatable/ef-datatable.component.ts","../../../../libs/ui/src/lib/data/ef-datatable/ef-datatable.component.html","../../../../libs/ui/src/lib/data/ef-data-card/ef-data-card.mobile.ts","../../../../libs/ui/src/lib/data/ef-pager/ef-pager.component.ts","../../../../libs/ui/src/lib/data/ef-pager/ef-pager.component.html","../../../../libs/ui/src/lib/data/ef-row-actions/ef-row-actions.component.ts","../../../../libs/ui/src/lib/data/ef-row-actions/ef-row-actions.component.html","../../../../libs/ui/src/lib/data/ef-data-card/ef-column-template.directive.ts","../../../../libs/ui/src/lib/data/ef-data-card/ef-data-card.component.ts","../../../../libs/ui/src/lib/data/ef-data-card/ef-data-card.component.html","../../../../libs/ui/src/lib/data/ef-bulk-bar/ef-bulk-bar.component.ts","../../../../libs/ui/src/lib/feedback/ef-empty-state/ef-empty-state.component.ts","../../../../libs/ui/src/lib/data/ef-smart-bar/ef-smart-bar.component.ts","../../../../libs/ui/src/lib/forms/ef-filter-pill/ef-filter-pill.component.ts","../../../../libs/ui/src/lib/forms/ef-filter-pill/ef-filter-pill.component.html","../../../../libs/ui/src/lib/forms/ef-textarea/ef-textarea.component.ts","../../../../libs/ui/src/lib/forms/ef-textarea/ef-textarea.component.html","../../../../libs/ui/src/lib/forms/ef-preset-pill/ef-preset-pill.component.ts","../../../../libs/ui/src/lib/forms/ef-filter-drawer/ef-filter-drawer.component.ts","../../../../libs/ui/src/lib/forms/ef-activation-filter/ef-activation-filter.component.ts","../../../../libs/ui/src/lib/ef-theme-configurator/ef-theme-configurator.component.ts","../../../../libs/ui/src/lib/analytics/ef-email-metrics-card/ef-email-metrics-card.component.ts","../../../../libs/ui/src/lib/analytics/ef-email-metrics-card/ef-email-metrics-card.component.html","../../../../libs/ui/src/index.ts","../../../../libs/ui/src/elasticias-ui.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Merged currency pipe from ERP (AppCurrencyPipe) and Store (CurrencyFormatPipe).\n * Uses Intl.NumberFormat for formatting — no CurrencyPipe dependency needed.\n * Default: MAD currency, fr-MA locale.\n */\n@Pipe({ name: 'efCurrency', standalone: true })\nexport class EfCurrencyPipe implements PipeTransform {\n transform(value: number | null | undefined, currency = 'MAD', locale = 'fr-MA'): string {\n if (value == null) return '';\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({ name: 'truncate', standalone: true })\nexport class TruncatePipe implements PipeTransform {\n transform(value: string, maxLength = 50, suffix = '...'): string {\n if (!value) return '';\n return value.length > maxLength ? value.slice(0, maxLength) + suffix : value;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { NumberUtils } from '@elasticias/utils';\n\n/**\n * Compact human-readable rendering of a number for KPI displays:\n * 1000 → \"1 k\", 2_500_000 → \"2,5 M\" (fr-MA locale, decimal comma).\n */\n@Pipe({ name: 'efCompact', standalone: true, pure: true })\nexport class EfCompactPipe implements PipeTransform {\n transform(value: number | null | undefined, maxDecimals = 2): string {\n return value === null || value === undefined ? '' : NumberUtils.compact(value, { maxDecimals });\n }\n}\n","import { Component, input } from '@angular/core';\nimport { EfCurrencyPipe } from '../pipes/ef-currency.pipe';\n\n@Component({\n selector: 'ef-price-display',\n standalone: true,\n imports: [EfCurrencyPipe],\n template: `<span class=\"font-medium\">{{ amount() | efCurrency }}</span>`,\n})\nexport class EfPriceDisplayComponent {\n readonly amount = input.required<number>();\n}\n","import { Component, input, output } from '@angular/core';\nimport { ButtonModule } from 'primeng/button';\n\n@Component({\n selector: 'ef-quantity-selector',\n standalone: true,\n imports: [ButtonModule],\n template: `\n <div class=\"flex items-center gap-2\">\n <p-button\n icon=\"pi pi-minus\"\n [rounded]=\"true\"\n [text]=\"true\"\n size=\"small\"\n (onClick)=\"decrement()\"\n [disabled]=\"quantity() <= 1\"\n />\n <span class=\"w-8 text-center font-medium\">{{ quantity() }}</span>\n <p-button\n icon=\"pi pi-plus\"\n [rounded]=\"true\"\n [text]=\"true\"\n size=\"small\"\n (onClick)=\"increment()\"\n />\n </div>\n `,\n})\nexport class EfQuantitySelectorComponent {\n readonly quantity = input(1);\n readonly quantityChange = output<number>();\n\n increment(): void {\n this.quantityChange.emit(this.quantity() + 1);\n }\n\n decrement(): void {\n if (this.quantity() > 1) {\n this.quantityChange.emit(this.quantity() - 1);\n }\n }\n}\n","import { UuidUtils } from '@elasticias/utils';\n\n/**\n * Summary item for product count groups\n */\nexport interface OrderSummaryItem {\n code: string;\n label: string;\n count: number;\n column: number;\n}\n\n/**\n * Order products summary grouped by countGroup\n */\nexport interface OrderProductsSummary {\n items: OrderSummaryItem[];\n totalCount: number;\n}\n\n/**\n * Represents a line item in an order, invoice, or quote\n */\nexport interface OrderLineItem {\n id?: string | number;\n product?: Record<string, unknown>;\n productId?: unknown;\n variantId?: string | null;\n countGroup?: string;\n productDescription?: string;\n productUnitPrice: number;\n quantity: number;\n discount: number;\n grossAmount: number;\n amount?: number;\n taxeId?: number | null;\n taxRate?: number;\n taxAmount?: number;\n position?: number;\n isEditing?: boolean;\n editingField?: string | null;\n}\n\n/**\n * Standard order entity contract\n */\nexport interface OrderEntity {\n // Core identification\n id?: number;\n documentNumber?: string;\n documentType: 'order' | 'invoice' | 'quote';\n status?: 'draft' | 'confirmed' | 'processing' | 'completed' | 'cancelled';\n\n // Customer information\n customerId?: string | null;\n customerName?: string;\n\n // Dates\n orderDate: Date;\n deliveryDate?: Date | null;\n dueDate?: Date | null;\n\n // Line items\n orderLines: OrderLineItem[];\n\n // Financial calculations\n grossTotal: number;\n discountTotal: number;\n taxTotal: number;\n finalTotal: number;\n\n // Optional fields\n notes?: string;\n internalNotes?: string;\n paymentTerms?: string;\n shippingAddress?: string;\n billingAddress?: string;\n\n // Products summary by countGroup\n productsSummary?: OrderProductsSummary;\n}\n\n/**\n * Configuration for document types (order, invoice, quote)\n */\nexport interface DocumentConfig {\n documentType: 'order' | 'invoice' | 'quote';\n headerLabel: string;\n dateLabel: string;\n customerLabel: string;\n enableTax?: boolean;\n enableDiscount?: boolean;\n showCatalogue?: boolean;\n allowInlineEdit?: boolean;\n enableQuickAdd?: boolean;\n showNotes?: boolean;\n showProductsSummary?: boolean;\n currencyCode?: string;\n locale?: string;\n}\n\n/**\n * Change tracking metadata\n */\nexport interface OrderChangeInfo {\n hasChanges: boolean;\n lastModified: Date;\n modifiedFields: Set<string>;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n isValid: boolean;\n errors: { [key: string]: string[] };\n warnings?: { [key: string]: string[] };\n}\n\n/**\n * Helper functions for order line items\n */\nexport class OrderLineItemHelper {\n /**\n * Calculate subtotal for a line item (price * quantity - discount)\n */\n static calculateSubtotal(item: OrderLineItem): number {\n if (!item.productUnitPrice || !item.quantity) return 0;\n const subtotal = item.productUnitPrice * item.quantity;\n const discount = item.discount || 0;\n return subtotal - (subtotal * discount) / 100;\n }\n\n /**\n * Calculate tax amount for a line item\n */\n static calculateTaxAmount(item: OrderLineItem): number {\n if (!item.taxRate) return 0;\n const subtotal = this.calculateSubtotal(item);\n return (subtotal * item.taxRate) / 100;\n }\n\n /**\n * Calculate final amount including tax\n */\n static calculateFinalAmount(item: OrderLineItem): number {\n const subtotal = this.calculateSubtotal(item);\n const taxAmount = this.calculateTaxAmount(item);\n return subtotal + taxAmount;\n }\n\n /**\n * Compose a line description from a product and (optionally) its variant.\n * Variable product → \"{displayName} ({variantTitle})\"\n * Simple product → displayName\n * Mirrors the legacy PDF format `[PF] {ref} - {NAME} ({volume})` after\n * the parent displayName has been cleaned of its baked-in volume suffix.\n */\n static composeDescription(\n product: Record<string, unknown> | null | undefined,\n variant?: Record<string, unknown>,\n ): string {\n if (!product) return '';\n const base = (product['displayName'] || product['name'] || '') as string;\n if (!base) return '';\n const title = variant?.['title'] as string | undefined;\n if (title && title.trim().length > 0) {\n return `${base} (${title})`;\n }\n return base;\n }\n\n /**\n * Create a new empty line item\n */\n static createEmptyItem(): OrderLineItem {\n return {\n id: UuidUtils.randomUUID(),\n product: null,\n productId: undefined,\n productUnitPrice: 0,\n quantity: 1,\n discount: 0,\n grossAmount: 0,\n taxRate: 0,\n taxAmount: 0,\n isEditing: true,\n editingField: null,\n };\n }\n\n /**\n * Create a line item from product selection\n * @param keyField - Field name used to identify the product (default: 'id')\n */\n static createFromProduct(product: Record<string, unknown>, quantity = 1, keyField = 'id', variantId?: string): OrderLineItem {\n // Resolve variant data if variantId is provided and product has variants\n const variants = product['variants'] as Array<Record<string, unknown>> | undefined;\n const variant = variantId && variants?.length\n ? variants.find((v) => v['variantId'] === variantId)\n : undefined;\n\n const unitPrice = variant?.['price'] ?? product.unitPrice ?? product.salePrice ?? 0;\n const taxRate = product.taxRate || 0;\n const countGroup = (variant?.['countGroup'] ?? product['countGroup'] ?? '') as string;\n\n const item: OrderLineItem = {\n id: UuidUtils.randomUUID(),\n productId: product[keyField] as string,\n variantId: variantId ?? null,\n countGroup: countGroup,\n product: product,\n productDescription: OrderLineItemHelper.composeDescription(product, variant),\n productUnitPrice: unitPrice as number,\n quantity: quantity,\n discount: 0,\n grossAmount: 0,\n amount: 0,\n taxeId: (product.taxeId || null) as number | null,\n taxRate: taxRate as number,\n taxAmount: 0,\n isEditing: false,\n editingField: null,\n };\n\n // Calculate amounts\n item.grossAmount = OrderLineItemHelper.calculateSubtotal(item);\n item.taxAmount = OrderLineItemHelper.calculateTaxAmount(item);\n item.amount = OrderLineItemHelper.calculateFinalAmount(item);\n\n return item;\n }\n\n /**\n * Update calculations for an existing line item\n */\n static updateCalculations(item: OrderLineItem): OrderLineItem {\n return {\n ...item,\n grossAmount: this.calculateSubtotal(item),\n taxAmount: this.calculateTaxAmount(item),\n amount: this.calculateFinalAmount(item),\n };\n }\n\n /**\n * Validate a line item\n */\n static validate(item: OrderLineItem): ValidationResult {\n const errors: { [key: string]: string[] } = {};\n\n if (!item.product && !item.productId) {\n errors['product'] = ['Le produit est requis'];\n }\n\n if (!item.productUnitPrice || item.productUnitPrice <= 0) {\n errors['productUnitPrice'] = [\"Le prix d'unité doit être supérieur à 0\"];\n }\n\n if (!item.quantity || item.quantity <= 0) {\n errors['quantity'] = ['La quantité doit être supérieure à 0'];\n }\n\n if (item.discount && (item.discount < 0 || item.discount > 100)) {\n errors['discount'] = ['La remise doit être entre 0 et 100'];\n }\n\n return {\n isValid: Object.keys(errors).length === 0,\n errors,\n };\n }\n\n /**\n * Compare two line items for equality\n */\n static areEqual(item1: OrderLineItem, item2: OrderLineItem): boolean {\n return (\n item1.productId === item2.productId &&\n item1.productUnitPrice === item2.productUnitPrice &&\n item1.quantity === item2.quantity &&\n item1.discount === item2.discount &&\n item1.taxRate === item2.taxRate\n );\n }\n}\n\n/**\n * Helper functions for order entity\n */\nexport class OrderEntityHelper {\n /**\n * Create a new empty order entity\n */\n static createEmpty(\n documentType: 'order' | 'invoice' | 'quote' = 'order',\n ): OrderEntity {\n return {\n documentType,\n orderDate: new Date(),\n orderLines: [],\n grossTotal: 0,\n discountTotal: 0,\n taxTotal: 0,\n finalTotal: 0,\n status: 'draft',\n };\n }\n\n /**\n * Calculate all totals for an order\n */\n static calculateTotals(order: OrderEntity): OrderEntity {\n const grossTotal = order.orderLines.reduce(\n (total, item) =>\n total + (item.productUnitPrice || 0) * (item.quantity || 0),\n 0,\n );\n\n const discountTotal = order.orderLines.reduce((total, item) => {\n const itemTotal = (item.productUnitPrice || 0) * (item.quantity || 0);\n const discount = item.discount || 0;\n return total + (itemTotal * discount) / 100;\n }, 0);\n\n const taxTotal = order.orderLines.reduce((total, item) => {\n return total + (item.taxAmount || 0);\n }, 0);\n\n const finalTotal = grossTotal - discountTotal + taxTotal;\n\n return {\n ...order,\n grossTotal,\n discountTotal,\n taxTotal,\n finalTotal,\n };\n }\n\n /**\n * Validate order entity\n */\n static validate(order: OrderEntity): ValidationResult {\n const errors: { [key: string]: string[] } = {};\n const warnings: { [key: string]: string[] } = {};\n\n // Validate required fields\n if (!order.customerId) {\n errors['customerId'] = ['Le client est requis'];\n }\n\n if (!order.orderDate) {\n errors['orderDate'] = ['La date est requise'];\n }\n\n if (!order.orderLines || order.orderLines.length === 0) {\n errors['orderLines'] = ['Au moins un article est requis'];\n }\n\n // Validate line items\n order.orderLines.forEach((item, index) => {\n const itemValidation = OrderLineItemHelper.validate(item);\n if (!itemValidation.isValid) {\n Object.keys(itemValidation.errors).forEach((key) => {\n errors[`orderLines[${index}].${key}`] = itemValidation.errors[key];\n });\n }\n });\n\n // Check for warnings\n if (order.finalTotal <= 0) {\n warnings['finalTotal'] = ['Le montant total est invalide'];\n }\n\n return {\n isValid: Object.keys(errors).length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Clone order entity for immutability\n */\n static clone(order: OrderEntity): OrderEntity {\n return {\n ...order,\n orderDate: new Date(order.orderDate),\n deliveryDate: order.deliveryDate ? new Date(order.deliveryDate) : null,\n dueDate: order.dueDate ? new Date(order.dueDate) : null,\n orderLines: order.orderLines.map((item) => ({ ...item })),\n };\n }\n\n /**\n * Compare two orders for changes\n */\n static detectChanges(\n original: OrderEntity,\n current: OrderEntity,\n ): OrderChangeInfo {\n const modifiedFields = new Set<string>();\n\n // Compare basic fields\n const fieldsToCompare: (keyof OrderEntity)[] = [\n 'customerId',\n 'orderDate',\n 'deliveryDate',\n 'dueDate',\n 'notes',\n 'internalNotes',\n 'status',\n ];\n\n fieldsToCompare.forEach((field) => {\n if (original[field] !== current[field]) {\n modifiedFields.add(field as string);\n }\n });\n\n // Compare order items\n if (original.orderLines.length !== current.orderLines.length) {\n modifiedFields.add('orderLines');\n } else {\n for (let i = 0; i < original.orderLines.length; i++) {\n if (\n !OrderLineItemHelper.areEqual(\n original.orderLines[i],\n current.orderLines[i],\n )\n ) {\n modifiedFields.add('orderLines');\n break;\n }\n }\n }\n\n return {\n hasChanges: modifiedFields.size > 0,\n lastModified: new Date(),\n modifiedFields,\n };\n }\n}\n","import { booleanAttribute, Component, Input } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Comptoir form label — renders a `<label>` with the design-system\n * typography (uppercase Manrope 11px / 700 / `--text-mute`,\n * 0.06em letter-spacing) defined under `.ef-label` in\n * `@elasticias/ui/styles/patterns`.\n *\n * - `[labelKey]` — translation key (preferred). Falls back to\n * `[label]` when missing. The `feedback_i18n_keys` memory says\n * always use `*Key` on shared `ef-*` components.\n * - `[for]` — DOM id of the input the label labels. Mapped through\n * `[attr.for]` so an empty value renders no attribute (the input\n * doesn't end up with a broken `for=\"\"`).\n * - `[required]` — toggles a red asterisk via\n * `.ef-label.is-required::after`.\n * - `[styleClass]` — caller-supplied extra class. Defaults to\n * `'form-label'` for v1 back-compat. The `.ef-label` Comptoir\n * class is always applied on top.\n */\n@Component({\n selector: 'ef-label',\n standalone: true,\n template: `\n <label\n [attr.for]=\"for || null\"\n [class]=\"resolvedClass\"\n >{{ labelKey ? (labelKey | translate) : label }}</label>\n `,\n styles: [`:host { display: contents; }`],\n imports: [TranslateModule],\n})\nexport class EfLabelComponent {\n /** Direct label text — use `labelKey` for i18n. */\n @Input() label?: string;\n /** Translation key — preferred. */\n @Input() labelKey?: string;\n /** DOM id of the labelled input. Empty / unset → no `for` attr. */\n @Input() for?: string;\n /** Caller-supplied extra class. The Comptoir `.ef-label` class is\n * always applied; this stacks on top. Defaults to `'form-label'`\n * for v1 back-compat. */\n @Input() styleClass = 'form-label';\n /** Show the required-asterisk modifier. */\n @Input({ transform: booleanAttribute }) required = false;\n\n /** Composes `'ef-label'` + `styleClass` + the `'is-required'`\n * modifier into a single class string. Angular's `[class]`\n * binding replaces (doesn't merge) so we do the joining here. */\n get resolvedClass(): string {\n const parts = ['ef-label'];\n if (this.styleClass) parts.push(this.styleClass);\n if (this.required) parts.push('is-required');\n return parts.join(' ');\n }\n}\n","import { Directive, input } from '@angular/core';\n\n/**\n * Scopes a map of server/validation errors to its descendant `ef-*` form\n * controls, which auto-link by their `name` — no per-field `[errors]`\n * binding needed.\n *\n * Drop it on any container that wraps the form fields and bind the screen's\n * `serverErrors()` signal once:\n *\n * ```html\n * <div class=\"detail-grid\" [efServerErrors]=\"serverErrors()\">\n * <ef-input-text name=\"companyName\" ... /> <!-- picks up errors['companyName'] -->\n * <ef-select name=\"clientType\" ... /> <!-- picks up errors['clientType'] -->\n * </div>\n * ```\n *\n * Each control resolves its messages via `AbstractEfFormControl`\n * (`resolvedExternalErrors`): an explicit `[errors]` input still wins when\n * present, otherwise the control falls back to this scope keyed by `name`.\n * Keys must match the control `name` (camelCase) — `AbstractScreenComponent.setServerErrors`\n * already normalizes the backend's PascalCase keys, so the map is camelCase.\n *\n * The input is a signal, so updates propagate to controls under zoneless\n * change detection (controls read it through a `computed`).\n */\n@Directive({\n selector: '[efServerErrors]',\n standalone: true,\n})\nexport class EfServerErrorsDirective {\n /** Field-name → messages map (camelCase keys, matching control `name`). */\n readonly errors = input<{ [key: string]: string[] } | null>(null, {\n alias: 'efServerErrors',\n });\n\n /** Messages for a control by its `name`, or `null` when none. */\n errorsFor(name: string | undefined | null): string[] | null {\n const map = this.errors();\n if (!name || !map) return null;\n return map[name] ?? null;\n }\n}\n\n/**\n * Resolves a form control's external (server) errors: the explicit `[errors]`\n * input wins, otherwise fall back to the enclosing `[efServerErrors]` scope\n * keyed by `name`. Shared by `AbstractEfFormControl` and the standalone\n * controls that don't extend it (ef-password, ef-datepicker, …), so the\n * precedence stays identical everywhere.\n *\n * Call from a `computed(() => resolveExternalErrors(this.errors(), this.serverErrorsScope, this.name))`\n * so the read tracks both signal sources under zoneless change detection.\n */\nexport function resolveExternalErrors(\n explicit: string[] | null | undefined,\n scope: EfServerErrorsDirective | null,\n name: string | undefined | null,\n): string[] | null {\n if (explicit && explicit.length) return explicit;\n return scope?.errorsFor(name) ?? null;\n}\n","import { booleanAttribute, Component, computed, inject, input, signal } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { EfServerErrorsDirective, resolveExternalErrors } from './ef-server-errors.directive';\n\n/**\n * Shared base for every Comptoir form control (`ef-input-text`,\n * `ef-textarea`, `ef-select`, `ef-input-number`, `ef-checkbox`, …).\n *\n * Hoists the cross-cutting concerns that every form control wants\n * to handle the same way:\n *\n * - **Identity** — `inputId` / `name` plus an auto-generated id\n * (`ef-ctrl-<n>`) so the `<label for>` ↔ `<input id>` binding\n * always works for screen readers + click-to-focus, even when\n * the consumer didn't pass anything.\n * - **Label / placeholder i18n** — `labelKey` / `label` and\n * `placeholderKey` / `placeholder` with the same precedence\n * convention (`*Key` wins, falls back to literal). All ef-*\n * form controls follow the\n * [feedback_i18n_keys](memory) convention by surfacing both\n * inputs.\n * - **ARIA** — `ariaLabelKey` / `ariaLabel` for screen-reader-only\n * labels; `effectiveAriaLabel` returns `null` when a visible\n * label is rendered (which already serves as the ARIA name).\n * `errorsId` provides a stable id for the error/hint container\n * so subclasses can wire `aria-describedby`.\n * - **State** — `required` / `readonly` / `disabled` shared inputs,\n * used directly in subclass templates and toggled by CVA's\n * `setDisabledState` in subclasses.\n *\n * Subclasses still own their own `value` field, ControlValueAccessor\n * implementation, and any control-specific inputs (e.g. textarea's\n * `rows`, select's `options`).\n *\n * ```ts\n * export class EfInputTextComponent extends AbstractEfFormControl\n * implements ControlValueAccessor {\n * @Input() type = 'text';\n * @Input() value = '';\n * // ... CVA + value-specific logic\n * }\n * ```\n */\n@Component({ template: '', standalone: true })\nexport abstract class AbstractEfFormControl {\n /* ── Identity ─────────────────────────────────────────────── *\n * Signal inputs (`input()`) throughout, so signal-native subclasses\n * (e.g. ef-datepicker-advanced) can extend this base and read everything\n * reactively. Subclasses + templates read these as calls: `name()`,\n * `isDisabled()`, etc. */\n\n /** Explicit DOM `id` for the inner control. Falls back to\n * `name`, then to the auto-generated `_autoId`. */\n readonly inputId = input<string>('');\n\n /** Form `name` attribute — also used as the id fallback. */\n readonly name = input<string>('');\n\n /** Per-instance auto id used when neither `inputId` nor `name`\n * is supplied. The static counter is shared across all\n * AbstractEfFormControl subclasses, which is fine — uniqueness\n * per-page is the only requirement. */\n private static _nextId = 0;\n protected readonly _autoId = `ef-ctrl-${++AbstractEfFormControl._nextId}`;\n\n /* ── Visible label (i18n) ─────────────────────────────────── */\n\n /** Direct label text. Use `labelKey` for i18n. */\n readonly label = input<string>('');\n\n /** Translation key for the label — preferred (memory:\n * feedback_i18n_keys says always use `*Key`). */\n readonly labelKey = input<string>('');\n\n /* ── Placeholder (i18n) ───────────────────────────────────── */\n\n readonly placeholder = input<string>('');\n readonly placeholderKey = input<string>('');\n\n /* ── Screen-reader-only label (when no visible label) ─────── */\n\n readonly ariaLabel = input<string>('');\n readonly ariaLabelKey = input<string>('');\n\n /* ── State ────────────────────────────────────────────────── */\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n\n /** The `[disabled]` input. The **effective** disabled (input OR\n * form-driven via CVA) is {@link isDisabled} — bind that in templates. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Form-driven disabled set by CVA `setDisabledState`, merged with the\n * `[disabled]` input. Writable signal (the input itself is read-only). */\n private readonly _cvaDisabled = signal(false);\n\n /** Effective disabled state — the `[disabled]` input OR a reactive-form\n * `disable()`. Templates/logic should use this, not `disabled()`. */\n readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\n\n /** CVA hook for subclasses: `setDisabledState(d) { this.updateDisabledState(d); }`. */\n protected updateDisabledState(disabled: boolean): void {\n this._cvaDisabled.set(disabled);\n }\n\n /* ── Clearable ────────────────────────────────────────────── */\n\n /**\n * Show the inline clear ✕ (the shared `ef-clear-button`). On by default —\n * every control is clearable; the ✕ only appears when there's a value and\n * the field is editable (see {@link canClear}). Set `[showClear]=\"false\"`\n * to opt a field out.\n */\n readonly showClear = input(true, { transform: booleanAttribute });\n\n /** Whether the clear ✕ should currently render: opted in, the control\n * holds a value ({@link hasValue}), and the field is editable. */\n get canClear(): boolean {\n return this.showClear() && this.hasValue && !this.isDisabled() && !this.readonly();\n }\n\n /** Subclasses report whether they currently hold a clearable value.\n * Default `false` (controls that don't override never show a clear). */\n protected get hasValue(): boolean {\n return false;\n }\n\n /** Reset the control's value (and notify forms / `valueChangeEvent`).\n * Overridden by subclasses that support clearing. */\n clearValue(): void {\n /* no-op — overridden by clearable subclasses */\n }\n\n /**\n * Forms-independent server/validation errors for this field.\n *\n * The signal-based V2 detail screens bind values with `[value]` +\n * `(valueChangeEvent)` and never register an `NgControl`, so the\n * `ngControl`-based `serverError` path can't surface backend\n * validation messages. Two ways to feed them in:\n *\n * - Explicit, per-field: `[errors]=\"serverErrors()['clientType']\"`.\n * - Automatic, by `name`: wrap the fields in `[efServerErrors]=\"serverErrors()\"`\n * and the control links itself via {@link EfServerErrorsDirective}\n * (no per-field binding). See {@link resolvedExternalErrors}.\n *\n * Either way the control renders the messages and the invalid state.\n * Falls back to the `NgControl` `serverError` path when neither is\n * present, so `ngModel`-based (v1) screens keep working unchanged.\n */\n readonly errors = input<string[] | null | undefined>(undefined);\n\n /** Optional enclosing `[efServerErrors]` scope (auto-link by `name`). */\n private readonly serverErrorsScope = inject(EfServerErrorsDirective, { optional: true });\n\n /**\n * External (server) errors for this control, resolved reactively from\n * either the explicit `[errors]` input (wins) or the enclosing\n * `[efServerErrors]` scope keyed by `name`. A `computed` so reads inside\n * the subclass `serverErrors` / `isInvalid` getters track the source\n * signals under zoneless change detection.\n */\n readonly resolvedExternalErrors = computed<string[] | null>(() =>\n resolveExternalErrors(this.errors(), this.serverErrorsScope, this.name()),\n );\n\n /* ── Internals ────────────────────────────────────────────── */\n\n protected readonly translateService = inject(TranslateService);\n\n /** Resolved DOM id. Always non-empty so `<label for>` and\n * `<input id>` can match unambiguously. */\n get effectiveId(): string {\n return this.inputId() || this.name() || this._autoId;\n }\n\n /** Translated placeholder (or empty string). */\n get effectivePlaceholder(): string {\n if (this.placeholderKey()) {\n return this.translateService.instant(this.placeholderKey());\n }\n return this.placeholder() || '';\n }\n\n /**\n * Resolved `aria-label` value — used when no visible label is\n * rendered. Returns `null` (no attribute) when a visible label\n * IS shown, since the visible label already serves as the\n * accessible name and duplicate `aria-label` would override it.\n */\n get effectiveAriaLabel(): string | null {\n if (this.labelKey() || this.label()) return null;\n if (this.ariaLabelKey()) {\n return this.translateService.instant(this.ariaLabelKey());\n }\n return this.ariaLabel() || null;\n }\n\n /** Stable id for the error / hint container — wired through\n * `aria-describedby` on the input so screen readers announce\n * the validation message together with the field name. */\n get errorsId(): string {\n return `${this.effectiveId}-errors`;\n }\n}\n","import {\n booleanAttribute,\n Component,\n ContentChild,\n forwardRef,\n HostBinding,\n inject,\n Injector,\n Input,\n OnInit,\n Output,\n EventEmitter,\n OnChanges,\n SimpleChanges,\n TemplateRef,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { SelectModule } from 'primeng/select';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n/**\n * Comptoir select — wraps PrimeNG `p-select` (single) or `p-multiselect`\n * (multi) and skins it against the `.es` / `.es__panel` patterns lifted\n * from the static prototype (`docs/ux-ui/erp/screens/components.html`,\n * Section 04). All the heavy machinery (filter, virtual scroll, group\n * support, keyboard nav, ARIA listbox semantics, RTL, focus trapping,\n * lazy loading) comes from PrimeNG; we own only the visuals + the\n * Elasticias API surface (i18n `*Key` inputs, `selectionChangeEvent`,\n * `filterByKeys`, content-projected templates).\n *\n * The `'comptoir'` variant remains as a lite, no-deps escape hatch\n * (native `<select>` styled via `.ef-select-native`); use the default\n * `'primeng'` variant for any screen that needs filter / multi /\n * group / templating.\n *\n * ```html\n * <ef-select\n * labelKey=\"orders.status\"\n * placeholderKey=\"orders.status_placeholder\"\n * [(value)]=\"status\"\n * [options]=\"statuses\"\n * optionLabel=\"label\" optionValue=\"code\"\n * [filter]=\"true\" [showClear]=\"true\">\n * </ef-select>\n *\n * <ef-select\n * labelKey=\"users.assigned\"\n * [options]=\"users\" optionLabel=\"name\" optionValue=\"id\"\n * [multiple]=\"true\" [filter]=\"true\">\n * <ng-template #item let-u>\n * <span class=\"av\">{{ u.initials }}</span>\n * <span class=\"body\">\n * <span class=\"nm\">{{ u.name }}</span>\n * <span class=\"meta\">{{ u.role }}</span>\n * </span>\n * </ng-template>\n * </ef-select>\n * ```\n */\n@Component({\n selector: 'ef-select',\n standalone: true,\n templateUrl: './ef-select.component.html',\n styleUrls: ['./ef-select.component.scss'],\n imports: [\n SelectModule,\n MultiSelectModule,\n FormsModule,\n TranslateModule,\n EfLabelComponent,\n CommonModule,\n ],\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => EfSelectComponent),\n multi: true,\n }],\n})\nexport class EfSelectComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor, OnInit, OnChanges\n{\n /* Identity / label / placeholder / aria / required / readonly /\n disabled all inherited from AbstractEfFormControl. */\n\n /* ── Data ────────────────────────────────────────────────────── */\n\n @Input() options: any[] = [];\n @Input() optionLabel = 'name';\n @Input() optionValue?: string;\n @Input() optionDisabled?: string;\n /** Stable identity key — required for groups and virtual scroll. */\n @Input() dataKey?: string;\n\n /** Group mode — pair with `optionGroupLabel` + `optionGroupChildren`. */\n @Input({ transform: booleanAttribute }) group = false;\n @Input() optionGroupLabel = 'label';\n @Input() optionGroupChildren = 'items';\n\n /* ── Layout / size ───────────────────────────────────────────── */\n\n /** Control height. Default (undefined) = the canonical `--hit-base` (40px),\n * matching native inputs (ADR-009). `'small'` opts into the dense 32px\n * variant for compact contexts (e.g. table-row editors). */\n @Input() size?: 'small' | 'large';\n @Input({ transform: booleanAttribute }) fluid = true;\n @Input({ transform: booleanAttribute }) inline = false;\n @Input() appendTo?: string;\n\n /* ── Behavior ────────────────────────────────────────────────── */\n\n /** Multi-selection — internally swaps `<p-select>` for `<p-multiselect>`. */\n @Input({ transform: booleanAttribute }) multiple = false;\n\n @Input({ transform: booleanAttribute }) filter = false;\n /** Filter the list against these option fields (string or csv).\n * PrimeNG default: `optionLabel`. */\n @Input() filterBy?: string;\n @Input() filterPlaceholder?: string;\n @Input() filterPlaceholderKey?: string;\n /** Auto-focus the filter input when the panel opens (default: true). */\n @Input({ transform: booleanAttribute }) autofocusFilter = true;\n\n /* showClear is inherited from AbstractEfFormControl (default true →\n clearable by default; PrimeNG only renders the ✕ when a value is set). */\n @Input({ transform: booleanAttribute }) editable = false;\n @Input({ transform: booleanAttribute }) loading = false;\n\n /** Virtual-scroll for long lists (>100 items). Pair with\n * `virtualScrollItemSize` (default 38px). */\n @Input({ transform: booleanAttribute }) virtualScroll = false;\n @Input() virtualScrollItemSize = 38;\n @Input() scrollHeight = '240px';\n\n /** Multi-select trigger display: `'chip'` (default — chips visible\n * in the trigger, individually removable) or `'comma'`. */\n @Input() multiDisplay: 'chip' | 'comma' = 'chip';\n\n /** Multi-select header \"select all\" toggle. Off by default — the\n * Comptoir multiselect leads with the filter; opt in when bulk\n * select-all is genuinely useful. */\n @Input({ transform: booleanAttribute }) showToggleAll = false;\n\n /* ── Empty state messages (i18n) ─────────────────────────────── */\n\n @Input() emptyMessage?: string;\n @Input() emptyMessageKey?: string;\n @Input() emptyFilterMessage?: string;\n @Input() emptyFilterMessageKey?: string;\n\n /* ── Style hooks (merged with our base `.es` / `.es__panel`) ── */\n\n @Input() styleClass?: string;\n @Input() panelStyleClass?: string;\n\n /** Filter options by matching key-value pairs (legacy Elasticias\n * helper — pre-filters `options` before they reach PrimeNG). */\n @Input() filterByKeys?: { [key: string]: any };\n\n /**\n * Rendering variant.\n * - `'primeng'` (default) — wraps `p-select` / `p-multiselect`, skinned with\n * the `.es` / `.es__panel` patterns (the custom\n * dropdown: filter, styled options, animated panel\n * — see `components.html` Section 04). Also pinned\n * to the canonical `--hit-base` (40px) trigger\n * height (`.es.p-select { min-height: --hit-base }`),\n * so it aligns with inputs/buttons in a row.\n * - `'comptoir'` — lite native `<select class=\"ef-select-native\">`.\n * No filter / panel / multi / templates; use it for\n * inline / dense contexts that want the plain native\n * control (e.g. table-row editors).\n * The `.es` dropdown is the default per the design system; opt into\n * `comptoir` only when a native control is specifically wanted. See ADR-009.\n */\n @Input() variant: 'primeng' | 'comptoir' = 'primeng';\n\n @HostBinding('class.ef-inline') get isInline() { return this.inline; }\n @HostBinding('class.ef-select-host') readonly hostClass = true;\n\n /* ── Content templates (projected into PrimeNG via local refs) ── */\n\n @ContentChild('item') itemTemplate: TemplateRef<any> | null = null;\n @ContentChild('selectedItem') selectedItemTemplate: TemplateRef<any> | null = null;\n @ContentChild('group') groupTemplate: TemplateRef<any> | null = null;\n @ContentChild('header') headerTemplate: TemplateRef<any> | null = null;\n @ContentChild('footer') footerTemplate: TemplateRef<any> | null = null;\n @ContentChild('empty') emptyTemplate: TemplateRef<any> | null = null;\n @ContentChild('emptyFilter') emptyFilterTemplate: TemplateRef<any> | null = null;\n @ContentChild('filter') filterTemplate: TemplateRef<any> | null = null;\n @ContentChild('loader') loaderTemplate: TemplateRef<any> | null = null;\n\n /* ── Outputs ─────────────────────────────────────────────────── */\n\n @Output() selectionChangeEvent = new EventEmitter<any>();\n @Output() filterChangeEvent = new EventEmitter<string>();\n @Output() panelShowEvent = new EventEmitter<void>();\n @Output() panelHideEvent = new EventEmitter<void>();\n\n /** Two-way-bindable as `[value]` (one-way) or\n * `[(value)]` (set + listen via `selectionChangeEvent`). */\n @Input() value: any = null;\n filteredOptions: any[] = [];\n\n private onChange: (value: any) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n /** Resolved lazily in ngOnInit to avoid circular DI with NG_VALUE_ACCESSOR */\n ngControl: NgControl | null = null;\n private readonly injector = inject(Injector);\n\n ngOnInit(): void {\n this.ngControl = this.injector.get(NgControl, null);\n this.applyFilters();\n }\n\n /* effectiveId / effectivePlaceholder / effectiveAriaLabel /\n errorsId all inherited from AbstractEfFormControl. */\n\n /** Translated filter placeholder. Falls back to a generic key, then\n * to \"Search…\" so it always renders something readable. */\n get effectiveFilterPlaceholder(): string {\n if (this.filterPlaceholderKey) {\n return this.translateService.instant(this.filterPlaceholderKey);\n }\n return this.filterPlaceholder ?? this.translateService.instant('ef_select_filter_placeholder');\n }\n\n get effectiveEmptyMessage(): string {\n if (this.emptyMessageKey) return this.translateService.instant(this.emptyMessageKey);\n return this.emptyMessage ?? this.translateService.instant('ef_select_empty');\n }\n\n get effectiveEmptyFilterMessage(): string {\n if (this.emptyFilterMessageKey) return this.translateService.instant(this.emptyFilterMessageKey);\n return this.emptyFilterMessage ?? this.translateService.instant('ef_select_empty_filter');\n }\n\n /** Always include `.es` so the global Comptoir skin in\n * `_patterns.scss` always finds a hook, regardless of what the\n * consumer passes via `styleClass`. */\n get effectiveStyleClass(): string {\n return ['es', this.size === 'small' ? 'es--sm' : null, this.styleClass]\n .filter(Boolean).join(' ');\n }\n\n get effectivePanelStyleClass(): string {\n return ['es__panel', this.panelStyleClass].filter(Boolean).join(' ');\n }\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? this.ngControl?.control?.errors?.['serverError'] ?? null;\n }\n\n get isInvalid(): boolean {\n if (this.resolvedExternalErrors()?.length) return true;\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.invalid && (ctrl?.touched || ctrl?.dirty));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['options'] || changes['filterByKeys']) {\n this.applyFilters();\n }\n }\n\n writeValue(value: any): void {\n this.value = value ?? null;\n }\n\n registerOnChange(fn: (value: any) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n handleSelectionChange(event: { originalEvent?: Event; value: any }): void {\n const val = event?.value ?? null;\n this.value = val;\n this.onChange(val);\n this.onTouched();\n this.selectionChangeEvent.emit(val);\n }\n\n handleClear(): void {\n this.value = this.multiple ? [] : null;\n this.onChange(this.value);\n this.onTouched();\n this.selectionChangeEvent.emit(this.value);\n }\n\n handleFilter(event: { originalEvent?: Event; filter: string }): void {\n this.filterChangeEvent.emit(event?.filter ?? '');\n }\n\n handlePanelShow(): void {\n this.panelShowEvent.emit();\n }\n\n handlePanelHide(): void {\n this.panelHideEvent.emit();\n this.onTouched();\n }\n\n /** Comptoir variant — native `<select>` change handler. The empty\n * string from the placeholder option becomes `null`; otherwise we\n * resolve the value through `optionValue` if provided. */\n handleNativeSelectChange(rawValue: string): void {\n if (rawValue === '' || rawValue == null) {\n this.handleClear();\n return;\n }\n let resolved: any = rawValue;\n if (this.optionValue) {\n // Map the string back to its option's value (which may be a\n // number, object key, etc. — preserves the original type).\n const match = this.filteredOptions.find(\n (opt) => String(opt[this.optionValue!]) === rawValue,\n );\n if (match) resolved = match[this.optionValue];\n }\n this.value = resolved;\n this.onChange(resolved);\n this.onTouched();\n this.selectionChangeEvent.emit(resolved);\n }\n\n private applyFilters(): void {\n if (this.options && this.filterByKeys && typeof this.filterByKeys === 'object') {\n this.filteredOptions = this.options.filter(option =>\n Object.keys(this.filterByKeys!).every(key => option[key] === this.filterByKeys![key])\n );\n } else {\n this.filteredOptions = this.options ?? [];\n }\n }\n}\n","@if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" [for]=\"effectiveId\" [required]=\"required()\" />\n}\n<div class=\"ef-field-control\">\n @if (variant === 'comptoir') {\n <!-- Comptoir variant — native <select> against the\n .ef-select-native pattern. No filter / virtualization /\n multi / templates; use the PrimeNG variant for those. -->\n <select\n class=\"ef-select-native\"\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [disabled]=\"isDisabled()\"\n [class.is-invalid]=\"isInvalid\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n (change)=\"handleNativeSelectChange($any($event.target).value)\"\n >\n @if (effectivePlaceholder) {\n <option value=\"\" [selected]=\"value === null || value === undefined\">— {{ effectivePlaceholder }} —</option>\n }\n @for (opt of filteredOptions; track $index) {\n <option\n [value]=\"optionValue ? opt[optionValue] : opt\"\n [selected]=\"(optionValue ? opt[optionValue] : opt) === value\"\n >\n {{ opt[optionLabel] }}\n </option>\n }\n </select>\n } @else if (multiple) {\n <!-- ───── PrimeNG multi-select branch ───── -->\n <p-multiselect\n [inputId]=\"effectiveId\"\n [name]=\"name()\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n (onChange)=\"handleSelectionChange($event)\"\n (onClear)=\"handleClear()\"\n (onFilter)=\"handleFilter($event)\"\n (onPanelShow)=\"handlePanelShow()\"\n (onPanelHide)=\"handlePanelHide()\"\n [options]=\"filteredOptions\"\n [optionLabel]=\"optionLabel\"\n [optionValue]=\"optionValue\"\n [optionDisabled]=\"optionDisabled\"\n [dataKey]=\"dataKey\"\n [group]=\"group\"\n [optionGroupLabel]=\"optionGroupLabel\"\n [optionGroupChildren]=\"optionGroupChildren\"\n [placeholder]=\"effectivePlaceholder\"\n [filter]=\"filter\"\n [filterPlaceHolder]=\"effectiveFilterPlaceholder\"\n [autofocusFilter]=\"autofocusFilter\"\n [filterBy]=\"filterBy ?? optionLabel\"\n [showClear]=\"showClear()\"\n [disabled]=\"isDisabled()\"\n [appendTo]=\"appendTo\"\n [styleClass]=\"effectiveStyleClass\"\n [panelStyleClass]=\"effectivePanelStyleClass\"\n [scrollHeight]=\"scrollHeight\"\n [virtualScroll]=\"virtualScroll\"\n [virtualScrollItemSize]=\"virtualScrollItemSize\"\n [loading]=\"loading\"\n [emptyMessage]=\"effectiveEmptyMessage\"\n [emptyFilterMessage]=\"effectiveEmptyFilterMessage\"\n [display]=\"multiDisplay\"\n [showToggleAll]=\"showToggleAll\"\n [class.ng-invalid]=\"isInvalid\"\n [class.ng-touched]=\"ngControl?.touched\"\n fluid\n >\n @if (itemTemplate) {\n <ng-template #item let-item>\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\" />\n </ng-template>\n }\n @if (selectedItemTemplate) {\n <ng-template #selectedItems let-items>\n <ng-container *ngTemplateOutlet=\"selectedItemTemplate; context: { $implicit: items }\" />\n </ng-template>\n }\n @if (groupTemplate) {\n <ng-template #group let-group>\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { $implicit: group }\" />\n </ng-template>\n }\n @if (headerTemplate) {\n <ng-template #header>\n <ng-container *ngTemplateOutlet=\"headerTemplate\" />\n </ng-template>\n }\n @if (footerTemplate) {\n <ng-template #footer>\n <ng-container *ngTemplateOutlet=\"footerTemplate\" />\n </ng-template>\n }\n @if (emptyTemplate) {\n <ng-template #empty>\n <ng-container *ngTemplateOutlet=\"emptyTemplate\" />\n </ng-template>\n }\n @if (emptyFilterTemplate) {\n <ng-template #emptyfilter>\n <ng-container *ngTemplateOutlet=\"emptyFilterTemplate\" />\n </ng-template>\n }\n @if (filterTemplate) {\n <ng-template #filter let-options=\"options\">\n <ng-container *ngTemplateOutlet=\"filterTemplate; context: { $implicit: options }\" />\n </ng-template>\n }\n @if (loaderTemplate) {\n <ng-template #loader>\n <ng-container *ngTemplateOutlet=\"loaderTemplate\" />\n </ng-template>\n }\n <ng-template #clearicon>\n <span class=\"es-clear\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </span>\n </ng-template>\n <ng-template #dropdownicon>\n <svg class=\"ef-chevron\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </ng-template>\n </p-multiselect>\n } @else {\n <!-- ───── PrimeNG single-select branch ───── -->\n <p-select\n [inputId]=\"effectiveId\"\n [name]=\"name()\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n (onChange)=\"handleSelectionChange($event)\"\n (onClear)=\"handleClear()\"\n (onFilter)=\"handleFilter($event)\"\n (onShow)=\"handlePanelShow()\"\n (onHide)=\"handlePanelHide()\"\n [options]=\"filteredOptions\"\n [optionLabel]=\"optionLabel\"\n [optionValue]=\"optionValue\"\n [optionDisabled]=\"optionDisabled\"\n [dataKey]=\"dataKey\"\n [group]=\"group\"\n [optionGroupLabel]=\"optionGroupLabel\"\n [optionGroupChildren]=\"optionGroupChildren\"\n [placeholder]=\"effectivePlaceholder\"\n [size]=\"size\"\n [filter]=\"filter\"\n [filterPlaceholder]=\"effectiveFilterPlaceholder\"\n [filterBy]=\"filterBy ?? optionLabel\"\n [autofocusFilter]=\"autofocusFilter\"\n [showClear]=\"showClear()\"\n [editable]=\"editable\"\n [disabled]=\"isDisabled()\"\n [appendTo]=\"appendTo\"\n [styleClass]=\"effectiveStyleClass\"\n [panelStyleClass]=\"effectivePanelStyleClass\"\n [scrollHeight]=\"scrollHeight\"\n [virtualScroll]=\"virtualScroll\"\n [virtualScrollItemSize]=\"virtualScrollItemSize\"\n [loading]=\"loading\"\n [emptyMessage]=\"effectiveEmptyMessage\"\n [emptyFilterMessage]=\"effectiveEmptyFilterMessage\"\n [class.ng-invalid]=\"isInvalid\"\n [class.ng-touched]=\"ngControl?.touched\"\n fluid\n >\n @if (itemTemplate) {\n <ng-template #item let-item>\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\" />\n </ng-template>\n }\n @if (selectedItemTemplate) {\n <ng-template #selectedItem let-item>\n <ng-container *ngTemplateOutlet=\"selectedItemTemplate; context: { $implicit: item }\" />\n </ng-template>\n }\n @if (groupTemplate) {\n <ng-template #group let-group>\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { $implicit: group }\" />\n </ng-template>\n }\n @if (headerTemplate) {\n <ng-template #header>\n <ng-container *ngTemplateOutlet=\"headerTemplate\" />\n </ng-template>\n }\n @if (footerTemplate) {\n <ng-template #footer>\n <ng-container *ngTemplateOutlet=\"footerTemplate\" />\n </ng-template>\n }\n @if (emptyTemplate) {\n <ng-template #empty>\n <ng-container *ngTemplateOutlet=\"emptyTemplate\" />\n </ng-template>\n }\n @if (emptyFilterTemplate) {\n <ng-template #emptyfilter>\n <ng-container *ngTemplateOutlet=\"emptyFilterTemplate\" />\n </ng-template>\n }\n @if (filterTemplate) {\n <ng-template #filter let-options=\"options\">\n <ng-container *ngTemplateOutlet=\"filterTemplate; context: { $implicit: options }\" />\n </ng-template>\n }\n @if (loaderTemplate) {\n <ng-template #loader>\n <ng-container *ngTemplateOutlet=\"loaderTemplate\" />\n </ng-template>\n }\n <ng-template #clearicon>\n <span class=\"es-clear\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </span>\n </ng-template>\n <ng-template #dropdownicon>\n <svg class=\"ef-chevron\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </ng-template>\n </p-select>\n }\n @if (showRequired || serverErrors) {\n <div [id]=\"errorsId\" role=\"alert\" aria-live=\"polite\">\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n} from '@angular/core';\n\n/**\n * The shared inline \"clear\" affordance — a circular button with the canonical\n * stroke-✕ glyph. One component so every clearable control (ef-input-text,\n * ef-inputnumber, ef-select via its `#clearicon` template, ef-product-typeahead,\n * …) shows the exact same clear icon, hover circle, and hit area.\n *\n * Styling lives in `_patterns.scss` under `.ef-clear` (global, so the same\n * glyph is reachable from PrimeNG templates that can't import this component).\n *\n * `mousedown` is prevented so clicking the clear doesn't blur/commit the field\n * before the `clear` handler runs.\n */\n@Component({\n selector: 'ef-clear-button',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <button\n type=\"button\"\n class=\"ef-clear\"\n [attr.aria-label]=\"ariaLabel\"\n [disabled]=\"disabled\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"clear.emit($event)\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n `,\n})\nexport class EfClearButtonComponent {\n @Input() ariaLabel = 'Clear';\n @Input() disabled = false;\n @Output() clear = new EventEmitter<Event>();\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n ElementRef,\n EmbeddedViewRef,\n HostListener,\n LOCALE_ID,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CommonModule, formatDate } from '@angular/common';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { EfClearButtonComponent } from '../ef-clear-button/ef-clear-button.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\nimport {\n EfDatePreset,\n EfDatePresetKey,\n EfDateRange,\n} from './ef-datepicker-advanced.types';\n\n/** Value shape emitted / accepted by the field-mode ControlValueAccessor.\n * Mirrors PrimeNG's `p-datepicker`: a lone `Date` for single selection,\n * a `[start, end]` tuple for a range — so `ef-datepicker-advanced` is a\n * drop-in replacement for the legacy `ef-datepicker` in forms. */\nexport type EfDateFieldValue = Date | [Date, Date] | null;\n\n/**\n * Comptoir period selector for smart-bars — a pill trigger (\"Date — 30\n * derniers jours v\") that opens a popover with a preset list and an\n * optional custom-range view (full month calendar with range band).\n *\n * Replaces the legacy `ef-preset-pill` for date filters and the\n * date-range mini-popover that screens used to roll inline.\n *\n * ```html\n * <ef-datepicker-advanced\n * [activePreset]=\"dateFilter().presetKey\"\n * [start]=\"dateFilter().start\"\n * [end]=\"dateFilter().end\"\n * triggerLabelKey=\"filter_date\"\n * (rangeChange)=\"onDateChange($event)\"\n * />\n * ```\n *\n * Built-in presets (computed from `today` at open time):\n * `today`, `this_week`, `this_month`, `last_30_days`, `last_90_days`,\n * `this_quarter`, `this_year`. Override with `[presets]=\"customList\"`\n * if you need a different set.\n */\n@Component({\n selector: 'ef-datepicker-advanced',\n standalone: true,\n imports: [CommonModule, TranslateModule, EfLabelComponent, EfClearButtonComponent],\n templateUrl: './ef-datepicker-advanced.component.html',\n styleUrl: './ef-datepicker-advanced.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class.dp-host--field]': \"mode() === 'field'\" },\n})\nexport class EfDatepickerAdvancedComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor, AfterViewInit {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly locale = inject(LOCALE_ID);\n private readonly vcr = inject(ViewContainerRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n\n /**\n * Self-injected form control (present only when the consumer binds\n * `[(ngModel)]` / `formControlName` in field mode). We register as its\n * `valueAccessor` manually — same pattern as `ef-datepicker` — so no\n * `NG_VALUE_ACCESSOR` provider is needed and there's no circular DI.\n * `null` in filter mode (the output-only smart-bar usage).\n */\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n /** Always-present wrapper — the anchor for portal positioning (the\n * trigger itself lives behind an `@if`, so we anchor to the host box). */\n @ViewChild('anchorEl', { static: true })\n private anchorEl!: ElementRef<HTMLElement>;\n\n /** Panel template — instantiated and attached to <body> on open. */\n @ViewChild('panelTpl', { static: true })\n private panelTpl!: TemplateRef<unknown>;\n\n /** Active embedded view + its root node, while the panel is open. */\n private panelView: EmbeddedViewRef<unknown> | null = null;\n private panelRoot: HTMLElement | null = null;\n private resizeHandler: (() => void) | null = null;\n\n constructor() {\n super();\n // Register as our own NgControl's value accessor (field mode only).\n if (this.ngControl) this.ngControl.valueAccessor = this;\n\n // React to `open` toggling: attach / detach the body-portaled panel.\n effect(() => {\n if (this.open()) this.attachPortal();\n else this.detachPortal();\n });\n\n // Last-line cleanup if the host is destroyed while the panel is open\n // (route change, *ngIf collapse, …) — orphan DOM is the worst.\n this.destroyRef.onDestroy(() => this.detachPortal());\n }\n\n ngAfterViewInit(): void {\n // Field-mode validation display (`showRequired` / `isInvalid` /\n // `serverErrors`) reads NgControl state through plain getters. We're\n // OnPush + signal-driven, so a parent flipping touched/validity —\n // notably `form.markAllAsTouched()` on submit, which emits no value or\n // status change — wouldn't re-render this component and the error /\n // red border would go stale. Mirror the control's events (Angular 18+\n // `AbstractControl.events`: value, status, touched, pristine) into\n // change detection. No-op in filter mode (no NgControl).\n this.ngControl?.control?.events\n ?.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.cdr.markForCheck());\n }\n\n /* ── Inputs ─────────────────────────────────────────────────── */\n\n /** Trigger left-side label (translation key). Default: `'filter_date'`. */\n readonly triggerLabelKey = input<string>('filter_date');\n /** Direct label fallback when `triggerLabelKey` is empty. */\n readonly triggerLabel = input<string>('');\n\n /**\n * Override the default preset list. The component ships sensible\n * defaults for `today`, `this_week`, `this_month`, `last_30_days`,\n * `last_90_days`, `this_quarter`, `this_year` — pass anything to\n * replace them outright (e.g. include a `last_year` preset).\n */\n readonly presets = input<ReadonlyArray<EfDatePreset> | undefined>(undefined);\n\n /** Currently active preset key (controlled). */\n readonly activePreset = input<EfDatePresetKey | undefined>(undefined);\n\n /** Currently selected start (controlled — pairs with `activePreset`). */\n readonly start = input<Date | null | undefined>(undefined);\n /** Currently selected end. */\n readonly end = input<Date | null | undefined>(undefined);\n\n /* `disabled` inherited from AbstractEfFormControl (effective = isDisabled). */\n\n /** Show a `'Personnalisé…'` row that opens the calendar view. */\n readonly allowCustomRange = input(true, { transform: booleanAttribute });\n\n /* ── Field mode (form control) ──────────────────────────────────\n `'filter'` (default) is the existing smart-bar period selector:\n preset list + custom range, output-only via `rangeChange`.\n `'field'` turns the component into a Comptoir-styled form control\n (ControlValueAccessor) that replaces the legacy `ef-datepicker`:\n no presets, opens straight to the calendar, and binds with\n `[(ngModel)]` / `formControlName`. */\n\n /** Component behaviour: smart-bar filter vs. form field. */\n readonly mode = input<'filter' | 'field'>('filter');\n\n /** Field mode only — pick a single date or a `[start, end]` range. */\n readonly selectionMode = input<'single' | 'range'>('range');\n\n /** Field mode trigger appearance: a labelled field box (default) or\n * the rounded pill used by filter mode. */\n readonly variant = input<'field' | 'pill'>('field');\n\n /**\n * Field mode only — also pick a time (24h `HH:mm`, free minutes).\n * Single: the calendar no longer commits on day-click; a time field +\n * Apply appear. Range: an `HH:mm` field sits under each of Du / Au.\n * The committed value is a `Date` with hours/minutes set (not\n * start-of-day) and the trigger renders `DD/MM/YYYY HH:mm`.\n */\n readonly showTime = input(false, { transform: booleanAttribute });\n\n /* label / labelKey / placeholder / placeholderKey / ariaLabel / ariaLabelKey\n / required / inputId / name / errors (+ resolvedExternalErrors) all\n inherited from AbstractEfFormControl. */\n\n /* ── Outputs ────────────────────────────────────────────────── */\n\n /** Emitted whenever a preset or applied custom range changes. */\n readonly rangeChange = output<EfDateRange>();\n /** Forwarded when the popover opens / closes (mirrors ef-row-actions). */\n readonly opened = output<void>();\n readonly closed = output<void>();\n\n /* ── State ──────────────────────────────────────────────────── */\n\n readonly open = signal(false);\n readonly view = signal<'presets' | 'custom'>('presets');\n\n /**\n * Custom view sub-mode: the day grid, the month picker, or the year\n * picker. Clicking the month / year labels in the calendar header\n * drills into the corresponding picker; selecting a cell returns to\n * the day grid.\n */\n readonly calMode = signal<'days' | 'months' | 'years'>('days');\n\n /** First year shown in the 12-cell year picker grid. */\n readonly yearWindowStart = signal<number>(this.startOfYearWindow(new Date().getFullYear()));\n\n /** Custom view: month being displayed (1st of the month, 00:00). */\n readonly visibleMonth = signal<Date>(this.startOfMonth(new Date()));\n\n /** Custom view: working start/end, before the user clicks Apply. */\n readonly draftStart = signal<Date | null>(null);\n readonly draftEnd = signal<Date | null>(null);\n\n /** Effective preset list — defaults if none provided. */\n readonly effectivePresets = computed<ReadonlyArray<EfDatePreset>>(\n () => this.presets() ?? this.defaultPresets,\n );\n\n /** Current value resolved against today's date. */\n readonly resolvedRange = computed<EfDateRange>(() => {\n const key = this.activePreset() ?? 'last_30_days';\n const explicitStart = this.start();\n const explicitEnd = this.end();\n if (explicitStart && explicitEnd) {\n return this.buildRange(key, explicitStart, explicitEnd);\n }\n return this.computePresetRange(key);\n });\n\n /** 7×6 grid for the visible month, prev/next-month overflow days included. */\n readonly calendarGrid = computed(() => this.buildMonthGrid(this.visibleMonth()));\n\n /** Day-of-week labels from CLDR (Mon-first). */\n readonly dowLabels = computed(() => this.buildDowLabels());\n\n /** Month + year title for the calendar header. */\n readonly monthLabel = computed(() => {\n const d = this.visibleMonth();\n return formatDate(d, 'LLLL', this.locale)\n .replace(/^./, c => c.toUpperCase());\n });\n readonly yearLabel = computed(() => formatDate(this.visibleMonth(), 'yyyy', this.locale));\n\n /** Range label for the year-picker header, e.g. `2024 – 2035`. */\n readonly yearWindowLabel = computed(() => {\n const start = this.yearWindowStart();\n return `${start} – ${start + 11}`;\n });\n\n /** 12 abbreviated months for the month picker (Jan…Déc), CLDR-localised. */\n readonly monthCells = computed(() => {\n const visible = this.visibleMonth();\n const today = new Date();\n return Array.from({ length: 12 }, (_, m) => ({\n month: m,\n label: formatDate(new Date(2000, m, 1), 'LLL', this.locale)\n .replace(/^./, c => c.toUpperCase()),\n active: m === visible.getMonth(),\n today: m === today.getMonth() && visible.getFullYear() === today.getFullYear(),\n }));\n });\n\n /** 12 consecutive years for the year picker, starting at `yearWindowStart`. */\n readonly yearCells = computed(() => {\n const start = this.yearWindowStart();\n const visibleYear = this.visibleMonth().getFullYear();\n const todayYear = new Date().getFullYear();\n return Array.from({ length: 12 }, (_, i) => {\n const year = start + i;\n return { year, active: year === visibleYear, today: year === todayYear };\n });\n });\n\n /** Live duration in days for the draft range. Mirrors `applyCustomRange`:\n * a lone start is treated as a single-day range (→ \"1 jour\"). */\n readonly draftDurationDays = computed(() => {\n const s = this.draftStart();\n if (!s) return 0;\n const e = this.draftEnd() ?? s;\n return Math.round((this.startOfDay(e).getTime() - this.startOfDay(s).getTime()) / 86_400_000) + 1;\n });\n\n /** Du / Au inputs as DD/MM/YYYY strings (kept in sync with drafts). */\n readonly fromText = computed(() => this.formatDayInput(this.draftStart()));\n readonly toText = computed(() => this.formatDayInput(this.draftEnd()));\n\n /* ── Field mode: committed value (ControlValueAccessor) ──────────\n The trigger in field mode renders THIS — the committed CVA value —\n not the drafts (mid-selection) nor `resolvedRange()` (filter-only). */\n\n /** Committed value pushed in via `writeValue` / day-pick / Apply. */\n private readonly fieldValue = signal<EfDateFieldValue>(null);\n\n /* isDisabled (the `[disabled]` input OR form-driven) and updateDisabledState\n are inherited from AbstractEfFormControl. */\n\n /** Committed start / end derived from `fieldValue`. */\n readonly fieldStart = computed<Date | null>(() => {\n const v = this.fieldValue();\n if (!v) return null;\n return Array.isArray(v) ? v[0] ?? null : v;\n });\n readonly fieldEnd = computed<Date | null>(() => {\n const v = this.fieldValue();\n return v && Array.isArray(v) ? v[1] ?? null : null;\n });\n\n /** Whether the field currently holds a value (vs. placeholder). */\n readonly hasFieldValue = computed(() => this.fieldStart() != null);\n\n /** Text rendered in the field-mode trigger (date, +time when enabled). */\n readonly fieldDisplay = computed<string>(() => {\n const s = this.fieldStart();\n if (!s) return '';\n const fmt = this.showTime() ? 'dd/MM/yyyy HH:mm' : 'dd/MM/yyyy';\n const from = formatDate(s, fmt, this.locale);\n if (this.selectionMode() === 'single') return from;\n const e = this.fieldEnd();\n return e ? `${from} — ${formatDate(e, fmt, this.locale)}` : from;\n });\n\n /* ── Time drafts (field mode + showTime) ────────────────────────\n Tracked separately from the day drafts so the calendar stays\n start-of-day internally; date + time are merged only at commit. */\n readonly draftStartTime = signal<{ h: number; m: number }>({ h: 0, m: 0 });\n readonly draftEndTime = signal<{ h: number; m: number }>({ h: 0, m: 0 });\n\n /** Du / Au time inputs as `HH:mm` strings (kept in sync with drafts). */\n readonly fromTimeText = computed(() => this.formatTime(this.draftStartTime()));\n readonly toTimeText = computed(() => this.formatTime(this.draftEndTime()));\n\n private onChange: (value: EfDateFieldValue) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n /* effectiveId / errorsId / _autoId inherited from AbstractEfFormControl. */\n\n /** Required error is shown once the control is touched. */\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n /** Backend validation messages stashed under `serverError`. */\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? (this.ngControl?.control?.errors?.['serverError'] as string[]) ?? null;\n }\n /** Invalid + interacted — drives the red border on the field box. */\n get isInvalid(): boolean {\n if (this.resolvedExternalErrors()?.length) return true;\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.invalid && (ctrl?.touched || ctrl?.dirty));\n }\n\n /* ── ControlValueAccessor ───────────────────────────────────── */\n\n writeValue(value: Date | Date[] | string | number | null | undefined): void {\n this.fieldValue.set(this.coerceValue(value));\n }\n registerOnChange(fn: (value: EfDateFieldValue) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n /* ── Clearable (field + single mode only) ───────────────────── *\n * showClear / canClear inherited from AbstractEfFormControl. Only offer\n * the inline clear ✕ for a single-date field with a committed value —\n * range clearing is intentionally left out. */\n protected override get hasValue(): boolean {\n return this.selectionMode() === 'single' && this.hasFieldValue();\n }\n\n override clearValue(): void {\n this.fieldValue.set(null);\n this.onChange(null);\n this.onTouched();\n }\n\n /** Normalise whatever a form pushes in to our internal value shape.\n * Tolerates `null`, `[start, null]`, strings/epochs, and stray\n * multi-element arrays (keeps the first two). */\n private coerceValue(value: Date | Date[] | string | number | null | undefined): EfDateFieldValue {\n if (value == null) return null;\n if (Array.isArray(value)) {\n const start = this.toDate(value[0]);\n if (!start) return null;\n const end = this.toDate(value[1]);\n return end ? [start, end] : start;\n }\n return this.toDate(value);\n }\n\n private toDate(v: unknown): Date | null {\n // Preserve the time component — `showTime` mode needs it; date-only\n // paths re-normalise to start-of-day when they seed the calendar and\n // when they commit, so nothing leaks the stray time.\n if (v == null) return null;\n if (v instanceof Date) return isNaN(v.getTime()) ? null : v;\n if (typeof v === 'string' || typeof v === 'number') {\n const d = new Date(v);\n return isNaN(d.getTime()) ? null : d;\n }\n return null;\n }\n\n /** Commit a field-mode value: update internal state, notify the form,\n * and close the popover. `single` → `Date`, `range` → `[start, end]`. */\n private commitField(value: Date | [Date, Date]): void {\n this.fieldValue.set(value);\n this.onChange(value);\n this.close();\n }\n\n /** Merge a day with a draft time. Returns start-of-day when `showTime`\n * is off, so date-only commits stay time-free. */\n private composeDateTime(day: Date, time: { h: number; m: number }): Date {\n const base = this.startOfDay(day);\n if (this.showTime()) base.setHours(time.h, time.m, 0, 0);\n return base;\n }\n\n /** Format a draft time as zero-padded `HH:mm`. */\n private formatTime(t: { h: number; m: number }): string {\n return `${String(t.h).padStart(2, '0')}:${String(t.m).padStart(2, '0')}`;\n }\n\n /** Parse `H:mm` … `HH:mm` (24h) → `{h, m}`, or null when out of range. */\n private parseTimeInput(raw: string): { h: number; m: number } | null {\n const m = raw.trim().match(/^(\\d{1,2}):(\\d{1,2})$/);\n if (!m) return null;\n const h = +m[1];\n const min = +m[2];\n if (h > 23 || min > 59) return null;\n return { h, m: min };\n }\n\n /** Allow only digits and `:` while typing a time; Enter commits via blur. */\n onTimeKeydown(event: KeyboardEvent, el: HTMLInputElement): void {\n if (event.key === 'Enter') {\n el.blur();\n return;\n }\n if (event.ctrlKey || event.metaKey || event.altKey) return;\n if (event.key.length > 1) return;\n if (!/[0-9:]/.test(event.key)) event.preventDefault();\n }\n\n /** Commit a typed `HH:mm` value to the start or end draft time. */\n commitTimeInput(which: 'start' | 'end', el: HTMLInputElement): void {\n const parsed = this.parseTimeInput(el.value);\n if (!parsed) {\n el.value = which === 'start' ? this.fromTimeText() : this.toTimeText();\n return;\n }\n if (which === 'start') this.draftStartTime.set(parsed);\n else this.draftEndTime.set(parsed);\n el.value = which === 'start' ? this.fromTimeText() : this.toTimeText();\n }\n\n /* ── Trigger / popover ──────────────────────────────────────── */\n\n toggle(event: MouseEvent): void {\n event.stopPropagation();\n if (this.isDisabled()) return;\n this.open.update(v => !v);\n if (this.open()) {\n this.calMode.set('days');\n if (this.mode() === 'field') {\n // No presets in field mode — open straight to the calendar.\n this.view.set('custom');\n this.seedDraftFromValue();\n const anchor = this.draftStart() ?? new Date();\n this.visibleMonth.set(this.startOfMonth(anchor));\n } else if (this.activePreset() === 'custom') {\n // The active range was hand-picked, so the preset list has\n // nothing selected to show. Reopen where it was chosen, with\n // the calendar already sitting on those dates.\n this.openCustomView();\n } else {\n this.view.set('presets');\n this.seedDraftFromValue();\n }\n this.opened.emit();\n } else {\n this.onTouched();\n this.closed.emit();\n }\n }\n\n close(): void {\n if (!this.open()) return;\n this.open.set(false);\n this.onTouched();\n this.closed.emit();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node | null;\n if (!target) return;\n // Trigger sits inside the host element …\n if (this.host.nativeElement.contains(target)) return;\n // … the panel is portaled to <body>, so check it separately.\n if (this.panelRoot && this.panelRoot.contains(target)) return;\n this.close();\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n // Drill back out one level at a time: year/month picker → day grid\n // → presets → closed.\n if (this.view() === 'custom' && this.calMode() !== 'days') {\n this.calMode.set('days');\n return;\n }\n // Field mode has no preset view to drill back to — Escape closes.\n if (this.view() === 'custom' && this.mode() !== 'field') {\n this.backToPresets();\n return;\n }\n this.close();\n }\n\n /* ── Preset actions ─────────────────────────────────────────── */\n\n selectPreset(preset: EfDatePreset): void {\n if (preset.key === 'custom') {\n this.openCustomView();\n return;\n }\n const range = this.computePresetRange(preset.key);\n this.rangeChange.emit(range);\n this.close();\n }\n\n isActivePreset(key: EfDatePresetKey): boolean {\n return (this.activePreset() ?? 'last_30_days') === key;\n }\n\n presetHint(preset: EfDatePreset): string {\n if (preset.hintFn) return preset.hintFn(new Date());\n return this.builtInHint(preset.key);\n }\n\n /* ── Custom view ────────────────────────────────────────────── */\n\n openCustomView(): void {\n this.view.set('custom');\n this.calMode.set('days');\n this.seedDraftFromValue();\n const anchor = this.draftStart() ?? new Date();\n this.visibleMonth.set(this.startOfMonth(anchor));\n }\n\n backToPresets(): void {\n this.view.set('presets');\n this.calMode.set('days');\n }\n\n /* ── Calendar header navigation (context-aware) ─────────────────\n The same ‹ / › chevrons step by month (day grid), by year\n (month picker), or by 12-year page (year picker). */\n\n headerPrev(): void {\n this.stepHeader(-1);\n }\n\n headerNext(): void {\n this.stepHeader(1);\n }\n\n private stepHeader(dir: 1 | -1): void {\n switch (this.calMode()) {\n case 'days':\n this.visibleMonth.update(d => this.addMonths(d, dir));\n break;\n case 'months':\n this.visibleMonth.update(d => this.addMonths(d, dir * 12));\n break;\n case 'years':\n this.yearWindowStart.update(y => y + dir * 12);\n break;\n }\n }\n\n /* ── Month / year pickers ───────────────────────────────────── */\n\n /** Open the month picker (triggered by clicking the month label). */\n openMonthPicker(): void {\n this.calMode.set('months');\n }\n\n /** Open the year picker (triggered by clicking the year label). */\n openYearPicker(): void {\n this.yearWindowStart.set(this.startOfYearWindow(this.visibleMonth().getFullYear()));\n this.calMode.set('years');\n }\n\n /** Pick a month → jump the day grid to it. */\n selectMonth(month: number): void {\n this.visibleMonth.update(d => new Date(d.getFullYear(), month, 1));\n this.calMode.set('days');\n }\n\n /** Pick a year → keep the current month, return to the day grid. */\n selectYear(year: number): void {\n this.visibleMonth.update(d => new Date(year, d.getMonth(), 1));\n this.calMode.set('days');\n }\n\n /* ── Editable Du / Au inputs ────────────────────────────────────\n The text inputs are no longer read-only — the user can type a\n `JJ/MM/AAAA` date. We commit on blur / Enter: a valid date updates\n the matching draft (auto-swapping if end precedes start) and moves\n the calendar to it; an invalid one reverts the field to canonical. */\n\n /** Allow only digits and `/` for printable keys; Enter commits via blur. */\n onDateKeydown(event: KeyboardEvent, el: HTMLInputElement): void {\n if (event.key === 'Enter') {\n el.blur();\n return;\n }\n if (event.ctrlKey || event.metaKey || event.altKey) return;\n // Multi-char keys (Backspace, ArrowLeft, Tab, Delete, …) pass through.\n if (event.key.length > 1) return;\n if (!/[0-9/]/.test(event.key)) event.preventDefault();\n }\n\n /** Commit a typed `JJ/MM/AAAA` value to the start or end draft. */\n commitDateInput(which: 'start' | 'end', el: HTMLInputElement): void {\n const parsed = this.parseDayInput(el.value);\n if (!parsed) {\n // Invalid → restore the canonical text for this field.\n el.value = which === 'start' ? this.fromText() : this.toText();\n return;\n }\n\n if (which === 'start') {\n this.draftStart.set(parsed);\n const end = this.draftEnd();\n // New start after the existing end → drop the now-invalid end.\n if (end && parsed.getTime() > end.getTime()) this.draftEnd.set(null);\n } else {\n const start = this.draftStart();\n if (start && parsed.getTime() < start.getTime()) {\n // End before start → swap so the range stays ordered.\n this.draftStart.set(parsed);\n this.draftEnd.set(start);\n } else {\n this.draftEnd.set(parsed);\n }\n }\n\n this.visibleMonth.set(this.startOfMonth(parsed));\n // Re-sync to canonical (zero-padded) regardless of how it was typed.\n el.value = which === 'start' ? this.fromText() : this.toText();\n }\n\n /* ── Portal (panel rendered as a child of <body>) ───────────── */\n\n private attachPortal(): void {\n if (this.panelView || !this.panelTpl) return;\n\n this.panelView = this.vcr.createEmbeddedView(this.panelTpl);\n this.panelView.detectChanges();\n\n const root = this.panelView.rootNodes.find(\n (n: Node): n is HTMLElement => n instanceof HTMLElement,\n );\n if (!root) return;\n\n this.panelRoot = root;\n document.body.appendChild(root);\n this.positionPanel();\n\n // Reposition when the viewport changes; scroll already moves the\n // panel with the trigger because we use absolute / page coords.\n this.resizeHandler = () => this.positionPanel();\n window.addEventListener('resize', this.resizeHandler);\n }\n\n private detachPortal(): void {\n if (this.resizeHandler) {\n window.removeEventListener('resize', this.resizeHandler);\n this.resizeHandler = null;\n }\n if (this.panelRoot && this.panelRoot.parentNode) {\n this.panelRoot.parentNode.removeChild(this.panelRoot);\n }\n this.panelRoot = null;\n if (this.panelView) {\n this.panelView.destroy();\n this.panelView = null;\n }\n }\n\n /** Anchor the panel's top-left to the trigger's bottom-left, using\n * page coords so the panel scrolls with the trigger naturally.\n * Flips to right-aligned (and clamps to the viewport) when the\n * default left-anchor would overflow the right edge — otherwise the\n * panel is clipped for triggers that sit near the right of the page. */\n private positionPanel(): void {\n if (!this.panelRoot || !this.anchorEl) return;\n const rect = this.anchorEl.nativeElement.getBoundingClientRect();\n const margin = 8;\n const viewportWidth = document.documentElement.clientWidth;\n const panelWidth = this.panelRoot.offsetWidth || 320;\n\n // Default: align panel's left edge to the trigger's left edge.\n let left = rect.left;\n // Flip to right-aligned (panel right edge ↔ trigger right edge)\n // if the panel would spill past the right viewport edge.\n if (left + panelWidth > viewportWidth - margin) {\n left = rect.right - panelWidth;\n }\n // Never let it spill past the left edge either.\n left = Math.max(margin, left);\n\n Object.assign(this.panelRoot.style, {\n position: 'absolute',\n top: `${window.scrollY + rect.bottom + 8}px`,\n left: `${window.scrollX + left}px`,\n insetInlineEnd: 'auto',\n });\n }\n\n /** Click handling: 1st click sets start, 2nd click sets end (or swap).\n * Field single-date mode short-circuits — one click commits & closes. */\n selectDay(day: Date): void {\n if (this.mode() === 'field' && this.selectionMode() === 'single') {\n const picked = this.startOfDay(day);\n this.draftStart.set(picked);\n this.draftEnd.set(null);\n // With a time field, wait for Apply so the user can set the time.\n if (this.showTime()) return;\n this.commitField(picked);\n return;\n }\n\n const start = this.draftStart();\n const end = this.draftEnd();\n\n // Reset → set start; or already-have-both → start over\n if (!start || (start && end)) {\n this.draftStart.set(this.startOfDay(day));\n this.draftEnd.set(null);\n return;\n }\n\n // Have only start → set end (with auto-swap if before start)\n const picked = this.startOfDay(day);\n if (picked.getTime() < start.getTime()) {\n this.draftStart.set(picked);\n this.draftEnd.set(start);\n } else {\n this.draftEnd.set(picked);\n }\n }\n\n applyCustomRange(): void {\n const s = this.draftStart();\n const e = this.draftEnd() ?? s;\n if (!s || !e) return;\n if (this.mode() === 'field') {\n // Commit as a form value (single → Date, range → [start, end]),\n // merging the draft time(s) when `showTime` is on.\n this.commitField(\n this.selectionMode() === 'single'\n ? this.composeDateTime(s, this.draftStartTime())\n : [\n this.composeDateTime(s, this.draftStartTime()),\n this.composeDateTime(e, this.draftEndTime()),\n ],\n );\n return;\n }\n this.rangeChange.emit(this.buildRange('custom', s, e));\n this.close();\n }\n\n /** Field single-date mode: commit a typed `JJ/MM/AAAA` value & close.\n * With `showTime`, only update the draft — Apply commits date + time. */\n commitSingleInput(el: HTMLInputElement): void {\n const parsed = this.parseDayInput(el.value);\n if (!parsed) {\n el.value = this.fromText();\n return;\n }\n this.draftStart.set(parsed);\n this.draftEnd.set(null);\n this.visibleMonth.set(this.startOfMonth(parsed));\n if (this.showTime()) {\n el.value = this.fromText();\n return;\n }\n this.commitField(parsed);\n }\n\n /* ── Internals ──────────────────────────────────────────────── */\n\n /** Default preset list — built-in semantics, all keys recognised. */\n private readonly defaultPresets: ReadonlyArray<EfDatePreset> = [\n { key: 'today', labelKey: 'date_preset_today' },\n { key: 'this_week', labelKey: 'date_preset_this_week' },\n { key: 'this_month', labelKey: 'date_preset_this_month' },\n { key: 'last_30_days', labelKey: 'date_preset_last_30_days' },\n { key: 'last_90_days', labelKey: 'date_preset_last_90_days' },\n { key: 'this_quarter', labelKey: 'date_preset_this_quarter' },\n { key: 'this_year', labelKey: 'date_preset_this_year' },\n ];\n\n private seedDraftFromValue(): void {\n if (this.mode() === 'field') {\n // Seed the calendar (day) + time drafts from the committed value.\n const s = this.fieldStart();\n const e = this.fieldEnd();\n this.draftStart.set(s ? this.startOfDay(s) : null);\n this.draftEnd.set(e ? this.startOfDay(e) : null);\n this.draftStartTime.set(s ? { h: s.getHours(), m: s.getMinutes() } : { h: 0, m: 0 });\n this.draftEndTime.set(e ? { h: e.getHours(), m: e.getMinutes() } : { h: 0, m: 0 });\n return;\n }\n const range = this.resolvedRange();\n this.draftStart.set(this.startOfDay(range.start));\n this.draftEnd.set(this.startOfDay(range.end));\n }\n\n /** Compute the date range for a preset key. */\n private computePresetRange(key: EfDatePresetKey): EfDateRange {\n const today = new Date();\n const preset = this.effectivePresets().find(p => p.key === key);\n const { start, end } = preset?.compute\n ? preset.compute(today)\n : this.builtInRange(key, today);\n return this.buildRange(key, start, end);\n }\n\n /** Assemble an EfDateRange — exposes `labelKey` (for the trigger\n * to render via `| translate`) and a literal `label` fallback. */\n private buildRange(key: EfDatePresetKey, start: Date, end: Date): EfDateRange {\n if (key === 'custom') {\n const sameYear = start.getFullYear() === end.getFullYear();\n const fmt = sameYear ? 'd MMM' : 'd MMM yyyy';\n return {\n start, end,\n presetKey: 'custom',\n label: `${formatDate(start, fmt, this.locale)} — ${formatDate(end, fmt, this.locale)}`,\n };\n }\n const preset = this.effectivePresets().find(p => p.key === key);\n return {\n start, end,\n presetKey: key,\n labelKey: preset?.labelKey,\n label: preset?.label ?? this.builtInHint(key),\n };\n }\n\n private builtInRange(key: EfDatePresetKey, today: Date): { start: Date; end: Date } {\n const t = this.startOfDay(today);\n switch (key) {\n case 'today':\n return { start: t, end: t };\n case 'this_week': {\n const dow = (t.getDay() + 6) % 7; // Monday = 0\n const start = this.addDays(t, -dow);\n return { start, end: t };\n }\n case 'this_month':\n return { start: this.startOfMonth(t), end: t };\n case 'last_30_days':\n return { start: this.addDays(t, -29), end: t };\n case 'last_90_days':\n return { start: this.addDays(t, -89), end: t };\n case 'this_quarter': {\n const q = Math.floor(t.getMonth() / 3);\n const start = new Date(t.getFullYear(), q * 3, 1);\n return { start, end: t };\n }\n case 'this_year':\n return { start: new Date(t.getFullYear(), 0, 1), end: t };\n default:\n // Unknown key falls back to today.\n return { start: t, end: t };\n }\n }\n\n private builtInHint(key: EfDatePresetKey): string {\n const today = new Date();\n const r = this.builtInRange(key, today);\n switch (key) {\n case 'today':\n return formatDate(today, 'd MMM', this.locale);\n case 'this_week':\n case 'this_month':\n return `${this.daysBetween(r.start, r.end)} j`;\n case 'last_30_days':\n case 'last_90_days':\n return `${formatDate(r.start, 'd MMM', this.locale)} — ${formatDate(r.end, 'd MMM', this.locale)}`;\n case 'this_quarter':\n return `T${Math.floor(today.getMonth() / 3) + 1}`;\n case 'this_year':\n return formatDate(today, 'yyyy', this.locale);\n default:\n return '';\n }\n }\n\n /** 6 weeks × 7 days. Each cell carries its date + flags. */\n private buildMonthGrid(month: Date): ReadonlyArray<{\n date: Date;\n day: number;\n out: boolean;\n today: boolean;\n inRange: boolean;\n rangeStart: boolean;\n rangeEnd: boolean;\n }> {\n const startOfMonth = this.startOfMonth(month);\n const offset = (startOfMonth.getDay() + 6) % 7; // Mon-first\n const gridStart = this.addDays(startOfMonth, -offset);\n const today = this.startOfDay(new Date());\n const ds = this.draftStart();\n const de = this.draftEnd();\n\n return Array.from({ length: 42 }, (_, i) => {\n const date = this.addDays(gridStart, i);\n const out = date.getMonth() !== month.getMonth();\n const t = this.startOfDay(date);\n const sameDay = (a: Date | null, b: Date) =>\n !!a && a.getTime() === b.getTime();\n\n const inBand = ds && de && t.getTime() > ds.getTime() && t.getTime() < de.getTime();\n return {\n date: t,\n day: date.getDate(),\n out,\n today: t.getTime() === today.getTime(),\n inRange: !!inBand,\n rangeStart: sameDay(ds, t),\n rangeEnd: sameDay(de, t),\n };\n });\n }\n\n private buildDowLabels(): ReadonlyArray<string> {\n // Build a Monday → Sunday list from CLDR's narrow weekday name.\n // CLDR puts Sunday at index 0; we want Mon first.\n const monday = new Date(2024, 0, 1); // 2024-01-01 is a Monday\n return Array.from({ length: 7 }, (_, i) =>\n formatDate(this.addDays(monday, i), 'EEEEE', this.locale).slice(0, 2)\n .replace(/^./, c => c.toUpperCase()),\n );\n }\n\n /* ── Date math (no library; everything local-time) ──────────── */\n\n private startOfDay(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n }\n\n private startOfMonth(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), 1);\n }\n\n private addDays(d: Date, n: number): Date {\n const out = new Date(d);\n out.setDate(out.getDate() + n);\n return this.startOfDay(out);\n }\n\n private addMonths(d: Date, n: number): Date {\n return new Date(d.getFullYear(), d.getMonth() + n, 1);\n }\n\n private daysBetween(a: Date, b: Date): number {\n return Math.round((this.startOfDay(b).getTime() - this.startOfDay(a).getTime()) / 86_400_000) + 1;\n }\n\n private formatDayInput(d: Date | null | undefined): string {\n if (!d) return '';\n return formatDate(d, 'dd/MM/yyyy', this.locale);\n }\n\n /** Parse a `J/M/AAAA`…`JJ/MM/AAAA` string to a start-of-day Date, or\n * null when malformed or out of range (e.g. `31/02/2026`). */\n private parseDayInput(raw: string): Date | null {\n const m = raw.trim().match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n if (!m) return null;\n const day = +m[1];\n const month = +m[2];\n const year = +m[3];\n if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n const d = new Date(year, month - 1, day);\n // Reject calendar overflow — JS rolls 31/02 into March.\n if (d.getFullYear() !== year || d.getMonth() !== month - 1 || d.getDate() !== day) {\n return null;\n }\n return this.startOfDay(d);\n }\n\n /** First year of the 12-cell window containing `year` (e.g. 2026 → 2016). */\n private startOfYearWindow(year: number): number {\n // -4 anchors the current year roughly in the second row of the grid.\n return year - ((year - 4) % 12 + 12) % 12;\n }\n\n /** Stable trackBy across renders. */\n trackByPreset = (_: number, p: EfDatePreset): string => p.key;\n trackByDay = (_: number, day: { date: Date }): number => day.date.getTime();\n trackByDow = (_: number, label: string): string => label;\n}\n","<div class=\"dp\" [class.dp--field]=\"mode() === 'field'\" #anchorEl>\n @if (mode() === 'field' && variant() === 'field') {\n <!-- Field mode — labelled field-box trigger (form control) -->\n @if (labelKey() || label()) {\n <ef-label\n [labelKey]=\"labelKey()\"\n [label]=\"label()\"\n [for]=\"effectiveId\"\n [required]=\"required()\"\n />\n }\n <div class=\"ef-field-control\">\n <button\n type=\"button\"\n class=\"dp__field-trigger\"\n [id]=\"effectiveId\"\n [class.open]=\"open()\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-placeholder]=\"!hasFieldValue()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n [attr.aria-label]=\"(labelKey() || label()) ? null : (ariaLabelKey() ? (ariaLabelKey() | translate) : (ariaLabel() || null))\"\n (click)=\"toggle($event)\"\n >\n <i class=\"ico pi pi-calendar\" aria-hidden=\"true\"></i>\n <span class=\"val\">\n {{ hasFieldValue() ? fieldDisplay() : (placeholderKey() ? (placeholderKey() | translate) : placeholder()) }}\n </span>\n <svg class=\"caret ef-chevron\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"6 9 12 15 18 9\" /></svg>\n </button>\n @if (canClear) {\n <!-- Overlaid sibling (not nested in the trigger <button>) so it\n clears instead of toggling the calendar. -->\n <ef-clear-button\n class=\"dp__field-clear\"\n [ariaLabel]=\"'action.clear' | translate\"\n (clear)=\"clearValue()\"\n />\n }\n @if (showRequired || serverErrors) {\n <div [id]=\"errorsId\" role=\"alert\" aria-live=\"polite\">\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n </div>\n }\n </div>\n } @else {\n <!-- Pill trigger — filter mode, or field mode with variant=\"pill\" -->\n <button\n type=\"button\"\n class=\"dp__trigger\"\n [class.open]=\"open()\"\n [disabled]=\"isDisabled()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-label]=\"mode() === 'field' && !(labelKey() || label()) ? (ariaLabelKey() ? (ariaLabelKey() | translate) : (ariaLabel() || null)) : null\"\n (click)=\"toggle($event)\"\n >\n <i class=\"ico pi pi-calendar\" aria-hidden=\"true\"></i>\n @if (mode() === 'field') {\n <span class=\"val\">\n {{ hasFieldValue() ? fieldDisplay() : (placeholderKey() ? (placeholderKey() | translate) : placeholder()) }}\n </span>\n } @else {\n <span class=\"lbl\">\n {{ triggerLabelKey() ? (triggerLabelKey() | translate) : triggerLabel() }}\n </span>\n <span class=\"val\">\n @if (resolvedRange().labelKey; as key) {\n {{ key | translate }}\n } @else {\n {{ resolvedRange().label }}\n }\n </span>\n }\n <svg class=\"caret ef-chevron\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"6 9 12 15 18 9\" /></svg>\n </button>\n }\n</div>\n\n<!--\n Popover panel — instantiated via ViewContainerRef + appended to\n <body> when `open()` flips on. Anchored absolutely to the trigger\n via positionPanel(); escapes ancestor overflow / stacking contexts.\n-->\n<ng-template #panelTpl>\n <div\n class=\"dp__panel open\"\n [class.wide]=\"view() === 'custom'\"\n role=\"dialog\"\n [attr.aria-label]=\"triggerLabelKey() | translate\"\n >\n <!-- ── View 1 — preset list ── -->\n <div class=\"dp__view\" [class.active]=\"view() === 'presets'\">\n @for (preset of effectivePresets(); track trackByPreset($index, preset)) {\n <button\n type=\"button\"\n class=\"dp__preset\"\n [class.active]=\"isActivePreset(preset.key)\"\n (click)=\"selectPreset(preset)\"\n >\n {{ preset.labelKey ? (preset.labelKey | translate) : preset.label }}\n <span class=\"hint\">{{ presetHint(preset) }}</span>\n </button>\n }\n\n @if (allowCustomRange()) {\n <div class=\"dp__divider\" role=\"separator\"></div>\n <button\n type=\"button\"\n class=\"dp__preset muted\"\n (click)=\"openCustomView()\"\n >\n <span style=\"display:inline-flex;align-items:center;gap:8px\">\n <i class=\"ico-lead pi pi-calendar\" aria-hidden=\"true\"></i>\n {{ 'date_preset_custom' | translate }}\n </span>\n <span class=\"hint\">⇧</span>\n </button>\n }\n </div>\n\n <!-- ── View 2 — custom range with calendar ── -->\n <div class=\"dp__view\" [class.active]=\"view() === 'custom'\">\n <div class=\"dp__custom-head\">\n @if (mode() !== 'field') {\n <button\n type=\"button\"\n class=\"dp__back\"\n [attr.aria-label]=\"'common_back' | translate\"\n (click)=\"backToPresets()\"\n >\n <i class=\"pi pi-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n } @else {\n <span></span>\n }\n <div class=\"dp__custom-title\">\n <span class=\"pulse-dot\"></span>\n {{ (mode() === 'field' && selectionMode() === 'single' ? 'date_select_date' : 'date_custom_range') | translate }}\n </div>\n <span></span>\n </div>\n\n <div class=\"dp__cal\">\n <div class=\"dp__cal-head\">\n <button\n type=\"button\"\n class=\"dp__cal-nav\"\n [attr.aria-label]=\"'date_prev_month' | translate\"\n (click)=\"headerPrev()\"\n >\n <i class=\"pi pi-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n <div class=\"dp__cal-title\">\n @switch (calMode()) {\n @case ('years') {\n <span class=\"dp__cal-pick is-static\">{{ yearWindowLabel() }}</span>\n }\n @case ('months') {\n <button type=\"button\" class=\"dp__cal-pick\" (click)=\"openYearPicker()\">\n {{ yearLabel() }}\n </button>\n }\n @default {\n <button type=\"button\" class=\"dp__cal-pick\" (click)=\"openMonthPicker()\">\n {{ monthLabel() }}\n </button>\n <button type=\"button\" class=\"dp__cal-pick\" (click)=\"openYearPicker()\">\n {{ yearLabel() }}\n </button>\n }\n }\n </div>\n <button\n type=\"button\"\n class=\"dp__cal-nav\"\n [attr.aria-label]=\"'date_next_month' | translate\"\n (click)=\"headerNext()\"\n >\n <i class=\"pi pi-chevron-right\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n @switch (calMode()) {\n @case ('months') {\n <div class=\"dp__cal-cells\">\n @for (cell of monthCells(); track cell.month) {\n <button\n type=\"button\"\n class=\"dp__cal-cell\"\n [class.active]=\"cell.active\"\n [class.today]=\"cell.today\"\n (click)=\"selectMonth(cell.month)\"\n >\n {{ cell.label }}\n </button>\n }\n </div>\n }\n @case ('years') {\n <div class=\"dp__cal-cells\">\n @for (cell of yearCells(); track cell.year) {\n <button\n type=\"button\"\n class=\"dp__cal-cell\"\n [class.active]=\"cell.active\"\n [class.today]=\"cell.today\"\n (click)=\"selectYear(cell.year)\"\n >\n {{ cell.year }}\n </button>\n }\n </div>\n }\n @default {\n <div class=\"dp__cal-dow-row\">\n @for (label of dowLabels(); track trackByDow($index, label)) {\n <div class=\"dp__cal-dow\">{{ label }}</div>\n }\n </div>\n\n <div class=\"dp__cal-grid\">\n @for (day of calendarGrid(); track trackByDay($index, day)) {\n <button\n type=\"button\"\n class=\"dp__cal-day\"\n [class.out]=\"day.out\"\n [class.today]=\"day.today\"\n [class.in-range]=\"day.inRange\"\n [class.range-start]=\"day.rangeStart\"\n [class.range-end]=\"day.rangeEnd\"\n [attr.aria-label]=\"day.date | date:'fullDate'\"\n (click)=\"selectDay(day.date)\"\n >\n <span class=\"day-num\">{{ day.day }}</span>\n </button>\n }\n </div>\n }\n }\n </div>\n\n @if (mode() === 'field' && selectionMode() === 'single') {\n <!-- Single-date field: date (+ time when enabled). Without time,\n picking a day commits & closes; with time, Apply commits. -->\n <div class=\"dp__inputs\" [class.dp__inputs--single]=\"!showTime()\">\n <div class=\"dp__field\">\n <label [attr.for]=\"effectiveId + '-single'\">{{ 'date_select_date' | translate }}</label>\n <input\n #singleInput\n [id]=\"effectiveId + '-single'\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"10\"\n [value]=\"fromText()\"\n placeholder=\"JJ/MM/AAAA\"\n (keydown)=\"onDateKeydown($event, singleInput)\"\n (change)=\"commitSingleInput(singleInput)\"\n />\n </div>\n @if (showTime()) {\n <div class=\"dp__field\">\n <label [attr.for]=\"effectiveId + '-single-time'\">{{ 'date_time' | translate }}</label>\n <input\n #singleTime\n [id]=\"effectiveId + '-single-time'\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"5\"\n [value]=\"fromTimeText()\"\n placeholder=\"HH:mm\"\n (keydown)=\"onTimeKeydown($event, singleTime)\"\n (change)=\"commitTimeInput('start', singleTime)\"\n />\n </div>\n }\n </div>\n } @else {\n <div class=\"dp__inputs\">\n <div class=\"dp__field\">\n <label [attr.for]=\"effectiveId + '-from'\">{{ 'date_from' | translate }}</label>\n <input\n #fromInput\n [id]=\"effectiveId + '-from'\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"10\"\n [value]=\"fromText()\"\n placeholder=\"JJ/MM/AAAA\"\n (keydown)=\"onDateKeydown($event, fromInput)\"\n (change)=\"commitDateInput('start', fromInput)\"\n />\n @if (mode() === 'field' && showTime()) {\n <input\n #fromTime\n [attr.aria-label]=\"'date_time' | translate\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"5\"\n [value]=\"fromTimeText()\"\n placeholder=\"HH:mm\"\n (keydown)=\"onTimeKeydown($event, fromTime)\"\n (change)=\"commitTimeInput('start', fromTime)\"\n />\n }\n </div>\n <div class=\"dp__field\">\n <label [attr.for]=\"effectiveId + '-to'\">{{ 'date_to' | translate }}</label>\n <input\n #toInput\n [id]=\"effectiveId + '-to'\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"10\"\n [value]=\"toText()\"\n placeholder=\"JJ/MM/AAAA\"\n (keydown)=\"onDateKeydown($event, toInput)\"\n (change)=\"commitDateInput('end', toInput)\"\n />\n @if (mode() === 'field' && showTime()) {\n <input\n #toTime\n [attr.aria-label]=\"'date_time' | translate\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"5\"\n [value]=\"toTimeText()\"\n placeholder=\"HH:mm\"\n (keydown)=\"onTimeKeydown($event, toTime)\"\n (change)=\"commitTimeInput('end', toTime)\"\n />\n }\n </div>\n </div>\n }\n\n <!-- Footer: hidden only for single field WITHOUT time (commit on pick). -->\n @if (!(mode() === 'field' && selectionMode() === 'single' && !showTime())) {\n <div class=\"dp__actions\">\n @if (mode() === 'field' && selectionMode() === 'single') {\n <span></span>\n } @else {\n <span class=\"duration\">\n <span class=\"num\">{{ draftDurationDays() }}</span>\n {{ 'date_days' | translate }}\n </span>\n }\n <div class=\"right\">\n @if (mode() !== 'field') {\n <button\n type=\"button\"\n class=\"btn btn-ghost btn-sm\"\n (click)=\"backToPresets()\"\n >\n {{ 'common_back' | translate }}\n </button>\n }\n <button\n type=\"button\"\n class=\"btn btn-primary btn-sm\"\n [disabled]=\"!draftStart()\"\n (click)=\"applyCustomRange()\"\n >\n {{ 'common_apply' | translate }}\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n</ng-template>\n","import {\n booleanAttribute,\n Component,\n HostBinding,\n inject,\n Input,\n Output,\n EventEmitter,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport {\n InputNumber,\n InputNumberInputEvent,\n InputNumberModule,\n} from 'primeng/inputnumber';\nimport { Nullable } from 'primeng/ts-helpers';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { EfClearButtonComponent } from '../ef-clear-button/ef-clear-button.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n/**\n * Comptoir number input.\n *\n * Two render variants share the same API:\n * - `'comptoir'` (default) — native `<input type=\"text\" inputmode=\"decimal\">`\n * styled against `.ef-input` / `.ef-input-group`. Lean, no locale\n * formatting on display, but data entry accepts both `,` and `.` as\n * the decimal separator (fr-MA users type commas) and ignores\n * space group separators; pair with `suffix=\"MAD\"` for unit display\n * in dense grids (variants table, inventory adjustments, etc.).\n * See ADR-009.\n * - `'primeng'` — wraps `p-inputnumber`. Full locale-aware\n * currency / decimal formatting, stepper buttons, prefix / suffix.\n *\n * Identity / label / placeholder / aria / required / readonly /\n * disabled are inherited from `AbstractEfFormControl`.\n *\n * ```html\n * <ef-inputnumber\n * labelKey=\"catalog.price\"\n * variant=\"primeng\"\n * mode=\"currency\" currency=\"MAD\" locale=\"fr-MA\"\n * [(value)]=\"variant.price\" />\n *\n * <ef-inputnumber\n * labelKey=\"catalog.inventory\"\n * variant=\"comptoir\"\n * [showButtons]=\"true\" buttonLayout=\"horizontal\"\n * [min]=\"0\" [step]=\"1\"\n * [(value)]=\"variant.inventoryQuantity\" />\n * ```\n */\n@Component({\n selector: 'ef-inputnumber',\n standalone: true,\n templateUrl: './ef-inputnumber.component.html',\n styleUrls: ['./ef-inputnumber.component.scss'],\n imports: [InputNumberModule, FormsModule, TranslateModule, EfLabelComponent, EfClearButtonComponent],\n})\nexport class EfInputNumberComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor\n{\n @ViewChild('inputNumber', { static: false }) inputNumber?: InputNumber;\n\n /* Identity / label / placeholder / aria / required / readonly /\n disabled all inherited from AbstractEfFormControl. */\n\n /* ── Value & state ──────────────────────────────────────────── */\n\n @Input() value?: Nullable<number>;\n @Input() invalid = false;\n\n /* ── Format & display (primeng variant) ──────────────────────── */\n\n @Input() format = true;\n @Input({ transform: booleanAttribute }) showButtons = false;\n @Input() buttonLayout: 'stacked' | 'horizontal' | 'vertical' = 'stacked';\n @Input() incrementButtonClass?: string;\n @Input() decrementButtonClass?: string;\n @Input() incrementButtonIcon?: string;\n @Input() decrementButtonIcon?: string;\n @Input() prefix?: string;\n @Input() suffix?: string;\n @Input() currency?: string;\n @Input() currencyDisplay?: string;\n @Input() locale?: string;\n @Input() localeMatcher?: 'lookup' | 'best fit';\n @Input() mode: 'decimal' | 'currency' = 'decimal';\n @Input() useGrouping = true;\n @Input() minFractionDigits?: number;\n @Input() maxFractionDigits?: number;\n\n /* ── Constraints ─────────────────────────────────────────────── */\n\n @Input() min?: number;\n @Input() max?: number;\n @Input() step = 1;\n @Input() allowEmpty = true;\n\n /* ── Input attributes ────────────────────────────────────────── */\n\n @Input() inputSize?: number;\n /** Default (undefined) = canonical `--hit-base` (40px); `'small'` = dense 32px. */\n @Input() size?: 'small' | 'large';\n @Input() maxlength?: number;\n @Input() minlength?: number;\n @Input() pattern?: string;\n @Input() tabindex?: number;\n @Input() title?: string;\n @Input() ariaLabelledBy?: string;\n @Input() inputStyle?: any;\n @Input() inputStyleClass?: string;\n @Input() style?: any;\n @Input() styleClass?: string;\n /* showClear inherited from AbstractEfFormControl (default true). */\n /** PrimeNG visual variant (`'filled'` | `'outlined'`) — only\n * honored when {@link variant} === 'primeng'. */\n @Input() primeNgVariant?: 'filled' | 'outlined';\n @Input({ transform: booleanAttribute }) autofocus = false;\n @Input() autocomplete?: string;\n @Input() fluid = true;\n @Input({ transform: booleanAttribute }) inline = false;\n\n /**\n * Render variant.\n * - `'comptoir'` (default) — native `<input type=\"text\" inputmode=\"decimal\">`\n * styled against `.ef-input` / `.ef-input-group`,\n * at the canonical `--hit-base` (40px) height.\n * Accepts `,` and `.` as decimal separator.\n * - `'primeng'` — wraps `p-inputnumber`. Opt in for PrimeNG's\n * formatted stepper behaviour.\n * See ADR-009 for why comptoir is the height-consistent default.\n */\n @Input() variant: 'primeng' | 'comptoir' = 'comptoir';\n\n @HostBinding('class.ef-inline') get isInline() { return this.inline; }\n\n /* ── Styling pass-through (primeng variant) ─────────────────── */\n\n @Input() pt?: any;\n @Input() ptOptions?: any;\n @Input() dt?: any;\n @Input() unstyled?: boolean;\n\n /* ── Events ──────────────────────────────────────────────────── */\n\n @Output() inputEvent = new EventEmitter<InputNumberInputEvent>();\n @Output() valueChangeEvent: EventEmitter<number | null> = new EventEmitter<number | null>();\n @Output() focusEvent = new EventEmitter<Event>();\n @Output() blurEvent = new EventEmitter<Event>();\n @Output() keyDownEvent = new EventEmitter<KeyboardEvent>();\n @Output() clearEvent = new EventEmitter<void>();\n\n /* ── Clearable (showClear / canClear inherited from the base) ── */\n\n /** A number field is clearable when it holds any value (including 0). */\n protected override get hasValue(): boolean {\n return this.value != null;\n }\n\n override clearValue(): void {\n this.handleClear();\n }\n\n /* ── CVA ─────────────────────────────────────────────────────── */\n\n private onChange: (value: any) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n /* effectiveId / effectivePlaceholder / effectiveAriaLabel /\n errorsId all inherited from AbstractEfFormControl. */\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? this.ngControl?.control?.errors?.['serverError'] ?? null;\n }\n\n get isInvalid(): boolean {\n if (this.resolvedExternalErrors()?.length) return true;\n const ctrl = this.ngControl?.control;\n return this.invalid || !!(ctrl?.invalid && (ctrl?.touched || ctrl?.dirty));\n }\n\n writeValue(value: any): void {\n this.value = value;\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n /* ── Event handlers ─────────────────────────────────────────── */\n\n handleInput(event: InputNumberInputEvent): void {\n const next = (event.value ?? null) as number | null;\n this.value = next;\n this.onChange(next);\n this.inputEvent.emit(event);\n this.valueChangeEvent.emit(next);\n }\n\n /** Comptoir native input handler — the text input emits a raw\n * string; normalize + coerce to number or null (empty / invalid). */\n handleNativeInput(raw: string): void {\n const next = this.parseComptoirValue(raw);\n this.value = next;\n this.onChange(next);\n this.valueChangeEvent.emit(next);\n }\n\n /**\n * Parses comptoir free-text numeric entry.\n *\n * fr-MA users type commas as the decimal separator (`23,50`), while\n * `Number()` only understands `.` — so a comma is normalized to a\n * dot before parsing, and spaces (JS `\\s` covers NBSP / narrow-NBSP\n * group separators) are stripped. Both `23,50` and `23.50` parse to\n * 23.5; unparseable text yields `null` (existing empty semantics).\n */\n private parseComptoirValue(raw: string): number | null {\n if (raw == null) return null;\n const normalized = raw.replace(/\\s/g, '').replace(/,/g, '.');\n if (normalized === '') return null;\n const parsed = Number(normalized);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n /**\n * Blur-time clamp for the comptoir variant. The native input no\n * longer carries `min` / `max` attributes (it's `type=\"text\"`), so\n * range enforcement — previously only advisory on `type=\"number\"`\n * anyway — happens here, and the field text is re-synced to the\n * canonical parsed value (e.g. a dangling `23,` becomes `23`).\n */\n private clampAndReflect(el: HTMLInputElement | null): void {\n const current = this.value ?? null;\n let next = current;\n if (next != null) {\n if (this.min != null && next < this.min) next = this.min;\n if (this.max != null && next > this.max) next = this.max;\n }\n if (next !== current) {\n this.value = next;\n this.onChange(next);\n this.valueChangeEvent.emit(next);\n }\n if (el) el.value = next == null ? '' : String(next);\n }\n\n /** Comptoir stepper buttons handler — bumps `value` by `step`,\n * clamped to `min` / `max`. */\n step$(direction: 1 | -1): void {\n const current = this.value ?? 0;\n let next = current + direction * (this.step ?? 1);\n if (this.min != null) next = Math.max(this.min, next);\n if (this.max != null) next = Math.min(this.max, next);\n this.value = next;\n this.onChange(next);\n this.valueChangeEvent.emit(next);\n }\n\n handleFocus(event: Event): void {\n this.focusEvent.emit(event);\n }\n\n handleBlur(event: Event): void {\n if (this.variant === 'comptoir') {\n this.clampAndReflect((event.target as HTMLInputElement | null) ?? null);\n }\n this.onTouched();\n this.blurEvent.emit(event);\n }\n\n handleKeyDown(event: KeyboardEvent): void {\n this.keyDownEvent.emit(event);\n }\n\n handleClear(): void {\n this.value = null;\n this.onChange(null);\n this.valueChangeEvent.emit(null);\n this.clearEvent.emit();\n }\n\n focus(): void {\n this.inputNumber?.input?.nativeElement?.focus();\n }\n\n clear(): void {\n if (this.inputNumber) {\n this.inputNumber.clear();\n }\n this.handleClear();\n }\n}\n","@if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" [for]=\"effectiveId\" [required]=\"required()\" />\n}\n<div class=\"ef-field-control\">\n @if (variant === 'comptoir') {\n @if (prefix || suffix || showButtons) {\n <!-- Comptoir variant — native text input (inputmode=decimal, accepts\n \",\" or \".\" as decimal separator) wrapped in .ef-input-group when\n there's a prefix / suffix / stepper. min/max are enforced by\n blur-time clamping in the component (text inputs have no native\n range semantics). -->\n <div class=\"ef-input-group\" [class.is-invalid]=\"isInvalid\">\n @if (showButtons) {\n <button\n type=\"button\"\n class=\"ef-input-addon is-stepper\"\n [disabled]=\"isDisabled() || (min !== undefined && (value ?? 0) <= min)\"\n (click)=\"step$(-1)\"\n [attr.aria-label]=\"('ef_input_decrement' | translate) || 'Decrease'\"\n >\n <i class=\"pi pi-minus\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (prefix) {\n <span class=\"ef-input-addon is-prefix\" aria-hidden=\"true\">{{ prefix }}</span>\n }\n <input\n type=\"text\"\n inputmode=\"decimal\"\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [value]=\"value ?? ''\"\n [attr.placeholder]=\"effectivePlaceholder || null\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete ?? 'off'\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n (input)=\"handleNativeInput($any($event.target).value)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n @if (canClear) {\n <ef-clear-button\n class=\"ef-group-clear\"\n [ariaLabel]=\"'action.clear' | translate\"\n (clear)=\"clearValue()\"\n />\n }\n @if (suffix) {\n <span class=\"ef-input-addon is-suffix\" aria-hidden=\"true\">{{ suffix }}</span>\n }\n @if (showButtons) {\n <button\n type=\"button\"\n class=\"ef-input-addon is-stepper\"\n [disabled]=\"isDisabled() || (max !== undefined && (value ?? 0) >= max)\"\n (click)=\"step$(1)\"\n [attr.aria-label]=\"('ef_input_increment' | translate) || 'Increase'\"\n >\n <i class=\"pi pi-plus\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n } @else {\n <!-- Comptoir variant — bare native text input (inputmode=decimal,\n accepts \",\" or \".\" as decimal separator; optional inline clear).\n min/max are enforced by blur-time clamping in the component. -->\n <div class=\"ef-input-wrap\">\n <input\n type=\"text\"\n inputmode=\"decimal\"\n class=\"ef-input\"\n [class.has-clear]=\"canClear\"\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [value]=\"value ?? ''\"\n [attr.placeholder]=\"effectivePlaceholder || null\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete ?? 'off'\"\n [class.is-invalid]=\"isInvalid\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n (input)=\"handleNativeInput($any($event.target).value)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n @if (canClear) {\n <ef-clear-button\n class=\"ef-input-clear\"\n [ariaLabel]=\"'action.clear' | translate\"\n (clear)=\"clearValue()\"\n />\n }\n </div>\n }\n } @else {\n <!-- PrimeNG variant (default) — full locale-aware formatting. -->\n <p-inputnumber\n #inputNumber\n [(ngModel)]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n [invalid]=\"isInvalid\"\n [disabled]=\"isDisabled()\"\n [readonly]=\"readonly()\"\n [required]=\"required()\"\n [format]=\"format\"\n [showButtons]=\"showButtons\"\n [buttonLayout]=\"buttonLayout\"\n [incrementButtonClass]=\"incrementButtonClass\"\n [decrementButtonClass]=\"decrementButtonClass\"\n [incrementButtonIcon]=\"incrementButtonIcon\"\n [decrementButtonIcon]=\"decrementButtonIcon\"\n [prefix]=\"prefix\"\n [suffix]=\"suffix\"\n [currency]=\"currency\"\n [currencyDisplay]=\"currencyDisplay\"\n [locale]=\"locale\"\n [localeMatcher]=\"localeMatcher\"\n [mode]=\"mode\"\n [useGrouping]=\"useGrouping\"\n [minFractionDigits]=\"minFractionDigits\"\n [maxFractionDigits]=\"maxFractionDigits\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n [allowEmpty]=\"allowEmpty\"\n [inputId]=\"effectiveId\"\n [name]=\"name()\"\n [placeholder]=\"effectivePlaceholder\"\n [inputSize]=\"inputSize\"\n [size]=\"size\"\n [maxlength]=\"maxlength\"\n [minlength]=\"minlength\"\n [pattern]=\"pattern\"\n [tabindex]=\"tabindex\"\n [title]=\"title\"\n [ariaLabel]=\"effectiveAriaLabel\"\n [ariaLabelledBy]=\"ariaLabelledBy\"\n [ariaRequired]=\"required()\"\n [inputStyle]=\"inputStyle\"\n [inputStyleClass]=\"inputStyleClass\"\n [style]=\"style\"\n [styleClass]=\"styleClass\"\n [showClear]=\"showClear()\"\n [variant]=\"primeNgVariant\"\n [autofocus]=\"autofocus\"\n [autocomplete]=\"autocomplete\"\n [fluid]=\"fluid\"\n [pt]=\"pt\"\n [ptOptions]=\"ptOptions\"\n [dt]=\"dt\"\n [unstyled]=\"unstyled\"\n (onInput)=\"handleInput($event)\"\n (onFocus)=\"handleFocus($event)\"\n (onBlur)=\"handleBlur($event)\"\n (onKeyDown)=\"handleKeyDown($event)\"\n (onClear)=\"handleClear()\"\n />\n }\n @if (showRequired || serverErrors) {\n <div [id]=\"errorsId\" role=\"alert\" aria-live=\"polite\">\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n </div>\n }\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n forwardRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport {\n NG_VALUE_ACCESSOR,\n ControlValueAccessor,\n FormsModule,\n} from '@angular/forms';\nimport { Nullable } from 'primeng/ts-helpers';\nimport { EfInputNumberComponent } from '../ef-inputnumber/ef-inputnumber.component';\n\n/**\n * EfQuantityStepper is a specialized component for quantity selection with increment/decrement buttons.\n * Perfect for shopping carts, POS systems, and order forms where users need to adjust quantities.\n *\n * Features:\n * - Increment/decrement buttons with customizable styling\n * - Min/max value constraints\n * - Configurable step value\n * - Fully integrated with Angular Forms (ngModel, FormControl)\n * - Rounded button design optimized for touch interfaces\n *\n * @group Components\n */\n@Component({\n selector: 'ef-quantity-stepper',\n templateUrl: './ef-quantity-stepper.component.html',\n styleUrls: ['./ef-quantity-stepper.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [EfInputNumberComponent, FormsModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => EfQuantityStepperComponent),\n multi: true,\n },\n ],\n})\nexport class EfQuantityStepperComponent implements ControlValueAccessor {\n /**\n * Current quantity value\n */\n @Input() value: Nullable<number> = 0;\n\n /**\n * Minimum allowed value\n */\n @Input() min = 0;\n\n /**\n * Maximum allowed value\n */\n @Input() max = 999;\n\n /**\n * Step increment/decrement value\n */\n @Input() step = 1;\n\n /**\n * Minimum fraction digits to display (forwarded to ef-inputnumber).\n */\n @Input() minFractionDigits?: number;\n\n /**\n * Maximum fraction digits to display (forwarded to ef-inputnumber).\n */\n @Input() maxFractionDigits?: number;\n\n /**\n * Locale used for number formatting (forwarded to ef-inputnumber).\n */\n @Input() locale?: string;\n\n /**\n * When present, it specifies that the component should be disabled\n */\n @Input() disabled = false;\n\n /**\n * Callback to invoke when the value changes\n */\n @Output() valueChange = new EventEmitter<number>();\n\n /**\n * Pass Through configuration for custom styling\n */\n ptConfig = {\n root: {\n class: 'flex items-center justify-center gap-2',\n },\n pcInputText: {\n root: {\n class:\n '!w-12 !border-none !rounded-full bg-transparent font-bold text-primary dark:text-primary-contrast !text-center',\n },\n },\n decrementButton: {\n class:\n '!w-9 !border-none cursor-pointer !rounded-full !bg-white px-3 py-2 font-bold !text-primary dark:!text-primary-contrast !text-center',\n },\n incrementButton: {\n class:\n '!w-9 !border-none cursor-pointer !rounded-full !bg-white px-3 py-2 font-bold !text-primary dark:!text-primary-contrast !text-center',\n },\n decrementButtonIcon: {\n innerHTML: '-',\n },\n incrementButtonIcon: {\n innerHTML: '+',\n },\n };\n\n // ============================================================================\n // CONTROL VALUE ACCESSOR\n // ============================================================================\n\n private onChange: (value: any) => void = () => {\n /* noop */\n };\n private onTouched: () => void = () => {\n /* noop */\n };\n\n // ============================================================================\n // CONTROL VALUE ACCESSOR IMPLEMENTATION\n // ============================================================================\n\n writeValue(value: any): void {\n this.value = value;\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n // ============================================================================\n // EVENT HANDLERS\n // ============================================================================\n\n handleValueChange(value: number | null): void {\n this.value = value;\n this.onChange(value);\n this.valueChange.emit(value);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n}\n","<div\n class=\"flex h-12 items-center text-center justify-center gap-2 rounded-full !border !border-gray-200 bg-gray-100 dark:bg-slate-500 p-2\"\n>\n <ef-inputnumber\n [(ngModel)]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n [minFractionDigits]=\"minFractionDigits\"\n [maxFractionDigits]=\"maxFractionDigits\"\n [locale]=\"locale\"\n [disabled]=\"disabled\"\n [showButtons]=\"true\"\n buttonLayout=\"horizontal\"\n decrementButtonIcon=\"-\"\n incrementButtonIcon=\"+\"\n [pt]=\"ptConfig\"\n (ngModelChange)=\"handleValueChange($event)\"\n (blurEvent)=\"handleBlur()\"\n >\n </ef-inputnumber>\n</div>\n","import {\n booleanAttribute,\n Component,\n EventEmitter,\n Input,\n Output,\n} from '@angular/core';\nimport { ButtonModule } from 'primeng/button';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/** PrimeNG severity vocabulary (v1's default). */\nexport type EfButtonPrimeNGSeverity =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'info'\n | 'warn'\n | 'danger'\n | 'help'\n | 'contrast';\n\n/** Comptoir severity vocabulary — maps to `.btn-{name}` rules in\n * `@elasticias/ui/styles/patterns`. `'danger'` renders as\n * `.btn-ghost` with the cancelled-fg tint applied inline. */\nexport type EfButtonComptoirSeverity = 'primary' | 'tenant' | 'ghost' | 'danger';\n\nexport type EfButtonSeverity = EfButtonPrimeNGSeverity | EfButtonComptoirSeverity;\n\n/**\n * Wrapper button for both v1 (PrimeNG-themed) and V2 (Comptoir-themed)\n * surfaces. `[variant]` picks the rendering path:\n *\n * - `'primeng'` (default) — wraps `<p-button>` with PrimeNG severities\n * (`primary / success / danger / …`). Keeps v1 imports working\n * unchanged.\n *\n * - `'comptoir'` — renders a native `<button class=\"btn btn-{severity}\n * btn-sm\">` against the Comptoir `.btn` pattern. Severities are\n * `'primary' | 'tenant' | 'ghost' | 'danger'`; `'danger'` falls back\n * to `.btn-ghost` with the `--st-cancelled-fg` tint applied inline,\n * matching the prototype's Delete-button styling.\n *\n * Both variants honour `labelKey` (i18n preferred), `icon`,\n * `disabled`, `loading`, `pTooltip` (via `tooltipKey`), and emit the\n * same `clickEvent`.\n */\n@Component({\n selector: 'ef-button',\n standalone: true,\n templateUrl: './ef-button.component.html',\n imports: [ButtonModule, TooltipModule, TranslateModule],\n})\nexport class EfButtonComponent {\n /** Direct label text (not translated). */\n @Input() label?: string;\n /** Translation key — takes priority over `label`. */\n @Input() labelKey?: string;\n\n @Input() icon?: string;\n\n /**\n * Which rendering surface to use. Default `'primeng'` keeps v1\n * consumers unchanged. V2 detail/list screens pass `'comptoir'`\n * to opt into the Comptoir `.btn` styling.\n */\n @Input() variant: 'primeng' | 'comptoir' = 'primeng';\n\n @Input() severity: EfButtonSeverity = 'primary';\n @Input() size: 'small' | 'large' = 'small';\n\n @Input({ transform: booleanAttribute }) disabled = false;\n @Input({ transform: booleanAttribute }) rounded = false;\n @Input({ transform: booleanAttribute }) outlined = false;\n @Input({ transform: booleanAttribute }) raised = false;\n @Input({ transform: booleanAttribute }) text = false;\n @Input({ transform: booleanAttribute }) loading = false;\n @Input() styleClass?: string;\n @Input() type: 'button' | 'submit' = 'button';\n @Input() badge?: string;\n @Input() badgeSeverity?:\n | 'success'\n | 'info'\n | 'warn'\n | 'danger'\n | 'help'\n | 'primary'\n | 'secondary'\n | 'contrast';\n\n /** Direct tooltip text (not translated). Falls back to `label`\n * when neither `tooltip` nor `tooltipKey` is set. */\n @Input() tooltip?: string;\n /** Translation key for tooltip — takes priority over `tooltip`.\n * Falls back to `labelKey` when not provided, so buttons with\n * visible labels still expose them to screen readers / mobile\n * long-press once the label is hidden by responsive CSS. */\n @Input() tooltipKey?: string;\n @Input() tooltipPosition: 'top' | 'bottom' | 'left' | 'right' = 'top';\n\n /** Resolved tooltip translation key — `tooltipKey` if provided,\n * otherwise `labelKey`. Lets responsive icon-only buttons reuse\n * their label as the tooltip without restating it at every call\n * site. */\n get effectiveTooltipKey(): string | undefined {\n return this.tooltipKey ?? this.labelKey;\n }\n\n /** Resolved plain tooltip text — `tooltip` if provided, otherwise\n * `label`. Used only when neither `tooltipKey` nor `labelKey` is\n * set. */\n get effectiveTooltip(): string | undefined {\n return this.tooltip ?? this.label;\n }\n\n @Output() clickEvent = new EventEmitter<Event>();\n\n /** Composed class string for the Comptoir variant —\n * `btn btn-{severity} btn-sm` plus any caller-supplied `styleClass`. */\n get comptoirClass(): string {\n // 'danger' renders as ghost + danger-tint (applied as inline style\n // in the template); other severities map directly.\n const sevClass = this.severity === 'danger' ? 'btn-ghost' : `btn-${this.severity}`;\n const sizeClass = this.size === 'small' ? 'btn-sm' : '';\n return ['btn', sevClass, sizeClass, this.styleClass ?? '']\n .filter(Boolean)\n .join(' ');\n }\n\n /** Inline danger tint for the `severity=\"danger\"` Comptoir variant. */\n get comptoirInlineColor(): string | null {\n return this.severity === 'danger' ? 'var(--st-cancelled-fg)' : null;\n }\n\n handleClick(event: Event): void {\n if (this.disabled || this.loading) return;\n this.clickEvent.emit(event);\n }\n}\n","@if (variant === 'comptoir') {\n <!-- Comptoir variant — native button against the `.btn` pattern\n in `@elasticias/ui/styles/patterns`. PrimeNG severities\n (success/info/warn/help/contrast/secondary) fall through to\n this branch only when explicitly passed with variant='comptoir';\n they render as ghost since they have no Comptoir equivalent. -->\n <button\n [type]=\"type\"\n [class]=\"comptoirClass\"\n [disabled]=\"disabled || loading\"\n [style.color]=\"comptoirInlineColor\"\n [pTooltip]=\"effectiveTooltipKey ? (effectiveTooltipKey | translate) : effectiveTooltip\"\n [tooltipPosition]=\"tooltipPosition\"\n (click)=\"handleClick($event)\"\n >\n @if (loading) {\n <i class=\"pi pi-spinner pi-spin\" aria-hidden=\"true\"></i>\n } @else if (icon) {\n <i [class]=\"icon\" aria-hidden=\"true\"></i>\n }\n @if (labelKey || label) {\n <span>{{ labelKey ? (labelKey | translate) : label }}</span>\n }\n </button>\n} @else {\n <!-- PrimeNG variant (default) — v1 styling via <p-button>. -->\n <p-button\n [label]=\"labelKey ? (labelKey | translate) : label\"\n [icon]=\"icon\"\n [severity]=\"$any(severity)\"\n [size]=\"size\"\n [disabled]=\"disabled\"\n [rounded]=\"rounded\"\n [outlined]=\"outlined\"\n [raised]=\"raised\"\n [text]=\"text\"\n [loading]=\"loading\"\n [styleClass]=\"styleClass\"\n [type]=\"type\"\n [badge]=\"badge\"\n [badgeSeverity]=\"badgeSeverity\"\n [pTooltip]=\"effectiveTooltipKey ? (effectiveTooltipKey | translate) : effectiveTooltip\"\n [tooltipPosition]=\"tooltipPosition\"\n (onClick)=\"handleClick($event)\"\n />\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/** Shape of the placeholder rendered while a widget's data is in flight. */\nexport type EfSkeletonVariant = 'text' | 'kpi' | 'chart' | 'table';\n\n/**\n * Comptoir loading skeleton — the one reusable \"waiting for results\"\n * placeholder for async card/widget bodies (dashboards, reports,\n * detail sidebars). Pure CSS shimmer on the design-system tokens;\n * decorative only (`aria-hidden`), so hosts flag busyness themselves\n * (`ef-card` sets `aria-busy` on its body when `[loading]` is true).\n *\n * Prefer injecting it through `ef-card`'s `[loading]` + `skeleton`\n * inputs — the card swaps its body for the skeleton with a single\n * binding. Use the component directly only for non-card shells\n * (e.g. a KPI tile row):\n *\n * ```html\n * <ef-card titleKey=\"…\" [loading]=\"state() === 'loading'\" skeleton=\"chart\">…</ef-card>\n * <ef-skeleton class=\"kpi\" variant=\"kpi\" />\n * ```\n *\n * Variants: `text` (default, `rows` lines), `kpi` (label / value /\n * delta bars), `chart` (one block, `height` px), `table` (header bar\n * + `rows` row bars).\n */\n@Component({\n selector: 'ef-skeleton',\n standalone: true,\n template: `\n @switch (variant()) {\n @case ('kpi') {\n <span class=\"sk sk-label\"></span>\n <span class=\"sk sk-value\"></span>\n <span class=\"sk sk-delta\"></span>\n }\n @case ('chart') {\n <span class=\"sk sk-chart\" [style.height.px]=\"height()\"></span>\n }\n @case ('table') {\n <span class=\"sk sk-th\"></span>\n @for (i of lines(); track i) {\n <span class=\"sk sk-row\"></span>\n }\n }\n @default {\n @for (i of lines(); track i) {\n <span class=\"sk sk-text\"></span>\n }\n }\n }\n `,\n styleUrl: './ef-skeleton.component.scss',\n host: { 'aria-hidden': 'true' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfSkeletonComponent {\n /** Placeholder shape. */\n readonly variant = input<EfSkeletonVariant>('text');\n\n /** Line/row count for the `text` and `table` variants. */\n readonly rows = input(4);\n\n /** Block height (px) for the `chart` variant. */\n readonly height = input(280);\n\n readonly lines = computed(() =>\n Array.from({ length: Math.max(1, this.rows()) }, (_, i) => i),\n );\n}\n","import { ChangeDetectionStrategy, Component, booleanAttribute, computed, input, model } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfSkeletonComponent, EfSkeletonVariant } from '../../feedback/ef-skeleton/ef-skeleton.component';\n\n/**\n * Comptoir card primitive — `.card` shell with optional `.card-head`,\n * `.card-body`, `.card-foot`. Phase 7's most reused container.\n *\n * Three projection slots:\n * `head-extra` — projected on the right of the head row, after the\n * built-in title/meta. Use for a status chip,\n * action button, kbd hint, etc.\n * default — body content (replaced by the reusable\n * `ef-skeleton` while `[loading]` is true).\n * `foot` — bottom strip with rule-soft separator + paper bg.\n *\n * ```html\n * <ef-card titleKey=\"orders_status\" [tone]=\"'module'\">\n * <ng-container head-extra>\n * <ef-status-chip referenceKey=\"sales_order_status\" [code]=\"status\" />\n * </ng-container>\n * <div>… body content …</div>\n * <div foot>\n * <span class=\"small text-mute\">Modifié il y a 2 min</span>\n * </div>\n * </ef-card>\n * ```\n */\n@Component({\n selector: 'ef-card',\n standalone: true,\n host: { '[class.is-overflow-visible]': 'overflowVisible()' },\n imports: [CommonModule, TranslateModule, EfSkeletonComponent],\n template: `\n @if (showHead()) {\n <div\n class=\"card-head\"\n [class.tone-module]=\"tone() === 'module'\"\n [class.is-collapsible]=\"collapsible()\"\n [attr.role]=\"collapsible() ? 'button' : null\"\n [attr.tabindex]=\"collapsible() ? 0 : null\"\n (click)=\"onHeadClick()\"\n (keydown.enter)=\"onHeadClick()\"\n (keydown.space)=\"onHeadClick()\"\n >\n <div>\n @if (titleKey() || title()) {\n <div class=\"title\">\n {{ titleKey() ? (titleKey() | translate) : title() }}\n </div>\n }\n @if (metaKey() || meta()) {\n <div class=\"meta\">\n {{ metaKey() ? (metaKey() | translate) : meta() }}\n </div>\n }\n </div>\n <!-- eslint-disable-next-line @angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"card-head-actions\"\n (click)=\"$event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.space)=\"$event.stopPropagation()\"\n >\n <ng-content select=\"[head-extra]\"></ng-content>\n @if (collapsible()) {\n <button\n type=\"button\"\n class=\"card-collapse-btn\"\n (click)=\"toggle()\"\n [attr.aria-expanded]=\"!collapsed()\"\n >\n <i\n class=\"pi\"\n [class.pi-chevron-down]=\"collapsed()\"\n [class.pi-chevron-up]=\"!collapsed()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n </div>\n </div>\n }\n\n @if (!collapsed()) {\n <div class=\"card-body\" [attr.aria-busy]=\"loading() ? 'true' : null\">\n @if (loading()) {\n <ef-skeleton\n [variant]=\"skeleton()\"\n [rows]=\"skeletonRows()\"\n [height]=\"skeletonHeight()\"\n />\n } @else {\n <ng-content></ng-content>\n }\n </div>\n }\n\n @if (showFoot() && !collapsed()) {\n <div class=\"card-foot\">\n <ng-content select=\"[foot]\"></ng-content>\n </div>\n }\n `,\n styleUrl: './ef-card.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfCardComponent {\n /** Translation key for the head title — preferred. */\n readonly titleKey = input<string>('');\n /** Direct title fallback when `titleKey` is empty. */\n readonly title = input<string>('');\n\n /** Translation key for the head's small meta line. */\n readonly metaKey = input<string>('');\n readonly meta = input<string>('');\n\n /** Module-tinted head — uses `var(--module)` for the head bg. */\n readonly tone = input<'default' | 'module'>('default');\n\n /** Force the head to render even when no title/meta (e.g. when\n * using only the head-extra slot). Defaults to auto-detect. */\n readonly forceHead = input(false, { transform: booleanAttribute });\n\n /** Render the foot strip — set when projecting `[foot]` content. */\n readonly hasFoot = input(false, { transform: booleanAttribute });\n\n /** When true, the head shows a chevron toggle and the body/foot collapse. */\n readonly collapsible = input(false, { transform: booleanAttribute });\n\n /** Let overlay content (custom dropdowns/menus rendered inside the body)\n * escape the card's `overflow: hidden`. PrimeNG overlays should prefer\n * `appendTo=\"body\"`; use this for non-PrimeNG absolute-positioned menus. */\n readonly overflowVisible = input(false, { transform: booleanAttribute });\n\n /** While true, the body renders the reusable `ef-skeleton` instead of\n * the projected content (and flags `aria-busy`). Bind each card's own\n * async state so widgets shimmer independently:\n * `[loading]=\"state().series === 'loading'\"`. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** Skeleton shape shown while `loading` — match the body content. */\n readonly skeleton = input<EfSkeletonVariant>('text');\n\n /** Line/row count for the `text` / `table` skeleton variants. */\n readonly skeletonRows = input(4);\n\n /** Block height (px) for the `chart` skeleton variant. */\n readonly skeletonHeight = input(280);\n\n /** Collapsed state (two-way). Bind `[collapsed]=\"true\"` to start collapsed. */\n readonly collapsed = model(false);\n\n readonly showHead = computed(\n () =>\n this.forceHead() ||\n this.collapsible() ||\n !!this.titleKey() ||\n !!this.title() ||\n !!this.metaKey() ||\n !!this.meta(),\n );\n\n readonly showFoot = computed(() => this.hasFoot());\n\n /** Toggle collapsed state (no-op when not collapsible). */\n toggle(): void {\n if (this.collapsible()) this.collapsed.set(!this.collapsed());\n }\n\n /** Clicking anywhere on a collapsible head (except the actions area, which\n * stops propagation) toggles the card. */\n onHeadClick(): void {\n this.toggle();\n }\n}\n","import {\n booleanAttribute,\n Component,\n EventEmitter,\n inject,\n Input,\n Output,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DialogModule } from 'primeng/dialog';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { EfButtonComponent } from '../ef-button/ef-button.component';\n\n/**\n * Dynamic action descriptor for `ef-dialog`. The dialog renders one\n * `<button class=\"btn …\">` per entry, in array order (left → right);\n * the rightmost entry is the focused / \"primary\" by convention.\n *\n * When `command` returns a `Promise`, the button auto-toggles\n * `.is-loading` for the duration and the dialog closes when it\n * resolves (unless `dismiss === false`).\n */\nexport interface EfDialogAction {\n /** Direct label text. Use `labelKey` for i18n. */\n label?: string;\n /** Translation key for the label — takes precedence over `label`. */\n labelKey?: string;\n /** Visual severity (controls the .btn class). Default: `'ghost'`. */\n severity?: 'primary' | 'ghost' | 'tenant' | 'danger';\n /** PrimeNG icon class (e.g. `'pi pi-trash'`). Optional. */\n icon?: string;\n /** Extra class(es) appended to the footer button — for brand-tinted\n * actions (e.g. `'btn-whatsapp'`) or layout helpers (`'btn-dialog-leading'`)\n * beyond the four standard severities. */\n styleClass?: string;\n /** Click handler. Return a `Promise` to auto-toggle the loading\n * spinner overlay on the button until it settles. */\n command?: () => void | Promise<void>;\n /** Close the dialog after the command resolves. Default: `true`. */\n dismiss?: boolean;\n /** Render the button as disabled. */\n disabled?: boolean;\n /** Render the button as loading (in-flight). Mutated automatically\n * by the dialog when the command returns a Promise. */\n loading?: boolean;\n}\n\nexport type EfDialogSeverity = 'default' | 'danger' | 'warn' | 'info' | 'success' | 'tenant';\nexport type EfDialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\n/**\n * Comptoir dialog — wraps PrimeNG `p-dialog` and skins it against the\n * `.es-dialog` patterns lifted from the static prototype\n * (`docs/ux-ui/erp/screens/components.html` § Section 05).\n *\n * **Card design with two rules** — the header has a `border-bottom`,\n * the footer has a `border-top` (`1px var(--rule)`). Header layout:\n * optional severity-tinted icon · title + subtitle · close ✕.\n *\n * **Dynamic actions** — pass an `EfDialogAction[]` via `[actions]`\n * and the footer renders one button per entry, in order. The rightmost\n * is conventionally the primary action; consumers control severity\n * per-entry. Async commands flip the button to `.is-loading` until\n * resolved, then auto-dismiss (unless opted out).\n *\n * ```html\n * <ef-dialog\n * [(visible)]=\"show\"\n * headerKey=\"orders.delete_confirm\"\n * subtitleKey=\"orders.delete_irreversible\"\n * severity=\"danger\"\n * size=\"md\"\n * [actions]=\"[\n * { labelKey: 'common_cancel', severity: 'ghost' },\n * { labelKey: 'common_delete', severity: 'danger',\n * command: () => this.api.deleteOrder(this.id) }\n * ]\"\n * >\n * <div class=\"es-dialog__highlight\">\n * <span class=\"av tenant\">L</span>\n * <div class=\"body\">\n * <div class=\"nm\">SO-2026-198 · Leila Bennani</div>\n * <div class=\"meta\">07 mai · 1 132,00 MAD</div>\n * </div>\n * </div>\n * <p>{{ 'orders.delete_warning' | translate }}</p>\n * </ef-dialog>\n * ```\n */\n@Component({\n selector: 'ef-dialog',\n standalone: true,\n templateUrl: './ef-dialog.component.html',\n imports: [CommonModule, DialogModule, TranslateModule, EfButtonComponent],\n})\nexport class EfDialogComponent {\n private readonly translate = inject(TranslateService);\n\n /* ── Identity (existing) ─────────────────────────────────── */\n\n /** Direct header text (not translated). */\n @Input() header?: string;\n /** Translation key — takes precedence over `header`. */\n @Input() headerKey?: string;\n\n /** Direct subtitle text. */\n @Input() subtitle?: string;\n /** Translation key — takes precedence over `subtitle`. */\n @Input() subtitleKey?: string;\n\n /* ── Visibility / behaviour (existing + 1 new) ──────────── */\n\n @Input({ transform: booleanAttribute }) visible = false;\n @Input({ transform: booleanAttribute }) modal = true;\n @Input({ transform: booleanAttribute }) closable = true;\n @Input({ transform: booleanAttribute }) draggable = false;\n @Input({ transform: booleanAttribute }) resizable = false;\n /** Close the dialog when the user clicks the backdrop mask. */\n @Input({ transform: booleanAttribute }) dismissableMask = false;\n /** Close the dialog on Escape (PrimeNG default = true). */\n @Input({ transform: booleanAttribute }) closeOnEscape = true;\n\n /* ── Visuals (new) ──────────────────────────────────────── */\n\n /** Severity drives the header icon tint (panel itself stays neutral).\n * Pair with `[icon]` to override the default icon-class per severity. */\n @Input() severity: EfDialogSeverity = 'default';\n /** Header icon class (PrimeNG `pi pi-*`). Overrides the severity default. */\n @Input() icon?: string;\n /** Width preset: sm 380 / md 480 (default) / lg 640 / xl 880 / full. */\n @Input() size: EfDialogSize = 'md';\n\n /* ── Style hooks ────────────────────────────────────────── */\n\n @Input() style?: { [key: string]: string };\n @Input() styleClass?: string;\n\n @Input() position:\n | 'center' | 'top' | 'bottom' | 'left' | 'right'\n | 'topleft' | 'topright' | 'bottomleft' | 'bottomright' = 'center';\n @Input() appendTo?: string;\n\n /**\n * Render variant.\n * - `'comptoir'` (default) — applies the `.es-dialog` Comptoir skin,\n * custom header (icon + title + subtitle + close), and dynamic-action\n * footer.\n * - `'primeng'` — bare `p-dialog` with its native header (just the\n * `[header]` text + PrimeNG's default close). Use for legacy screens\n * or to dodge the Comptoir skin one-off.\n */\n @Input() variant: 'primeng' | 'comptoir' = 'comptoir';\n\n /* ── Dynamic actions (new) ──────────────────────────────── */\n\n /** Footer actions, rendered left → right. When set (non-empty),\n * takes precedence over `defaultActions`. */\n @Input() actions?: EfDialogAction[];\n\n /* ── Default actions (existing — preserved verbatim) ───── */\n\n /**\n * Render a standard cancel + save action footer. Backward-compat\n * shortcut — for richer footers prefer `[actions]`. When false (and\n * no `[actions]` provided), the footer is omitted entirely.\n */\n @Input({ transform: booleanAttribute }) defaultActions = true;\n @Input() saveLabelKey = 'common_save';\n @Input() cancelLabelKey = 'common_cancel';\n @Input() saveLabel?: string;\n @Input() cancelLabel?: string;\n @Input() saveIcon = 'pi pi-check';\n @Input() cancelIcon?: string;\n @Input({ transform: booleanAttribute }) saveDisabled = false;\n @Input() saveStyleClass?: string;\n @Input() cancelStyleClass?: string;\n @Input() saveSeverity: 'primary' | 'tenant' | 'ghost' | 'danger' = 'primary';\n @Input() cancelSeverity: 'primary' | 'tenant' | 'ghost' | 'danger' = 'ghost';\n\n /* ── Outputs ────────────────────────────────────────────── */\n\n @Output() visibleChange = new EventEmitter<boolean>();\n @Output() showEvent = new EventEmitter<void>();\n @Output() hideEvent = new EventEmitter<void>();\n @Output() saveAction = new EventEmitter<void>();\n @Output() cancelAction = new EventEmitter<void>();\n /** Emits for every action in the dynamic `[actions]` footer. The\n * payload includes the action object and its index. */\n @Output() actionClick = new EventEmitter<{ action: EfDialogAction; index: number }>();\n\n /** ViewChild ref to the default-action footer template — used in the\n * `'primeng'` variant via [footerTemplate] input. */\n @ViewChild('defaultFooter', { static: true }) defaultFooterTpl?: TemplateRef<void>;\n\n /* ── Derived ────────────────────────────────────────────── */\n\n /** Severity → default header icon. Override per-instance with `[icon]`. */\n private static readonly SEV_ICONS: Record<EfDialogSeverity, string> = {\n danger: 'pi pi-trash',\n warn: 'pi pi-exclamation-triangle',\n info: 'pi pi-info-circle',\n success: 'pi pi-check',\n tenant: 'pi pi-bookmark-fill',\n default: '',\n };\n\n get effectiveStyleClass(): string {\n const parts: string[] = [];\n if (this.variant === 'comptoir') {\n parts.push('es-dialog', `es-dialog--${this.size}`);\n if (this.severity !== 'default') parts.push(`es-dialog--${this.severity}`);\n }\n if (this.styleClass) parts.push(this.styleClass);\n return parts.join(' ');\n }\n\n get effectiveTitle(): string {\n if (this.headerKey) return this.translate.instant(this.headerKey);\n return this.header ?? '';\n }\n\n get effectiveSubtitle(): string {\n if (this.subtitleKey) return this.translate.instant(this.subtitleKey);\n return this.subtitle ?? '';\n }\n\n get effectiveIcon(): string | null {\n if (this.icon) return this.icon;\n return EfDialogComponent.SEV_ICONS[this.severity] || null;\n }\n\n /** True when the dynamic `[actions]` path should render the footer. */\n get useDynamicActions(): boolean {\n return Array.isArray(this.actions) && this.actions.length > 0;\n }\n\n /** Whether any kind of footer should render at all. */\n get hasFooter(): boolean {\n return this.useDynamicActions || this.defaultActions;\n }\n\n actionLabel(a: EfDialogAction): string {\n if (a.labelKey) return this.translate.instant(a.labelKey);\n return a.label ?? '';\n }\n\n actionClass(a: EfDialogAction): string {\n const sev = a.severity ?? 'ghost';\n const variantClass = (\n sev === 'primary' ? 'btn-primary'\n : sev === 'tenant' ? 'btn-tenant'\n : sev === 'danger' ? 'btn-danger'\n : 'btn-ghost'\n );\n return `btn ${variantClass} btn-sm${a.loading ? ' is-loading' : ''}${a.styleClass ? ' ' + a.styleClass : ''}`;\n }\n\n /* ── Handlers ───────────────────────────────────────────── */\n\n handleActionClick(a: EfDialogAction, index: number): void {\n if (a.disabled || a.loading) return;\n this.actionClick.emit({ action: a, index });\n\n let result: unknown;\n try {\n result = a.command?.();\n } catch {\n // Consumer error handling lives in their `command`. Swallow here\n // so a throw doesn't leave the dialog wedged open.\n }\n\n const isThenable = result && typeof (result as Promise<unknown>).then === 'function';\n if (isThenable) {\n a.loading = true;\n (result as Promise<unknown>).finally(() => {\n a.loading = false;\n if (a.dismiss !== false) this.handleVisibleChange(false);\n });\n } else if (a.dismiss !== false) {\n this.handleVisibleChange(false);\n }\n }\n\n handleVisibleChange(value: boolean): void {\n this.visible = value;\n this.visibleChange.emit(value);\n }\n\n handleShow(): void { this.showEvent.emit(); }\n handleHide(): void { this.hideEvent.emit(); }\n\n /** Default cancel — emits and closes. */\n onDefaultCancel(): void {\n this.cancelAction.emit();\n this.handleVisibleChange(false);\n }\n\n /** Default save — emits only (consumer closes after success). */\n onDefaultSave(): void {\n if (this.saveDisabled) return;\n this.saveAction.emit();\n }\n}\n","<p-dialog\n [visible]=\"visible\"\n (visibleChange)=\"handleVisibleChange($event)\"\n [modal]=\"modal\"\n [draggable]=\"draggable\"\n [resizable]=\"resizable\"\n [dismissableMask]=\"dismissableMask\"\n [closeOnEscape]=\"closeOnEscape\"\n [style]=\"style\"\n [styleClass]=\"effectiveStyleClass\"\n [position]=\"position\"\n [appendTo]=\"appendTo\"\n [header]=\"variant === 'primeng' ? effectiveTitle : null\"\n [closable]=\"variant === 'primeng' ? closable : false\"\n [footerTemplate]=\"variant === 'primeng' && !useDynamicActions && defaultActions ? defaultFooterTpl : null\"\n (onShow)=\"handleShow()\"\n (onHide)=\"handleHide()\"\n>\n <!-- ─────────── COMPTOIR HEADER (content-child #header) ───────────\n Replaces PrimeNG's default header strip with our icon + title\n + subtitle + close X structure. Skipped in 'primeng' variant\n (which uses the [header] string input + native close). -->\n @if (variant === 'comptoir') {\n <ng-template #header>\n @if (effectiveIcon) {\n <span class=\"es-dialog__icon\" aria-hidden=\"true\">\n <i [class]=\"effectiveIcon\"></i>\n </span>\n }\n <div class=\"es-dialog__title-block\">\n <div class=\"es-dialog__title\">{{ effectiveTitle }}</div>\n @if (effectiveSubtitle) {\n <div class=\"es-dialog__sub\">{{ effectiveSubtitle }}</div>\n }\n </div>\n @if (closable) {\n <button\n type=\"button\"\n class=\"es-dialog__close\"\n [attr.aria-label]=\"'common_close' | translate\"\n (click)=\"handleVisibleChange(false)\"\n >\n <i class=\"pi pi-times\"></i>\n </button>\n }\n </ng-template>\n }\n\n <!-- Body — projected from <ef-dialog>…</ef-dialog> -->\n <ng-content />\n\n <!-- ─────────── COMPTOIR FOOTER (content-child #footer) ───────────\n Dynamic [actions] path takes precedence; falls back to the\n backward-compat save+cancel pair when defaultActions is on. -->\n @if (variant === 'comptoir' && hasFooter) {\n <ng-template #footer>\n @if (useDynamicActions) {\n @for (a of actions; track $index) {\n <button\n type=\"button\"\n [class]=\"actionClass(a)\"\n [disabled]=\"a.disabled || a.loading\"\n (click)=\"handleActionClick(a, $index)\"\n >\n @if (a.icon) {\n <i [class]=\"a.icon\"></i>\n }\n {{ actionLabel(a) }}\n </button>\n }\n } @else {\n <ef-button\n variant=\"comptoir\"\n [severity]=\"cancelSeverity\"\n [labelKey]=\"cancelLabelKey\"\n [label]=\"cancelLabel\"\n [icon]=\"cancelIcon\"\n [styleClass]=\"cancelStyleClass\"\n (clickEvent)=\"onDefaultCancel()\"\n />\n <ef-button\n variant=\"comptoir\"\n [severity]=\"saveSeverity\"\n [labelKey]=\"saveLabelKey\"\n [label]=\"saveLabel\"\n [icon]=\"saveIcon\"\n [styleClass]=\"saveStyleClass\"\n [disabled]=\"saveDisabled\"\n (clickEvent)=\"onDefaultSave()\"\n />\n }\n </ng-template>\n }\n</p-dialog>\n\n<!-- Default-action footer template for the 'primeng' variant (legacy path).\n Declared outside <p-dialog> because the comptoir branch above already\n provides its own content-child footer; this template is only consumed\n when variant === 'primeng' via [footerTemplate] input binding. -->\n<ng-template #defaultFooter>\n <ef-button\n variant=\"primeng\"\n [severity]=\"cancelSeverity\"\n [labelKey]=\"cancelLabelKey\"\n [label]=\"cancelLabel\"\n [icon]=\"cancelIcon\"\n [styleClass]=\"cancelStyleClass\"\n (clickEvent)=\"onDefaultCancel()\"\n />\n <ef-button\n variant=\"primeng\"\n [severity]=\"saveSeverity\"\n [labelKey]=\"saveLabelKey\"\n [label]=\"saveLabel\"\n [icon]=\"saveIcon\"\n [styleClass]=\"saveStyleClass\"\n [disabled]=\"saveDisabled\"\n (clickEvent)=\"onDefaultSave()\"\n />\n</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { EfCardComponent } from '../../layout/ef-card/ef-card.component';\nimport { EfDialogComponent } from '../../layout/ef-dialog/ef-dialog.component';\nimport { EfButtonComponent } from '../../layout/ef-button/ef-button.component';\nimport { EfChangeHistoryEntry } from './ef-change-history.types';\n\ninterface OpMeta {\n cls: string;\n}\n\n/** Built-in color class per standardized operation code — keeps the box\n * self-contained (no reference-data round-trip needed for the visual).\n * Dots are plain solid circles; only the color varies. */\nconst OP_META: Record<string, OpMeta> = {\n created: { cls: 'op-created' },\n updated: { cls: 'op-updated' },\n status_changed: { cls: 'op-status' },\n deleted: { cls: 'op-deleted' },\n note: { cls: 'op-note' },\n};\nconst DEFAULT_META: OpMeta = { cls: 'op-default' };\n\n/**\n * Standardized change-history box. Drop it on any detail screen and feed it the\n * record's audit entries (from `GET /api/audit/{entityType}/{id}` via the NSwag\n * `AuditClient`). Renders a vertical timeline inside an {@link EfCardComponent},\n * resolving operation labels through `audit_op_*` i18n keys and field labels\n * through `audit_field_*` (falling back to the raw field key when unmapped).\n *\n * ```html\n * <ef-change-history [entries]=\"auditEntries()\" />\n * ```\n */\n@Component({\n selector: 'ef-change-history',\n standalone: true,\n imports: [\n CommonModule,\n TranslateModule,\n EfCardComponent,\n EfDialogComponent,\n EfButtonComponent,\n ],\n templateUrl: './ef-change-history.component.html',\n styleUrl: './ef-change-history.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfChangeHistoryComponent {\n private readonly translate = inject(TranslateService);\n\n readonly entries = input<ReadonlyArray<EfChangeHistoryEntry>>([]);\n readonly titleKey = input<string>('audit_history_title');\n readonly emptyKey = input<string>('audit_empty');\n /** Cap the total rows considered (newest first). 0 = no cap. */\n readonly limit = input<number>(0);\n /** How many recent entries to show inline in the card. 0 = all. The rest\n * are reachable via the \"view details\" dialog. */\n readonly previewLimit = input<number>(3);\n /** Render inside a collapsible card. */\n readonly collapsible = input(true);\n /** Initial collapsed state — expanded by default. */\n readonly startCollapsed = input(false);\n\n /** \"Show more\" dialog visibility. */\n readonly dialogVisible = signal(false);\n\n /** First `previewLimit` rows shown inline in the card. */\n readonly previewRows = computed(() => {\n const all = this.rows();\n const n = this.previewLimit();\n return n > 0 ? all.slice(0, n) : all;\n });\n\n /** True when the full list has more entries than the inline preview. */\n readonly hasMore = computed(() => this.rows().length > this.previewRows().length);\n\n openDialog(event?: Event): void {\n event?.stopPropagation();\n this.dialogVisible.set(true);\n }\n\n readonly rows = computed(() => {\n const list = this.entries() ?? [];\n const limited = this.limit() > 0 ? list.slice(0, this.limit()) : list;\n return limited.map((entry) => {\n const op = entry.operation ?? '';\n return {\n entry,\n meta: OP_META[op] ?? DEFAULT_META,\n operationLabel: this.resolveLabel(`audit_op_${op}`, op),\n };\n });\n });\n\n /** Resolve a field key to its label. Adding an `audit_field_<field>` key is\n * OPTIONAL — when it's missing the raw field name is humanized\n * (`clientCode` → \"Client code\"), so new entities/fields work with zero\n * i18n maintenance. Add a key only for a properly localized (fr/ar) term. */\n fieldLabel(field: string | undefined): string {\n if (!field) return '';\n // Dotted paths (address.city, contacts.added) → underscore i18n key,\n // since ngx-translate treats dots as nested lookups.\n const key = `audit_field_${field.replace(/\\./g, '_')}`;\n return this.resolveLabel(key, field);\n }\n\n /** Returns the translation when present, otherwise a humanized fallback of\n * the source token (ngx-translate echoes the key on a miss). */\n private resolveLabel(key: string, source: string): string {\n const translated = this.translate.instant(key);\n return translated === key ? this.humanize(source) : translated;\n }\n\n /** `clientCode` / `status_changed` → \"Client code\" / \"Status changed\". */\n private humanize(token: string): string {\n const words = token\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[._-]+/g, ' ')\n .trim()\n .toLowerCase();\n return words ? words.charAt(0).toUpperCase() + words.slice(1) : '';\n }\n\n /** Locale-stable dd/MM/yyyy HH:mm — avoids depending on Angular locale data\n * registration (the app's default locale is fr-MA). */\n formatWhen(value: string | Date | null | undefined): string {\n if (!value) return '';\n const d = typeof value === 'string' ? new Date(value) : value;\n if (!d || isNaN(d.getTime())) return '';\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${pad(d.getDate())}/${pad(d.getMonth() + 1)}/${d.getFullYear()} ${pad(d.getHours())}:${pad(d.getMinutes())}`;\n }\n}\n","<ef-card\n [titleKey]=\"titleKey()\"\n [collapsible]=\"collapsible()\"\n [collapsed]=\"startCollapsed()\"\n>\n <ng-container head-extra>\n @if (hasMore()) {\n <ef-button\n variant=\"comptoir\"\n severity=\"ghost\"\n size=\"small\"\n icon=\"pi pi-window-maximize\"\n tooltipKey=\"audit_view_all\"\n (clickEvent)=\"openDialog($event)\"\n />\n }\n </ng-container>\n\n <ng-container\n *ngTemplateOutlet=\"timeline; context: { $implicit: previewRows(), compact: true }\"\n ></ng-container>\n\n @if (hasMore()) {\n <button type=\"button\" class=\"ch-more\" (click)=\"openDialog()\">\n {{ 'audit_view_all' | translate }} ({{ rows().length }})\n </button>\n }\n</ef-card>\n\n<!-- \"Show more\" dialog — full timeline, roomy + scrollable -->\n<ef-dialog\n [visible]=\"dialogVisible()\"\n (visibleChange)=\"dialogVisible.set($event)\"\n [headerKey]=\"titleKey()\"\n [defaultActions]=\"false\"\n size=\"lg\"\n [modal]=\"true\"\n position=\"center\"\n>\n <ng-container\n *ngTemplateOutlet=\"timeline; context: { $implicit: rows(), compact: false }\"\n ></ng-container>\n</ef-dialog>\n\n<ng-template #timeline let-items let-compact=\"compact\">\n @if (items.length === 0) {\n <p class=\"text-mute small\">{{ emptyKey() | translate }}</p>\n } @else {\n <div class=\"timeline\" [class.timeline--compact]=\"compact\">\n @for (row of items; track $index) {\n <div class=\"item\">\n <span class=\"dot\" [class]=\"row.meta.cls\" aria-hidden=\"true\"></span>\n <div class=\"body\">\n <div class=\"label\">{{ row.operationLabel }}</div>\n <div class=\"meta\">\n @if (row.entry.userName) {\n <span class=\"strong\">{{ row.entry.userName }}</span> ·\n }\n {{ formatWhen(row.entry.occurredAt) }}\n </div>\n\n @if (row.entry.operation === 'status_changed' && (row.entry.fromStatus || row.entry.toStatus)) {\n <div class=\"ch-status small\">\n <span class=\"text-mute\">{{ row.entry.fromStatus || '—' }}</span>\n <i class=\"pi pi-arrow-right\"></i>\n <span class=\"strong\">{{ row.entry.toStatus || '—' }}</span>\n </div>\n }\n\n @if (row.entry.changes?.length) {\n <ul class=\"ch-changes small\">\n @for (c of row.entry.changes; track c.field) {\n <li>\n <span class=\"ch-field\">{{ fieldLabel(c.field) }}</span>\n <span class=\"text-mute\">{{ c.oldValue || '—' }}</span>\n <i class=\"pi pi-arrow-right\"></i>\n <span class=\"strong\">{{ c.newValue || '—' }}</span>\n </li>\n }\n </ul>\n }\n\n @if (row.entry.note) {\n <div class=\"ch-note small\">{{ row.entry.note }}</div>\n }\n </div>\n </div>\n }\n </div>\n }\n</ng-template>\n","import {\n Component,\n ChangeDetectionStrategy,\n booleanAttribute,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport {\n HighlightSegment,\n ProductTypeaheadRow,\n ProductTypeaheadSelection,\n} from './ef-product-typeahead.component.types';\n\n/**\n * Keyboard-navigable product search. Filters products by display name,\n * highlights the match, exposes per-product variant chips, and emits the\n * chosen product + active variant + unit price. Pure input-driven — no API.\n *\n * @example\n * <ef-product-typeahead\n * [products]=\"products()\"\n * productKeyField=\"id\"\n * placeholderKey=\"label.search_product\"\n * (productSelect)=\"onPicked($event)\" />\n */\n@Component({\n selector: 'ef-product-typeahead',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, TranslateModule],\n templateUrl: './ef-product-typeahead.component.html',\n styleUrl: './ef-product-typeahead.component.scss',\n})\nexport class EfProductTypeaheadComponent {\n products = input.required<Record<string, unknown>[]>();\n productKeyField = input<string>('id');\n placeholderKey = input<string>('');\n disabled = input(false, { transform: booleanAttribute });\n currency = input<string>('MAD');\n locale = input<string>('fr-FR');\n /**\n * How variants are presented.\n * - `true` (default): compact — one row per product with inline variant\n * chips (e.g. `30ml` / `50ml`); clicking a chip switches the active\n * variant + price.\n * - `false`: V1 expanded — one row per active variant, with the variant\n * title composed into the label (`Name - 30ml`) and its own price.\n *\n * Display-only: the emitted `ProductTypeaheadSelection` (product + chosen\n * variant + unit price) is identical either way.\n */\n showVariants = input(true, { transform: booleanAttribute });\n\n productSelect = output<ProductTypeaheadSelection>();\n\n query = signal('');\n open = signal(false);\n highlightedIndex = signal(0);\n /** Map of product key -> chosen variant index (defaults to 0). */\n activeVariant = signal<Record<string, number>>({});\n\n private static norm(value: string): string {\n return value\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '');\n }\n\n rows = computed<ProductTypeaheadRow[]>(() => {\n const q = this.query().trim();\n if (q.length < 2) return [];\n const keyField = this.productKeyField();\n const nq = EfProductTypeaheadComponent.norm(q);\n const expand = !this.showVariants();\n\n return this.products()\n .flatMap((product) => {\n const baseLabel = (product['displayName'] ||\n product['name'] ||\n '') as string;\n const key = String(product[keyField]);\n const variants = (\n (product['variants'] as Record<string, unknown>[] | undefined) ?? []\n ).filter((v) => v['isActive'] !== false);\n\n // V1 expanded mode: one row per active variant, with the variant\n // title composed into the label and resolved as the row's sole\n // variant (so price + emitted payload follow it). A variant-less\n // product still yields one base row.\n if (expand && variants.length > 0) {\n return variants.map((variant, vi) => {\n const label = `${baseLabel} - ${variant['title']}`;\n const variantId = variant['variantId'];\n return {\n key: variantId != null ? `${key}:${variantId}` : `${key}:${vi}`,\n product,\n label,\n variants: [variant],\n segments: this.buildSegments(label, q),\n };\n });\n }\n\n // Compact mode (variant chips), or a product with no variants.\n return [\n {\n key,\n product,\n label: baseLabel,\n variants,\n segments: this.buildSegments(baseLabel, q),\n },\n ];\n })\n .filter((row) => EfProductTypeaheadComponent.norm(row.label).includes(nq));\n });\n\n buildSegments(label: string, query: string): HighlightSegment[] {\n const nLabel = EfProductTypeaheadComponent.norm(label);\n const nq = EfProductTypeaheadComponent.norm(query.trim());\n const at = nLabel.indexOf(nq);\n if (nq.length === 0 || at === -1) return [{ text: label, mark: false }];\n return [\n { text: label.slice(0, at), mark: false },\n { text: label.slice(at, at + nq.length), mark: true },\n { text: label.slice(at + nq.length), mark: false },\n ].filter((s) => s.text.length > 0);\n }\n\n onInput(value: string): void {\n this.query.set(value);\n this.open.set(true);\n this.highlightedIndex.set(0);\n }\n\n moveHighlight(delta: number): void {\n const max = this.rows().length - 1;\n if (max < 0) return;\n const next = Math.min(max, Math.max(0, this.highlightedIndex() + delta));\n this.highlightedIndex.set(next);\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.open.set(true);\n this.moveHighlight(1);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.moveHighlight(-1);\n } else if (event.key === 'Enter') {\n event.preventDefault();\n this.selectHighlighted();\n } else if (event.key === 'Escape') {\n this.open.set(false);\n }\n }\n\n /** Active variant index for a row (defaults to 0). */\n variantIndexOf(row: ProductTypeaheadRow): number {\n return this.activeVariant()[row.key] ?? 0;\n }\n\n variantOf(row: ProductTypeaheadRow): Record<string, unknown> | null {\n return row.variants[this.variantIndexOf(row)] ?? null;\n }\n\n priceOf(row: ProductTypeaheadRow): number {\n const variant = this.variantOf(row);\n return (variant?.['price'] ??\n row.product['unitPrice'] ??\n row.product['salePrice'] ??\n 0) as number;\n }\n\n setActiveVariant(row: ProductTypeaheadRow, index: number): void {\n this.activeVariant.update((m) => ({ ...m, [row.key]: index }));\n }\n\n selectRow(row: ProductTypeaheadRow): void {\n this.productSelect.emit({\n product: row.product,\n variant: this.variantOf(row),\n unitPrice: this.priceOf(row),\n });\n // Keep the picked product visible in the field (the bar fills; the\n // consumer adds the line explicitly). Just close the results menu.\n this.query.set(row.label);\n this.open.set(false);\n }\n\n selectHighlighted(): void {\n const row = this.rows()[this.highlightedIndex()];\n if (row) this.selectRow(row);\n }\n\n /** Clear the field after the consumer has consumed the selection. */\n reset(): void {\n this.query.set('');\n this.open.set(false);\n this.highlightedIndex.set(0);\n this.activeVariant.set({});\n }\n}\n","<div class=\"qa-combo\">\n <svg class=\"ic\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"m20 20-3-3\" />\n </svg>\n <input\n class=\"input\"\n type=\"text\"\n autocomplete=\"off\"\n role=\"combobox\"\n aria-controls=\"qa-listbox\"\n [attr.aria-expanded]=\"open() && rows().length > 0\"\n [disabled]=\"disabled()\"\n [placeholder]=\"placeholderKey() ? (placeholderKey() | translate) : ''\"\n [ngModel]=\"query()\"\n (ngModelChange)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (focus)=\"open.set(true)\"\n (blur)=\"open.set(false)\" />\n\n @if (query() && !disabled()) {\n <button\n type=\"button\"\n class=\"qa-clear\"\n [attr.aria-label]=\"'action.clear' | translate\"\n (mousedown)=\"$event.preventDefault(); reset()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n }\n\n @if (open() && rows().length > 0) {\n <div id=\"qa-listbox\" class=\"qa-menu\" role=\"listbox\">\n <div class=\"grp\">{{ rows().length }} · « {{ query() }} »</div>\n @for (row of rows(); track row.key; let i = $index) {\n <div\n class=\"qa-opt\"\n role=\"option\"\n [attr.aria-selected]=\"i === highlightedIndex()\"\n [class.hl]=\"i === highlightedIndex()\"\n (mouseenter)=\"highlightedIndex.set(i)\"\n (mousedown)=\"$event.preventDefault(); selectRow(row)\">\n <span class=\"nm\">\n @for (seg of row.segments; track $index) {\n @if (seg.mark) { <mark>{{ seg.text }}</mark> } @else { {{ seg.text }} }\n }\n </span>\n <span class=\"var\">\n @if (showVariants()) {\n @for (variant of row.variants; track variant['variantId']; let vi = $index) {\n <span\n class=\"qa-chip\"\n [class.on]=\"vi === variantIndexOf(row)\"\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation(); setActiveVariant(row, vi)\">\n {{ variant['title'] }}\n </span>\n }\n }\n </span>\n <span class=\"px\">{{ priceOf(row) | number: '1.2-2' : locale() }}</span>\n </div>\n }\n <div class=\"qa-foot\">\n <span class=\"qa-hint\">\n <span class=\"kbd\">↑</span><span class=\"kbd\">↓</span>\n {{ 'order_builder.qa_navigate' | translate }} ·\n <span class=\"kbd\">↵</span> {{ 'order_builder.qa_add' | translate }}\n </span>\n </div>\n </div>\n }\n</div>\n","import {\n Component,\n computed,\n effect,\n input,\n model,\n OnInit,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport {\n DocumentConfig,\n OrderEntity,\n OrderLineItem,\n OrderLineItemHelper,\n OrderEntityHelper,\n OrderChangeInfo,\n ValidationResult,\n OrderProductsSummary,\n OrderSummaryItem,\n} from './ef-order-builder.component.types';\nimport { ProductCountGroupLabel } from '../ef-order-summary/ef-order-summary.component';\nimport { EfSelectComponent } from '../../forms/ef-select/ef-select.component';\nimport { EfDatepickerAdvancedComponent } from '../../forms/ef-datepicker-advanced/ef-datepicker-advanced.component';\nimport { EfInputNumberComponent } from '../../forms/ef-inputnumber/ef-inputnumber.component';\nimport { EfQuantityStepperComponent } from '../../forms/ef-quantity-stepper/ef-quantity-stepper.component';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { EfButtonComponent } from '../../layout/ef-button/ef-button.component';\nimport { EfCardComponent } from '../../layout/ef-card/ef-card.component';\nimport { EfChangeHistoryComponent } from '../../data/ef-change-history/ef-change-history.component';\nimport { EfChangeHistoryEntry } from '../../data/ef-change-history/ef-change-history.types';\nimport { EfProductTypeaheadComponent } from '../ef-product-typeahead/ef-product-typeahead.component';\nimport { ProductTypeaheadSelection } from '../ef-product-typeahead/ef-product-typeahead.component.types';\nimport { UuidUtils } from '@elasticias/utils';\n\n/**\n * Reusable order builder component for orders, invoices, and quotes\n * Manages complete order entity with automatic change tracking\n *\n * @example\n * <ef-order-builder\n * [(order)]=\"orderEntity\"\n * [config]=\"documentConfig\"\n * [products]=\"products\"\n * [customers]=\"customers\"\n * (openCatalogue)=\"handleCatalogueOpen()\"\n * (orderChanged)=\"handleOrderChange($event)\"\n * />\n */\n/** Numeric line columns that support inline click-to-edit. */\ntype EditableLineField = 'price' | 'qty' | 'discount' | 'tva';\n\n@Component({\n selector: 'ef-order-builder',\n standalone: true,\n templateUrl: 'ef-order-builder.component.html',\n styleUrl: 'ef-order-builder.component.scss',\n imports: [\n CommonModule,\n FormsModule,\n TranslateModule,\n EfSelectComponent,\n EfDatepickerAdvancedComponent,\n EfInputNumberComponent,\n EfQuantityStepperComponent,\n EfLabelComponent,\n EfButtonComponent,\n EfCardComponent,\n EfChangeHistoryComponent,\n EfProductTypeaheadComponent,\n ],\n})\nexport class EfOrderBuilderComponent implements OnInit {\n rowTrackBy = (_: number, item: OrderLineItem) => item.id;\n\n config = input<DocumentConfig>({\n documentType: 'order',\n headerLabel: 'Commande',\n dateLabel: 'Date de commande',\n customerLabel: 'Client',\n enableTax: false,\n enableDiscount: true,\n showCatalogue: false,\n allowInlineEdit: true,\n currencyCode: 'MAD',\n locale: 'fr-FR',\n });\n\n order = model.required<OrderEntity>();\n products = input.required<Record<string, unknown>[]>();\n customers = input.required<Record<string, unknown>[]>();\n readonly = input<boolean>(false);\n countGroupLabels = input<ProductCountGroupLabel[]>([]);\n /** Field name used to identify products (must match catalogue's trackByField) */\n productKeyField = input<string>('id');\n backendErrors = input<{ [key: string]: string[] }>({});\n\n /** Optional change-history entries; when non-empty the Historique rail card renders. */\n auditEntries = input<EfChangeHistoryEntry[]>([]);\n\n openCatalogue = output<void>();\n orderChanged = output<OrderChangeInfo>();\n orderValidated = output<ValidationResult>();\n productsAdded = output<OrderLineItem[]>();\n\n private originalOrder = signal<OrderEntity | null>(null);\n private initialized = signal(false);\n\n quickAddSelection = signal<ProductTypeaheadSelection | null>(null);\n quickAddPrice = signal<number>(0);\n quickAddQuantity = signal<number>(1);\n\n quickAddDisabled = computed(\n () =>\n this.quickAddSelection() === null || (this.quickAddQuantity() ?? 0) <= 0,\n );\n\n orderLines = computed(() => this.order().orderLines || []);\n\n grossTotal = computed(() => {\n return this.orderLines().reduce((total, item) => {\n return total + (item.productUnitPrice || 0) * (item.quantity || 0);\n }, 0);\n });\n\n discountTotal = computed(() => {\n return this.orderLines().reduce((total, item) => {\n const itemTotal = (item.productUnitPrice || 0) * (item.quantity || 0);\n const discount = item.discount || 0;\n return total + (itemTotal * discount) / 100;\n }, 0);\n });\n\n tvaTotal = computed(() => {\n return this.orderLines().reduce((total, item) => {\n return total + (item.taxAmount || 0);\n }, 0);\n });\n\n finalTotal = computed(() => {\n return this.grossTotal() - this.discountTotal() + this.tvaTotal();\n });\n\n currency = computed(() => this.config().currencyCode || 'MAD');\n locale = computed(() => this.config().locale || 'fr-FR');\n hasItems = computed(() => this.orderLines().length > 0);\n\n productsSummary = computed<OrderProductsSummary>(() => {\n const lines = this.orderLines();\n const labels = this.countGroupLabels();\n const countMap = new Map<string, number>();\n\n lines.forEach((line) => {\n const product = line.product as { countGroup?: string };\n const countGroup = line.countGroup || product?.countGroup;\n\n if (countGroup) {\n const currentCount = countMap.get(countGroup) || 0;\n countMap.set(countGroup, currentCount + (line.quantity || 0));\n }\n });\n\n const items: OrderSummaryItem[] = [];\n\n countMap.forEach((count, code) => {\n const labelItem = labels.find(\n (l) => l.code.toUpperCase() === code.toUpperCase(),\n );\n items.push({\n code,\n label: labelItem?.label || code,\n count,\n column: labelItem?.column ?? 1,\n });\n });\n\n items.sort((a, b) => {\n const labelA = labels.find((l) => l.code === a.code);\n const labelB = labels.find((l) => l.code === b.code);\n const orderA = labelA?.sortOrder ?? 999;\n const orderB = labelB?.sortOrder ?? 999;\n return orderA - orderB;\n });\n\n const totalCount = items.reduce((sum, item) => sum + item.count, 0);\n\n return { items, totalCount };\n });\n\n validationResult = computed(() => {\n return OrderEntityHelper.validate(this.order());\n });\n\n combinedErrors = computed(() => {\n const clientErrors = this.validationResult().errors;\n const serverErrors = this.backendErrors();\n return { ...clientErrors, ...serverErrors };\n });\n\n hasErrors = computed(() => Object.keys(this.combinedErrors()).length > 0);\n\n isValid = computed(\n () =>\n this.validationResult().isValid &&\n Object.keys(this.backendErrors()).length === 0,\n );\n\n changeInfo = computed<OrderChangeInfo | null>(() => {\n const original = this.originalOrder();\n if (!original || !this.initialized()) return null;\n\n return OrderEntityHelper.detectChanges(original, this.order());\n });\n\n hasChanges = computed(() => this.changeInfo()?.hasChanges ?? false);\n\n focusMode = model(true);\n railOpen = signal(false);\n\n /**\n * Inline cell editing — lines render their numeric values as read-only text\n * until the user clicks a value, which swaps just that cell to an input\n * (V1 behaviour). One cell is editable at a time; blur / Enter / Escape /\n * Tab commits and returns the cell to display.\n */\n editingCell = signal<{\n id: OrderLineItem['id'];\n field: EditableLineField;\n } | null>(null);\n\n /** Number of table columns, used for the empty-state colspan. */\n colCount = computed(\n () =>\n 5 +\n (this.config().enableDiscount ? 1 : 0) +\n (this.config().enableTax ? 1 : 0),\n );\n\n isEditingCell(item: OrderLineItem, field: EditableLineField): boolean {\n const cell = this.editingCell();\n return cell !== null && cell.id === item.id && cell.field === field;\n }\n\n startEditCell(item: OrderLineItem, field: EditableLineField): void {\n if (this.readonly()) return;\n this.editingCell.set({ id: item.id, field });\n }\n\n stopEditCell(): void {\n this.editingCell.set(null);\n }\n\n onEditCellKeydown(event: KeyboardEvent): void {\n if (\n event.key === 'Enter' ||\n event.key === 'Escape' ||\n event.key === 'Tab'\n ) {\n this.stopEditCell();\n }\n }\n\n toggleFocus(): void {\n this.focusMode.update((v) => !v);\n }\n toggleRail(open?: boolean): void {\n this.railOpen.set(open ?? !this.railOpen());\n }\n\n hasAudit = computed(() => this.auditEntries().length > 0);\n\n /** Récap items grouped into columns (column index from reference data). */\n recapColumns = computed<OrderSummaryItem[][]>(() => {\n const items = this.productsSummary().items;\n const byCol = new Map<number, OrderSummaryItem[]>();\n for (const it of items) {\n const col = it.column ?? 1;\n if (!byCol.has(col)) byCol.set(col, []);\n byCol.get(col)!.push(it);\n }\n return [...byCol.keys()].sort((a, b) => a - b).map((k) => byCol.get(k)!);\n });\n\n constructor() {\n effect(() => {\n if (!this.initialized()) return;\n\n const updatedOrder = OrderEntityHelper.calculateTotals(this.order());\n const summary = this.productsSummary();\n\n if (\n updatedOrder.grossTotal !== this.order().grossTotal ||\n updatedOrder.discountTotal !== this.order().discountTotal ||\n updatedOrder.taxTotal !== this.order().taxTotal ||\n updatedOrder.finalTotal !== this.order().finalTotal ||\n JSON.stringify(updatedOrder.productsSummary) !== JSON.stringify(summary)\n ) {\n this.order.set({ ...updatedOrder, productsSummary: summary });\n }\n });\n\n effect(() => {\n const info = this.changeInfo();\n if (info && info.hasChanges) {\n this.orderChanged.emit(info);\n }\n });\n\n effect(() => {\n if (!this.initialized()) return;\n\n const validation = this.validationResult();\n this.orderValidated.emit(validation);\n });\n }\n\n ngOnInit(): void {\n this.originalOrder.set(OrderEntityHelper.clone(this.order()));\n this.initialized.set(true);\n }\n\n removeOrderLine(id: string | number | undefined): void {\n if (this.readonly() || id === undefined) return;\n\n const updatedItems = this.orderLines().filter((item) => item.id !== id);\n this.updateOrderLines(updatedItems);\n }\n\n onFieldChange(item: OrderLineItem): void {\n const updatedItem = OrderLineItemHelper.updateCalculations(item);\n Object.assign(item, updatedItem);\n this.updateOrderLines([...this.orderLines()]);\n }\n\n calculateSubtotal(item: OrderLineItem): number {\n return OrderLineItemHelper.calculateSubtotal(item);\n }\n\n handleOpenCatalogue(): void {\n if (this.readonly()) return;\n this.openCatalogue.emit();\n }\n\n private readonly typeahead = viewChild(EfProductTypeaheadComponent);\n\n /**\n * Fill the quick-add bar from a typeahead pick. Does NOT add the line —\n * the user reviews price/quantity then clicks \"Ajouter\" (addQuickProduct).\n */\n onTypeaheadSelect(selection: ProductTypeaheadSelection): void {\n if (this.readonly()) return;\n this.quickAddSelection.set(selection);\n this.quickAddPrice.set(selection.unitPrice);\n }\n\n addQuickProduct(): void {\n const selection = this.quickAddSelection();\n if (\n this.readonly() ||\n selection === null ||\n (this.quickAddQuantity() ?? 0) <= 0\n ) {\n return;\n }\n const variantId =\n (selection.variant?.['variantId'] as string | undefined) ?? undefined;\n const newItem = OrderLineItemHelper.createFromProduct(\n selection.product,\n this.quickAddQuantity(),\n this.productKeyField(),\n variantId,\n );\n const overridden = OrderLineItemHelper.updateCalculations({\n ...newItem,\n productUnitPrice: this.quickAddPrice(),\n });\n this.updateOrderLines([...this.orderLines(), overridden]);\n this.productsAdded.emit([overridden]);\n\n this.quickAddSelection.set(null);\n this.quickAddPrice.set(0);\n this.quickAddQuantity.set(1);\n this.typeahead()?.reset();\n }\n\n addProductsFromCatalogue(\n selectedProducts: Array<{\n product: Record<string, unknown>;\n quantity: number;\n variantId?: string;\n }>,\n ): void {\n if (this.readonly() || !selectedProducts || selectedProducts.length === 0) {\n return;\n }\n\n const currentItems = [...this.orderLines()];\n const addedItems: OrderLineItem[] = [];\n\n const keyField = this.productKeyField();\n\n selectedProducts.forEach(({ product, quantity, variantId }) => {\n const productKeyValue = product[keyField];\n // Match by both productId AND variantId to avoid merging different variants\n const existingIndex = currentItems.findIndex(\n (item) =>\n item.productId === productKeyValue &&\n item.variantId === (variantId ?? null),\n );\n\n if (existingIndex !== -1) {\n // The catalogue is seeded with current order lines via\n // `initialSelectedItems` and shows live steppers, so the emitted\n // selection represents the desired final quantity for each product\n // — replace rather than add, otherwise reopening the catalogue and\n // re-validating doubles every previously-selected line.\n const existing = currentItems[existingIndex];\n const updated = OrderLineItemHelper.updateCalculations({\n ...existing,\n quantity,\n });\n currentItems[existingIndex] = updated;\n } else {\n const newItem = OrderLineItemHelper.createFromProduct(\n product,\n quantity,\n keyField,\n variantId,\n );\n currentItems.push(newItem);\n addedItems.push(newItem);\n }\n });\n\n this.updateOrderLines(currentItems);\n\n if (addedItems.length > 0) {\n this.productsAdded.emit(addedItems);\n }\n }\n\n updateCustomer(customerId: string | null): void {\n if (this.readonly()) return;\n\n this.order.update((order) => ({\n ...order,\n customerId,\n customerName: this.getCustomerName(customerId),\n }));\n }\n\n updateOrderDate(date: Date): void {\n if (this.readonly()) return;\n\n this.order.update((order) => ({\n ...order,\n orderDate: date,\n }));\n }\n\n updateDeliveryDate(date: Date | null): void {\n if (this.readonly()) return;\n\n this.order.update((order) => ({\n ...order,\n deliveryDate: date,\n }));\n }\n\n updateNotes(notes: string): void {\n if (this.readonly()) return;\n\n this.order.update((order) => ({\n ...order,\n notes,\n }));\n }\n\n resetChanges(): void {\n const original = this.originalOrder();\n if (original) {\n this.order.set(OrderEntityHelper.clone(original));\n }\n }\n\n markAsSaved(): void {\n this.originalOrder.set(OrderEntityHelper.clone(this.order()));\n }\n\n validate(): ValidationResult {\n return this.validationResult();\n }\n\n private updateOrderLines(items: OrderLineItem[]): void {\n this.order.update((order) => ({\n ...order,\n orderLines: items,\n }));\n }\n\n private getCustomerName(customerId: string | null): string | undefined {\n if (!customerId) return undefined;\n\n const customer = this.customers().find(\n (c) => c['customerId'] === customerId,\n );\n return (customer?.['companyName'] || customer?.['name']) as\n | string\n | undefined;\n }\n\n getProduct(productId: unknown): Record<string, unknown> | undefined {\n const field = this.productKeyField();\n return this.products().find((p) => p[field] === productId);\n }\n\n getCustomer(customerId: string): Record<string, unknown> | undefined {\n return this.customers().find((c) => c['customerId'] === customerId);\n }\n\n initializeOrderLines(): void {\n const items = this.order().orderLines || [];\n\n const initializedItems = items.map((item: OrderLineItem) => {\n let product = item.product;\n\n if (item.productId && !item.product) {\n product = this.getProduct(item.productId);\n }\n\n if (product && !item.productDescription) {\n const variants = product['variants'] as\n | Array<Record<string, unknown>>\n | undefined;\n const variant =\n item.variantId && variants?.length\n ? variants.find((v) => v['variantId'] === item.variantId)\n : undefined;\n item.productDescription = OrderLineItemHelper.composeDescription(\n product,\n variant,\n );\n }\n\n return OrderLineItemHelper.updateCalculations({\n ...item,\n product,\n id: item.id || UuidUtils.randomUUID(),\n isEditing: item.isEditing ?? false,\n editingField: item.editingField ?? null,\n });\n });\n\n this.updateOrderLines(initializedItems);\n }\n\n getTotals() {\n return {\n grossTotal: this.grossTotal(),\n discountTotal: this.discountTotal(),\n tvaTotal: this.tvaTotal(),\n finalTotal: this.finalTotal(),\n };\n }\n\n exportOrder(): OrderEntity {\n return OrderEntityHelper.calculateTotals(this.order());\n }\n}\n","<div\n class=\"order-builder\"\n [class.ob-collapsed]=\"focusMode()\"\n [class.ob-rail-open]=\"railOpen()\">\n <div class=\"ob-grid\">\n <div class=\"ob-main\">\n <!-- Order header: customer + date + express add (one card) -->\n <ef-card\n titleKey=\"order_builder.section_order\"\n [metaKey]=\"readonly() ? '' : 'order_builder.quick_add_hint'\"\n [overflowVisible]=\"true\">\n <div class=\"ob-order-head\">\n <div class=\"form-grid\">\n <div class=\"field col-6\">\n <ef-label labelKey=\"label.customer\" for=\"ob-cust\" [required]=\"true\" />\n <ef-select\n inputId=\"ob-cust\"\n [options]=\"customers()\"\n optionLabel=\"companyName\"\n optionValue=\"customerId\"\n [ngModel]=\"order().customerId\"\n (ngModelChange)=\"updateCustomer($event)\"\n [disabled]=\"readonly()\"\n [showClear]=\"true\"\n [filter]=\"true\"\n filterBy=\"companyName\"\n filterPlaceholderKey=\"label.search_customer\"\n appendTo=\"body\"\n placeholderKey=\"label.select_customer\" />\n </div>\n <div class=\"field col-3\">\n <ef-label labelKey=\"label.order_date\" for=\"ob-date\" [required]=\"true\" />\n <ef-datepicker-advanced\n mode=\"field\"\n selectionMode=\"single\"\n inputId=\"ob-date\"\n placeholderKey=\"date_select_date\"\n [ngModel]=\"order().orderDate\"\n (ngModelChange)=\"updateOrderDate($event)\"\n [disabled]=\"readonly()\" />\n </div>\n </div>\n\n @if (!readonly()) {\n <div class=\"qa-grid\">\n <div class=\"qa-combo-wrap\">\n <ef-label labelKey=\"label.article\" />\n <ef-product-typeahead\n [products]=\"products()\"\n [productKeyField]=\"productKeyField()\"\n placeholderKey=\"label.search_product\"\n [currency]=\"currency()\"\n [locale]=\"locale()\"\n (productSelect)=\"onTypeaheadSelect($event)\"\n [showVariants]=\"false\" />\n </div>\n <div class=\"qa-price\">\n <ef-label labelKey=\"label.sale_price\" />\n <ef-inputnumber\n variant=\"comptoir\"\n [value]=\"quickAddPrice()\"\n (valueChangeEvent)=\"quickAddPrice.set($event ?? 0)\"\n [minFractionDigits]=\"2\"\n [maxFractionDigits]=\"2\"\n [locale]=\"locale()\"\n [disabled]=\"readonly()\" />\n </div>\n <div class=\"qa-qtyf\">\n <ef-label labelKey=\"label.quantity\" />\n <ef-inputnumber\n variant=\"comptoir\"\n [ngModel]=\"quickAddQuantity()\"\n (ngModelChange)=\"quickAddQuantity.set($event)\"\n [min]=\"0\"\n [maxFractionDigits]=\"4\"\n [locale]=\"locale()\"\n [disabled]=\"readonly()\"\n />\n </div>\n <div class=\"qa-go\">\n <ef-button\n labelKey=\"action.add\"\n icon=\"pi pi-plus\"\n variant=\"comptoir\"\n severity=\"tenant\"\n [disabled]=\"quickAddDisabled()\"\n (clickEvent)=\"addQuickProduct()\" />\n </div>\n </div>\n }\n </div>\n </ef-card>\n\n <!-- Lines -->\n <ef-card titleKey=\"order_builder.lines\" [meta]=\"'· ' + orderLines().length\">\n <div head-extra class=\"head-actions\">\n @if (config().showCatalogue && !readonly()) {\n <ef-button\n labelKey=\"action.open_catalogue\"\n icon=\"pi pi-box\"\n severity=\"secondary\"\n [text]=\"true\"\n (clickEvent)=\"handleOpenCatalogue()\" />\n }\n <ef-button\n [labelKey]=\"focusMode() ? 'order_builder.show_summary' : 'order_builder.fullscreen'\"\n icon=\"pi pi-window-maximize\"\n severity=\"secondary\"\n [text]=\"true\"\n (clickEvent)=\"toggleFocus()\" />\n </div>\n\n <table class=\"ob-tbl\">\n <thead>\n <tr>\n <th class=\"col-prod\">{{ 'label.article' | translate }}</th>\n <th>{{ 'label.sale_price' | translate }}</th>\n <th>{{ 'label.quantity' | translate }}</th>\n @if (config().enableDiscount) {\n <th>{{ 'label.discount' | translate }}</th>\n }\n @if (config().enableTax) {\n <th>{{ 'order_builder.tax' | translate }}</th>\n }\n <th>{{ 'label.subtotal' | translate }}</th>\n <th class=\"col-act\"></th>\n </tr>\n </thead>\n <tbody>\n @for (item of orderLines(); track item.id; let i = $index) {\n <tr>\n <td class=\"col-prod\">\n <div class=\"p\">\n <span class=\"ln\">{{ i + 1 }}</span>\n <span class=\"pp\">\n <span class=\"nm\">{{ item.productDescription }}</span>\n </span>\n </div>\n </td>\n <td class=\"num w-[120px]\">\n @if (!readonly() && isEditingCell(item, 'price')) {\n <ef-inputnumber\n [(ngModel)]=\"item.productUnitPrice\"\n (ngModelChange)=\"onFieldChange(item)\"\n [showClear]=\"false\"\n [autofocus]=\"true\"\n (blurEvent)=\"stopEditCell()\"\n (keyDownEvent)=\"onEditCellKeydown($event)\"\n [min]=\"0\"\n [minFractionDigits]=\"2\"\n [maxFractionDigits]=\"2\"\n [locale]=\"locale()\"\n size=\"small\"\n class=\"!text-end\" />\n } @else {\n <button\n type=\"button\"\n class=\"ln-val\"\n [disabled]=\"readonly()\"\n (click)=\"startEditCell(item, 'price')\">\n {{ item.productUnitPrice | number: '1.2-2' : locale() }}\n </button>\n }\n </td>\n <td class=\"num w-[120px]\">\n @if (!readonly() && isEditingCell(item, 'qty')) {\n <ef-inputnumber\n [(ngModel)]=\"item.quantity\"\n (ngModelChange)=\"onFieldChange(item)\"\n [showClear]=\"false\"\n [autofocus]=\"true\"\n (blurEvent)=\"stopEditCell()\"\n (keyDownEvent)=\"onEditCellKeydown($event)\"\n [min]=\"0\"\n [maxFractionDigits]=\"4\"\n [locale]=\"locale()\"\n size=\"small\"\n class=\"!text-end\" />\n } @else {\n <button\n type=\"button\"\n class=\"ln-val\"\n [disabled]=\"readonly()\"\n (click)=\"startEditCell(item, 'qty')\">\n {{ item.quantity | number: '1.0-4' : locale() }}\n </button>\n }\n </td>\n @if (config().enableDiscount) {\n <td class=\"num w-[80px]\">\n @if (!readonly() && isEditingCell(item, 'discount')) {\n <ef-inputnumber\n [(ngModel)]=\"item.discount\"\n (ngModelChange)=\"onFieldChange(item)\"\n [showClear]=\"false\"\n [autofocus]=\"true\"\n (blurEvent)=\"stopEditCell()\"\n (keyDownEvent)=\"onEditCellKeydown($event)\"\n [min]=\"0\"\n [max]=\"100\"\n [maxFractionDigits]=\"2\"\n suffix=\" %\"\n [locale]=\"locale()\"\n size=\"small\"\n class=\"!text-end\" />\n } @else {\n <button\n type=\"button\"\n class=\"ln-val\"\n [disabled]=\"readonly()\"\n (click)=\"startEditCell(item, 'discount')\">\n {{ item.discount | number: '1.0-2' : locale() }} %\n </button>\n }\n </td>\n }\n @if (config().enableTax) {\n <td class=\"num w-[80px]\">\n @if (!readonly() && isEditingCell(item, 'tva')) {\n <ef-inputnumber\n [(ngModel)]=\"item.taxRate\"\n (ngModelChange)=\"onFieldChange(item)\"\n [showClear]=\"false\"\n [autofocus]=\"true\"\n (blurEvent)=\"stopEditCell()\"\n (keyDownEvent)=\"onEditCellKeydown($event)\"\n [min]=\"0\"\n [max]=\"100\"\n [maxFractionDigits]=\"2\"\n suffix=\" %\"\n [locale]=\"locale()\"\n size=\"small\"\n class=\"!text-end\" />\n } @else {\n <button\n type=\"button\"\n class=\"ln-val\"\n [disabled]=\"readonly()\"\n (click)=\"startEditCell(item, 'tva')\">\n {{ (item.taxRate ?? 0) | number: '1.0-2' : locale() }} %\n </button>\n }\n </td>\n }\n <td class=\"total\">\n {{ calculateSubtotal(item) | number: '1.2-2' : locale() }}\n </td>\n <td class=\"col-act\">\n @if (!readonly()) {\n <ef-button\n icon=\"pi pi-trash\"\n severity=\"danger\"\n [text]=\"true\"\n styleClass=\"ob-del\"\n (clickEvent)=\"removeOrderLine(item.id)\" />\n }\n </td>\n </tr>\n } @empty {\n <tr>\n <td [attr.colspan]=\"colCount()\">\n <div class=\"ob-empty\">{{ 'order_builder.empty' | translate }}</div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </ef-card>\n </div>\n\n <!-- CONTEXT RAIL (1/3) -->\n <aside class=\"ob-rail\">\n <!-- Totaux (top) -->\n <ef-card titleKey=\"order_builder.totals\" [meta]=\"currency()\">\n <div class=\"ob-totals\">\n <div class=\"row\">\n <span class=\"lbl\">{{ 'order_builder.gross' | translate }}</span>\n <span class=\"v\">{{ grossTotal() | number: '1.2-2' : locale() }}</span>\n </div>\n <div class=\"row discount\">\n <span class=\"lbl\">{{ 'order_builder.discount' | translate }}</span>\n <span class=\"v\">−{{ discountTotal() | number: '1.2-2' : locale() }}</span>\n </div>\n <div class=\"row\">\n <span class=\"lbl\">{{ 'order_builder.tax' | translate }}</span>\n <span class=\"v\">{{ tvaTotal() | number: '1.2-2' : locale() }}</span>\n </div>\n <hr />\n <div class=\"row grand\">\n <span class=\"lbl\">{{ 'order_builder.grand_total' | translate }}</span>\n <span class=\"v\">{{ finalTotal() | number: '1.2-2' : locale() }}<span class=\"cur\">{{ currency() }}</span></span>\n </div>\n </div>\n </ef-card>\n\n <!-- Récapitulatif par format -->\n @if (productsSummary().items.length > 0) {\n <ef-card titleKey=\"order_builder.recap\" metaKey=\"order_builder.auto\">\n <div class=\"ob-recap\">\n <div class=\"cols\">\n @for (col of recapColumns(); track $index) {\n <div class=\"grp\">\n @for (seg of col; track seg.code) {\n <div class=\"seg\">\n <span class=\"fmt\">{{ seg.label }}</span>\n <span class=\"n\">{{ seg.count | number: '1.0-0' : locale() }}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"tot\">\n <span class=\"l\">{{ 'order_builder.total_units' | translate }}</span>\n <span class=\"n\">{{ productsSummary().totalCount | number: '1.0-0' : locale() }}</span>\n </div>\n </div>\n </ef-card>\n }\n\n <!-- Historique (optional, component-owned) -->\n @if (hasAudit()) {\n <ef-change-history [entries]=\"auditEntries()\" />\n }\n </aside>\n </div>\n\n <!-- Floating summary FAB + backdrop -->\n <button type=\"button\" class=\"ob-backdrop\" aria-hidden=\"true\" tabindex=\"-1\" (click)=\"toggleRail(false)\"></button>\n <div class=\"ob-fab\" role=\"status\">\n <div class=\"ft\">\n <span class=\"k\">{{ 'order_builder.total_units' | translate }} · {{ productsSummary().totalCount }}</span>\n <span class=\"vv\">{{ finalTotal() | number: '1.2-2' : locale() }}<span class=\"cur\">{{ currency() }}</span></span>\n </div>\n <button type=\"button\" class=\"open\" (click)=\"toggleRail(true)\">\n {{ 'order_builder.summary' | translate }}\n </button>\n </div>\n</div>\n","import { Component, computed, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FieldsetModule } from 'primeng/fieldset';\nimport { OrderLineItem } from '../ef-order-builder/ef-order-builder.component.types';\n\n/**\n * Product count group entry for displaying grouped counts\n */\nexport interface ProductCountGroup {\n code: string;\n label: string;\n count: number;\n column: number;\n}\n\n/**\n * Reference data item for product count group labels\n */\nexport interface ProductCountGroupLabel {\n code: string;\n label: string;\n description?: string;\n isActive?: boolean;\n sortOrder?: number;\n column?: number;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Product with countGroup field\n */\nexport interface ProductWithCountGroup {\n countGroup?: string;\n [key: string]: unknown;\n}\n\n/**\n * Displays a summary of product quantities grouped by their countGroup field.\n * Maps countGroup codes to labels from product_count_group_labels reference data.\n *\n * @example\n * <ef-order-summary\n * [orderLines]=\"orderLines()\"\n * [countGroupLabels]=\"countGroupLabels\"\n * />\n */\n@Component({\n selector: 'ef-order-summary',\n standalone: true,\n imports: [CommonModule, FieldsetModule],\n templateUrl: './ef-order-summary.component.html',\n styleUrl: './ef-order-summary.component.scss',\n})\nexport class EfOrderSummaryComponent {\n /**\n * Order line items to summarize\n */\n orderLines = input.required<OrderLineItem[]>();\n\n /**\n * Product count group labels from reference data\n */\n countGroupLabels = input<ProductCountGroupLabel[]>([]);\n\n /**\n * Legend text for the fieldset\n */\n legend = input<string>('Récapitulatif');\n\n /**\n * Computed grouped counts by countGroup\n */\n groupedCounts = computed<ProductCountGroup[]>(() => {\n const lines = this.orderLines();\n const labels = this.countGroupLabels();\n\n const countMap = new Map<string, number>();\n\n lines.forEach((line) => {\n const product = line.product as ProductWithCountGroup;\n const countGroup = (line as { countGroup?: string }).countGroup || product?.countGroup;\n\n if (countGroup) {\n const currentCount = countMap.get(countGroup) || 0;\n countMap.set(countGroup, currentCount + (line.quantity || 0));\n }\n });\n\n const groups: ProductCountGroup[] = [];\n\n countMap.forEach((count, code) => {\n const labelItem = labels.find(\n (l) => l.code.toUpperCase() === code.toUpperCase(),\n );\n groups.push({\n code,\n label: labelItem?.label || code,\n count,\n column: labelItem?.column ?? 1,\n });\n });\n\n // Sort by the sortOrder from labels, then by label alphabetically\n groups.sort((a, b) => {\n const labelA = labels.find(\n (l) => l.code.toUpperCase() === a.code.toUpperCase(),\n );\n const labelB = labels.find(\n (l) => l.code.toUpperCase() === b.code.toUpperCase(),\n );\n const orderA = labelA?.sortOrder ?? 999;\n const orderB = labelB?.sortOrder ?? 999;\n\n if (orderA !== orderB) {\n return orderA - orderB;\n }\n return a.label.localeCompare(b.label);\n });\n\n return groups;\n });\n\n /**\n * Total quantity across all groups\n */\n totalCount = computed(() => {\n return this.groupedCounts().reduce((sum, group) => sum + group.count, 0);\n });\n\n /**\n * Split groups into columns based on column field from reference data\n */\n columnGroups = computed(() => {\n const groups = this.groupedCounts();\n const columnMap = new Map<number, ProductCountGroup[]>();\n\n groups.forEach((group) => {\n const colIndex = group.column;\n if (!columnMap.has(colIndex)) {\n columnMap.set(colIndex, []);\n }\n const col = columnMap.get(colIndex);\n if (col) {\n col.push(group);\n }\n });\n\n // Sort columns by key and return as array\n const sortedKeys = Array.from(columnMap.keys()).sort((a, b) => a - b);\n return sortedKeys.map((key) => columnMap.get(key) as ProductCountGroup[]);\n });\n\n /**\n * Check if there are any groups to display\n */\n hasGroups = computed(() => this.groupedCounts().length > 0);\n}\n","@if (hasGroups()) {\n <p-fieldset [legend]=\"legend()\">\n <div class=\"ef-order-summary\">\n <div class=\"ef-order-summary__content\">\n @for (column of columnGroups(); track $index) {\n <div class=\"ef-order-summary__column\">\n @for (group of column; track group.code) {\n <div class=\"ef-order-summary__item\">\n <span class=\"ef-order-summary__label\">{{ group.label }}:</span>\n <span class=\"ef-order-summary__count\">{{ group.count }}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"ef-order-summary__footer\">\n <span class=\"ef-order-summary__total-label\">Total:</span>\n <span class=\"ef-order-summary__total-count\">{{ totalCount() }}</span>\n </div>\n </div>\n </p-fieldset>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AccordionModule } from 'primeng/accordion';\nimport { BadgeModule } from 'primeng/badge';\nimport { ButtonModule } from 'primeng/button';\nimport { CheckboxModule } from 'primeng/checkbox';\nimport { ChipModule } from 'primeng/chip';\nimport { IconFieldModule } from 'primeng/iconfield';\nimport { InputIconModule } from 'primeng/inputicon';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\n\nexport interface CategoryItem {\n code: string;\n label: string;\n description?: string | null;\n isActive: boolean;\n sortOrder: number;\n metadata?: Record<string, unknown> | null;\n children?: CategoryItem[];\n}\n\nexport interface CategoryGroup {\n code: string;\n label: string;\n description?: string | null;\n isActive: boolean;\n sortOrder: number;\n metadata?: Record<string, unknown> | null;\n children?: CategoryItem[];\n}\n\nexport interface CategoryAssignment {\n type: string;\n code: string;\n}\n\nexport interface SelectedFilter {\n type: string;\n code: string;\n label: string;\n}\n\n@Component({\n selector: 'ef-product-catalogue-filter',\n templateUrl: './ef-product-catalogue-filter.component.html',\n imports: [\n FormsModule,\n AccordionModule,\n BadgeModule,\n ButtonModule,\n CheckboxModule,\n ChipModule,\n IconFieldModule,\n InputIconModule,\n InputTextModule,\n EfLabelComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfProductCatalogueFilterComponent {\n /** Category groups from reference_data (product_categories items with children) */\n categoryGroups = input.required<CategoryGroup[]>();\n\n /** Products to calculate counts */\n products = input.required<Array<{ categoryAssignments?: CategoryAssignment[] }>>();\n\n /** Selected filters (two-way binding) */\n selectedFilters = model<SelectedFilter[]>([]);\n\n /** Emitted when filters change */\n filtersChanged = output<SelectedFilter[]>();\n\n /** Search terms for each category group */\n searchTerms = signal<Record<string, string>>({});\n\n /** Accordion panel values (expanded panels) */\n expandedPanels = computed(() =>\n this.categoryGroups()\n .filter((g) => g.children && g.children.length > 0)\n .map((g) => g.code)\n );\n\n /** Get filtered children for a category group based on search */\n getFilteredChildren(group: CategoryGroup): CategoryItem[] {\n const children = group.children || [];\n const searchTerm = this.searchTerms()[group.code]?.toLowerCase() || '';\n\n if (!searchTerm) {\n return children.filter((c) => c.isActive);\n }\n\n return children.filter(\n (c) => c.isActive && c.label.toLowerCase().includes(searchTerm)\n );\n }\n\n /** Get product count for a specific category item */\n getItemCount(groupCode: string, itemCode: string): number {\n return this.products().filter((product) =>\n product.categoryAssignments?.some(\n (ca) => ca.type === groupCode && ca.code === itemCode\n )\n ).length;\n }\n\n /** Check if a filter is selected */\n isFilterSelected(groupCode: string, itemCode: string): boolean {\n return this.selectedFilters().some(\n (f) => f.type === groupCode && f.code === itemCode\n );\n }\n\n /** Toggle a filter selection */\n toggleFilter(group: CategoryGroup, item: CategoryItem): void {\n const currentFilters = this.selectedFilters();\n const existingIndex = currentFilters.findIndex(\n (f) => f.type === group.code && f.code === item.code\n );\n\n let newFilters: SelectedFilter[];\n if (existingIndex >= 0) {\n newFilters = currentFilters.filter((_, i) => i !== existingIndex);\n } else {\n newFilters = [\n ...currentFilters,\n { type: group.code, code: item.code, label: item.label },\n ];\n }\n\n this.selectedFilters.set(newFilters);\n this.filtersChanged.emit(newFilters);\n }\n\n /** Remove a specific filter */\n removeFilter(filter: SelectedFilter): void {\n const newFilters = this.selectedFilters().filter(\n (f) => !(f.type === filter.type && f.code === filter.code)\n );\n this.selectedFilters.set(newFilters);\n this.filtersChanged.emit(newFilters);\n }\n\n /** Clear all filters */\n clearAllFilters(): void {\n this.selectedFilters.set([]);\n this.filtersChanged.emit([]);\n }\n\n /** Update search term for a category group */\n updateSearchTerm(groupCode: string, term: string): void {\n this.searchTerms.update((current) => ({\n ...current,\n [groupCode]: term,\n }));\n }\n\n /** Get color class from metadata if available */\n getColorClass(item: CategoryItem): string | null {\n const color = item.metadata?.['color'];\n return typeof color === 'string' ? color : null;\n }\n\n /** Check if group should show search input (more than 5 items) */\n shouldShowSearch(group: CategoryGroup): boolean {\n return (group.children?.length || 0) > 5;\n }\n}\n","<div class=\"flex w-80 shrink-0 flex-col items-start justify-start sticky top-4 max-h-[calc(100vh-2rem)] overflow-y-auto\">\n <div\n class=\"mb-4 flex flex-col items-start justify-center gap-2 self-stretch border-b border-surface-200 px-2 pb-4 dark:border-surface-700\"\n >\n <div class=\"flex items-center justify-between gap-2 self-stretch\">\n <div\n class=\"text-base font-semibold leading-tight text-surface-900 dark:text-surface-0\"\n >\n Filters\n </div>\n <p-button\n size=\"small\"\n severity=\"secondary\"\n [text]=\"true\"\n class=\"py-1! px-2! text-base! font-normal!\"\n (clickEvent)=\"clearAllFilters()\"\n >\n <span pButtonLabel>\n <i class=\"pi pi-eraser\"></i>\n Clear\n </span>\n </p-button>\n </div>\n @if (selectedFilters().length > 0) {\n <div\n class=\"flex flex-wrap items-start justify-start gap-2 self-stretch\"\n >\n @for (filter of selectedFilters(); track filter.type + filter.code) {\n <p-chip\n [label]=\"filter.label\"\n [removable]=\"true\"\n size=\"small\"\n class=\"h-auto rounded-full px-6\"\n removeIcon=\"pi pi-times\"\n (onRemove)=\"removeFilter(filter)\"\n ></p-chip>\n }\n </div>\n }\n </div>\n\n <p-accordion\n [multiple]=\"true\"\n [value]=\"expandedPanels()\"\n class=\"w-full\"\n >\n @for (group of categoryGroups(); track group.code) {\n @if (group.children && group.children.length > 0) {\n <p-accordion-panel [value]=\"group.code\">\n <p-accordion-header>\n <span\n class=\"text-base font-semibold leading-tight text-surface-900 dark:text-surface-0\"\n >{{ group.label }}</span>\n </p-accordion-header>\n <p-accordion-content>\n <div class=\"flex flex-col gap-4\">\n @if (shouldShowSearch(group)) {\n <p-iconfield iconPosition=\"left\" class=\"w-full\">\n <p-inputicon class=\"pi pi-search\"></p-inputicon>\n <input\n pInputText\n size=\"small\"\n [ngModel]=\"searchTerms()[group.code] || ''\"\n (ngModelChange)=\"updateSearchTerm(group.code, $event)\"\n [placeholder]=\"'Rechercher ' + group.label.toLowerCase()\"\n class=\"w-full\"\n />\n </p-iconfield>\n }\n\n @for (item of getFilteredChildren(group); track item.code) {\n <div class=\"flex items-center justify-between gap-2\">\n <div class=\"flex flex-1 items-center gap-2\">\n <p-checkbox\n size=\"small\"\n [inputId]=\"group.code + '_' + item.code\"\n [binary]=\"true\"\n [ngModel]=\"isFilterSelected(group.code, item.code)\"\n (ngModelChange)=\"toggleFilter(group, item)\"\n ></p-checkbox>\n @if (getColorClass(item)) {\n <div\n class=\"h-5 w-5 rounded-full\"\n [class]=\"getColorClass(item)\"\n ></div>\n }\n <ef-label\n [label]=\"item.label\"\n [for]=\"group.code + '_' + item.code\"\n styleClass=\"cursor-pointer text-base font-normal leading-tight text-surface-700 dark:text-surface-300\"\n />\n </div>\n @if (getItemCount(group.code, item.code) > 0) {\n <p-badge\n [value]=\"getItemCount(group.code, item.code)\"\n size=\"small\"\n class=\"rounded-xl! h-6! min-w-6!\"\n severity=\"secondary\"\n ></p-badge>\n }\n </div>\n }\n </div>\n </p-accordion-content>\n </p-accordion-panel>\n }\n }\n </p-accordion>\n</div>\n","import { CommonModule, CurrencyPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n inject,\n input,\n LOCALE_ID,\n OnChanges,\n output,\n signal,\n TemplateRef,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { BadgeModule } from 'primeng/badge';\nimport { CardModule } from 'primeng/card';\nimport { IconFieldModule } from 'primeng/iconfield';\nimport { InputIconModule } from 'primeng/inputicon';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { Menu, MenuModule } from 'primeng/menu';\nimport { SelectModule } from 'primeng/select';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfQuantityStepperComponent } from '../../forms/ef-quantity-stepper/ef-quantity-stepper.component';\nimport { EfProductCatalogueFilterComponent } from '../ef-product-catalogue-filter/ef-product-catalogue-filter.component';\nimport {\n CategoryAssignment,\n CategoryGroup,\n SelectedFilter,\n} from '../ef-product-catalogue-filter/ef-product-catalogue-filter.component';\nimport { EfButtonComponent } from '../../layout/ef-button/ef-button.component';\n\nexport interface CatalogueProductVariant {\n variantId: string;\n title: string;\n sku?: string | null;\n price: number;\n compareAtPrice?: number | null;\n optionValues?: Record<string, string>;\n isActive?: boolean;\n countGroup?: string | null;\n [key: string]: unknown;\n}\n\nexport interface CatalogueProduct {\n id: number;\n productCode: string;\n name: string;\n displayName: string;\n unitPrice?: number | null;\n packagingVolume?: number | null;\n categoryAssignments?: CategoryAssignment[];\n productType?: string | null; // 'SIMPLE' | 'VARIABLE'\n variants?: CatalogueProductVariant[];\n defaultVariantId?: string | null;\n [key: string]: unknown;\n}\n\n@Component({\n selector: 'ef-product-catalogue',\n styleUrl: './ef-product-catalogue.component.scss',\n templateUrl: './ef-product-catalogue.component.html',\n imports: [\n CommonModule,\n FormsModule,\n BadgeModule,\n EfButtonComponent,\n CardModule,\n IconFieldModule,\n InputIconModule,\n InputTextModule,\n MenuModule,\n SelectModule,\n EfQuantityStepperComponent,\n EfProductCatalogueFilterComponent,\n TranslateModule,\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfProductCatalogueComponent implements OnChanges {\n private readonly locale = inject(LOCALE_ID);\n private readonly currencyPipe = new CurrencyPipe(this.locale);\n\n /** Products to display */\n products = input<CatalogueProduct[]>([]);\n\n /** Category groups for filtering */\n categoryGroups = input<CategoryGroup[]>([]);\n\n /** Initial selected items (for editing existing orders) */\n initialSelectedItems = input<Array<{ productId?: unknown; quantity: number; variantId?: string | null }>>(\n [],\n );\n\n /** Default filters to apply on init */\n defaultFilters = input<SelectedFilter[]>([]);\n\n /** Property name used as unique key for tracking products in the list */\n trackByField = input<string>('id');\n\n /** Currency code for price formatting */\n currencyCode = input<string>('MAD');\n\n /** Locale used for number/currency formatting and the quantity stepper */\n localeCode = input<string>('fr-FR');\n\n /**\n * Custom product thumbnail template.\n * Context: { $implicit: CatalogueProduct }\n *\n * @example\n * <ef-product-catalogue [products]=\"products()\">\n * <ng-template #productThumbnail let-product>\n * <my-custom-thumbnail [product]=\"product\" />\n * </ng-template>\n * </ef-product-catalogue>\n */\n productThumbnailTpl = contentChild<TemplateRef<unknown>>('productThumbnail');\n\n @ViewChild('sortMenu') sortMenu!: Menu;\n\n /** Emitted when products are validated */\n productsValidated =\n output<Array<{ product: CatalogueProduct; quantity: number; variantId?: string }>>();\n\n productSearch = signal('');\n selectedFilters = signal<SelectedFilter[]>([]);\n selectedSort = signal('Sort By');\n selectedProducts = signal<\n Array<{ product: CatalogueProduct; quantity: number; variantId?: string }>\n >([]);\n\n /** Tracks the currently selected variantId per product key */\n selectedVariants = signal<Record<string, string>>({});\n\n filteredProducts = computed(() => {\n let filtered = this.products();\n const filters = this.selectedFilters();\n const searchTerm = this.productSearch().toLowerCase().trim();\n\n if (searchTerm) {\n filtered = filtered.filter((p) => {\n const displayName = (p.displayName || '').toLowerCase();\n const name = (p.name || '').toLowerCase();\n return displayName.includes(searchTerm) || name.includes(searchTerm);\n });\n }\n\n if (filters.length === 0) {\n return filtered;\n }\n\n const filtersByType = filters.reduce(\n (acc, filter) => {\n if (!acc[filter.type]) {\n acc[filter.type] = [];\n }\n acc[filter.type].push(filter.code);\n return acc;\n },\n {} as Record<string, string[]>,\n );\n\n filtered = filtered.filter((product) => {\n const assignments = product.categoryAssignments || [];\n return Object.entries(filtersByType).every(([type, codes]) => {\n return assignments.some(\n (a) => a.type === type && codes.includes(a.code),\n );\n });\n });\n\n return filtered;\n });\n\n sortOptions = [\n {\n label: 'Newest First',\n icon: 'pi pi-calendar-plus',\n command: () => {\n this.selectedSort.set('Newest First');\n this.sortMenu.hide();\n },\n },\n {\n label: 'Price: Low to High',\n icon: 'pi pi-sort-amount-up',\n command: () => {\n this.selectedSort.set('Price: Low to High');\n this.sortMenu.hide();\n },\n },\n {\n label: 'Price: High to Low',\n icon: 'pi pi-sort-amount-down',\n command: () => {\n this.selectedSort.set('Price: High to Low');\n this.sortMenu.hide();\n },\n },\n ];\n\n onFiltersChanged(filters: SelectedFilter[]): void {\n this.selectedFilters.set(filters);\n }\n\n ngOnChanges(): void {\n this.initializeSelectedProducts();\n this.initializeDefaultFilters();\n }\n\n productKey(product: CatalogueProduct): unknown {\n return product[this.trackByField()];\n }\n\n private initializeSelectedProducts(): void {\n const initialItems = this.initialSelectedItems();\n const allProducts = this.products();\n\n if (\n !initialItems ||\n initialItems.length === 0 ||\n !allProducts ||\n allProducts.length === 0\n ) {\n return;\n }\n\n const selectedProductsArray: Array<{\n product: CatalogueProduct;\n quantity: number;\n variantId?: string;\n }> = [];\n\n initialItems.forEach((orderItem) => {\n const matchingProduct = allProducts.find(\n (p) => this.productKey(p) === orderItem.productId,\n );\n if (matchingProduct) {\n selectedProductsArray.push({\n product: matchingProduct,\n quantity: orderItem.quantity || 1,\n variantId: orderItem.variantId ?? undefined,\n });\n }\n });\n\n this.selectedProducts.set(selectedProductsArray);\n }\n\n private initializeDefaultFilters(): void {\n const defaults = this.defaultFilters();\n if (defaults.length > 0 && this.selectedFilters().length === 0) {\n this.selectedFilters.set(defaults);\n }\n }\n\n toggleSortMenu(event: Event): void {\n this.sortMenu.toggle(event);\n }\n\n /** Composite key for tracking product+variant selections */\n private selectionKey(productKey: unknown, variantId?: string): string {\n return variantId ? `${productKey}::${variantId}` : `${productKey}`;\n }\n\n /** Get the selected variantId for a product, or its defaultVariantId */\n getSelectedVariantId(product: CatalogueProduct): string | undefined {\n const key = String(this.productKey(product));\n const selected = this.selectedVariants()[key];\n if (selected) return selected;\n if (this.isVariableProduct(product)) {\n const activeVariants = this.getActiveVariants(product);\n return product.defaultVariantId ?? activeVariants[0]?.variantId;\n }\n return undefined;\n }\n\n /** Set the selected variant for a product */\n setSelectedVariant(product: CatalogueProduct, variantId: string): void {\n const key = String(this.productKey(product));\n this.selectedVariants.update((v) => ({ ...v, [key]: variantId }));\n }\n\n /** Check if product is a VARIABLE product with variants */\n isVariableProduct(product: CatalogueProduct): boolean {\n return product.productType === 'VARIABLE' && !!product.variants?.length;\n }\n\n /** Get active variants for a product */\n getActiveVariants(product: CatalogueProduct): CatalogueProductVariant[] {\n return (product.variants || []).filter((v) => v.isActive !== false);\n }\n\n /** Get total quantity for a product across all its variants */\n getProductQuantity(product: CatalogueProduct): number {\n const key = this.productKey(product);\n if (this.isVariableProduct(product)) {\n return this.selectedProducts()\n .filter((sp) => this.productKey(sp.product) === key)\n .reduce((sum, sp) => sum + sp.quantity, 0);\n }\n const selected = this.selectedProducts().find(\n (sp) => this.productKey(sp.product) === key,\n );\n return selected?.quantity || 0;\n }\n\n /** Get quantity for a specific product+variant combination */\n getVariantQuantity(product: CatalogueProduct, variantId: string): number {\n const key = this.productKey(product);\n const selected = this.selectedProducts().find(\n (sp) => this.productKey(sp.product) === key && sp.variantId === variantId,\n );\n return selected?.quantity || 0;\n }\n\n addProduct(product: CatalogueProduct): void {\n const key = this.productKey(product);\n const variantId = this.isVariableProduct(product)\n ? this.getSelectedVariantId(product)\n : undefined;\n const selKey = this.selectionKey(key, variantId);\n const currentProducts = this.selectedProducts();\n\n const existingIndex = currentProducts.findIndex(\n (sp) => this.selectionKey(this.productKey(sp.product), sp.variantId) === selKey,\n );\n\n if (existingIndex !== -1) {\n this.selectedProducts.set(\n currentProducts.map((sp, i) =>\n i === existingIndex ? { ...sp, quantity: sp.quantity + 1 } : sp,\n ),\n );\n } else {\n this.selectedProducts.set([\n ...currentProducts,\n { product, quantity: 1, variantId },\n ]);\n }\n }\n\n removeProduct(product: CatalogueProduct): void {\n const key = this.productKey(product);\n if (this.isVariableProduct(product)) {\n // Remove all variant selections for this product\n this.selectedProducts.set(\n this.selectedProducts().filter(\n (sp) => this.productKey(sp.product) !== key,\n ),\n );\n } else {\n this.selectedProducts.set(\n this.selectedProducts().filter(\n (sp) => this.productKey(sp.product) !== key,\n ),\n );\n }\n }\n\n removeVariantSelection(product: CatalogueProduct, variantId: string): void {\n const key = this.productKey(product);\n const selKey = this.selectionKey(key, variantId);\n this.selectedProducts.set(\n this.selectedProducts().filter(\n (sp) => this.selectionKey(this.productKey(sp.product), sp.variantId) !== selKey,\n ),\n );\n }\n\n updateProductQuantity(product: CatalogueProduct, quantity: number): void {\n const key = this.productKey(product);\n const variantId = this.isVariableProduct(product)\n ? this.getSelectedVariantId(product)\n : undefined;\n const selKey = this.selectionKey(key, variantId);\n const currentProducts = this.selectedProducts();\n\n if (quantity === 0) {\n this.selectedProducts.set(\n currentProducts.filter(\n (sp) => this.selectionKey(this.productKey(sp.product), sp.variantId) !== selKey,\n ),\n );\n } else {\n this.selectedProducts.set(\n currentProducts.map((sp) =>\n this.selectionKey(this.productKey(sp.product), sp.variantId) === selKey\n ? { ...sp, quantity }\n : sp,\n ),\n );\n }\n }\n\n updateVariantQuantity(product: CatalogueProduct, variantId: string, quantity: number): void {\n const key = this.productKey(product);\n const selKey = this.selectionKey(key, variantId);\n const currentProducts = this.selectedProducts();\n\n if (quantity === 0) {\n this.removeVariantSelection(product, variantId);\n } else {\n const existingIndex = currentProducts.findIndex(\n (sp) => this.selectionKey(this.productKey(sp.product), sp.variantId) === selKey,\n );\n if (existingIndex !== -1) {\n this.selectedProducts.set(\n currentProducts.map((sp, i) =>\n i === existingIndex ? { ...sp, quantity } : sp,\n ),\n );\n } else {\n this.selectedProducts.set([\n ...currentProducts,\n { product, quantity, variantId },\n ]);\n }\n }\n }\n\n validateSelection(): void {\n const selectedItems = this.selectedProducts();\n if (selectedItems.length > 0) {\n this.productsValidated.emit([...selectedItems]);\n this.selectedProducts.set([]);\n this.selectedVariants.set({});\n }\n }\n\n getPackagingLabel(product: CatalogueProduct): string {\n const packagingAssignment = product.categoryAssignments?.find(\n (ca) => ca.type === 'PACKAGING',\n );\n return packagingAssignment?.code || '';\n }\n\n getVariantTitle(product: CatalogueProduct, variantId: string): string {\n const variant = product.variants?.find((v) => v.variantId === variantId);\n return variant?.title || variantId;\n }\n\n trackKey(product: CatalogueProduct): unknown {\n return this.productKey(product);\n }\n\n formatPrice(product: CatalogueProduct): string {\n if (this.isVariableProduct(product)) {\n const variantId = this.getSelectedVariantId(product);\n const variant = product.variants?.find((v) => v.variantId === variantId);\n if (variant) {\n return this.formatCurrency(variant.price);\n }\n // Fallback: show price range\n const activeVariants = this.getActiveVariants(product);\n if (activeVariants.length > 0) {\n const min = Math.min(...activeVariants.map((v) => v.price));\n const max = Math.max(...activeVariants.map((v) => v.price));\n if (min === max) return this.formatCurrency(min);\n return `${this.formatCurrency(min)} - ${this.formatCurrency(max)}`;\n }\n }\n const price = product.unitPrice;\n if (price == null) return '';\n return this.formatCurrency(price);\n }\n\n formatVariantPrice(variant: CatalogueProductVariant): string {\n return this.formatCurrency(variant.price);\n }\n\n private formatCurrency(value: number | null | undefined): string {\n if (value == null) return '';\n return (\n this.currencyPipe.transform(\n value,\n this.currencyCode(),\n 'symbol-narrow',\n '1.2-2',\n ) || ''\n );\n }\n}\n","<div class=\"bg-surface-0 dark:bg-surface-950\">\n <div class=\"flex flex-row gap-4\">\n <!-- Filter Sidebar -->\n <ef-product-catalogue-filter\n [categoryGroups]=\"categoryGroups()\"\n [products]=\"products()\"\n [(selectedFilters)]=\"selectedFilters\"\n (filtersChanged)=\"onFiltersChanged($event)\"\n />\n\n <!-- Product Grid -->\n <div\n class=\"min-h-96 flex-1 rounded-md border-2 border-dotted border-surface-200 bg-surface-50 p-4 dark:border-surface-700 dark:bg-surface-800\"\n >\n <div class=\"sticky top-0 z-10 w-full mb-4 bg-surface-50 dark:bg-surface-800 pb-2 -mt-4 pt-4 -mx-4 px-4\">\n <p-iconfield iconPosition=\"left\" class=\"w-full\">\n <p-inputicon class=\"pi pi-search\"></p-inputicon>\n <input\n pInputText\n size=\"small\"\n [(ngModel)]=\"productSearch\"\n [placeholder]=\"'placeholder.search_products' | translate\"\n class=\"w-full\"\n />\n </p-iconfield>\n </div>\n <div class=\"grid grid-cols-2 gap-4 lg:grid-cols-3 xl:grid-cols-4\">\n @for (product of filteredProducts(); track trackKey(product)) {\n <p-card\n [header]=\"''\"\n [class.border-2]=\"true\"\n [class.border-blue-100]=\"getProductQuantity(product) > 0\"\n [class.!bg-blue-100]=\"getProductQuantity(product) > 0\"\n [class.dark:!border-blue-900]=\"getProductQuantity(product) > 0\"\n [class.dark:!bg-blue-900]=\"getProductQuantity(product) > 0\"\n [class.border-transparent]=\"getProductQuantity(product) === 0\"\n class=\"cursor-pointer hover:shadow-md dark:hover:shadow-md dark:hover:shadow-gray-300/50\"\n >\n <ng-template pTemplate=\"header\">\n <div class=\"w-full\">\n @if (productThumbnailTpl()) {\n <ng-container *ngTemplateOutlet=\"productThumbnailTpl(); context: { $implicit: product }\"></ng-container>\n } @else {\n <!-- Default fallback thumbnail -->\n <div class=\"flex h-[13rem] items-center justify-center bg-surface-100 text-3xl text-surface-400 dark:bg-surface-800\">\n <i class=\"pi pi-box\"></i>\n </div>\n }\n </div>\n </ng-template>\n <ng-template pTemplate=\"content\">\n <div [innerHTML]=\"product.displayName\" class=\"h-14 font-semibold\"></div>\n </ng-template>\n <ng-template pTemplate=\"footer\">\n @if (isVariableProduct(product)) {\n <!-- Variable product: variant selector + per-variant quantities -->\n <div class=\"flex items-center justify-between mb-2\">\n <p-badge\n severity=\"secondary\"\n [value]=\"getActiveVariants(product).length + ' ' + ('catalogue.variants' | translate)\"\n badgeSize=\"small\"\n />\n <div class=\"text-lg font-bold\">\n {{ formatPrice(product) }}\n </div>\n </div>\n\n <!-- Variant selector -->\n <p-select\n [options]=\"getActiveVariants(product)\"\n optionLabel=\"title\"\n optionValue=\"variantId\"\n [ngModel]=\"getSelectedVariantId(product)\"\n (ngModelChange)=\"setSelectedVariant(product, $event)\"\n size=\"small\"\n styleClass=\"w-full mb-3\"\n [placeholder]=\"'placeholder.select_variant' | translate\"\n />\n\n <!-- Add button or quantity stepper for selected variant -->\n <div class=\"mt-2\">\n @if (getProductQuantity(product) > 0) {\n <!-- Show per-variant breakdown -->\n @for (entry of selectedProducts(); track $index) {\n @if (productKey(entry.product) === productKey(product) && entry.variantId) {\n <div class=\"flex items-center justify-center gap-2 mb-2\">\n <span class=\"text-xs font-medium text-surface-600 dark:text-surface-400 min-w-12 text-center\">\n {{ getVariantTitle(product, entry.variantId) }}\n </span>\n <ef-quantity-stepper\n [ngModel]=\"entry.quantity\"\n (ngModelChange)=\"updateVariantQuantity(product, entry.variantId!, $event)\"\n [min]=\"0\"\n [max]=\"1000\"\n [maxFractionDigits]=\"4\"\n [locale]=\"localeCode()\"\n />\n <ef-button\n icon=\"pi pi-times\"\n severity=\"danger\"\n styleClass=\"!rounded-full !w-7 !h-7 !p-0\"\n size=\"small\"\n (clickEvent)=\"removeVariantSelection(product, entry.variantId!)\"\n />\n </div>\n }\n }\n <!-- Add another variant button -->\n <ef-button\n icon=\"pi pi-plus\"\n [label]=\"'button.add_variant' | translate\"\n severity=\"primary\"\n styleClass=\"w-full !rounded-full !h-10 mt-1\"\n size=\"small\"\n (clickEvent)=\"addProduct(product)\"\n />\n } @else {\n <ef-button\n [label]=\"'button.add' | translate\"\n icon=\"pi pi-shopping-cart\"\n severity=\"primary\"\n styleClass=\"w-full !rounded-full !h-12\"\n (clickEvent)=\"addProduct(product)\"\n />\n }\n </div>\n } @else {\n <!-- Simple product: original behavior -->\n <div class=\"flex items-center justify-between\">\n <p-badge\n severity=\"secondary\"\n [value]=\"getPackagingLabel(product)\"\n badgeSize=\"small\"\n />\n <div class=\"text-lg font-bold\">\n {{ formatPrice(product) }}\n </div>\n </div>\n <div class=\"mt-4\">\n @if (getProductQuantity(product) > 0) {\n <div class=\"flex items-center justify-between\">\n <ef-button\n icon=\"pi pi-trash\"\n severity=\"primary\"\n styleClass=\"!rounded-full\"\n (clickEvent)=\"removeProduct(product)\"\n />\n <ef-quantity-stepper\n [ngModel]=\"getProductQuantity(product)\"\n (ngModelChange)=\"updateProductQuantity(product, $event)\"\n [min]=\"0\"\n [max]=\"1000\"\n [maxFractionDigits]=\"4\"\n [locale]=\"localeCode()\"\n />\n </div>\n } @else {\n <ef-button\n [label]=\"'button.add' | translate\"\n icon=\"pi pi-shopping-cart\"\n severity=\"primary\"\n styleClass=\"w-full !rounded-full !h-12\"\n (clickEvent)=\"addProduct(product)\"\n />\n }\n </div>\n }\n </ng-template>\n </p-card>\n } @empty {\n <div class=\"p-2\">{{ 'message.no_products_found' | translate }}</div>\n }\n </div>\n </div>\n </div>\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ConfirmDialogModule } from 'primeng/confirmdialog';\n\n/**\n * The app-wide confirmation modal, wearing the same skin as `ef-dialog`.\n *\n * PrimeNG's `<p-confirmdialog>` renders an ordinary `<p-dialog>` inside\n * itself and forwards `styleClass` to its root, so handing it the\n * `es-dialog` classes makes every rule that dresses `ef-dialog` — the\n * paper-alt panel, the rule-separated header and footer, the Bricolage\n * title, the ghost close — apply here too. Only the confirm-specific\n * internals (the icon tile, the message, the two action buttons) need\n * their own rules, and those live beside the rest in `_patterns.scss`.\n *\n * Drop one instance at the application root; the content is driven by\n * `ConfirmDialogService.confirm()`, not by inputs.\n *\n * ```html\n * <ef-confirm-dialog />\n * ```\n */\n@Component({\n selector: 'ef-confirm-dialog',\n standalone: true,\n imports: [ConfirmDialogModule],\n template: `<p-confirmdialog [styleClass]=\"effectiveStyleClass()\" />`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfConfirmDialogComponent {\n /** Panel width preset, mirroring `ef-dialog`'s `size`. */\n readonly size = input<'sm' | 'md' | 'lg'>('sm');\n\n /** Extra classes appended to the panel. */\n readonly styleClass = input<string>('');\n\n protected readonly effectiveStyleClass = () =>\n ['es-dialog', `es-dialog--${this.size()}`, 'es-confirm', this.styleClass()]\n .filter(Boolean)\n .join(' ');\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfThemeConfigService } from '@elasticias/core';\n\n/**\n * Light / dark switch.\n *\n * All of the machinery already exists in `EfThemeConfigService`: it holds\n * `darkTheme` in the persisted app state, puts `.p-dark` on `<html>`, and\n * runs the swap through a view transition where the browser supports one.\n * This is the control that was missing, so the preference had no way to be\n * expressed.\n *\n * The icon shows the theme you would move to, not the one you are in, which\n * is what makes a single-button toggle readable: a moon means \"go dark\".\n *\n * ```html\n * <ef-theme-toggle />\n * ```\n */\n@Component({\n selector: 'ef-theme-toggle',\n standalone: true,\n imports: [TranslateModule],\n template: `\n <button\n type=\"button\"\n class=\"ef-theme-toggle\"\n [class.is-dark]=\"isDark()\"\n [attr.aria-label]=\"labelKey() | translate\"\n [attr.title]=\"labelKey() | translate\"\n [attr.aria-pressed]=\"isDark()\"\n (click)=\"toggle()\"\n >\n <i [class]=\"isDark() ? lightIcon() : darkIcon()\" aria-hidden=\"true\"></i>\n </button>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfThemeToggleComponent {\n private readonly themeConfig = inject(EfThemeConfigService);\n\n /** Icon shown while light is active (i.e. \"switch to dark\"). */\n readonly darkIcon = input<string>('pi pi-moon');\n\n /** Icon shown while dark is active (i.e. \"switch to light\"). */\n readonly lightIcon = input<string>('pi pi-sun');\n\n /** Translation key for the accessible name. */\n readonly ariaLabelKey = input<string>('');\n\n readonly isDark = computed(() => !!this.themeConfig.appState()?.darkTheme);\n\n protected readonly labelKey = computed(\n () =>\n this.ariaLabelKey() ||\n (this.isDark() ? 'common_theme_switch_light' : 'common_theme_switch_dark'),\n );\n\n toggle(): void {\n this.themeConfig.appState.update(state => ({ ...state, darkTheme: !state.darkTheme }));\n }\n}\n","import { Directive } from '@angular/core';\nimport { Tooltip } from 'primeng/tooltip';\n\n/**\n * Comptoir-skinned tooltip.\n *\n * `ef-button` already drives PrimeNG's tooltip through its `tooltipKey`\n * input, so this composes the same directive rather than introducing a\n * second tooltip with its own positioning and its own bugs. It contributes\n * the `ef-*` name the house style asks for and nothing else; the look comes\n * from the `.p-tooltip` rules in `_patterns.scss`, which means every tooltip\n * in the app — this one and `ef-button`'s — reads the same.\n *\n * Text is a plain input, so translate at the call site:\n *\n * ```html\n * <span [efTooltip]=\"'module_sales_hint' | translate\" efTooltipPosition=\"top\"></span>\n * ```\n */\n@Directive({\n selector: '[efTooltip]',\n standalone: true,\n hostDirectives: [\n {\n directive: Tooltip,\n inputs: [\n 'pTooltip: efTooltip',\n 'tooltipPosition: efTooltipPosition',\n 'tooltipDisabled: efTooltipDisabled',\n 'tooltipStyleClass: efTooltipStyleClass',\n 'tooltipEvent: efTooltipEvent',\n 'showDelay: efTooltipShowDelay',\n 'hideDelay: efTooltipHideDelay',\n 'appendTo: efTooltipAppendTo',\n 'autoHide: efTooltipAutoHide',\n 'escape: efTooltipEscape',\n 'life: efTooltipLife',\n ],\n },\n ],\n})\nexport class EfTooltipDirective {}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { EF_BUILD_INFO } from '@elasticias/core';\nimport { EfTooltipDirective } from '../../overlays/ef-tooltip.directive';\n\n/**\n * Which build is running, for a footer or an about box.\n *\n * Reads `EF_BUILD_INFO` optionally and renders nothing when the app has not\n * provided it, so a consumer that never wired a build stamp shows no empty\n * line. The commit and branch go in the tooltip rather than the label: the\n * date is what a person recognises, the hash is what you paste into an issue.\n *\n * ```html\n * <ef-build-stamp owner=\"Elasticias\" />\n * ```\n */\n@Component({\n selector: 'ef-build-stamp',\n standalone: true,\n imports: [EfTooltipDirective],\n template: `\n @if (info) {\n <span class=\"ef-build-stamp\" [efTooltip]=\"detail()\" efTooltipPosition=\"bottom\">\n @if (owner()) {\n <span class=\"ef-build-stamp__owner\">© {{ year }} {{ owner() }}</span>\n <span class=\"ef-build-stamp__sep\" aria-hidden=\"true\">·</span>\n }\n <span class=\"ef-build-stamp__build\">{{ label() }}</span>\n </span>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfBuildStampComponent {\n /** Copyright holder shown before the build. Omit for the build alone. */\n readonly owner = input<string>('');\n\n protected readonly info = inject(EF_BUILD_INFO, { optional: true });\n\n protected readonly year = new Date().getFullYear();\n\n /**\n * A released build is known by its version; an unreleased one has no\n * version to be known by, so it shows what actually identifies it.\n *\n * That is not a cosmetic split. Only production is cut from a tag, so\n * only production has a number a person can repeat back to you. On\n * develop and staging the honest answer is where it came from and when.\n */\n protected readonly label = computed(() => {\n if (!this.info) return '';\n if (this.info.version) return `v${this.info.version}`;\n return [this.info.environment, this.info.commit, this.info.date]\n .filter(Boolean)\n .join(' · ');\n });\n\n /** The rest of the identity, for when the label is only a version. */\n protected readonly detail = computed(() => {\n if (!this.info) return '';\n return [this.info.commit, this.info.environment, this.info.date]\n .filter(Boolean)\n .join(' · ');\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, model } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EF_BUILD_INFO, EfBuildPackage } from '@elasticias/core';\nimport { EfDialogComponent, EfDialogAction } from '../ef-dialog/ef-dialog.component';\n\n/**\n * \"About this app\" — which build is running and what shared packages it\n * was compiled against.\n *\n * Reads `EF_BUILD_INFO` optionally and renders the build rows only when the\n * app provided it, so a consumer that wired no stamp still gets a usable\n * dialog with its product identity.\n *\n * It is deliberately a dialog rather than a screen: the information is\n * consulted (to paste a commit into an issue, to check which release a\n * tenant is on) and dismissed, never navigated to.\n *\n * ```html\n * <ef-about-dialog [(visible)]=\"aboutOpen\" product=\"Crescilio\" [edition]=\"tenantName()\" />\n * ```\n */\n@Component({\n selector: 'ef-about-dialog',\n standalone: true,\n templateUrl: './ef-about-dialog.component.html',\n styleUrl: './ef-about-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, EfDialogComponent],\n})\nexport class EfAboutDialogComponent {\n /** Two-way open state. */\n readonly visible = model(false);\n\n /** Product name, shown large under the mark. */\n readonly product = input('');\n\n /** One muted line under the product — a tenant, a plan, an edition. */\n readonly edition = input('');\n\n /** Brand mark. A logo wins over the initial when both are set; empty\n * means \"none\", the same way `edition` and `initial` read. */\n readonly logoUrl = input('');\n readonly initial = input('');\n\n /** Copyright holder on the last line. */\n readonly owner = input('Elasticias');\n\n protected readonly info = inject(EF_BUILD_INFO, { optional: true });\n\n protected readonly year = new Date().getFullYear();\n\n protected readonly packages = computed<EfBuildPackage[]>(() => this.info?.packages ?? []);\n\n /**\n * A released build is known by its version; an unreleased one has no\n * version to be known by. Same split as `ef-build-stamp`: printing an\n * empty row is worse than printing none.\n */\n protected readonly rows = computed<{ labelKey: string; value: string }[]>(() => {\n const i = this.info;\n if (!i) return [];\n return [\n { labelKey: 'common_about_version', value: i.version ? `v${i.version}` : '' },\n { labelKey: 'common_about_environment', value: i.environment },\n { labelKey: 'common_about_branch', value: i.branch },\n { labelKey: 'common_about_commit', value: i.commit },\n { labelKey: 'common_about_date', value: i.date },\n ].filter(row => !!row.value);\n });\n\n /** A footer button, not only the header ✕: a thumb needs a real target. */\n protected readonly closeAction: EfDialogAction[] = [\n { labelKey: 'common_close', severity: 'ghost' },\n ];\n}\n","<!-- appendTo=\"body\": ef-app-main is `overflow: hidden`, so a dialog left in\n place inside the content column is clipped by it. -->\n<ef-dialog\n [visible]=\"visible()\"\n (visibleChange)=\"visible.set($event)\"\n headerKey=\"common_about\"\n size=\"sm\"\n appendTo=\"body\"\n dismissableMask\n [actions]=\"closeAction\"\n>\n <div class=\"ef-about\">\n <span class=\"ef-about__mark\" aria-hidden=\"true\">\n @if (logoUrl()) {\n <img [src]=\"logoUrl()\" alt=\"\" />\n } @else {\n {{ initial() }}\n }\n </span>\n\n <p class=\"ef-about__product\">{{ product() }}</p>\n @if (edition()) {\n <p class=\"ef-about__edition\">{{ edition() }}</p>\n }\n\n @if (rows().length) {\n <dl class=\"ef-about__rows\">\n @for (row of rows(); track row.labelKey) {\n <div class=\"ef-about__row\">\n <dt>{{ row.labelKey | translate }}</dt>\n <dd>{{ row.value }}</dd>\n </div>\n }\n </dl>\n }\n\n @if (packages().length) {\n <h3 class=\"ef-about__group\">{{ 'common_about_packages' | translate }}</h3>\n <dl class=\"ef-about__rows ef-about__rows--scroll\">\n @for (pkg of packages(); track pkg.name) {\n <div class=\"ef-about__row\">\n <dt>{{ pkg.name }}</dt>\n <dd>{{ pkg.version }}</dd>\n </div>\n }\n </dl>\n }\n\n <p class=\"ef-about__owner\">© {{ year }} {{ owner() }}</p>\n </div>\n</ef-dialog>\n","import {\n booleanAttribute,\n Component,\n Input,\n} from '@angular/core';\nimport { FieldsetModule } from 'primeng/fieldset';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@Component({\n selector: 'ef-fieldset',\n standalone: true,\n templateUrl: './ef-fieldset.component.html',\n imports: [FieldsetModule, TranslateModule],\n})\nexport class EfFieldsetComponent {\n /** Direct legend text (not translated) */\n @Input() legend?: string;\n /** Translation key — takes priority over legend */\n @Input() legendKey?: string;\n\n @Input({ transform: booleanAttribute }) toggleable = false;\n @Input({ transform: booleanAttribute }) collapsed = false;\n @Input() styleClass?: string;\n}\n","<p-fieldset\n [legend]=\"legendKey ? (legendKey | translate) : legend\"\n [toggleable]=\"toggleable\"\n [collapsed]=\"collapsed\"\n [styleClass]=\"styleClass\"\n>\n <ng-content />\n</p-fieldset>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ButtonGroupModule } from 'primeng/buttongroup';\n\n@Component({\n selector: 'ef-button-group',\n standalone: true,\n template: `<p-buttonGroup><ng-content /></p-buttonGroup>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ButtonGroupModule],\n})\nexport class EfButtonGroupComponent {}\n","/**\n * Available Tailwind color names for badges\n */\nexport type EfBadgeColor =\n | 'emerald'\n | 'green'\n | 'lime'\n | 'orange'\n | 'amber'\n | 'yellow'\n | 'teal'\n | 'cyan'\n | 'sky'\n | 'blue'\n | 'indigo'\n | 'violet'\n | 'purple'\n | 'fuchsia'\n | 'pink'\n | 'rose'\n | 'slate'\n | 'gray'\n | 'zinc'\n | 'neutral'\n | 'stone'\n | 'red';\n\n/**\n * Badge size variants\n */\nexport type EfBadgeSize = 'sm' | 'md' | 'lg';\n\n/**\n * Badge style variants\n */\nexport type EfBadgeVariant = 'filled' | 'outline' | 'dot' | 'pill';\n\n/**\n * Badge configuration interface\n */\nexport interface EfBadgeConfig {\n /**\n * Text label to display (optional for 'dot' variant)\n */\n label?: string;\n\n /**\n * Badge color (Tailwind color name)\n * @default 'blue'\n */\n color?: EfBadgeColor;\n\n /**\n * Badge size\n * @default 'md'\n */\n size?: EfBadgeSize;\n\n /**\n * Badge style variant\n * @default 'filled'\n */\n variant?: EfBadgeVariant;\n\n /**\n * Custom CSS classes to apply\n */\n styleClass?: string;\n\n /**\n * Icon class (e.g., PrimeIcons) to display before label\n */\n icon?: string;\n\n /**\n * Whether to show the dot indicator\n * @default true for 'dot' variant, false otherwise\n */\n showDot?: boolean;\n}\n\n/**\n * Default badge configuration\n */\nexport const EF_BADGE_DEFAULTS: Required<Omit<EfBadgeConfig, 'label' | 'icon'>> = {\n color: 'blue',\n size: 'md',\n variant: 'filled',\n styleClass: '',\n showDot: false,\n};\n\n/**\n * Maps Tailwind colors to their background classes\n */\nexport const EF_BADGE_BG_COLORS: Record<EfBadgeColor, string> = {\n emerald: 'bg-emerald-500',\n green: 'bg-green-500',\n lime: 'bg-lime-500',\n orange: 'bg-orange-500',\n amber: 'bg-amber-500',\n yellow: 'bg-yellow-500',\n teal: 'bg-teal-500',\n cyan: 'bg-cyan-500',\n sky: 'bg-sky-500',\n blue: 'bg-blue-500',\n indigo: 'bg-indigo-500',\n violet: 'bg-violet-500',\n purple: 'bg-purple-500',\n fuchsia: 'bg-fuchsia-500',\n pink: 'bg-pink-500',\n rose: 'bg-rose-500',\n slate: 'bg-slate-500',\n gray: 'bg-gray-500',\n zinc: 'bg-zinc-500',\n neutral: 'bg-neutral-500',\n stone: 'bg-stone-500',\n red: 'bg-red-500',\n};\n\n/**\n * Maps Tailwind colors to their text classes\n */\nexport const EF_BADGE_TEXT_COLORS: Record<EfBadgeColor, string> = {\n emerald: 'text-emerald-700',\n green: 'text-green-700',\n lime: 'text-lime-700',\n orange: 'text-orange-700',\n amber: 'text-amber-700',\n yellow: 'text-yellow-700',\n teal: 'text-teal-700',\n cyan: 'text-cyan-700',\n sky: 'text-sky-700',\n blue: 'text-blue-700',\n indigo: 'text-indigo-700',\n violet: 'text-violet-700',\n purple: 'text-purple-700',\n fuchsia: 'text-fuchsia-700',\n pink: 'text-pink-700',\n rose: 'text-rose-700',\n slate: 'text-slate-700',\n gray: 'text-gray-700',\n zinc: 'text-zinc-700',\n neutral: 'text-neutral-700',\n stone: 'text-stone-700',\n red: 'text-red-700',\n};\n\n/**\n * Maps Tailwind colors to their border classes\n */\nexport const EF_BADGE_BORDER_COLORS: Record<EfBadgeColor, string> = {\n emerald: 'border-emerald-500',\n green: 'border-green-500',\n lime: 'border-lime-500',\n orange: 'border-orange-500',\n amber: 'border-amber-500',\n yellow: 'border-yellow-500',\n teal: 'border-teal-500',\n cyan: 'border-cyan-500',\n sky: 'border-sky-500',\n blue: 'border-blue-500',\n indigo: 'border-indigo-500',\n violet: 'border-violet-500',\n purple: 'border-purple-500',\n fuchsia: 'border-fuchsia-500',\n pink: 'border-pink-500',\n rose: 'border-rose-500',\n slate: 'border-slate-500',\n gray: 'border-gray-500',\n zinc: 'border-zinc-500',\n neutral: 'border-neutral-500',\n stone: 'border-stone-500',\n red: 'border-red-500',\n};\n\n/**\n * Maps Tailwind colors to their light background classes (for filled variant)\n */\nexport const EF_BADGE_BG_LIGHT_COLORS: Record<EfBadgeColor, string> = {\n emerald: 'bg-emerald-100',\n green: 'bg-green-100',\n lime: 'bg-lime-100',\n orange: 'bg-orange-100',\n amber: 'bg-amber-100',\n yellow: 'bg-yellow-100',\n teal: 'bg-teal-100',\n cyan: 'bg-cyan-100',\n sky: 'bg-sky-100',\n blue: 'bg-blue-100',\n indigo: 'bg-indigo-100',\n violet: 'bg-violet-100',\n purple: 'bg-purple-100',\n fuchsia: 'bg-fuchsia-100',\n pink: 'bg-pink-100',\n rose: 'bg-rose-100',\n slate: 'bg-slate-100',\n gray: 'bg-gray-100',\n zinc: 'bg-zinc-100',\n neutral: 'bg-neutral-100',\n stone: 'bg-stone-100',\n red: 'bg-red-100',\n};\n","import { Component, computed, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n EfBadgeConfig,\n EfBadgeColor,\n EfBadgeSize,\n EfBadgeVariant,\n EF_BADGE_DEFAULTS,\n EF_BADGE_BG_COLORS,\n EF_BADGE_TEXT_COLORS,\n EF_BADGE_BORDER_COLORS,\n EF_BADGE_BG_LIGHT_COLORS,\n} from './ef-badge.component.types';\n\n/**\n * ef-badge - Reusable status badge component\n *\n * Features:\n * - Multiple color variants (Tailwind colors)\n * - Multiple size options (sm, md, lg)\n * - Multiple style variants (filled, outline, dot, pill)\n * - Icon support\n * - Fully customizable with styleClass\n *\n * @example\n * ```html\n * <!-- Simple filled badge -->\n * <ef-badge label=\"Active\" color=\"green\" />\n *\n * <!-- Dot variant -->\n * <ef-badge label=\"En attente\" color=\"yellow\" variant=\"dot\" />\n *\n * <!-- With icon -->\n * <ef-badge label=\"Error\" color=\"red\" icon=\"pi pi-exclamation-circle\" />\n *\n * <!-- Outline variant -->\n * <ef-badge label=\"Info\" color=\"blue\" variant=\"outline\" />\n *\n * <!-- Pill variant -->\n * <ef-badge label=\"New\" color=\"purple\" variant=\"pill\" />\n * ```\n */\n@Component({\n selector: 'ef-badge',\n standalone: true,\n templateUrl: './ef-badge.component.html',\n styleUrl: './ef-badge.component.scss',\n imports: [CommonModule],\n})\nexport class EfBadgeComponent {\n /**\n * Badge label text\n */\n label = input<string>();\n\n /**\n * Badge color (Tailwind color name)\n */\n color = input<EfBadgeColor>(EF_BADGE_DEFAULTS.color);\n\n /**\n * Badge size\n */\n size = input<EfBadgeSize>(EF_BADGE_DEFAULTS.size);\n\n /**\n * Badge style variant\n */\n variant = input<EfBadgeVariant>(EF_BADGE_DEFAULTS.variant);\n\n /**\n * Custom CSS classes\n */\n styleClass = input<string>(EF_BADGE_DEFAULTS.styleClass);\n\n /**\n * Icon class (e.g., PrimeIcons)\n */\n icon = input<string>();\n\n /**\n * Whether to show the dot indicator\n */\n showDot = input<boolean>(EF_BADGE_DEFAULTS.showDot);\n\n /**\n * Computed badge configuration with defaults\n */\n config = computed<Required<EfBadgeConfig>>(() => ({\n label: this.label() || '',\n color: this.color(),\n size: this.size(),\n variant: this.variant(),\n styleClass: this.styleClass(),\n icon: this.icon() || '',\n showDot: this.showDot() || this.variant() === 'dot',\n }));\n\n /**\n * Computed CSS classes for the badge\n */\n badgeClasses = computed(() => {\n const cfg = this.config();\n const classes: string[] = ['ef-badge'];\n\n // Base classes\n classes.push('inline-flex', 'items-center', 'gap-1.5', 'font-medium');\n\n // Size classes\n switch (cfg.size) {\n case 'sm':\n classes.push('text-xs', 'px-2', 'py-0.5');\n break;\n case 'md':\n classes.push('text-sm', 'px-2.5', 'py-1');\n break;\n case 'lg':\n classes.push('text-base', 'px-3', 'py-1.5');\n break;\n }\n\n // Variant-specific classes\n switch (cfg.variant) {\n case 'filled':\n classes.push('rounded');\n classes.push(EF_BADGE_BG_LIGHT_COLORS[cfg.color]);\n classes.push(EF_BADGE_TEXT_COLORS[cfg.color]);\n break;\n\n case 'outline':\n classes.push('rounded', 'border-2');\n classes.push(EF_BADGE_BORDER_COLORS[cfg.color]);\n classes.push(EF_BADGE_TEXT_COLORS[cfg.color]);\n classes.push('bg-white');\n break;\n\n case 'dot':\n classes.push('rounded');\n classes.push(EF_BADGE_TEXT_COLORS[cfg.color]);\n break;\n\n case 'pill':\n classes.push('rounded-full');\n classes.push(EF_BADGE_BG_LIGHT_COLORS[cfg.color]);\n classes.push(EF_BADGE_TEXT_COLORS[cfg.color]);\n break;\n }\n\n // Custom classes\n if (cfg.styleClass) {\n classes.push(cfg.styleClass);\n }\n\n return classes.join(' ');\n });\n\n /**\n * Computed CSS classes for the dot indicator\n */\n dotClasses = computed(() => {\n const cfg = this.config();\n const classes: string[] = ['inline-block', 'shrink-0', 'rounded-full'];\n\n // Dot size based on badge size\n switch (cfg.size) {\n case 'sm':\n classes.push('w-2', 'h-2');\n break;\n case 'md':\n classes.push('w-2.5', 'h-2.5');\n break;\n case 'lg':\n classes.push('w-3', 'h-3');\n break;\n }\n\n // Dot color\n classes.push(EF_BADGE_BG_COLORS[cfg.color]);\n\n return classes.join(' ');\n });\n\n /**\n * Computed CSS classes for the icon\n */\n iconClasses = computed(() => {\n const cfg = this.config();\n const classes: string[] = [];\n\n if (cfg.icon) {\n classes.push(cfg.icon);\n }\n\n // Icon size based on badge size\n switch (cfg.size) {\n case 'sm':\n classes.push('text-xs');\n break;\n case 'md':\n classes.push('text-sm');\n break;\n case 'lg':\n classes.push('text-base');\n break;\n }\n\n return classes.join(' ');\n });\n}\n","<span [class]=\"badgeClasses()\">\n <!-- Dot indicator -->\n @if (config().showDot) {\n <span [class]=\"dotClasses()\"></span>\n }\n\n <!-- Icon -->\n @if (config().icon) {\n <i [class]=\"iconClasses()\"></i>\n }\n\n <!-- Label -->\n @if (config().label) {\n <span>{{ config().label }}</span>\n }\n</span>\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n inject,\n Input,\n Output,\n} from '@angular/core';\nimport { EfButtonComponent } from '../ef-button/ef-button.component';\nimport { IconFieldModule } from 'primeng/iconfield';\nimport { InputIconModule } from 'primeng/inputicon';\nimport { ToolbarModule } from 'primeng/toolbar';\nimport { ScreenStateEnum, ScreenContext } from '@elasticias/screens';\nimport { Router } from '@angular/router';\nimport { Permissions } from '@elasticias/types';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@Component({\n selector: 'ef-toolbar',\n standalone: true,\n templateUrl: 'ef-toolbar.component.html',\n styleUrl: 'ef-toolbar.component.scss',\n imports: [\n CommonModule,\n ToolbarModule,\n EfButtonComponent,\n IconFieldModule,\n InputIconModule,\n InputTextModule,\n FormsModule,\n TranslateModule,\n ],\n})\nexport class EfToolbarComponent {\n @Input() context: ScreenContext;\n\n @Input() state: string;\n @Input() disabled: boolean;\n\n // Detail Action\n @Output() back = new EventEmitter();\n @Output() save = new EventEmitter();\n @Output() delete = new EventEmitter();\n @Output() duplicate = new EventEmitter();\n @Output() print = new EventEmitter();\n @Output() triggerCustoAction = new EventEmitter<any>();\n\n // Search Actions\n @Output() add = new EventEmitter();\n // `search` collides with the native HTMLInputElement `search` event. The\n // no-output-native rule is not enabled in this config, so there is nothing to\n // suppress; renaming would churn every consumer template, so the name stays.\n // `search` shadows a native DOM event name. Renaming this output would\n // churn every consumer template, so the name stays and the rule is\n // suppressed here deliberately.\n // eslint-disable-next-line @angular-eslint/no-output-native\n @Output() search = new EventEmitter();\n @Output() clear = new EventEmitter();\n\n searchText = '';\n\n // Flags\n @Input() backButton = false;\n @Input() deleteButton = false;\n @Input() duplicateButton = true;\n @Input() saveButton = true;\n @Input() exportButton = false;\n @Input() printButton = false;\n @Input() addButton = true;\n @Input() clearButton = true;\n @Input() searchButton = true;\n @Input() showFreeSearchInput = false;\n\n private router = inject(Router);\n\n get isSearchState(): boolean {\n return this.state === ScreenStateEnum.SEARCH;\n }\n\n get isDetailState(): boolean {\n return this.state === ScreenStateEnum.DETAIL;\n }\n\n get hasReadPermission(): boolean {\n return this.context.isGranted(Permissions.Read);\n }\n\n get hasCreatePermission(): boolean {\n return this.context.isGranted(Permissions.Create);\n }\n\n get hasEditPermission(): boolean {\n return this.context.isGranted(Permissions.Edit);\n }\n\n get hasDeletePermission(): boolean {\n return this.context.isGranted(Permissions.Delete);\n }\n\n get hasDuplicatePermission(): boolean {\n return this.context.isGranted(Permissions.Duplicate);\n }\n\n get hasExportPermission(): boolean {\n return this.context.isGranted(Permissions.Export);\n }\n\n get isDuplicateMode(): boolean {\n return this.context?.duplicateMode ?? false;\n }\n\n backAction() {\n this.back.emit();\n this.navigateBack();\n }\n\n deleteAction() {\n this.delete.emit();\n }\n\n saveAction() {\n this.save.emit();\n }\n\n duplicateAction() {\n this.duplicate.emit();\n }\n\n printAction() {\n this.print.emit();\n }\n\n exportAction() {\n this.add.emit();\n }\n\n addAction() {\n this.add.emit();\n }\n\n searchAction() {\n this.search.emit();\n }\n\n clearAction() {\n this.clear.emit();\n }\n\n navigateBack() {\n const currentUrl = this.router.url;\n const baseUrl = currentUrl.substring(0, currentUrl.indexOf('/details'));\n this.router.navigate([baseUrl]);\n }\n}\n","<p-toolbar>\n <ng-template #start>\n <div class=\"flex items-center gap-3\">\n @if (isDetailState || backButton) {\n <ef-button\n icon=\"pi pi-angle-left\"\n severity=\"primary\"\n styleClass=\"action-btn-text\"\n tooltipKey=\"common.back\"\n labelKey=\"common.back\"\n size=\"small\"\n (clickEvent)=\"backAction()\"\n />\n }\n <!-- Custom content slot for start section (e.g., status badge) -->\n <ng-content select=\"[toolbarStart]\" />\n </div>\n </ng-template>\n <ng-template #center>\n @if (showFreeSearchInput) {\n <p-iconfield iconPosition=\"left\">\n <p-inputicon styleClass=\"pi pi-search\" />\n <input\n id=\"freeTextSearch\"\n type=\"text\"\n pInputText\n [placeholder]=\"'common.search' | translate\"\n />\n </p-iconfield>\n }\n </ng-template>\n <ng-template #end>\n <!-- DETAIL state -->\n <!-- Custom content slot for start section (e.g., status badge) -->\n <ng-content select=\"[toolbarEnd]\" />\n @if (isDetailState && isDuplicateMode) {\n <span\n class=\"duplicate-badge flex items-center gap-1 rounded bg-blue-100 px-2 py-1 text-sm text-blue-700\"\n >\n <i class=\"pi pi-copy\"></i> {{ 'common.duplicate' | translate }}\n </span>\n }\n @if (isDetailState && deleteButton && hasDeletePermission) {\n <ef-button\n icon=\"pi pi-trash\"\n severity=\"danger\"\n styleClass=\"action-btn\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.delete\"\n size=\"small\"\n [disabled]=\"disabled\"\n (clickEvent)=\"deleteAction()\"\n />\n }\n @if (isDetailState && printButton) {\n <ef-button\n icon=\"pi pi-print\"\n severity=\"primary\"\n styleClass=\"action-btn\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.print\"\n size=\"small\"\n [disabled]=\"disabled\"\n (clickEvent)=\"printAction()\"\n />\n }\n @if (\n isDetailState &&\n duplicateButton &&\n hasDuplicatePermission &&\n !isDuplicateMode\n ) {\n <ef-button\n icon=\"pi pi-copy\"\n severity=\"primary\"\n styleClass=\"action-btn\"\n tooltipPosition=\"left\"\n tooltipKey=\"common.duplicate\"\n size=\"small\"\n [disabled]=\"disabled\"\n (clickEvent)=\"duplicateAction()\"\n />\n }\n @if (isDetailState && saveButton && (hasCreatePermission || hasEditPermission)) {\n <ef-button\n icon=\"pi pi-save\"\n severity=\"primary\"\n styleClass=\"action-btn\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.save\"\n size=\"small\"\n [disabled]=\"disabled\"\n (clickEvent)=\"saveAction()\"\n />\n }\n <!-- SEARCH state -->\n @if (isSearchState && exportButton && hasExportPermission) {\n <ef-button\n icon=\"pi pi-upload\"\n severity=\"primary\"\n styleClass=\"action-btn\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.export\"\n size=\"small\"\n (clickEvent)=\"exportAction()\"\n />\n }\n @if (isSearchState && addButton && hasCreatePermission) {\n <ef-button\n icon=\"pi pi-plus\"\n severity=\"primary\"\n styleClass=\"action-btn-text\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.add\"\n labelKey=\"common.add\"\n size=\"small\"\n (clickEvent)=\"addAction()\"\n />\n }\n @if (isSearchState && clearButton) {\n <ef-button\n icon=\"pi pi-filter-slash\"\n severity=\"primary\"\n styleClass=\"action-btn-text\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.clear_search_criteria\"\n labelKey=\"common.clear\"\n size=\"small\"\n (clickEvent)=\"clearAction()\"\n />\n }\n @if (isSearchState && searchButton && hasReadPermission) {\n <ef-button\n icon=\"pi pi-search\"\n severity=\"primary\"\n styleClass=\"action-btn-text\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.search\"\n labelKey=\"common.search\"\n size=\"small\"\n [disabled]=\"disabled\"\n (clickEvent)=\"searchAction()\"\n />\n }\n </ng-template>\n</p-toolbar>\n","import { ChangeDetectionStrategy, Component, computed, inject, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { TranslateModule } from '@ngx-translate/core';\nimport {\n EfActiveModuleService,\n EfModule,\n EfModuleId,\n EfPermissionService,\n} from '@elasticias/core';\n\n/**\n * Rail row — either a module button (with the metadata needed by the\n * template) or a divider rendered between two modules whose `group`\n * differs.\n */\ntype RailRow =\n | { kind: 'module'; module: EfModule }\n | { kind: 'divider' };\n\n/**\n * 64px vertical module switcher rendered at the left of `ef-app-shell`\n * on desktop and tablet. Black (`--ink-active`) background with\n * white-alpha icons, 44×44px buttons, and a 3px module-color accent\n * strip on the inside edge of the active button.\n *\n * Reads from `EfPermissionService.visibleModules()` and\n * `EfActiveModuleService.activeModule()`. No per-app wiring needed.\n *\n * Apps can supply per-module badge content (e.g., notification counts)\n * via the `[badges]` input keyed by module id, and project a logo into\n * the `[logo]` content slot — typical content is the tenant initial,\n * an avatar, or a small SVG. When a logo is projected, a hairline\n * divider is rendered between the logo and the first module group.\n *\n * Dividers also appear automatically between consecutive modules whose\n * `EfModule.group` differs (e.g. Sales/operations followed by\n * Admin/admin).\n */\n@Component({\n selector: 'ef-module-rail',\n standalone: true,\n templateUrl: './ef-module-rail.component.html',\n styleUrl: './ef-module-rail.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TooltipModule, TranslateModule],\n})\nexport class EfModuleRailComponent {\n private readonly perms = inject(EfPermissionService);\n private readonly active = inject(EfActiveModuleService);\n private readonly router = inject(Router);\n\n /** Optional notification badges per module id. */\n @Input() badges: Partial<Record<EfModuleId, string | number>> = {};\n\n readonly visibleModules = this.perms.visibleModules;\n readonly activeId = this.active.activeModuleId;\n\n /** Visible modules interleaved with dividers at group boundaries. */\n readonly rows = computed<RailRow[]>(() => {\n const rows: RailRow[] = [];\n let prevGroup: string | undefined;\n for (const module of this.visibleModules()) {\n if (rows.length > 0 && module.group !== prevGroup) {\n rows.push({ kind: 'divider' });\n }\n rows.push({ kind: 'module', module });\n prevGroup = module.group;\n }\n return rows;\n });\n\n readonly hasBadges = computed(() => Object.keys(this.badges).length > 0);\n\n onSelect(module: EfModule): void {\n this.router.navigateByUrl(module.defaultRoute);\n }\n\n badgeFor(id: EfModuleId): string | number | undefined {\n return this.badges[id];\n }\n\n trackRow(index: number, row: RailRow): string {\n return row.kind === 'module' ? `m:${row.module.id}` : `d:${index}`;\n }\n}\n","<nav class=\"ef-module-rail\" aria-label=\"Modules\">\n <div class=\"ef-module-rail__logo-slot\">\n <ng-content select=\"[logo]\"></ng-content>\n </div>\n\n @for (row of rows(); track trackRow($index, row)) {\n @if (row.kind === 'divider') {\n <span class=\"ef-module-rail__divider\" aria-hidden=\"true\"></span>\n } @else {\n <button\n type=\"button\"\n class=\"ef-module-rail__btn\"\n [class.is-active]=\"activeId() === row.module.id\"\n [attr.data-module]=\"row.module.id\"\n [attr.aria-current]=\"activeId() === row.module.id ? 'page' : null\"\n [style.--m-color]=\"'var(--' + row.module.accent + ')'\"\n [pTooltip]=\"row.module.labelKey | translate\"\n tooltipPosition=\"right\"\n (click)=\"onSelect(row.module)\"\n >\n <i class=\"ef-module-rail__icon\" [class]=\"row.module.icon\" aria-hidden=\"true\"></i>\n\n @if (badgeFor(row.module.id); as badge) {\n <span class=\"ef-module-rail__badge\">{{ badge }}</span>\n }\n\n <span class=\"ef-module-rail__sr\">{{ row.module.labelKey | translate }}</span>\n </button>\n }\n }\n</nav>\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router, RouterLink, RouterLinkActive } from '@angular/router';\nimport { TranslateModule } from '@ngx-translate/core';\nimport {\n EfActiveModuleService,\n EfNavItem,\n EfNavSection,\n EfPermissionService,\n} from '@elasticias/core';\n\n/**\n * 240px module-specific side panel. Renders the active module's\n * `navSections`, filtered by `EfPermissionService.can()` against\n * each item's `requiredAction` (defaults to `'read'`).\n *\n * When no module is active, or the active module has no sections,\n * the panel collapses (renders nothing) — apps using `ef-app-shell`\n * already handle the layout reflow.\n */\n@Component({\n selector: 'ef-module-side',\n standalone: true,\n templateUrl: './ef-module-side.component.html',\n styleUrl: './ef-module-side.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, RouterLink, RouterLinkActive, TranslateModule],\n host: {\n '[attr.data-module]': 'moduleId()',\n },\n})\nexport class EfModuleSideComponent {\n private readonly active = inject(EfActiveModuleService);\n private readonly perms = inject(EfPermissionService);\n\n readonly module = this.active.activeModule;\n readonly moduleId = this.active.activeModuleId;\n\n readonly visibleSections = computed<EfNavSection[]>(() => {\n const m = this.module();\n if (!m) return [];\n\n return m.navSections\n .map(section => ({\n ...section,\n items: section.items.filter(item =>\n this.perms.can(m.id, item.requiredAction ?? 'read')\n ),\n }))\n .filter(section => section.items.length > 0);\n });\n\n trackSection(_: number, s: EfNavSection): string {\n return s.id;\n }\n\n trackItem(_: number, i: EfNavItem): string {\n return i.id;\n }\n}\n","@if (module(); as m) {\n <div class=\"ef-module-side__scroll\">\n <header class=\"ef-module-side__header\">\n <span\n class=\"ef-module-side__header-icon\"\n [style.--m-color]=\"'var(--' + m.accent + ')'\"\n aria-hidden=\"true\"\n >\n @if (m.icon) {\n <i [class]=\"m.icon\"></i>\n }\n </span>\n <span class=\"ef-module-side__header-text\">\n <span class=\"ef-module-side__name\">{{ m.labelKey | translate }}</span>\n <span class=\"ef-module-side__meta\">\n <ng-content select=\"[side-header-meta]\"></ng-content>\n </span>\n </span>\n </header>\n\n @for (section of visibleSections(); track section.id) {\n <section class=\"ef-module-side__section\">\n @if (section.labelKey) {\n <h3 class=\"ef-module-side__section-title\">{{ section.labelKey | translate }}</h3>\n }\n <ul class=\"ef-module-side__list\">\n @for (item of section.items; track item.id) {\n <li>\n <a\n class=\"ef-module-side__item\"\n [routerLink]=\"item.route\"\n routerLinkActive=\"is-active\"\n [routerLinkActiveOptions]=\"{ exact: false }\"\n >\n @if (item.icon) {\n <i class=\"ef-module-side__icon\" [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n <span class=\"ef-module-side__label\">{{ item.labelKey | translate }}</span>\n @if (item.badge !== undefined && item.badge !== null) {\n <span class=\"ef-module-side__badge\">{{ item.badge }}</span>\n }\n </a>\n </li>\n }\n </ul>\n </section>\n }\n </div>\n\n <div class=\"ef-module-side__footer\">\n <ng-content></ng-content>\n </div>\n}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EF_SESSION, EfActiveModuleService } from '@elasticias/core';\nimport { EfThemeToggleComponent } from '../ef-theme-toggle/ef-theme-toggle.component';\n\n/**\n * Top chrome bar for the desktop and mobile shells.\n *\n * Layout is three slots: `breadcrumb` (left), `search` (centre), and\n * `actions` (right). Apps project into `search` and `actions` for global\n * features (⌘K, notifications bell, profile chip).\n *\n * The breadcrumb slot fills automatically from `EfActiveModuleService`:\n * a leading dot in the active module's accent, the module label, then\n * the active nav-item label as the leaf. Apps that need a custom\n * breadcrumb can still project their own content into `[breadcrumb]`.\n */\n@Component({\n selector: 'ef-app-top',\n standalone: true,\n templateUrl: './ef-app-top.component.html',\n styleUrl: './ef-app-top.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TranslateModule, EfThemeToggleComponent],\n})\nexport class EfAppTopComponent {\n /**\n * Show the light/dark switch at the trailing edge of the bar.\n *\n * It lives here rather than being projected through `[actions]`\n * because that slot is declared once per viewport branch in\n * `ef-app-shell` and only the mobile one receives content — so\n * anything an app projects there never appears on desktop.\n */\n readonly themeToggle = input(true, { transform: booleanAttribute });\n\n /**\n * Show the sign-out button. It only renders when the app has provided\n * `EF_SESSION`, so this input turns off a control the app opted into\n * rather than being the thing that enables it.\n */\n readonly logout = input(true, { transform: booleanAttribute });\n\n /** Present only when the app provides `EF_SESSION`. */\n protected readonly session = inject(EF_SESSION, { optional: true });\n\n protected signOut(): void {\n this.session?.logout();\n }\n\n private readonly active = inject(EfActiveModuleService);\n\n readonly module = this.active.activeModule;\n readonly navItem = this.active.activeNavItem;\n\n readonly hasBreadcrumb = computed(() => this.module() != null);\n}\n","<div class=\"ef-app-top__slot ef-app-top__slot--breadcrumb\">\n <ng-content select=\"[breadcrumb]\"></ng-content>\n @if (hasBreadcrumb()) {\n <nav class=\"ef-app-top__crumb\" aria-label=\"breadcrumb\">\n <span class=\"ef-app-top__crumb-dot\" [attr.data-module]=\"module()!.id\" aria-hidden=\"true\"></span>\n <span class=\"ef-app-top__crumb-root\">{{ module()!.labelKey | translate }}</span>\n @if (navItem(); as item) {\n <span class=\"ef-app-top__crumb-sep\" aria-hidden=\"true\">/</span>\n <span class=\"ef-app-top__crumb-leaf\">{{ item.labelKey | translate }}</span>\n }\n </nav>\n }\n</div>\n\n<div class=\"ef-app-top__slot ef-app-top__slot--actions\">\n <ng-content select=\"[actions]\"></ng-content>\n @if (themeToggle()) {\n <ef-theme-toggle />\n }\n @if (logout() && session) {\n <button\n type=\"button\"\n class=\"ef-app-top__logout\"\n [attr.aria-label]=\"'common_logout' | translate\"\n [attr.title]=\"'common_logout' | translate\"\n (click)=\"signOut()\"\n >\n <i class=\"pi pi-sign-out\" aria-hidden=\"true\"></i>\n </button>\n }\n</div>\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, Input } from '@angular/core';\nimport { EfActiveModuleService } from '@elasticias/core';\n\n/**\n * Content scroll container. Lives at the right of the rail+side\n * on desktop, full-width on mobile. Sets `data-module` so the\n * Comptoir SCSS layer's `[data-module=\"...\"]` rules apply the\n * active module's `--module` accent inside this region.\n *\n * Usage:\n * ```html\n * <ef-app-main [stripe]=\"true\">\n * <router-outlet />\n * </ef-app-main>\n * ```\n *\n * Reads the active module from `EfActiveModuleService` — no per-app\n * wiring required.\n */\n@Component({\n selector: 'ef-app-main',\n standalone: true,\n templateUrl: './ef-app-main.component.html',\n styleUrl: './ef-app-main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-module]': 'moduleId()',\n },\n})\nexport class EfAppMainComponent {\n private readonly activeModule = inject(EfActiveModuleService);\n\n /** Render the 3px module-color stripe at the top of the content area. */\n @Input({ transform: booleanAttribute }) stripe = false;\n\n /** `data-module` value bound to the host. Null when no module is active. */\n readonly moduleId = computed(() => this.activeModule.activeModuleId());\n}\n","@if (stripe) {\n <div class=\"ef-app-main__stripe\" aria-hidden=\"true\"></div>\n}\n<div class=\"ef-app-main__content\">\n <ng-content></ng-content>\n</div>\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostListener,\n Input,\n Output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n/**\n * Slide-up overlay with a grabber. Replaces dropdowns and dialogs on\n * mobile per the Comptoir plan. Controlled component — apps drive\n * `[open]` and listen to `(openChange)`.\n *\n * Tapping the backdrop or pressing Escape emits `openChange.emit(false)`.\n *\n * Usage:\n * ```html\n * <ef-bottom-sheet [open]=\"filtersOpen()\" (openChange)=\"filtersOpen.set($event)\">\n * <ng-template>...filters body...</ng-template>\n * </ef-bottom-sheet>\n * ```\n */\n@Component({\n selector: 'ef-bottom-sheet',\n standalone: true,\n templateUrl: './ef-bottom-sheet.component.html',\n styleUrl: './ef-bottom-sheet.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule],\n host: {\n '[class.is-open]': 'open',\n '[attr.aria-hidden]': '!open',\n },\n})\nexport class EfBottomSheetComponent {\n @Input({ transform: booleanAttribute }) open = false;\n @Input({ transform: booleanAttribute }) dismissOnBackdrop = true;\n\n @Output() openChange = new EventEmitter<boolean>();\n\n onBackdropClick(): void {\n if (this.dismissOnBackdrop) this.close();\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.open) this.close();\n }\n\n close(): void {\n this.open = false;\n this.openChange.emit(false);\n }\n}\n","<div class=\"ef-bottom-sheet__backdrop\" (click)=\"onBackdropClick()\" aria-hidden=\"true\"></div>\n\n<div class=\"ef-bottom-sheet__panel\" role=\"dialog\" aria-modal=\"true\">\n <div class=\"ef-bottom-sheet__grabber\" aria-hidden=\"true\"></div>\n <div class=\"ef-bottom-sheet__body\">\n <ng-content></ng-content>\n </div>\n</div>\n","import { ChangeDetectionStrategy, Component, computed, inject, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EfViewportService } from '@elasticias/core';\nimport { EfModuleRailComponent } from '../ef-module-rail/ef-module-rail.component';\nimport { EfModuleSideComponent } from '../ef-module-side/ef-module-side.component';\nimport { EfAppTopComponent } from '../ef-app-top/ef-app-top.component';\nimport { EfAppMainComponent } from '../ef-app-main/ef-app-main.component';\nimport { EfBottomSheetComponent } from '../ef-bottom-sheet/ef-bottom-sheet.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { Router, RouterLink } from '@angular/router';\nimport {\n EfActiveModuleService,\n EfPermissionService,\n EfModule,\n EfNavItem,\n EfNavSection,\n} from '@elasticias/core';\nimport { signal } from '@angular/core';\n\n/**\n * Top-level Comptoir shell.\n *\n * Composes the chrome an Elasticias app puts around its `<router-outlet />`.\n * Apps mount it at their root component:\n *\n * ```html\n * <ef-app-shell>\n * <router-outlet />\n * </ef-app-shell>\n * ```\n *\n * The shell reads:\n * - `EfViewportService` to switch between desktop and mobile branches\n * - `EfPermissionService` (via the rail / mobile tabs) for visible modules\n * - `EfActiveModuleService` for the active module accent\n *\n * **Desktop / tablet:** rail (64px) + side (240px) + (top + main).\n * **Mobile:** delegates to `<ef-app-shell-mobile>` — top bar + scrollable\n * body + 5-tab bottom bar + FAB slot.\n *\n * Top-bar slots are forwarded to `<ef-app-top>` on both layouts: project\n * with `breadcrumb`, `search`, `actions` attributes. The `side-footer`\n * slot is forwarded to the bottom of `<ef-module-side>` (desktop only —\n * mobile drops it; surface identity via `[actions]` instead). The `logo`\n * slot is forwarded to the top of `<ef-module-rail>` (desktop/tablet\n * only — mobile uses the bottom tab bar instead).\n */\n@Component({\n selector: 'ef-app-shell',\n standalone: true,\n templateUrl: './ef-app-shell.component.html',\n styleUrl: './ef-app-shell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n EfModuleRailComponent,\n EfModuleSideComponent,\n EfAppTopComponent,\n EfAppMainComponent,\n EfBottomSheetComponent,\n TranslateModule,\n RouterLink,\n ],\n host: {\n '[attr.data-viewport]': 'viewport()',\n },\n})\nexport class EfAppShellComponent {\n private readonly vp = inject(EfViewportService);\n private readonly perms = inject(EfPermissionService);\n private readonly active = inject(EfActiveModuleService);\n private readonly router = inject(Router);\n\n /** Show the 3px module-color stripe at the top of the content area. */\n @Input() stripe = true;\n\n readonly viewport = this.vp.current;\n readonly isMobile = this.vp.isMobile;\n readonly showSide = computed(() => !this.vp.isMobile());\n\n /* ── Mobile chrome ───────────────────────────────────────────\n Tabs and the module sheet live here rather than in a child\n component: content has to be declared once, in one template,\n and a child shell would mean declaring the slots twice. */\n\n readonly activeId = this.active.activeModuleId;\n readonly switcherOpen = signal(false);\n\n /** Five tabs is what fits a phone; the rest live in the sheet. */\n readonly tabs = computed<EfModule[]>(() => this.perms.visibleModules().slice(0, 5));\n readonly allVisible = this.perms.visibleModules;\n\n /**\n * The screens inside the active module, for the mobile sheet.\n *\n * On a phone the side nav is not rendered, and the tab bar switches\n * modules — so without this there was no way to reach any screen except\n * the module's default one. Same filtering as `ef-module-side`, because\n * it answers the same question.\n */\n readonly moduleSections = computed<EfNavSection[]>(() => {\n const m = this.active.activeModule();\n if (!m) return [];\n return m.navSections\n .map(section => ({\n ...section,\n items: section.items.filter(item =>\n this.perms.can(m.id, item.requiredAction ?? 'read'),\n ),\n }))\n .filter(section => section.items.length > 0);\n });\n\n onNavigate(item: EfNavItem): void {\n this.router.navigateByUrl(item.route);\n this.switcherOpen.set(false);\n }\n\n openSwitcher(): void {\n this.switcherOpen.set(true);\n }\n\n /**\n * Dismiss the module sheet from outside.\n *\n * Every item the shell itself renders in the sheet navigates, and\n * navigating closes it. An app-level entry in the `[sheet-footer]` slot\n * may do neither — \"à propos\" opens a dialog — and would otherwise leave\n * the sheet standing behind it. The app owns that button, so the app says\n * when the sheet is done: `<ef-app-shell #shell>` then\n * `(click)=\"shell.closeSwitcher(); …\"`.\n */\n closeSwitcher(): void {\n this.switcherOpen.set(false);\n }\n\n onSwitcherChange(open: boolean): void {\n this.switcherOpen.set(open);\n }\n\n onSelect(module: EfModule): void {\n this.router.navigateByUrl(module.defaultRoute);\n this.switcherOpen.set(false);\n }\n}\n","<!-- One layout, one declaration per slot.\n Angular binds projected content to the LAST matching <ng-content> in a\n template, so declaring the same selector once per viewport branch meant the\n branch that was actually rendered on a phone received nothing — every\n screen came up blank inside working chrome. The layouts differ by CSS and\n by which chrome is rendered, never by where the content is declared. -->\n\n<ef-module-rail class=\"ef-app-shell__rail\">\n <ng-content select=\"[logo]\" logo></ng-content>\n</ef-module-rail>\n\n@if (showSide()) {\n <ef-module-side class=\"ef-app-shell__side\">\n <ng-content select=\"[side-header-meta]\" side-header-meta></ng-content>\n <ng-content select=\"[side-footer]\" side-footer></ng-content>\n </ef-module-side>\n}\n\n<div class=\"ef-app-shell__column\">\n <ef-app-top>\n <!-- The menu takes the breadcrumb's slot on a phone: the breadcrumb is\n hidden there (ef-app-top), so this is the leading position, which is\n where a menu button belongs and where a thumb reaches. -->\n @if (isMobile()) {\n <button\n breadcrumb\n type=\"button\"\n class=\"ef-app-shell__menu\"\n (click)=\"openSwitcher()\"\n [attr.aria-label]=\"'common_modules' | translate\"\n >\n <i class=\"pi pi-bars\" aria-hidden=\"true\"></i>\n </button>\n }\n <ng-content select=\"[breadcrumb]\" breadcrumb></ng-content>\n <ng-content select=\"[search]\" search></ng-content>\n <ng-content select=\"[actions]\" actions></ng-content>\n </ef-app-top>\n\n <ef-app-main [stripe]=\"stripe\">\n <ng-content></ng-content>\n </ef-app-main>\n\n @if (isMobile()) {\n <nav class=\"ef-app-shell__tabs\" [attr.aria-label]=\"'common_modules' | translate\">\n @for (module of tabs(); track module.id) {\n <button\n type=\"button\"\n class=\"ef-app-shell__tab\"\n [class.is-active]=\"activeId() === module.id\"\n [attr.data-module]=\"module.id\"\n [attr.aria-current]=\"activeId() === module.id ? 'page' : null\"\n (click)=\"onSelect(module)\"\n >\n <i class=\"ef-app-shell__tab-icon\" [class]=\"module.icon\" aria-hidden=\"true\"></i>\n <span class=\"ef-app-shell__tab-label\">{{ module.labelKey | translate }}</span>\n </button>\n }\n </nav>\n }\n</div>\n\n<ng-content select=\"[fab]\"></ng-content>\n\n@if (isMobile()) {\n <ef-bottom-sheet [open]=\"switcherOpen()\" (openChange)=\"onSwitcherChange($event)\">\n <!-- The screens first: the tab bar already switches modules, so this is\n the only way to reach anything but a module's default screen. -->\n @for (section of moduleSections(); track section.id) {\n @if (section.labelKey) {\n <h2 class=\"ef-app-shell__sheet-title\">{{ section.labelKey | translate }}</h2>\n }\n <ul class=\"ef-app-shell__sheet-list\">\n @for (item of section.items; track item.id) {\n <li>\n <a\n class=\"ef-app-shell__sheet-item\"\n [routerLink]=\"item.route\"\n routerLinkActive=\"is-active\"\n (click)=\"onNavigate(item)\"\n >\n @if (item.icon) {\n <i [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n <span>{{ item.labelKey | translate }}</span>\n @if (item.badge !== undefined && item.badge !== null) {\n <span class=\"ef-app-shell__sheet-badge\">{{ item.badge }}</span>\n }\n </a>\n </li>\n }\n </ul>\n }\n\n <h2 class=\"ef-app-shell__sheet-title\">{{ 'common_modules' | translate }}</h2>\n <ul class=\"ef-app-shell__sheet-list\">\n @for (module of allVisible(); track module.id) {\n <li>\n <button\n type=\"button\"\n class=\"ef-app-shell__sheet-item\"\n [class.is-active]=\"activeId() === module.id\"\n [attr.data-module]=\"module.id\"\n (click)=\"onSelect(module)\"\n >\n <i [class]=\"module.icon\" aria-hidden=\"true\"></i>\n <span>{{ module.labelKey | translate }}</span>\n </button>\n </li>\n }\n </ul>\n\n <!-- App-level entries that live in the rail on a desktop and have nowhere\n else to go on a phone: this sheet is the phone's menu. Declared only\n in the mobile branch, so a desktop simply drops what is projected. -->\n <div class=\"ef-app-shell__sheet-footer\">\n <ng-content select=\"[sheet-footer]\" sheet-footer></ng-content>\n </div>\n </ef-bottom-sheet>\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { TooltipModule } from 'primeng/tooltip';\nimport {\n EfActiveModuleService,\n EfModule,\n EfPermissionService,\n} from '@elasticias/core';\nimport { EfAppTopComponent } from '../ef-app-top/ef-app-top.component';\nimport { EfAppMainComponent } from '../ef-app-main/ef-app-main.component';\nimport { EfBottomSheetComponent } from '../ef-bottom-sheet/ef-bottom-sheet.component';\n\n/**\n * Mobile-only shell. Picks up when `ef-app-shell` detects a mobile\n * viewport. Composition:\n *\n * - Top bar (`ef-app-top`) with a menu trigger that opens the module\n * switcher in a bottom sheet.\n * - Scrollable content (`ef-app-main`) — projects `<router-outlet />`.\n * - 5-tab bottom bar — first 5 visible modules from\n * `EfPermissionService.visibleModules()`. Apps that want a usage-\n * ranked tab order can replace the registry via `EF_MODULES_TOKEN`.\n * - FAB slot (`[fab]`) — apps project a `<ef-fab />` here.\n *\n * The module switcher (bottom sheet) lists all visible modules so\n * users can reach modules outside the top-5 tabs.\n */\n@Component({\n selector: 'ef-app-shell-mobile',\n standalone: true,\n templateUrl: './ef-app-shell-mobile.component.html',\n styleUrl: './ef-app-shell-mobile.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TranslateModule,\n TooltipModule,\n EfAppTopComponent,\n EfAppMainComponent,\n EfBottomSheetComponent,\n ],\n})\nexport class EfAppShellMobileComponent {\n private readonly perms = inject(EfPermissionService);\n private readonly active = inject(EfActiveModuleService);\n private readonly router = inject(Router);\n\n readonly activeId = this.active.activeModuleId;\n readonly switcherOpen = signal(false);\n\n readonly tabs = computed<EfModule[]>(() => this.perms.visibleModules().slice(0, 5));\n readonly allVisible = this.perms.visibleModules;\n\n openSwitcher(): void { this.switcherOpen.set(true); }\n onSwitcherChange(open: boolean): void { this.switcherOpen.set(open); }\n\n onSelect(module: EfModule): void {\n this.router.navigateByUrl(module.defaultRoute);\n this.switcherOpen.set(false);\n }\n}\n","<ef-app-top>\n <ng-content select=\"[breadcrumb]\" breadcrumb></ng-content>\n <ng-content select=\"[search]\" search></ng-content>\n <button\n actions\n type=\"button\"\n class=\"ef-app-shell-mobile__menu\"\n (click)=\"openSwitcher()\"\n aria-label=\"Modules\"\n >\n <i class=\"pi pi-bars\" aria-hidden=\"true\"></i>\n </button>\n <ng-content select=\"[actions]\" actions></ng-content>\n</ef-app-top>\n\n<ef-app-main [stripe]=\"true\">\n <ng-content></ng-content>\n</ef-app-main>\n\n<nav class=\"ef-app-shell-mobile__tabs\" aria-label=\"Modules\">\n @for (module of tabs(); track module.id) {\n <button\n type=\"button\"\n class=\"ef-app-shell-mobile__tab\"\n [class.is-active]=\"activeId() === module.id\"\n [attr.data-module]=\"module.id\"\n [attr.aria-current]=\"activeId() === module.id ? 'page' : null\"\n (click)=\"onSelect(module)\"\n >\n <i class=\"ef-app-shell-mobile__tab-icon\" [class]=\"module.icon\" aria-hidden=\"true\"></i>\n <span class=\"ef-app-shell-mobile__tab-label\">{{ module.labelKey | translate }}</span>\n </button>\n }\n</nav>\n\n<ng-content select=\"[fab]\"></ng-content>\n\n<ef-bottom-sheet [open]=\"switcherOpen()\" (openChange)=\"onSwitcherChange($event)\">\n <h2 class=\"ef-app-shell-mobile__sheet-title\">{{ 'modules.all' | translate }}</h2>\n <ul class=\"ef-app-shell-mobile__sheet-list\">\n @for (module of allVisible(); track module.id) {\n <li>\n <button\n type=\"button\"\n class=\"ef-app-shell-mobile__sheet-item\"\n [class.is-active]=\"activeId() === module.id\"\n [attr.data-module]=\"module.id\"\n (click)=\"onSelect(module)\"\n >\n <i [class]=\"module.icon\" aria-hidden=\"true\"></i>\n <span>{{ module.labelKey | translate }}</span>\n </button>\n </li>\n }\n </ul>\n</ef-bottom-sheet>\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\nexport type EfFabPosition = 'bottom-right' | 'bottom-center' | 'bottom-left';\n\n/**\n * Floating action button — mobile primary action surface.\n *\n * Lives at the bottom of the mobile viewport, carrying the screen's\n * principal action (e.g. Nouvelle commande). Reads `--tenant-500`\n * for its background; foreground is `--tenant-contrast` (defaults\n * to white). When `label` / `labelKey` is provided, renders as an\n * extended FAB with the label inline.\n *\n * Usage:\n * ```html\n * <ef-fab icon=\"pi pi-plus\" labelKey=\"orders.new\" (press)=\"onNew()\" />\n * ```\n */\n@Component({\n selector: 'ef-fab',\n standalone: true,\n templateUrl: './ef-fab.component.html',\n styleUrl: './ef-fab.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TranslateModule],\n host: {\n '[attr.data-position]': 'position',\n '[class.is-extended]': 'isExtended',\n },\n})\nexport class EfFabComponent {\n @Input() icon = 'pi pi-plus';\n @Input() label?: string;\n /** Translation key — takes priority over `label`. */\n @Input() labelKey?: string;\n\n @Input() position: EfFabPosition = 'bottom-right';\n\n @Input({ transform: booleanAttribute }) disabled = false;\n\n @Output() press = new EventEmitter<MouseEvent>();\n\n get isExtended(): boolean {\n return !!(this.label || this.labelKey);\n }\n\n onClick(e: MouseEvent): void {\n if (!this.disabled) this.press.emit(e);\n }\n}\n","<button\n type=\"button\"\n class=\"ef-fab\"\n [disabled]=\"disabled\"\n (click)=\"onClick($event)\"\n>\n <i class=\"ef-fab__icon\" [class]=\"icon\" aria-hidden=\"true\"></i>\n\n @if (isExtended) {\n <span class=\"ef-fab__label\">\n @if (labelKey) {\n {{ labelKey | translate }}\n } @else {\n {{ label }}\n }\n </span>\n }\n</button>\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\nexport interface EfPillItem<T = string> {\n value: T;\n /** Direct label (no translation). */\n label?: string;\n /** Translation key — takes priority over label. */\n labelKey?: string;\n /** Optional count rendered after a thin separator. */\n count?: number;\n}\n\n/**\n * Segmented pill filter. Used for tab-like selectors over a small\n * set of options — \"Toutes · 87 / À approuver · 14 / En retard · 3\".\n *\n * ```html\n * <ef-pill-group\n * [items]=\"filters\"\n * [(value)]=\"activeFilter\"\n * (valueChange)=\"onFilterChange($event)\"\n * />\n * ```\n *\n * The active pill picks up a contrast fill (`--ink-active`); inactive\n * pills sit on transparent ground with muted text. Heights map to\n * `--hit` (32px) so it stacks naturally next to compact action buttons.\n */\n@Component({\n selector: 'ef-pill-group',\n standalone: true,\n templateUrl: './ef-pill-group.component.html',\n styleUrl: './ef-pill-group.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TranslateModule],\n})\nexport class EfPillGroupComponent<T = string> {\n @Input({ required: true }) items: ReadonlyArray<EfPillItem<T>> = [];\n @Input() value: T | null = null;\n @Input() ariaLabel = 'filters';\n /** Hide counts even when items provide them. */\n @Input() hideCounts = false;\n\n @Output() readonly valueChange = new EventEmitter<T>();\n\n select(item: EfPillItem<T>): void {\n if (this.value !== item.value) {\n this.value = item.value;\n this.valueChange.emit(item.value);\n }\n }\n\n trackValue(_: number, item: EfPillItem<T>): T {\n return item.value;\n }\n}\n","<div class=\"ef-pill-group\" role=\"tablist\" [attr.aria-label]=\"ariaLabel\">\n @for (item of items; track trackValue($index, item)) {\n <button\n type=\"button\"\n class=\"ef-pill\"\n role=\"tab\"\n [class.is-active]=\"item.value === value\"\n [attr.aria-selected]=\"item.value === value\"\n (click)=\"select(item)\"\n >\n <span class=\"ef-pill__label\">\n @if (item.labelKey) {\n {{ item.labelKey | translate }}\n } @else {\n {{ item.label }}\n }\n </span>\n @if (!hideCounts && item.count !== undefined) {\n <span class=\"ef-pill__sep\" aria-hidden=\"true\">·</span>\n <span class=\"ef-pill__count\">{{ item.count }}</span>\n }\n </button>\n }\n</div>\n","import { Directive, Input, TemplateRef, inject } from '@angular/core';\n\n/**\n * Marks an `<ng-template>` as the panel renderer for a tab value on\n * `<ef-tabs>`. When at least one panel template is projected,\n * `ef-tabs` renders the matching one below the tablist. When none is\n * projected, the component stays a tablist only — the consumer owns\n * panel rendering via `@switch` / `@if` on the active value.\n *\n * ```html\n * <ef-tabs [items]=\"sections\" [(value)]=\"active\">\n * <ng-template efTabPanel=\"identity\">\n * <product-identity />\n * </ng-template>\n * <ng-template efTabPanel=\"media\">\n * <product-media />\n * </ng-template>\n * </ef-tabs>\n * ```\n *\n * The input value must match one of the `EfTabItem.value` entries the\n * tabset is driven by.\n */\n@Directive({\n selector: '[efTabPanel]',\n standalone: true,\n})\nexport class EfTabPanelDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n\n @Input({ alias: 'efTabPanel', required: true })\n value!: string;\n}\n","import {\n AfterContentInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n QueryList,\n TemplateRef,\n ViewChildren,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfTabPanelDirective } from './ef-tab-panel.directive';\n\n/** Visual treatment of the tabset. `'pill'` is the default. */\nexport type EfTabsVariant = 'pill' | 'underline';\n\n/** Known module slugs whose accent (`var(--m-{slug})`) drives the\n * active indicator and count tint when `variant === 'underline'`. */\nexport type EfTabsModule =\n | 'sales'\n | 'purchase'\n | 'stock'\n | 'pos'\n | 'marketing'\n | 'store'\n | 'finance'\n | 'admin';\n\nexport interface EfTabItem<T = string> {\n value: T;\n /** Direct label (not translated). */\n label?: string;\n /** Translation key — takes priority over `label`. */\n labelKey?: string;\n /** PrimeIcons class string, e.g. `'pi pi-th-large'`. Rendered\n * before the label, muted when idle. */\n icon?: string;\n /** Optional count rendered after the label in a mono badge. */\n count?: number;\n /** Show a dirty/unread dot after the label/count. */\n dirty?: boolean;\n disabled?: boolean;\n}\n\n/**\n * Comptoir tabset. Pilots the visible *view* on a detail screen\n * (Identité / Médias / Variantes / SEO / Activité…). Defaults to the\n * pill variant — chunky toggle suited for sub-modes (Editor / Preview,\n * Day / Week) — with `'underline'` available for fiche-wide navigation\n * where the active tab adopts the module accent.\n *\n * Two consumer surfaces, mirroring `<ef-data-card>`:\n *\n * 1. **Tablist only** — no panels projected. The component renders\n * the tab strip and emits `valueChange` ; the consumer owns panel\n * rendering via `@switch` / `@if`.\n *\n * ```html\n * <ef-tabs [items]=\"sections\" [(value)]=\"active\" />\n * @switch (active) {\n * @case ('identity') { <product-identity /> }\n * @case ('media') { <product-media /> }\n * }\n * ```\n *\n * 2. **Tabs + projected panels** — `<ng-template efTabPanel=\"…\">`\n * blocks declare the body of each tab. The component shows the one\n * whose `efTabPanel` matches the active value.\n *\n * ```html\n * <ef-tabs [items]=\"sections\" [(value)]=\"active\" variant=\"underline\" module=\"store\">\n * <ng-template efTabPanel=\"identity\"><product-identity /></ng-template>\n * <ng-template efTabPanel=\"media\"><product-media /></ng-template>\n * </ef-tabs>\n * ```\n *\n * For filter toggles over result sets (Toutes / Pending / Shipped),\n * prefer `<ef-pill-group>` — it shares the pill look but stays scoped\n * to filter selection rather than view switching.\n */\n@Component({\n selector: 'ef-tabs',\n standalone: true,\n templateUrl: './ef-tabs.component.html',\n styleUrl: './ef-tabs.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TranslateModule],\n host: {\n '[class.ef-tabs--pill]': \"variant === 'pill'\",\n '[class.ef-tabs--underline]': \"variant === 'underline'\",\n '[class.ef-tabs--overflow]': 'overflow',\n '[attr.data-module]': 'module ?? null',\n },\n})\nexport class EfTabsComponent<T = string> implements AfterContentInit {\n @Input({ required: true }) items: ReadonlyArray<EfTabItem<T>> = [];\n /** Currently-selected tab value. When no `*efTabPanel` templates\n * are projected, panel rendering is the consumer's job (typically\n * via `@switch (active)` in the template). */\n @Input() value: T | null = null;\n\n /** Visual variant. `'pill'` (default) is the segmented toggle ;\n * `'underline'` draws a 2px indicator under the active tab. */\n @Input() variant: EfTabsVariant = 'pill';\n\n /** Forces the module accent on the active indicator + count tint\n * (only meaningful for `variant='underline'`). When omitted, the\n * underline inherits `--module` from the closest `[data-module]`\n * ancestor (and falls back to `--ink-active`). */\n @Input() module?: EfTabsModule;\n\n /** Show edge fades when the tablist overflows horizontally. The\n * list itself always scrolls — tabs are never collapsed into a\n * menu. */\n @Input({ transform: booleanAttribute }) overflow = false;\n\n /** Hide count badges even when items provide them. */\n @Input({ transform: booleanAttribute }) hideCounts = false;\n\n @Input() ariaLabel = 'tabs';\n\n /** Translation key used as the `aria-label` of the dirty dot.\n * Defaults to `'common.dirty'` — apps add the matching entry to\n * `fr.json` / `ar.json`. */\n @Input() dirtyLabelKey = 'common.dirty';\n\n @Output() readonly valueChange = new EventEmitter<T>();\n\n @ViewChildren('tabEl') private tabEls?: QueryList<ElementRef<HTMLButtonElement>>;\n\n /* ── Content children (optional projected panels) ────────────── */\n\n @ContentChildren(EfTabPanelDirective)\n private readonly panels!: QueryList<EfTabPanelDirective>;\n\n private readonly panelMap = signal<Map<string, TemplateRef<unknown>>>(new Map());\n\n /** Active panel template for the current `value`, or `null` when\n * no template matches (incl. tablist-only mode). Read by the\n * template via `ngTemplateOutlet`. */\n activePanel(): TemplateRef<unknown> | null {\n const v = this.value;\n if (v === null || v === undefined) return null;\n return this.panelMap().get(String(v)) ?? null;\n }\n\n /** `true` when at least one `*efTabPanel` template has been\n * projected — toggles the panel rendering slot in the template. */\n hasPanels(): boolean {\n return this.panelMap().size > 0;\n }\n\n ngAfterContentInit(): void {\n this.panelMap.set(toPanelMap(this.panels));\n this.panels.changes.subscribe(() => this.panelMap.set(toPanelMap(this.panels)));\n }\n\n select(item: EfTabItem<T>): void {\n if (item.disabled) return;\n if (this.value !== item.value) {\n this.value = item.value;\n this.valueChange.emit(item.value);\n }\n }\n\n onKeydown(event: KeyboardEvent, index: number): void {\n const all = this.items;\n if (all.length === 0) return;\n\n // Build the cyclic list of enabled positions and locate the current one.\n const enabledPositions: number[] = [];\n for (let i = 0; i < all.length; i++) {\n if (!all[i].disabled) enabledPositions.push(i);\n }\n if (enabledPositions.length === 0) return;\n\n const here = enabledPositions.indexOf(index);\n let nextPos = -1;\n\n switch (event.key) {\n case 'ArrowRight':\n nextPos = enabledPositions[(here + 1) % enabledPositions.length];\n break;\n case 'ArrowLeft':\n nextPos =\n enabledPositions[(here - 1 + enabledPositions.length) % enabledPositions.length];\n break;\n case 'Home':\n nextPos = enabledPositions[0];\n break;\n case 'End':\n nextPos = enabledPositions[enabledPositions.length - 1];\n break;\n default:\n return;\n }\n\n event.preventDefault();\n const target = all[nextPos];\n this.select(target);\n // Focus follows selection — the WAI-ARIA \"tabs with automatic\n // activation\" pattern, mirrored from the prototype.\n const el = this.tabEls?.toArray()[nextPos]?.nativeElement;\n el?.focus();\n }\n\n trackValue(_: number, item: EfTabItem<T>): T {\n return item.value;\n }\n}\n\nfunction toPanelMap(\n panels: QueryList<EfTabPanelDirective>,\n): Map<string, TemplateRef<unknown>> {\n const map = new Map<string, TemplateRef<unknown>>();\n panels.forEach(p => map.set(p.value, p.templateRef));\n return map;\n}\n","<div class=\"ef-tabs__list\" role=\"tablist\" [attr.aria-label]=\"ariaLabel\">\n @for (item of items; track trackValue($index, item); let i = $index) {\n <button\n #tabEl\n type=\"button\"\n class=\"ef-tabs__tab\"\n role=\"tab\"\n [class.is-active]=\"item.value === value\"\n [class.is-disabled]=\"!!item.disabled\"\n [attr.aria-selected]=\"item.value === value\"\n [attr.aria-disabled]=\"item.disabled ? 'true' : null\"\n [disabled]=\"item.disabled\"\n [tabindex]=\"item.value === value ? 0 : -1\"\n (click)=\"select(item)\"\n (keydown)=\"onKeydown($event, i)\"\n >\n @if (item.icon) {\n <i class=\"ef-tabs__ico\" [class]=\"item.icon\" aria-hidden=\"true\"></i>\n }\n <span class=\"ef-tabs__label\">\n @if (item.labelKey) {\n {{ item.labelKey | translate }}\n } @else {\n {{ item.label }}\n }\n </span>\n @if (!hideCounts && item.count !== undefined && item.count !== null) {\n <span class=\"ef-tabs__count\">{{ item.count }}</span>\n }\n @if (item.dirty) {\n <span class=\"ef-tabs__dot\" [attr.aria-label]=\"dirtyLabelKey | translate\"></span>\n }\n </button>\n }\n</div>\n\n@if (hasPanels()) {\n <div class=\"ef-tabs__panels\" role=\"tabpanel\">\n @if (activePanel(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\"></ng-container>\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n booleanAttribute,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Compact identity chip — avatar + name + role — designed to sit at the\n * bottom of `ef-module-side` (project via the `side-footer` slot of\n * `ef-app-shell`). On mobile, apps usually surface the same identity in\n * the top bar `[actions]` slot instead.\n *\n * ```html\n * <ef-app-shell>\n * <ef-profile-chip\n * side-footer\n * [name]=\"user.name\"\n * [role]=\"user.roleLabel\"\n * (clickEvent)=\"openUserMenu()\"\n * />\n * <router-outlet />\n * </ef-app-shell>\n * ```\n *\n * The component is intentionally dumb: apps wire their own identity\n * source. Initials are derived from `name` unless explicitly overridden.\n */\n@Component({\n selector: 'ef-profile-chip',\n standalone: true,\n templateUrl: './ef-profile-chip.component.html',\n styleUrl: './ef-profile-chip.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TranslateModule],\n})\nexport class EfProfileChipComponent {\n /** Direct name text (not translated). */\n @Input() name?: string;\n\n /** Direct role text (not translated). */\n @Input() role?: string;\n\n /** Translation key for the role line — takes priority over `role`. */\n @Input() roleKey?: string;\n\n /** Override the avatar glyph (up to two characters). Defaults to the first letter of `name`. */\n @Input() initial?: string;\n\n /** Tenant tone uses `--tenant-500`; neutral uses `--ink-active`. */\n @Input() tone: 'tenant' | 'neutral' = 'tenant';\n\n /** Render as a non-interactive container (no hover/focus, no click). */\n @Input({ transform: booleanAttribute }) readonly = false;\n\n @Output() readonly clickEvent = new EventEmitter<Event>();\n\n get computedInitial(): string {\n /* An explicit `initial` is taken verbatim — callers pass real initials\n (\"AE\"), and truncating them to one letter threw away the half that\n tells two colleagues apart. Only the name fallback is a single letter. */\n const explicit = (this.initial ?? '').trim();\n if (explicit) {\n return explicit.slice(0, 2).toUpperCase();\n }\n const name = (this.name ?? '').trim();\n return name ? name.charAt(0).toUpperCase() : '?';\n }\n\n handleClick(event: Event): void {\n if (!this.readonly) {\n this.clickEvent.emit(event);\n }\n }\n}\n","<button\n type=\"button\"\n class=\"ef-profile-chip\"\n [class.is-tenant]=\"tone === 'tenant'\"\n [class.is-readonly]=\"readonly\"\n [attr.aria-label]=\"name || null\"\n [attr.tabindex]=\"readonly ? -1 : null\"\n (click)=\"handleClick($event)\"\n>\n <span class=\"ef-profile-chip__avatar\" aria-hidden=\"true\">{{ computedInitial }}</span>\n <span class=\"ef-profile-chip__text\">\n @if (name) {\n <span class=\"ef-profile-chip__name\">{{ name }}</span>\n }\n @if (roleKey || role) {\n <span class=\"ef-profile-chip__role\">\n @if (roleKey) {\n {{ roleKey | translate }}\n } @else {\n {{ role }}\n }\n </span>\n }\n </span>\n</button>\n","import { Component, Input } from '@angular/core';\nimport { BlockUIModule } from 'primeng/blockui';\n\n@Component({\n selector: 'ef-block-ui',\n standalone: true,\n templateUrl: './ef-block-ui.component.html',\n styleUrls: ['./ef-block-ui.component.scss'],\n imports: [BlockUIModule],\n})\nexport class EfBlockUiComponent {\n @Input() isLoading = false;\n @Input() contentPanel!: any;\n}\n","@if (isLoading) {\n <p-blockUI\n [target]=\"contentPanel\"\n [blocked]=\"isLoading\"\n styleClass=\"appBlockUI w-full h-full fixed top-0 left-0 right-0 flex items-start justify-center bg-black/30 z-20\">\n\n <ng-template pTemplate=\"loader\">\n <!-- Loader Container -->\n <div class=\"mt-2 flex flex-row items-center space-x-4 rounded-lg bg-white px-4 py-2 shadow\">\n <!-- Spinning Loader -->\n <div class=\"h-6 w-6 animate-spin rounded-full border-2 border-primary border-t-transparent dark:border-primary-contrast dark:border-t-transparent\"></div>\n\n <!-- Loading Text -->\n <div id=\"loading-text\" class=\"font-normal text-primary dark:text-primary-contrast\">\n Chargement en cours... !\n </div>\n </div>\n </ng-template>\n </p-blockUI>\n}\n","import { Component, ElementRef, inject, Input, HostBinding } from '@angular/core';\nimport { BlockableUI } from 'primeng/api';\n\n@Component({\n selector: 'ef-blockable-div',\n standalone: true,\n template: `<ng-content></ng-content>`,\n})\nexport class EfBlockableDivComponent implements BlockableUI {\n @Input() style: { [key: string]: string } = {};\n @Input() cssClass = '';\n\n private readonly el = inject(ElementRef);\n\n getBlockableElement(): HTMLElement {\n return this.el.nativeElement;\n }\n\n @HostBinding('style') get componentStyle() {\n return this.style;\n }\n\n @HostBinding('class') get componentClass() {\n return this.cssClass;\n }\n}\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Live-indicator dot with a soft breath animation.\n *\n * Used for \"Live\", presence indicators, anything that says \"this is\n * happening right now.\" Defaults to the Comptoir `--st-delivered-fg`\n * green; pass `[severity]=\"'warn' | 'danger' | 'mute'\"` for amber, red,\n * or grey variants.\n *\n * ```html\n * <ef-pulse labelKey=\"status.live\" />\n * <ef-pulse label=\"Offline\" severity=\"mute\" />\n * ```\n */\n@Component({\n selector: 'ef-pulse',\n standalone: true,\n templateUrl: './ef-pulse.component.html',\n styleUrl: './ef-pulse.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TranslateModule],\n})\nexport class EfPulseComponent {\n /** Direct label text (no translation). */\n @Input() label?: string;\n /** Translation key — takes priority over label. */\n @Input() labelKey?: string;\n /** Visual tone of the dot. */\n @Input() severity: 'success' | 'warn' | 'danger' | 'mute' = 'success';\n /** Set false to freeze the breath animation. */\n @Input() active = true;\n}\n","<span class=\"ef-pulse\" [attr.data-severity]=\"severity\" [class.is-static]=\"!active\">\n <span class=\"ef-pulse__halo\" aria-hidden=\"true\"></span>\n <span class=\"ef-pulse__dot\" aria-hidden=\"true\"></span>\n @if (labelKey) {\n <span class=\"ef-pulse__label\">{{ labelKey | translate }}</span>\n } @else if (label) {\n <span class=\"ef-pulse__label\">{{ label }}</span>\n }\n</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport {\n EfDialogAction,\n EfDialogComponent,\n} from '../../layout/ef-dialog/ef-dialog.component';\n\n/**\n * Reusable PDF preview overlay — an `ef-dialog` hosting the browser's native\n * PDF viewer (an `<iframe>` fed a sanitized object URL) plus an optional action\n * bar (WhatsApp share · download · open in new tab · print · close).\n *\n * Self-contained: pass a `Blob` and a `fileName`, toggle which actions show.\n * The object URL is created/revoked automatically with the blob's lifetime.\n *\n * @example\n * <ef-pdf-preview\n * [(visible)]=\"pdfVisible\"\n * [blob]=\"pdfBlob()\"\n * [fileName]=\"pdfName()\"\n * [showWhatsappShare]=\"true\"\n * [whatsappPhone]=\"customerPhone()\" />\n */\n@Component({\n selector: 'ef-pdf-preview',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TranslateModule, EfDialogComponent],\n templateUrl: './ef-pdf-preview.component.html',\n styleUrl: './ef-pdf-preview.component.scss',\n})\nexport class EfPdfPreviewComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** The PDF blob to preview. Setting it (re)creates the object URL. */\n blob = input<Blob | null>(null);\n /** File name shown in the header + used for download / share. */\n fileName = input<string>('document.pdf');\n /** Two-way dialog visibility. */\n visible = model<boolean>(false);\n /** Header title translation key. */\n titleKey = input<string>('pdf_preview.title');\n\n showDownload = input(true, { transform: booleanAttribute });\n showPrint = input(true, { transform: booleanAttribute });\n showOpenInNewTab = input(true, { transform: booleanAttribute });\n /** Show the WhatsApp share button (Web Share API → wa.me fallback). */\n showWhatsappShare = input(false, { transform: booleanAttribute });\n /** Optional recipient phone for the wa.me fallback (digits / +). */\n whatsappPhone = input<string>('');\n\n private readonly objectUrl = signal<string | null>(null);\n private currentUrl: string | null = null;\n\n readonly safeUrl = computed<SafeResourceUrl | null>(() => {\n const url = this.objectUrl();\n return url ? this.sanitizer.bypassSecurityTrustResourceUrl(url) : null;\n });\n\n /** Footer buttons, rendered by `ef-dialog`'s `[actions]`. `dismiss:false`\n * keeps the preview open after download/print/share/open. */\n readonly actions = computed<EfDialogAction[]>(() => {\n const list: EfDialogAction[] = [\n {\n labelKey: 'common_close',\n icon: 'pi pi-times',\n severity: 'ghost',\n styleClass: 'btn-dialog-leading',\n dismiss: true,\n },\n ];\n if (this.showWhatsappShare()) {\n list.push({\n labelKey: 'pdf_preview.whatsapp',\n icon: 'pi pi-whatsapp',\n severity: 'ghost',\n styleClass: 'btn-whatsapp',\n dismiss: false,\n command: () => this.shareWhatsapp(),\n });\n }\n if (this.showDownload()) {\n list.push({\n labelKey: 'pdf_preview.download',\n icon: 'pi pi-download',\n severity: 'ghost',\n styleClass: 'btn-download',\n dismiss: false,\n command: () => this.download(),\n });\n }\n if (this.showOpenInNewTab()) {\n list.push({\n labelKey: 'pdf_preview.new_window',\n icon: 'pi pi-external-link',\n severity: 'ghost',\n dismiss: false,\n command: () => this.openInNewTab(),\n });\n }\n if (this.showPrint()) {\n list.push({\n labelKey: 'pdf_preview.print',\n icon: 'pi pi-print',\n severity: 'primary',\n dismiss: false,\n command: () => this.print(),\n });\n }\n return list;\n });\n\n constructor() {\n effect(() => {\n const blob = this.blob();\n this.revoke();\n this.currentUrl = blob ? URL.createObjectURL(blob) : null;\n this.objectUrl.set(this.currentUrl);\n });\n inject(DestroyRef).onDestroy(() => this.revoke());\n }\n\n private revoke(): void {\n if (this.currentUrl) {\n URL.revokeObjectURL(this.currentUrl);\n this.currentUrl = null;\n }\n }\n\n close(): void {\n this.visible.set(false);\n }\n\n download(): void {\n if (!this.currentUrl) return;\n const a = document.createElement('a');\n a.href = this.currentUrl;\n a.download = this.fileName();\n a.click();\n }\n\n openInNewTab(): void {\n if (this.currentUrl) window.open(this.currentUrl, '_blank');\n }\n\n print(): void {\n if (!this.currentUrl) return;\n const win = window.open(this.currentUrl, '_blank');\n win?.addEventListener('load', () => win.print());\n }\n\n shareWhatsapp(): void {\n const blob = this.blob();\n if (!blob) return;\n const file = new File([blob], this.fileName(), { type: 'application/pdf' });\n const nav = navigator as Navigator & {\n canShare?: (data?: unknown) => boolean;\n };\n if (nav.share && nav.canShare?.({ files: [file] })) {\n nav\n .share({ files: [file], title: this.fileName() })\n .catch(() => this.openWhatsappWeb());\n return;\n }\n this.openWhatsappWeb();\n }\n\n private openWhatsappWeb(): void {\n const phone = (this.whatsappPhone() || '').replace(/[^0-9+]/g, '');\n const msg = encodeURIComponent(this.fileName());\n const url = phone\n ? `https://wa.me/${phone}?text=${msg}`\n : `https://wa.me/?text=${msg}`;\n window.open(url, '_blank');\n }\n}\n","<ef-dialog\n [(visible)]=\"visible\"\n [headerKey]=\"titleKey()\"\n [subtitle]=\"fileName()\"\n icon=\"pi pi-file-pdf\"\n [style]=\"{ width: '92vw', 'max-width': '1280px' }\"\n styleClass=\"ef-pdf-preview-dialog\"\n [actions]=\"actions()\"\n>\n <div class=\"pdf-frame-wrap\">\n @if (safeUrl()) {\n <iframe class=\"pdf-frame\" [src]=\"safeUrl()\" [title]=\"fileName()\"></iframe>\n } @else {\n <div class=\"pdf-empty\">{{ 'pdf_preview.empty' | translate }}</div>\n }\n </div>\n</ef-dialog>\n","/**\n * Comptoir status spectrum — the canonical set of chip tones every\n * status reference can map to via `metadata.color`.\n *\n * Tenants customize their status palettes by writing one of these\n * values into `reference_data.metadata.color` for each entry. The\n * elastic-portal admin (when ready) picks from this same enum, so\n * the framework stays tenant-agnostic and the data layer is the\n * only knob that needs to change per tenant.\n */\nexport type EfStatusColor =\n | 'pending'\n | 'processing'\n | 'shipped'\n | 'delivered'\n | 'cancelled'\n | 'refunded'\n | 'onhold'\n | 'tenant'\n | 'module'\n | 'neutral';\n\n/**\n * Shape `ef-status-chip` expects when reading from a reference\n * dictionary. Mirrors the `reference_data` MongoDB collection in\n * ElasticERP — apps can pass any object with these fields.\n */\nexport interface EfStatusReferenceItem {\n code: string;\n label?: string;\n labelKey?: string;\n metadata?: {\n color?: EfStatusColor | string;\n icon?: string;\n [key: string]: unknown;\n };\n}\n\n/** Canonical tone list — used for membership checks by the resolver. */\nexport const EF_STATUS_COLORS: ReadonlyArray<EfStatusColor> = [\n 'pending',\n 'processing',\n 'shipped',\n 'delivered',\n 'cancelled',\n 'refunded',\n 'onhold',\n 'tenant',\n 'module',\n 'neutral',\n];\n\n/**\n * Generic color-name aliases → Comptoir tones. Seeded `reference_data`\n * commonly stores plain color names in `metadata.color` (e.g.\n * `sales_order_status`: Draft=gray, Completed=green, Cancelled=red).\n * Resolving them here keeps chips AND status-keyed charts on the same\n * `--st-*` tokens without migrating tenant data.\n */\nexport const EF_STATUS_COLOR_ALIASES: Readonly<Record<string, EfStatusColor>> = {\n gray: 'onhold',\n grey: 'onhold',\n slate: 'onhold',\n yellow: 'refunded',\n orange: 'pending',\n blue: 'processing',\n purple: 'shipped',\n green: 'delivered',\n red: 'cancelled',\n};\n\n/**\n * Resolve a `metadata.color` value — a canonical tone OR a generic\n * color-name alias — to its Comptoir tone. `undefined` when unknown,\n * so callers can chain fallbacks (e.g. the status code itself, then\n * `'neutral'`). Case-insensitive.\n */\nexport function resolveEfStatusColor(\n value: string | null | undefined,\n): EfStatusColor | undefined {\n if (!value) return undefined;\n const v = value.toLowerCase();\n if ((EF_STATUS_COLORS as ReadonlyArray<string>).includes(v)) {\n return v as EfStatusColor;\n }\n return EF_STATUS_COLOR_ALIASES[v];\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n Optional,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport {\n SCREEN_REF_DATA_SERVICE,\n ScreenReferenceDataService,\n} from '@elasticias/screens';\nimport {\n EfStatusColor,\n EfStatusReferenceItem,\n resolveEfStatusColor,\n} from './ef-status-chip.types';\n\n/**\n * Comptoir status chip — single source of truth for any kind of\n * status / pill across the app.\n *\n * Resolves the chip's tone + label from the `reference_data`\n * collection so each tenant can re-skin its status palette without\n * touching consumer code:\n *\n * 1. Look up `referenceKey` in `SCREEN_REF_DATA_SERVICE`.\n * 2. Find the entry whose `code` matches the `code` input.\n * 3. Use `metadata.color` for the chip class and `label` /\n * `labelKey` for the text.\n * 4. Fall back to the `code` itself (lowercased) when no reference\n * data is registered — this lets screens render meaningfully even\n * before the real `ReferenceDataService` is wired.\n *\n * ```html\n * <ef-status-chip\n * referenceKey=\"sales_order_status\"\n * [code]=\"row.status\"\n * />\n * ```\n *\n * Override knobs (escape hatches):\n * - `[color]` forces a specific Comptoir tone, ignoring metadata.\n * - `[label]` / `[labelKey]` force the text, ignoring reference data.\n * - `[hideDot]` removes the leading ● glyph.\n * - `[showCode]` displays the raw code (useful for admin screens).\n */\n@Component({\n selector: 'ef-status-chip',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n templateUrl: './ef-status-chip.component.html',\n styleUrl: './ef-status-chip.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfStatusChipComponent {\n private readonly refDataService = inject<ScreenReferenceDataService | null>(\n SCREEN_REF_DATA_SERVICE,\n { optional: true },\n );\n\n /** Reference key (e.g. `'sales_order_status'`). */\n readonly referenceKey = input<string>('');\n\n /** Entry code to look up (e.g. `'Pending'`). */\n readonly code = input<string>('');\n\n /** Force a specific Comptoir tone (overrides metadata.color). */\n readonly color = input<EfStatusColor | ''>('');\n\n /** Force the displayed label (skips reference lookup). */\n readonly label = input<string>('');\n /** Translation key — preferred when forcing a label. */\n readonly labelKey = input<string>('');\n\n /** Hide the leading ● dot. */\n readonly hideDot = input(false, { transform: booleanAttribute });\n\n /** Render the raw `code` after the label (admin-screen helper). */\n readonly showCode = input(false, { transform: booleanAttribute });\n\n /** The reference entry matching `code`, or `undefined`. */\n private readonly entry = computed<EfStatusReferenceItem | undefined>(() => {\n if (!this.refDataService) return undefined;\n const key = this.referenceKey();\n if (!key) return undefined;\n const list = this.refDataService.getReference(key)();\n return list.find(\n (item: EfStatusReferenceItem) => item?.code === this.code(),\n );\n });\n\n /** Chip tone — explicit override → metadata (canonical tone or\n * generic color-name alias, e.g. `green` → `delivered`) → code\n * fallback → `neutral`. */\n readonly resolvedColor = computed<EfStatusColor>(() => {\n const forced = this.color();\n if (forced) return forced as EfStatusColor;\n\n return (\n resolveEfStatusColor(this.entry()?.metadata?.color) ??\n resolveEfStatusColor(this.code()) ??\n 'neutral'\n );\n });\n\n /** Resolved label — labelKey input → label input → reference label → code. */\n readonly resolvedLabel = computed<string>(() => {\n const entry = this.entry();\n return this.label() || entry?.label || this.code();\n });\n\n /** Translation key returned for the template's translate pipe. */\n readonly resolvedLabelKey = computed<string>(() => {\n return this.labelKey() || this.entry()?.labelKey || '';\n });\n}\n","<span class=\"chip\" [class]=\"'chip chip-' + resolvedColor()\">\n @if (!hideDot()) {\n <span aria-hidden=\"true\">●</span>\n }\n @if (resolvedLabelKey()) {\n {{ resolvedLabelKey() | translate }}\n } @else {\n {{ resolvedLabel() }}\n }\n @if (showCode()) {\n <span class=\"text-mute\" style=\"margin-inline-start: 6px; font-family: 'JetBrains Mono', monospace; font-size: 10.5px;\">\n {{ code() }}\n </span>\n }\n</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n booleanAttribute,\n effect,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfToast, EfToastAction, EfToastService } from '@elasticias/core';\n\n/**\n * Available anchor positions for the toast region.\n */\nexport type EfToastRegionPosition =\n | 'top-right'\n | 'top-left'\n | 'top-center'\n | 'bottom-right'\n | 'bottom-left'\n | 'bottom-center';\n\n/**\n * Comptoir toast region — V2 successor to PrimeNG `<p-toast>`.\n *\n * Mounts once at the app root (or any layout shell) and renders the\n * live `EfToastService.toasts` queue. Auto-dismiss timers + manual\n * close button + optional inline action buttons. Severity styling\n * comes from the `.toast.<severity>` rules in `_patterns.scss`,\n * mapped 1:1 to the Comptoir status spectrum.\n *\n * ```html\n * <!-- App root -->\n * <ef-toast-region position=\"bottom-right\" />\n * ```\n */\n@Component({\n selector: 'ef-toast-region',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n templateUrl: './ef-toast-region.component.html',\n styleUrl: './ef-toast-region.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfToastRegionComponent {\n private readonly toastService = inject(EfToastService);\n private readonly destroyRef = inject(DestroyRef);\n\n /** Anchor position. Default: bottom-right. */\n readonly position = input<EfToastRegionPosition>('bottom-right');\n\n /** Cap the visible stack — older toasts get auto-dismissed. */\n readonly maxStack = input<number>(5);\n\n /** Hide the bottom progress bar across all toasts. */\n readonly hideProgress = input(false, { transform: booleanAttribute });\n\n /** Toasts currently mid-exit-animation (kept around for the\n * duration of the CSS transition before being removed from DOM). */\n readonly exiting = signal<ReadonlySet<number>>(new Set());\n\n /** Live queue from the service — direct read so the template\n * re-renders when a toast is pushed or dismissed. */\n readonly toasts = this.toastService.toasts;\n\n /** Per-toast lifespan timers (manual setTimeout — robust against\n * Angular zoneless mode and visible across HMR reloads). */\n private readonly timers = new Map<number, ReturnType<typeof setTimeout>>();\n\n constructor() {\n // Whenever the queue changes, schedule auto-dismiss timers for\n // newly added toasts and trim the stack to maxStack.\n effect(() => {\n const list = this.toasts();\n untracked(() => this.syncTimers(list));\n untracked(() => this.enforceMaxStack(list));\n });\n\n this.destroyRef.onDestroy(() => {\n for (const t of this.timers.values()) clearTimeout(t);\n this.timers.clear();\n });\n }\n\n /* ── Class plumbing ────────────────────────────────────────── */\n\n severityClass(t: EfToast): string {\n return `toast ${t.severity}` + (this.exiting().has(t.id) ? ' out' : '');\n }\n\n iconClass(t: EfToast): string {\n switch (t.severity) {\n case 'success':\n return 'pi pi-check';\n case 'warn':\n return 'pi pi-exclamation-triangle';\n case 'error':\n return 'pi pi-times';\n case 'info':\n default:\n return 'pi pi-info-circle';\n }\n }\n\n progressStyle(t: EfToast): { [k: string]: string } | null {\n if (t.life <= 0) return null;\n return { '--toast-life': `${t.life}ms` };\n }\n\n /* ── Interactions ──────────────────────────────────────────── */\n\n onClose(t: EfToast): void {\n this.beginExit(t.id);\n }\n\n onActionClick(t: EfToast, action: EfToastAction): void {\n action.command?.();\n if (action.dismissOnClick !== false) this.beginExit(t.id);\n }\n\n trackById = (_: number, t: EfToast): number => t.id;\n\n /* ── Internals ─────────────────────────────────────────────── */\n\n private syncTimers(list: ReadonlyArray<EfToast>): void {\n const visibleIds = new Set(list.map((t) => t.id));\n\n // Drop timers for toasts no longer in the queue.\n for (const [id, handle] of this.timers) {\n if (!visibleIds.has(id)) {\n clearTimeout(handle);\n this.timers.delete(id);\n }\n }\n\n // Schedule timers for new toasts (skip sticky `life: 0`).\n for (const t of list) {\n if (this.timers.has(t.id) || t.life <= 0) continue;\n const handle = setTimeout(() => this.beginExit(t.id), t.life);\n this.timers.set(t.id, handle);\n }\n }\n\n private enforceMaxStack(list: ReadonlyArray<EfToast>): void {\n const cap = this.maxStack();\n if (cap <= 0) return;\n const overflow = list.length - cap;\n if (overflow <= 0) return;\n // Drop oldest entries first.\n for (let i = 0; i < overflow; i++) {\n this.beginExit(list[i].id);\n }\n }\n\n /** Mark the toast as exiting → wait for the CSS animation → tell\n * the service to remove it. Keeps the DOM around for the\n * out-animation duration. */\n private beginExit(id: number): void {\n if (this.exiting().has(id)) return;\n this.exiting.update((set) => {\n const next = new Set(set);\n next.add(id);\n return next;\n });\n const handle = this.timers.get(id);\n if (handle) {\n clearTimeout(handle);\n this.timers.delete(id);\n }\n // 260ms matches `--t-base`; wait one frame longer to be safe.\n setTimeout(() => {\n this.exiting.update((set) => {\n const next = new Set(set);\n next.delete(id);\n return next;\n });\n this.toastService.dismiss(id);\n }, 280);\n }\n}\n","<div\n class=\"toast-region\"\n [class.top-right]=\"position() === 'top-right'\"\n [class.top-left]=\"position() === 'top-left'\"\n [class.top-center]=\"position() === 'top-center'\"\n [class.bottom-right]=\"position() === 'bottom-right'\"\n [class.bottom-left]=\"position() === 'bottom-left'\"\n [class.bottom-center]=\"position() === 'bottom-center'\"\n role=\"region\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'ef_toast_region_aria' | translate\"\n>\n @for (toast of toasts(); track trackById($index, toast)) {\n <div\n [class]=\"severityClass(toast)\"\n [style]=\"progressStyle(toast)\"\n role=\"status\"\n >\n <div class=\"toast__ico\">\n <i [class]=\"iconClass(toast)\" aria-hidden=\"true\"></i>\n </div>\n\n <div class=\"toast__body\">\n @if (toast.title) {\n <div class=\"toast__title\">{{ toast.title }}</div>\n }\n @if (toast.text) {\n <div class=\"toast__text\">{{ toast.text }}</div>\n }\n\n @if (toast.actions?.length) {\n <div class=\"toast__actions\">\n @for (action of toast.actions; track action.label || action.labelKey) {\n <button\n type=\"button\"\n class=\"btn btn-sm\"\n [class.btn-primary]=\"action.severity === 'primary'\"\n [class.btn-ghost]=\"(action.severity ?? 'ghost') === 'ghost'\"\n (click)=\"onActionClick(toast, action)\"\n >\n {{ action.labelKey ? (action.labelKey | translate) : action.label }}\n </button>\n }\n </div>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"toast__close\"\n [attr.aria-label]=\"'ef_toast_close' | translate\"\n (click)=\"onClose(toast)\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n\n @if (toast.life > 0 && !hideProgress()) {\n <div class=\"toast__progress\"></div>\n }\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/**\n * 12-column form-grid primitive. Children use `.col-2/3/4/6/8/9/12`\n * to claim spans; on viewports < 720px every span collapses to 12.\n *\n * ```html\n * <ef-form-grid>\n * <div class=\"col-6 ef-field\">\n * <label>Client</label>\n * <ef-select … />\n * </div>\n * <div class=\"col-3 ef-field\">\n * <label>Date</label>\n * <ef-datepicker … />\n * </div>\n * <div class=\"col-3 ef-field\">\n * <label>Total</label>\n * <span class=\"read strong\">12 350,00 MAD</span>\n * </div>\n * </ef-form-grid>\n * ```\n */\n@Component({\n selector: 'ef-form-grid',\n standalone: true,\n template: '<ng-content></ng-content>',\n host: { class: 'ef-form-grid' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfFormGridComponent {}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ScreenContext } from '@elasticias/screens';\nimport { Permissions } from '@elasticias/types';\nimport { EfButtonComponent } from '../ef-button/ef-button.component';\nimport { EfDetailToolbarAction } from './ef-detail-toolbar.types';\n\n/**\n * Sticky detail-screen toolbar. Two slots and an optional declarative\n * action API:\n *\n * - default — entity identity (ref / name / status chip / meta).\n * - `[customActions]` input — declarative array of EfDetailToolbarAction;\n * rendered at the start of the right group,\n * before the standard actions.\n * - `[actions]` slot — full-template escape hatch (rendered after\n * `[customActions]`, before the separator).\n * - Standard actions — Print, Duplicate, Delete, Save (in that order),\n * shown via `[showPrintAction]` / `[showDuplicateAction]`\n * / `[showDeleteAction]` / `[showSaveAction]` and\n * gated by `[context]`'s permissions.\n *\n * Layout: `…identity (left) | …customActions [actions] | print duplicate delete save…`\n *\n * ```html\n * <ef-detail-toolbar\n * [customActions]=\"screenActions()\"\n * [context]=\"context\"\n * [showPrintAction]=\"editionState()\"\n * [showDuplicateAction]=\"editionState()\"\n * [showDeleteAction]=\"editionState()\"\n * [saving]=\"loading()\"\n * [saveLabelKey]=\"editionState() ? 'common_save' : 'common_create'\"\n * (print)=\"print()\"\n * (duplicate)=\"duplicate()\"\n * (delete)=\"delete()\"\n * (save)=\"save()\"\n * >\n * <span class=\"ref\">{{ ref() }}</span>\n * <ef-status-chip referenceKey=\"…\" [code]=\"status()\" />\n * </ef-detail-toolbar>\n * ```\n *\n * Custom actions can declare `permission` and `visible` like\n * `EfRowAction`. With `[context]` bound, the toolbar filters them\n * against `ScreenContext.isGranted()` automatically.\n */\n@Component({\n selector: 'ef-detail-toolbar',\n standalone: true,\n imports: [CommonModule, TranslateModule, EfButtonComponent],\n templateUrl: './ef-detail-toolbar.component.html',\n host: { class: 'detail-toolbar' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfDetailToolbarComponent {\n /* ── Inputs ─────────────────────────────────────────────────── */\n\n /** Custom screen-specific actions, rendered before the standard\n * set in the right group. Each one gets the same permission /\n * visibility filtering used by EfRowAction. */\n readonly customActions = input<ReadonlyArray<EfDetailToolbarAction>>([]);\n\n /** Optional ScreenContext — when present, custom actions with a\n * `permission` field and standard actions Print / Duplicate /\n * Delete are filtered against `context.isGranted(...)`. */\n readonly context = input<ScreenContext | undefined>(undefined);\n\n /** Render the standard Print action (left of the standard group). */\n readonly showPrintAction = input(false, { transform: booleanAttribute });\n\n /** Render the standard Duplicate action. */\n readonly showDuplicateAction = input(false, { transform: booleanAttribute });\n\n /** Render the standard Delete action (danger-tinted). */\n readonly showDeleteAction = input(false, { transform: booleanAttribute });\n\n /** Render the standard Save action (rightmost, tenant-styled). */\n readonly showSaveAction = input(true, { transform: booleanAttribute });\n\n /** Disable Save while a save round-trip is in flight. */\n readonly saving = input(false, { transform: booleanAttribute });\n\n /** i18n key for the Save button label. Screens typically pass\n * `'common_create'` in create mode and `'common_save'` in edit. */\n readonly saveLabelKey = input<string>('common_save');\n\n /* ── Outputs ────────────────────────────────────────────────── */\n\n /** Fired when a `customActions` button is clicked. The toast\n * service or screen handler should consume `id`. The `command`\n * callback on the action is also invoked. */\n readonly customAction = output<EfDetailToolbarAction>();\n\n readonly print = output<void>();\n readonly duplicate = output<void>();\n readonly delete = output<void>();\n readonly save = output<void>();\n\n /* ── Computed visibility ────────────────────────────────────── */\n\n /** Custom actions after permission + `visible` filtering. */\n readonly visibleCustomActions = computed<\n ReadonlyArray<EfDetailToolbarAction>\n >(() => {\n const ctx = this.context();\n return this.customActions().filter((a) => this.isCustomVisible(a, ctx));\n });\n\n readonly canPrint = computed(() =>\n this.checkStandard(this.showPrintAction(), Permissions.Print),\n );\n readonly canDuplicate = computed(() =>\n this.checkStandard(this.showDuplicateAction(), Permissions.Duplicate),\n );\n readonly canDelete = computed(() =>\n this.checkStandard(this.showDeleteAction(), Permissions.Delete),\n );\n readonly canSave = computed(() => this.showSaveAction());\n\n readonly hasStandardActions = computed(\n () =>\n this.canPrint() ||\n this.canDuplicate() ||\n this.canDelete() ||\n this.canSave(),\n );\n readonly hasCustomActions = computed(\n () => this.visibleCustomActions().length > 0,\n );\n\n /** Whether the `|` separator should render — both groups present. */\n readonly showSeparator = computed(\n () => this.hasCustomActions() && this.hasStandardActions(),\n );\n\n /* ── Click bridge ───────────────────────────────────────────── */\n\n onCustomClick(action: EfDetailToolbarAction): void {\n if (action.disabled) return;\n action.command?.();\n this.customAction.emit(action);\n }\n\n /* ── Internals ──────────────────────────────────────────────── */\n\n private isCustomVisible(\n action: EfDetailToolbarAction,\n ctx: ScreenContext | undefined,\n ): boolean {\n if (action.visible === false) return false;\n if (action.permission && ctx && !ctx.isGranted(action.permission))\n return false;\n return true;\n }\n\n /** Standard action visibility: `show*Action` flag AND permission\n * granted by `context` (or no context bound). */\n private checkStandard(\n flag: boolean,\n perm:\n | Permissions.Duplicate\n | Permissions.Print\n | Permissions.Delete,\n ): boolean {\n if (!flag) return false;\n const ctx = this.context();\n if (!ctx) return true;\n switch (perm) {\n case Permissions.Print:\n return ctx.hasPrintPermission;\n case Permissions.Duplicate:\n return ctx.hasDuplicatePermission;\n case Permissions.Delete:\n return ctx.hasDeletePermission;\n }\n }\n\n /** Stable trackBy across renders. */\n trackByAction = (i: number, a: EfDetailToolbarAction): unknown =>\n a.id ?? a.labelKey ?? a.label ?? i;\n}\n","<div class=\"left\">\n <ng-content></ng-content>\n</div>\n\n<div class=\"right\">\n <!-- Custom screen actions (before the standard group). -->\n @for (action of visibleCustomActions(); track trackByAction($index, action)) {\n <ef-button\n variant=\"comptoir\"\n size=\"small\"\n [severity]=\"action.severity ?? 'ghost'\"\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n [labelKey]=\"action.labelKey\"\n [disabled]=\"!!action.disabled\"\n (clickEvent)=\"onCustomClick(action)\"\n />\n }\n\n <!-- Full-template escape hatch — anything projected here renders\n after the customActions array, before the standard group. -->\n <ng-content select=\"[actions]\"></ng-content>\n\n <!-- Separator between custom and standard groups. -->\n @if (showSeparator()) {\n <span class=\"sep\" aria-hidden=\"true\">|</span>\n }\n\n <!-- Standard actions: Print → Duplicate → Delete → Save. -->\n @if (canPrint()) {\n <ef-button\n variant=\"comptoir\"\n severity=\"ghost\"\n size=\"small\"\n icon=\"pi pi-print\"\n labelKey=\"common_print\"\n (clickEvent)=\"print.emit()\"\n />\n }\n\n @if (canDuplicate()) {\n <ef-button\n variant=\"comptoir\"\n severity=\"ghost\"\n size=\"small\"\n icon=\"pi pi-clone\"\n labelKey=\"common_duplicate\"\n (clickEvent)=\"duplicate.emit()\"\n />\n }\n\n @if (canDelete()) {\n <ef-button\n variant=\"comptoir\"\n severity=\"danger\"\n size=\"small\"\n icon=\"pi pi-trash\"\n labelKey=\"common_delete\"\n (clickEvent)=\"delete.emit()\"\n />\n }\n\n @if (canSave()) {\n <ef-button\n variant=\"comptoir\"\n severity=\"tenant\"\n size=\"small\"\n icon=\"pi pi-save\"\n [labelKey]=\"saveLabelKey()\"\n [disabled]=\"saving()\"\n [loading]=\"saving()\"\n (clickEvent)=\"save.emit()\"\n />\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ScreenContext } from '@elasticias/screens';\nimport { Permissions } from '@elasticias/types';\nimport { EfButtonComponent } from '../ef-button/ef-button.component';\nimport { EfSearchToolbarAction } from './ef-search-toolbar.types';\n\n/**\n * Page-level toolbar for list / search screens. Mirrors the\n * {@link EfDetailToolbarComponent} concept — two slots and a\n * declarative action API — but ships with the search-screen\n * default actions instead of the detail-screen ones.\n *\n * - default — page identity (title / meta / status pills).\n * - `[customActions]` input — declarative array of\n * EfSearchToolbarAction; rendered at the\n * start of the right group, before the\n * standard actions.\n * - `[actions]` slot — full-template escape hatch (rendered after\n * `[customActions]`, before the separator).\n * - Standard actions — Export, Add (in that order), shown via\n * `[showExportAction]` / `[showAddAction]` and\n * gated by `[context]`'s permissions.\n *\n * Search / Clear deliberately do **not** live here — those belong\n * to `ef-smart-bar` (its built-in `(search)` / `(clear)` outputs).\n * This toolbar owns the page-level actions, not the filter actions.\n *\n * Layout: `…title (left) | …customActions [actions] | export add`\n *\n * ```html\n * <ef-search-toolbar\n * [context]=\"context\"\n * [customActions]=\"screenActions()\"\n * showExportAction\n * (export)=\"exportItems()\"\n * (add)=\"add()\"\n * >\n * <div class=\"title-meta\">\n * <h1>{{ 'catalog_products_title' | translate }}</h1>\n * <p class=\"meta\">{{ totalCount() }} items</p>\n * </div>\n * </ef-search-toolbar>\n * ```\n *\n * Custom actions can declare `permission` and `visible` like\n * `EfRowAction`. With `[context]` bound, the toolbar filters them\n * against `ScreenContext.isGranted()` automatically.\n */\n@Component({\n selector: 'ef-search-toolbar',\n standalone: true,\n imports: [CommonModule, TranslateModule, EfButtonComponent],\n templateUrl: './ef-search-toolbar.component.html',\n host: { class: 'search-toolbar' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfSearchToolbarComponent {\n /* ── Inputs ─────────────────────────────────────────────────── */\n\n /** Custom screen-specific actions, rendered before the standard\n * set in the right group. Each one gets the same permission /\n * visibility filtering used by EfRowAction. */\n readonly customActions = input<ReadonlyArray<EfSearchToolbarAction>>([]);\n\n /** Optional ScreenContext — when present, custom actions with a\n * `permission` field and standard actions Export / Add are\n * filtered against `context.isGranted(...)`. */\n readonly context = input<ScreenContext | undefined>(undefined);\n\n /** Render the standard Export action (left of the standard group). */\n readonly showExportAction = input(false, { transform: booleanAttribute });\n\n /** Render the standard Add action (rightmost, tenant-styled). */\n readonly showAddAction = input(true, { transform: booleanAttribute });\n\n /** Disable Add while a navigation / fetch is in flight. */\n readonly busy = input(false, { transform: booleanAttribute });\n\n /** i18n key for the Add button label. Screens typically pass\n * `'common_new'` (default) or a screen-specific\n * `'catalog_products_new'`. */\n readonly addLabelKey = input<string>('common_new');\n\n /** i18n key for the Export button label. */\n readonly exportLabelKey = input<string>('common_export');\n\n /* ── Outputs ────────────────────────────────────────────────── */\n\n /** Fired when a `customActions` button is clicked. The toast\n * service or screen handler should consume `id`. The `command`\n * callback on the action is also invoked. */\n readonly customAction = output<EfSearchToolbarAction>();\n\n readonly export = output<void>();\n readonly add = output<void>();\n\n /* ── Computed visibility ────────────────────────────────────── */\n\n /** Custom actions after permission + `visible` filtering. */\n readonly visibleCustomActions = computed<\n ReadonlyArray<EfSearchToolbarAction>\n >(() => {\n const ctx = this.context();\n return this.customActions().filter((a) => this.isCustomVisible(a, ctx));\n });\n\n readonly canExport = computed(() =>\n this.checkStandard(this.showExportAction(), Permissions.Export),\n );\n readonly canAdd = computed(() =>\n this.checkStandard(this.showAddAction(), Permissions.Create),\n );\n\n readonly hasStandardActions = computed(\n () => this.canExport() || this.canAdd(),\n );\n readonly hasCustomActions = computed(\n () => this.visibleCustomActions().length > 0,\n );\n\n /** Whether the `|` separator should render — both groups present. */\n readonly showSeparator = computed(\n () => this.hasCustomActions() && this.hasStandardActions(),\n );\n\n /* ── Click bridge ───────────────────────────────────────────── */\n\n onCustomClick(action: EfSearchToolbarAction): void {\n if (action.disabled) return;\n action.command?.();\n this.customAction.emit(action);\n }\n\n /* ── Internals ──────────────────────────────────────────────── */\n\n private isCustomVisible(\n action: EfSearchToolbarAction,\n ctx: ScreenContext | undefined,\n ): boolean {\n if (action.visible === false) return false;\n if (action.permission && ctx && !ctx.isGranted(action.permission))\n return false;\n return true;\n }\n\n /** Standard action visibility: `show*Action` flag AND permission\n * granted by `context` (or no context bound). */\n private checkStandard(\n flag: boolean,\n perm: Permissions.Export | Permissions.Create,\n ): boolean {\n if (!flag) return false;\n const ctx = this.context();\n if (!ctx) return true;\n switch (perm) {\n case Permissions.Export:\n return ctx.hasExportPermission;\n case Permissions.Create:\n return ctx.hasCreatePermission;\n }\n }\n\n /** Stable trackBy across renders. */\n trackByAction = (i: number, a: EfSearchToolbarAction): unknown =>\n a.id ?? a.labelKey ?? a.label ?? i;\n}\n","<div class=\"left\">\n <ng-content></ng-content>\n</div>\n\n<div class=\"right\">\n <!-- Custom screen actions (before the standard group). -->\n @for (action of visibleCustomActions(); track trackByAction($index, action)) {\n <ef-button\n variant=\"comptoir\"\n size=\"small\"\n [severity]=\"action.severity ?? 'ghost'\"\n [icon]=\"action.icon\"\n [label]=\"action.label\"\n [labelKey]=\"action.labelKey\"\n [disabled]=\"!!action.disabled\"\n (clickEvent)=\"onCustomClick(action)\"\n />\n }\n\n <!-- Full-template escape hatch — anything projected here renders\n after the customActions array, before the standard group. -->\n <ng-content select=\"[actions]\"></ng-content>\n\n <!-- Separator between custom and standard groups. -->\n @if (showSeparator()) {\n <span class=\"sep\" aria-hidden=\"true\">|</span>\n }\n\n <!-- Standard actions: Export → Add. -->\n @if (canExport()) {\n <ef-button\n variant=\"comptoir\"\n severity=\"ghost\"\n size=\"small\"\n icon=\"pi pi-download\"\n [labelKey]=\"exportLabelKey()\"\n [disabled]=\"busy()\"\n (clickEvent)=\"export.emit()\"\n />\n }\n\n @if (canAdd()) {\n <ef-button\n variant=\"comptoir\"\n severity=\"tenant\"\n size=\"small\"\n icon=\"pi pi-plus\"\n [labelKey]=\"addLabelKey()\"\n [disabled]=\"busy()\"\n (clickEvent)=\"add.emit()\"\n />\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfTotalsGrand, EfTotalsRow } from './ef-totals.types';\n\n/**\n * Sidebar totals stack — key-value rows with optional display-size\n * grand-row (Bricolage Grotesque, ~28px). Lives inside an `<ef-card>`\n * on order / invoice / quote detail screens.\n *\n * ```html\n * <ef-card titleKey=\"orders_totals\">\n * <ef-totals\n * [rows]=\"[\n * { labelKey: 'totals_subtotal', value: '12 350,00', unit: 'MAD' },\n * { labelKey: 'totals_discount', value: '-450,00', unit: 'MAD', tone: 'discount' },\n * { labelKey: 'totals_tax', value: '2 372,40', unit: 'MAD' },\n * ]\"\n * [grand]=\"{ labelKey: 'totals_grand', value: '14 272,40', currency: 'MAD' }\"\n * />\n * </ef-card>\n * ```\n */\n@Component({\n selector: 'ef-totals',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n @for (row of rows(); track row.labelKey || row.label) {\n <div class=\"row\" [class.discount]=\"row.tone === 'discount'\">\n <span class=\"lbl\">\n {{ row.labelKey ? (row.labelKey | translate) : row.label }}\n </span>\n <span class=\"v\">\n {{ row.value }}@if (row.unit) {<span class=\"currency\"> {{ row.unit }}</span>}\n </span>\n </div>\n }\n\n @if (grand(); as g) {\n <hr />\n <div class=\"row grand-row\">\n <span class=\"lbl\">\n {{ g.labelKey ? (g.labelKey | translate) : g.label }}\n </span>\n <span class=\"v\">\n {{ g.value }}@if (g.currency) {<span class=\"currency\">{{ g.currency }}</span>}\n </span>\n </div>\n }\n `,\n host: { class: 'totals' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfTotalsComponent {\n readonly rows = input<ReadonlyArray<EfTotalsRow>>([]);\n readonly grand = input<EfTotalsGrand | undefined>(undefined);\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfStatsRow } from './ef-stats.types';\n\n/**\n * Sidebar mini-KPI stack. Lives inside an `<ef-card>` on detail\n * screens; rule-soft separators between rows, optional `.big` row\n * swaps the value to a Bricolage display number.\n *\n * ```html\n * <ef-card titleKey=\"clients_stats\">\n * <ef-stats\n * [rows]=\"[\n * { labelKey: 'stats_revenue_ytd', value: '128 450', unit: 'MAD', big: true },\n * { labelKey: 'stats_orders_count', value: 42 },\n * { labelKey: 'stats_last_order', value: 'Il y a 3 jours' },\n * ]\"\n * />\n * </ef-card>\n * ```\n *\n * Stats are sidebar-only — never on list/search screens (KPIs there\n * are forbidden, see CLAUDE.md memory).\n */\n@Component({\n selector: 'ef-stats',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n @for (row of rows(); track row.labelKey || row.label) {\n <div class=\"row\" [class.big]=\"row.big\">\n <span class=\"l\">\n {{ row.labelKey ? (row.labelKey | translate) : row.label }}\n </span>\n <span class=\"v\">\n {{ row.value }}@if (row.unit) {<span class=\"unit\">{{ row.unit }}</span>}\n </span>\n </div>\n }\n `,\n host: { class: 'stats' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfStatsComponent {\n readonly rows = input<ReadonlyArray<EfStatsRow>>([]);\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfTimelineItem } from './ef-timeline.types';\n\n/**\n * Vertical timeline — used on order / user / client detail screens\n * to surface the entity's history. Three dot states (`done` / `now`\n * / `upcoming`) line up with the prototype.\n *\n * ```html\n * <ef-card titleKey=\"orders_history\">\n * <ef-timeline\n * [items]=\"[\n * { state: 'done', label: 'Commande créée', meta: 'Karim · 12 mai 14:30' },\n * { state: 'done', label: 'Paiement reçu', meta: 'Stripe · 12 mai 14:32' },\n * { state: 'now', label: 'Préparation', meta: 'En cours' },\n * { state: 'upcoming', label: 'Expédition' },\n * ]\"\n * />\n * </ef-card>\n * ```\n *\n * The `'now'` dot picks up `var(--module)` so each module's accent\n * tints its own active step.\n */\n@Component({\n selector: 'ef-timeline',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n @for (item of items(); track item.id ?? item.labelKey ?? item.label) {\n <div\n class=\"item\"\n [class.done]=\"item.state === 'done'\"\n [class.now]=\"item.state === 'now'\"\n >\n <span class=\"dot\" aria-hidden=\"true\"></span>\n <div class=\"body\">\n <div class=\"label\">\n {{ item.labelKey ? (item.labelKey | translate) : item.label }}\n </div>\n @if (item.metaKey || item.meta) {\n <div class=\"meta\">\n {{ item.metaKey ? (item.metaKey | translate) : item.meta }}\n </div>\n }\n </div>\n </div>\n }\n `,\n host: { class: 'timeline' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfTimelineComponent {\n readonly items = input<ReadonlyArray<EfTimelineItem>>([]);\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfKpiDeltaTone, EfKpiSparkline } from './ef-kpi-card.types';\n\n/**\n * Dashboard headline KPI tile — the one place KPIs are allowed in\n * the design system. List/search screens stay focused on results;\n * KPIs live on per-module dashboards (and detail-screen sidebars\n * via `ef-stats`).\n *\n * ```html\n * <ef-kpi-card\n * labelKey=\"kpi_revenue_7d\"\n * value=\"52 480\"\n * unit=\"MAD\"\n * delta=\"▲ 12%\"\n * deltaTone=\"up\"\n * [spark]=\"[22, 20, 17, 18, 12, 14, 9, 11, 7, 10, 5, 8, 4, 3, 2]\"\n * />\n * ```\n *\n * Sparkline values are normalized to a fixed 200×28 viewBox; the\n * stroke colour follows the active module's color (`--module`, e.g.\n * Sales blue) by default — the convention for report/dashboard\n * accents — override via `[sparkColor]=\"'var(--st-pending-fg)'\"` for\n * variants. Pass an empty array to hide the sparkline.\n */\n@Component({\n selector: 'ef-kpi-card',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n <div class=\"kpi-head\">\n <span class=\"label\">\n {{ labelKey() ? (labelKey() | translate) : label() }}\n </span>\n @if (delta()) {\n <span class=\"delta\" [class]=\"'delta ' + deltaTone()\">{{ delta() }}</span>\n }\n </div>\n\n <div class=\"kpi-value\">\n {{ value() }}@if (unit()) {<span class=\"unit\">{{ unit() }}</span>}\n </div>\n\n @if (sparkPoints()) {\n <svg class=\"spark\" viewBox=\"0 0 200 28\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\n <polyline\n fill=\"none\"\n [attr.stroke]=\"sparkColor()\"\n stroke-width=\"2\"\n [attr.points]=\"sparkPoints()\"\n />\n </svg>\n }\n `,\n host: { class: 'kpi' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfKpiCardComponent {\n /** Translation key for the small label above the headline number. */\n readonly labelKey = input<string>('');\n /** Direct label fallback. */\n readonly label = input<string>('');\n\n /** Pre-formatted headline value (e.g. `'52 480'`, `'603'`). */\n readonly value = input<string | number>('');\n\n /** Optional small unit suffix (e.g. `'MAD'`, `'%'`). */\n readonly unit = input<string>('');\n\n /** Pre-formatted delta text including the arrow glyph (`'▲ 12%'`). */\n readonly delta = input<string>('');\n\n /** Delta tone — drives the arrow color. */\n readonly deltaTone = input<EfKpiDeltaTone>('up');\n\n /** Raw series for the sparkline. */\n readonly spark = input<EfKpiSparkline>([]);\n\n /** Stroke color for the sparkline polyline. Defaults to the active\n * module's color (report-accent convention); SVG resolves the CSS\n * custom property natively. */\n readonly sparkColor = input<string>('var(--module)');\n\n /** Computed `points=\"x,y x,y …\"` attribute, normalized into the\n * 200×28 viewBox so the polyline always fits. Returns null\n * when the series is empty. */\n readonly sparkPoints = computed<string | null>(() => {\n const series = this.spark();\n if (!series || series.length < 2) return null;\n\n const min = Math.min(...series);\n const max = Math.max(...series);\n const range = max - min || 1;\n const xStep = 200 / (series.length - 1);\n\n return series\n .map((v, i) => {\n const x = +(i * xStep).toFixed(2);\n // Higher values → smaller y (origin top-left). Inset\n // by 2px so the stroke doesn't clip at the edges.\n const y = +(26 - ((v - min) / range) * 24).toFixed(2);\n return `${x},${y}`;\n })\n .join(' ');\n });\n}\n","import type { ChartConfiguration, ChartType } from 'chart.js';\n\nexport type EfChartType = 'line' | 'bar' | 'donut';\n\nexport interface EfChartSeries {\n label?: string;\n data: ReadonlyArray<number>;\n color?: string;\n /** Per-point colors (donut slices / bars). Sparse entries fall back to\n * `color`, then the palette — use for status-keyed charts so slices\n * reuse the exact status-chip tokens (`--st-*-fg`) instead of accents. */\n colors?: ReadonlyArray<string | undefined>;\n}\n\n/** Concrete hexes (canvas can't resolve CSS var() strings). Order matches the tenant accents.\n *\n * Convention: the DOMINANT color of report/dashboard visuals is the **active\n * module's color** (`--module`, e.g. Sales blue `--m-sales`). `ef-chart`\n * resolves the token at render time and passes it as `moduleColor`, which\n * takes the palette's first slot — these accents only color secondary\n * series/slices. A series' explicit `color` always wins. */\nexport const EF_CHART_PALETTE: ReadonlyArray<string> = [\n '#0d9488', '#6366f1', '#f59e0b', '#ef4444', '#0ea5e9', '#a855f7',\n];\n\nexport function buildChartConfig(\n type: EfChartType,\n labels: ReadonlyArray<string>,\n series: ReadonlyArray<EfChartSeries>,\n /** Resolved `--module` color — becomes the palette's first (dominant) slot. */\n moduleColor?: string,\n): ChartConfiguration {\n const palette: ReadonlyArray<string> = moduleColor\n ? [moduleColor, ...EF_CHART_PALETTE.filter((c) => c.toLowerCase() !== moduleColor.toLowerCase())]\n : EF_CHART_PALETTE;\n const chartType: ChartType = type === 'donut' ? 'doughnut' : type;\n const datasets = series.map((s, i) => {\n const color = s.color ?? palette[i % palette.length];\n if (type === 'donut') {\n return {\n label: s.label,\n data: [...s.data],\n backgroundColor: s.data.map(\n (_, j) => s.colors?.[j] ?? s.color ?? palette[j % palette.length],\n ),\n borderWidth: 0,\n };\n }\n if (type === 'line') {\n return {\n label: s.label,\n data: [...s.data],\n borderColor: color,\n backgroundColor: `${color}22`,\n fill: true,\n tension: 0.35,\n pointRadius: 2,\n borderWidth: 2,\n };\n }\n return {\n label: s.label,\n data: [...s.data],\n backgroundColor: s.colors ? s.data.map((_, j) => s.colors?.[j] ?? color) : color,\n borderRadius: 4,\n };\n });\n\n return {\n type: chartType,\n data: { labels: [...labels], datasets },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n ...(type === 'donut' ? { cutout: '62%' } : {}),\n plugins: { legend: { display: type === 'donut', position: 'bottom' } },\n scales:\n type === 'donut'\n ? undefined\n : {\n x: { grid: { display: false } },\n y: { beginAtZero: true, grid: { color: 'rgba(0,0,0,0.06)' } },\n },\n },\n } as ChartConfiguration;\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy, Component, ElementRef, OnDestroy, effect, input, viewChild,\n} from '@angular/core';\nimport {\n ArcElement, BarController, BarElement, CategoryScale, Chart, DoughnutController, Filler,\n Legend, LineController, LineElement, LinearScale, PointElement, Tooltip,\n} from 'chart.js';\nimport type { ChartConfiguration } from 'chart.js';\nimport { buildChartConfig, type EfChartSeries, type EfChartType } from './ef-chart.config';\n\nChart.register(\n ArcElement, BarController, BarElement, CategoryScale, DoughnutController, Filler,\n Legend, LineController, LineElement, LinearScale, PointElement, Tooltip,\n);\n\n/**\n * Thin chart.js wrapper for report/dashboard visuals (line, bar, donut).\n * Labels/series are data — i18n happens in the parent. Zoneless-safe: the\n * effect below re-renders whenever inputs change; instance destroyed on cleanup.\n *\n * Color convention: the dominant series/slice color defaults to the **active\n * module's color** — the component resolves `--module` (set by `ef-app-main`'s\n * `[data-module]`, e.g. Sales blue) from the canvas at render time, since the\n * chart.js canvas can't consume CSS `var()` strings. Secondary series fall back\n * to `EF_CHART_PALETTE`; a series' explicit `color` always wins.\n */\n@Component({\n selector: 'ef-chart',\n standalone: true,\n imports: [CommonModule],\n template: `<div class=\"ef-chart\" [style.height.px]=\"height()\"><canvas #canvas></canvas></div>`,\n styles: [`.ef-chart { position: relative; width: 100%; }`],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfChartComponent implements OnDestroy {\n readonly type = input.required<EfChartType>();\n readonly labels = input<ReadonlyArray<string>>([]);\n readonly series = input<ReadonlyArray<EfChartSeries>>([]);\n readonly height = input(260);\n\n private readonly canvas = viewChild.required<ElementRef<HTMLCanvasElement>>('canvas');\n private chart: Chart | null = null;\n\n constructor() {\n effect(() => {\n // Resolve the module color from the inherited `--module` custom property\n // (empty string outside any [data-module] scope → palette fallback).\n const moduleColor =\n getComputedStyle(this.canvas().nativeElement).getPropertyValue('--module').trim() ||\n undefined;\n const cfg = buildChartConfig(this.type(), this.labels(), this.series(), moduleColor);\n // Chart#config is a union that includes per-dataset-typed configs; ours is always a plain ChartConfiguration.\n if (this.chart && (this.chart.config as ChartConfiguration).type === cfg.type) {\n this.chart.data = cfg.data;\n this.chart.update();\n } else {\n this.chart?.destroy();\n this.chart = new Chart(this.canvas().nativeElement, cfg);\n }\n });\n }\n\n ngOnDestroy(): void {\n this.chart?.destroy();\n this.chart = null;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\nexport interface EfRankRow {\n label: string;\n value: string;\n secondary?: string;\n pct: number;\n}\n\n/** Top-N ranked rows (label · proportional bar · value). Lives inside an ef-card. */\n@Component({\n selector: 'ef-rank-list',\n standalone: true,\n imports: [CommonModule],\n template: `\n <ol class=\"rank\">\n @for (row of rows(); track $index; let i = $index) {\n <li class=\"rank-row\">\n <span class=\"rank-idx\">{{ i + 1 }}</span>\n <span class=\"rank-main\">\n <span class=\"rank-label\" [title]=\"row.label\">{{ row.label }}</span>\n @if (row.secondary) { <span class=\"rank-secondary\">{{ row.secondary }}</span> }\n <span class=\"rank-bar\"><i [style.width.%]=\"clampPct(row.pct)\"></i></span>\n </span>\n <span class=\"rank-value\">{{ row.value }}</span>\n </li>\n }\n </ol>\n `,\n styles: [`\n :host { display: block; }\n .rank { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }\n .rank-row { display: grid; grid-template-columns: 22px 1fr auto; gap: 10px; align-items: center; }\n .rank-idx { font-size: 12px; font-weight: 700; color: var(--ink-soft, #64748b); text-align: center; }\n .rank-main { display: grid; gap: 3px; min-width: 0; }\n .rank-label { font-size: 13px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .rank-secondary { font-size: 11px; color: var(--ink-soft, #64748b); }\n .rank-bar { height: 4px; border-radius: 999px; background: var(--paper-alt, #f1f5f9); overflow: hidden; }\n .rank-bar i { display: block; height: 100%; border-radius: inherit; background: var(--tenant-500, #0d9488); }\n .rank-value { font-size: 13px; font-weight: 700; font-variant-numeric: tabular-nums; }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfRankListComponent {\n readonly rows = input<ReadonlyArray<EfRankRow>>([]);\n\n clampPct(pct: number): number {\n return Math.min(100, Math.max(0, pct));\n }\n}\n","import {\n booleanAttribute,\n Component,\n HostBinding,\n inject,\n Input,\n Output,\n EventEmitter,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { EfClearButtonComponent } from '../ef-clear-button/ef-clear-button.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n@Component({\n selector: 'ef-input-text',\n standalone: true,\n templateUrl: './ef-input-text.component.html',\n styleUrls: ['./ef-input-text.component.scss'],\n imports: [InputTextModule, FormsModule, TranslateModule, EfLabelComponent, EfClearButtonComponent],\n})\nexport class EfInputTextComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor\n{\n /* Identity / label / placeholder / aria / required / readonly /\n disabled all inherited from AbstractEfFormControl. */\n\n @Input() size: 'small' | 'large' = 'small';\n @Input() type = 'text';\n @Input() maxlength?: number;\n @Input({ transform: booleanAttribute }) fluid = true;\n @Input({ transform: booleanAttribute }) inline = false;\n @Input() autocomplete?: string;\n\n /** Clearable (showClear / canClear) is inherited from AbstractEfFormControl;\n * we only supply the value predicate + the reset. */\n protected override get hasValue(): boolean {\n return !!this.value;\n }\n\n override clearValue(): void {\n this.handleInput('');\n }\n\n /**\n * Rendering variant — same dual-mode pattern as `ef-button`.\n * - `'comptoir'` (default) — native `<input class=\"ef-input\">` against\n * the Comptoir pattern styles. Renders at the\n * canonical `--hit-base` (40px) control height.\n * Required for `prefix` / `suffix`.\n * - `'primeng'` — wraps `<input pInputText>` (v1). Opt in when\n * you specifically need PrimeNG input behaviour.\n * See ADR-009 for why comptoir is the height-consistent default.\n */\n @Input() variant: 'primeng' | 'comptoir' = 'comptoir';\n\n /** Inline prefix addon — e.g. `'/p/'` for slugs, `'$'` for prices.\n * Renders only in the Comptoir variant; ignored otherwise. */\n @Input() prefix?: string;\n\n /** Inline suffix addon — e.g. `'MAD'`, `'cm'`. Renders only in the\n * Comptoir variant; ignored otherwise. */\n @Input() suffix?: string;\n\n @HostBinding('class.ef-inline') get isInline() { return this.inline; }\n\n @Output() valueChangeEvent = new EventEmitter<string>();\n\n /** Two-way-bindable as `[value]` (one-way) or\n * `[(value)]=\"signal()\"` (set + listen via `valueChangeEvent`). */\n @Input() value = '';\n\n private onChange: (value: string) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? this.ngControl?.control?.errors?.['serverError'] ?? null;\n }\n\n get isInvalid(): boolean {\n if (this.resolvedExternalErrors()?.length) return true;\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.invalid && (ctrl?.touched || ctrl?.dirty));\n }\n\n writeValue(value: string): void {\n this.value = value ?? '';\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n handleInput(value: string): void {\n this.value = value;\n this.onChange(value);\n this.valueChangeEvent.emit(value);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n}\n","@if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" [for]=\"effectiveId\" [required]=\"required()\" />\n}\n<div class=\"ef-field-control\">\n @if (variant === 'comptoir') {\n @if (prefix || suffix) {\n <!-- Comptoir variant with prefix/suffix — wraps the input in\n an .ef-input-group so the addons share the border + focus\n ring with the input. -->\n <div class=\"ef-input-group\" [class.is-invalid]=\"isInvalid\">\n @if (prefix) {\n <span class=\"ef-input-addon is-prefix\" aria-hidden=\"true\">{{ prefix }}</span>\n }\n <input\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [type]=\"type\"\n [value]=\"value\"\n (input)=\"handleInput($any($event.target).value)\"\n (blur)=\"handleBlur()\"\n [attr.placeholder]=\"effectivePlaceholder || null\"\n [attr.maxlength]=\"maxlength ?? null\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete ?? null\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n />\n @if (canClear) {\n <ef-clear-button\n class=\"ef-group-clear\"\n [ariaLabel]=\"'action.clear' | translate\"\n (clear)=\"clearValue()\"\n />\n }\n @if (suffix) {\n <span class=\"ef-input-addon is-suffix\" aria-hidden=\"true\">{{ suffix }}</span>\n }\n </div>\n } @else {\n <!-- Comptoir variant — bare native input (+ optional inline clear). -->\n <div class=\"ef-input-wrap\">\n <input\n class=\"ef-input\"\n [class.has-clear]=\"canClear\"\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [type]=\"type\"\n [value]=\"value\"\n (input)=\"handleInput($any($event.target).value)\"\n (blur)=\"handleBlur()\"\n [attr.placeholder]=\"effectivePlaceholder || null\"\n [attr.maxlength]=\"maxlength ?? null\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete ?? null\"\n [class.is-invalid]=\"isInvalid\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n />\n @if (canClear) {\n <ef-clear-button\n class=\"ef-input-clear\"\n [ariaLabel]=\"'action.clear' | translate\"\n (clear)=\"clearValue()\"\n />\n }\n </div>\n }\n } @else {\n <!-- PrimeNG variant (default) — v1 styling. -->\n <input\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [type]=\"type\"\n pInputText\n [pSize]=\"size\"\n [value]=\"value\"\n (input)=\"handleInput($any($event.target).value)\"\n (blur)=\"handleBlur()\"\n [attr.placeholder]=\"effectivePlaceholder || null\"\n [attr.maxlength]=\"maxlength ?? null\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete ?? null\"\n [class.ng-invalid]=\"isInvalid\"\n [class.ng-touched]=\"ngControl?.touched\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n fluid\n />\n }\n @if (showRequired || serverErrors) {\n <div [id]=\"errorsId\" role=\"alert\" aria-live=\"polite\">\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n </div>\n }\n</div>\n","import {\n booleanAttribute,\n Component,\n inject,\n Input,\n Output,\n EventEmitter,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport { CheckboxModule } from 'primeng/checkbox';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n/**\n * Comptoir checkbox.\n *\n * Two render variants share the same API:\n * - `'primeng'` (default) — wraps `p-checkbox`. Stock PrimeNG visuals.\n * - `'comptoir'` — native `<input type=\"checkbox\">` styled\n * against `.ef-checkbox-native`. Lean, no animation, fits dense\n * grids (variants table, role / permission lists, etc.).\n *\n * Identity / label / aria / required / readonly / disabled inherited\n * from `AbstractEfFormControl`. `binary` flips between boolean mode\n * (`checked: true/false`) and value-mode (`checked` is the bound\n * value when ticked, `null` when unticked) — the latter pairs with\n * a parent NgModel array for multi-select scenarios.\n *\n * ```html\n * <ef-checkbox\n * labelKey=\"catalog.is_active\"\n * variant=\"comptoir\"\n * [(checked)]=\"variant.isActive\"\n * binary />\n * ```\n */\n@Component({\n selector: 'ef-checkbox',\n standalone: true,\n templateUrl: './ef-checkbox.component.html',\n styleUrls: ['./ef-checkbox.component.scss'],\n imports: [CheckboxModule, FormsModule, TranslateModule, EfLabelComponent],\n})\nexport class EfCheckboxComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor\n{\n /* Identity / label / aria / required / readonly / disabled all\n inherited from AbstractEfFormControl. */\n\n /** Underlying checkbox value when ticked (non-binary mode). */\n @Input() value?: any;\n\n /** Binary mode — checked becomes a boolean rather than the\n * `value` input. Default for new code. */\n @Input({ transform: booleanAttribute }) binary = false;\n\n /**\n * Render variant.\n * - `'primeng'` (default) — wraps `p-checkbox`.\n * - `'comptoir'` — native `<input type=\"checkbox\">`\n * styled against `.ef-checkbox-native`.\n */\n @Input() variant: 'primeng' | 'comptoir' = 'primeng';\n\n /** Two-way bindable `[(checked)]`. */\n @Input() checked: any = false;\n @Output() checkedChange = new EventEmitter<any>();\n\n private onChange: (value: any) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n /* effectiveId / effectiveAriaLabel / errorsId all inherited from\n AbstractEfFormControl. */\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? this.ngControl?.control?.errors?.['serverError'] ?? null;\n }\n\n get isInvalid(): boolean {\n if (this.resolvedExternalErrors()?.length) return true;\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.invalid && (ctrl?.touched || ctrl?.dirty));\n }\n\n writeValue(value: any): void {\n this.checked = value;\n }\n\n registerOnChange(fn: (value: any) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n /** Handler for PrimeNG's onChange event. */\n handleChange(event: any): void {\n this.checked = event.checked;\n this.onChange(event.checked);\n this.checkedChange.emit(event.checked);\n this.onTouched();\n }\n\n /** Handler for the native checkbox change event (Comptoir variant). */\n handleNativeChange(rawChecked: boolean): void {\n const next = this.binary ? rawChecked : (rawChecked ? this.value : null);\n this.checked = next;\n this.onChange(next);\n this.checkedChange.emit(next);\n this.onTouched();\n }\n}\n","@if (variant === 'comptoir') {\n <label class=\"ef-checkbox-native\" [class.is-disabled]=\"disabled\">\n <input\n type=\"checkbox\"\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [checked]=\"!!checked\"\n [disabled]=\"isDisabled()\"\n [class.is-invalid]=\"isInvalid\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n (change)=\"handleNativeChange($any($event.target).checked)\"\n />\n <span class=\"ef-checkbox-box\" aria-hidden=\"true\"></span>\n @if (labelKey() || label()) {\n <span class=\"ef-checkbox-label\">\n {{ labelKey() ? (labelKey() | translate) : label() }}\n @if (required()) {\n <span class=\"ef-checkbox-required\" aria-hidden=\"true\">*</span>\n }\n </span>\n }\n </label>\n} @else {\n <p-checkbox\n [inputId]=\"effectiveId\"\n [name]=\"name()\"\n [ngModel]=\"checked\"\n [ngModelOptions]=\"{standalone: true}\"\n (onChange)=\"handleChange($event)\"\n [value]=\"value\"\n [binary]=\"binary\"\n [disabled]=\"isDisabled()\"\n [ariaLabel]=\"effectiveAriaLabel || undefined\"\n />\n @if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" [for]=\"effectiveId\" styleClass=\"form-label-left cursor-pointer\" />\n }\n}\n@if (showRequired || serverErrors) {\n <div [id]=\"errorsId\" role=\"alert\" aria-live=\"polite\">\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n </div>\n}\n","import { Component, inject, Input, Output, EventEmitter } from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport { ToggleSwitchModule } from 'primeng/toggleswitch';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n/**\n * Comptoir toggle switch — wraps `p-toggleswitch`, boolean-only.\n *\n * Identity / label / aria / required / readonly / disabled inherited\n * from `AbstractEfFormControl`. Use for on/off state that applies\n * immediately (row activation toggles, settings), `ef-checkbox` for\n * form fields that are saved with the enclosing form.\n *\n * ```html\n * <ef-toggleswitch\n * [checked]=\"row.isActive\"\n * [disabled]=\"!context.hasEditPermission\"\n * ariaLabelKey=\"sales_clients_toggle_active_aria\"\n * (checkedChange)=\"setActive(row, $event)\" />\n * ```\n */\n@Component({\n selector: 'ef-toggleswitch',\n standalone: true,\n imports: [ToggleSwitchModule, FormsModule, TranslateModule, EfLabelComponent],\n template: `\n <p-toggleswitch\n [inputId]=\"effectiveId\"\n [name]=\"name() || undefined\"\n [ngModel]=\"checked\"\n [ngModelOptions]=\"{ standalone: true }\"\n [disabled]=\"isDisabled()\"\n [ariaLabel]=\"effectiveAriaLabel || undefined\"\n (onChange)=\"handleChange($event)\"\n />\n @if (labelKey() || label()) {\n <ef-label\n [labelKey]=\"labelKey()\"\n [label]=\"label()\"\n [for]=\"effectiveId\"\n styleClass=\"form-label-left cursor-pointer\"\n />\n }\n `,\n})\nexport class EfToggleSwitchComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor\n{\n /** Two-way bindable `[(checked)]` — boolean only. */\n @Input() checked = false;\n @Output() checkedChange = new EventEmitter<boolean>();\n\n private onChange: (value: boolean) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n writeValue(value: unknown): void {\n this.checked = !!value;\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n handleChange(event: { checked: boolean }): void {\n this.checked = event.checked;\n this.onChange(event.checked);\n this.checkedChange.emit(event.checked);\n this.onTouched();\n }\n}\n","import {\n booleanAttribute,\n Component,\n HostBinding,\n inject,\n Input,\n Output,\n EventEmitter,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport { DatePickerModule } from 'primeng/datepicker';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\n\n/**\n * @deprecated Wraps PrimeNG `p-datepicker`, which does not follow the\n * Comptoir design system. Prefer `ef-datepicker-advanced` in **field\n * mode** (`mode=\"field\"`, `selectionMode=\"single\" | \"range\"`) — it is a\n * Comptoir-native form control (ControlValueAccessor) with the same\n * `[(ngModel)]` / `formControlName` binding and a `Date` / `[start, end]`\n * value shape. This wrapper is kept only for legacy V1 screens and will\n * be removed once they are migrated.\n */\n@Component({\n selector: 'ef-datepicker',\n standalone: true,\n templateUrl: './ef-datepicker.component.html',\n styleUrls: ['./ef-datepicker.component.scss'],\n imports: [DatePickerModule, FormsModule, TranslateModule, EfLabelComponent],\n})\nexport class EfDatepickerComponent implements ControlValueAccessor {\n @Input() label?: string;\n @Input() labelKey?: string;\n @Input() inputId?: string;\n @Input() name?: string;\n @Input() placeholder?: string;\n @Input() placeholderKey?: string;\n @Input() size: 'small' | 'large' = 'small';\n @Input({ transform: booleanAttribute }) required = false;\n @Input({ transform: booleanAttribute }) fluid = true;\n @Input({ transform: booleanAttribute }) inline = false;\n @Input({ transform: booleanAttribute }) disabled = false;\n @Input({ transform: booleanAttribute }) showIcon = true;\n @Input() iconDisplay: 'input' | 'button' = 'input';\n @Input() selectionMode: 'single' | 'multiple' | 'range' = 'single';\n @Input() dateFormat?: string;\n @Input() appendTo?: string;\n @Input({ transform: booleanAttribute }) showTime = false;\n @Input({ transform: booleanAttribute }) showButtonBar = false;\n @Input() minDate?: Date;\n @Input() maxDate?: Date;\n\n @HostBinding('class.ef-inline') get isInline() { return this.inline; }\n\n @Output() dateSelectEvent = new EventEmitter<any>();\n\n value: any = null;\n\n private onChange: (value: any) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n private readonly translateService = inject(TranslateService);\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n get effectivePlaceholder(): string {\n return this.placeholderKey ? this.translateService.instant(this.placeholderKey) : (this.placeholder ?? '');\n }\n\n get effectiveId(): string {\n return this.inputId ?? this.name ?? '';\n }\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return ctrl?.hasError('required') && ctrl?.touched;\n }\n\n get serverErrors(): string[] | null {\n return this.ngControl?.control?.errors?.serverError ?? null;\n }\n\n get isInvalid(): boolean {\n const ctrl = this.ngControl?.control;\n return ctrl?.invalid && (ctrl?.touched || ctrl?.dirty);\n }\n\n writeValue(value: any): void {\n this.value = value;\n }\n\n registerOnChange(fn: (value: any) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n handleChange(value: any): void {\n this.value = value;\n this.onChange(value);\n this.dateSelectEvent.emit(value);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n}\n","@if (labelKey || label) {\n <ef-label [labelKey]=\"labelKey\" [label]=\"label\" [for]=\"effectiveId\" [required]=\"required\" />\n}\n<div class=\"ef-field-control\">\n <p-datepicker\n [inputId]=\"effectiveId\"\n [name]=\"name\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"handleChange($event)\"\n (onBlur)=\"handleBlur()\"\n [placeholder]=\"effectivePlaceholder\"\n [size]=\"size\"\n [disabled]=\"disabled\"\n [showIcon]=\"showIcon\"\n [iconDisplay]=\"iconDisplay\"\n [selectionMode]=\"selectionMode\"\n [dateFormat]=\"dateFormat\"\n [appendTo]=\"appendTo\"\n [showTime]=\"showTime\"\n [showButtonBar]=\"showButtonBar\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [fluid]=\"fluid\"\n [class.ng-invalid]=\"isInvalid\"\n [class.ng-touched]=\"ngControl?.touched\"\n />\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n</div>\n","import {\n booleanAttribute,\n Component,\n HostBinding,\n inject,\n Input,\n Output,\n EventEmitter,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport { PasswordModule } from 'primeng/password';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n@Component({\n selector: 'ef-password',\n standalone: true,\n templateUrl: './ef-password.component.html',\n styleUrls: ['./ef-password.component.scss'],\n imports: [PasswordModule, FormsModule, TranslateModule, EfLabelComponent],\n})\nexport class EfPasswordComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor\n{\n /* identity / label / placeholder / aria / required / readonly / disabled /\n errors (resolvedExternalErrors) / showClear all inherited from\n AbstractEfFormControl. */\n\n @Input() size?: 'small' | 'large';\n @Input({ transform: booleanAttribute }) fluid = true;\n @Input({ transform: booleanAttribute }) inline = false;\n @Input({ transform: booleanAttribute }) toggleMask = true;\n @Input({ transform: booleanAttribute }) feedback = false;\n @Input() autocomplete?: string;\n\n @HostBinding('class.ef-inline') get isInline() { return this.inline; }\n\n @Output() valueChangeEvent = new EventEmitter<string>();\n\n value = '';\n\n private onChange: (value: string) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? this.ngControl?.control?.errors?.serverError ?? null;\n }\n\n get isInvalid(): boolean {\n if (this.resolvedExternalErrors()?.length) return true;\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.invalid && (ctrl?.touched || ctrl?.dirty));\n }\n\n /** Clearable hooks (showClear / canClear inherited from the base). */\n protected override get hasValue(): boolean {\n return !!this.value;\n }\n\n override clearValue(): void {\n this.handleChange('');\n }\n\n writeValue(value: string): void {\n this.value = value ?? '';\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n handleChange(value: string): void {\n this.value = value;\n this.onChange(value);\n this.valueChangeEvent.emit(value);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n}\n","@if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" [for]=\"effectiveId\" [required]=\"required()\" />\n}\n<div class=\"ef-field-control\">\n <p-password\n [inputId]=\"effectiveId\"\n [name]=\"name()\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"handleChange($event)\"\n (onBlur)=\"handleBlur()\"\n [toggleMask]=\"toggleMask\"\n [feedback]=\"feedback\"\n [placeholder]=\"effectivePlaceholder\"\n [size]=\"size\"\n [disabled]=\"isDisabled()\"\n [attr.autocomplete]=\"autocomplete\"\n [class.ng-invalid]=\"isInvalid\"\n [class.ng-touched]=\"ngControl?.touched\"\n [showClear]=\"canClear\"\n (onClear)=\"clearValue()\"\n styleClass=\"ef-password-field\"\n fluid\n >\n <ng-template #clearicon>\n <span class=\"ef-clear\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\">\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </span>\n </ng-template>\n </p-password>\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n</div>\n","import { booleanAttribute, Component, HostBinding, inject, Input, Output, EventEmitter, OnChanges } from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NgControl } from '@angular/forms';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n@Component({\n selector: 'ef-multi-select',\n templateUrl: 'ef-multi-select.component.html',\n styleUrls: ['./ef-multi-select.component.scss'],\n standalone: true,\n imports: [FormsModule, MultiSelectModule, TranslateModule, EfLabelComponent],\n})\nexport class EfMultiSelectComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor, OnChanges\n{\n /* identity (inputId / name) / label / labelKey / placeholder / placeholderKey /\n required / disabled (isDisabled) / showClear / errors (resolvedExternalErrors)\n all inherited from AbstractEfFormControl. The clear ✕ is rendered by\n PrimeNG's own `[showClear]` (bound below), so the base's custom\n `ef-clear-button` hooks (`hasValue`/`clearValue`) are left at their no-op\n defaults — `(onClear)` drives `handleClear()` instead. */\n\n @Output() changeEvent = new EventEmitter<string[]>();\n\n @Input() optionLabel = 'name';\n @Input() optionValue = 'id';\n @Input() options: any;\n @Input() filteredOptions: any;\n @Input() maxSelectedLabels = 3;\n @Input() display: 'comma' | 'chip' = 'comma';\n @Input() size: 'large' | 'small';\n @Input() selectionLimit: any;\n @Input() filters: any;\n @Input({ transform: booleanAttribute }) inline = false;\n\n @HostBinding('class.ef-inline') get isInline() { return this.inline; }\n @HostBinding('class.ef-required') get isRequired() { return this.required(); }\n\n selectedValues: any[] = [];\n\n private propagateChange: (value: any[]) => void = () => { /* noop */ };\n private propagateTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? this.ngControl?.control?.errors?.['serverError'] ?? null;\n }\n\n writeValue(value: string[]): void {\n if (Array.isArray(value) && value.length > 0 && this.options) {\n this.selectedValues = value\n .map(v => this.options.find((opt: any) => opt[this.optionValue] === v)?.[this.optionValue])\n .filter((opt: any) => !!opt);\n } else {\n this.selectedValues = [];\n }\n }\n\n registerOnChange(fn: (value: any[]) => void): void {\n this.propagateChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.propagateTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n onInternalModelChange(val: any[]): void {\n const value = val ?? [];\n this.selectedValues = value;\n this.propagateChange(value);\n this.changeEvent.emit(value);\n this.propagateTouched();\n }\n\n handleClear(): void {\n this.selectedValues = [];\n this.propagateChange([]);\n this.changeEvent.emit([]);\n this.propagateTouched();\n }\n\n ngOnChanges(): void {\n if (this.options && this.filters && typeof this.filters === 'object') {\n this.applyFilters(this.filters);\n } else {\n this.filteredOptions = this.options;\n }\n }\n\n private applyFilters(filters: { [key: string]: any }): void {\n this.filteredOptions = this.options.filter((option: any) =>\n Object.keys(filters).every(key => option[key] === filters[key])\n );\n this.selectedValues = [];\n }\n}\n","@if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" [for]=\"effectiveId\" [required]=\"required()\" />\n}\n<div class=\"ef-field-control\">\n <p-multiSelect\n [id]=\"effectiveId\"\n [name]=\"name()\"\n [placeholder]=\"effectivePlaceholder\"\n [options]=\"filteredOptions\"\n [optionLabel]=\"optionLabel\"\n [optionValue]=\"optionValue\"\n [maxSelectedLabels]=\"maxSelectedLabels\"\n [ngModel]=\"selectedValues\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onInternalModelChange($event)\"\n (onClear)=\"handleClear()\"\n [disabled]=\"isDisabled()\"\n [display]=\"display\"\n [size]=\"size\"\n [selectionLimit]=\"selectionLimit\"\n [showClear]=\"showClear()\"\n fluid\n />\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n</div>\n","import {\n booleanAttribute,\n Component,\n inject,\n Input,\n TemplateRef,\n ContentChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport { SelectButtonModule } from 'primeng/selectbutton';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { CommonModule } from '@angular/common';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n@Component({\n selector: 'ef-selectbutton',\n standalone: true,\n templateUrl: './ef-selectbutton.component.html',\n imports: [SelectButtonModule, FormsModule, TranslateModule, CommonModule, EfLabelComponent],\n})\nexport class EfSelectButtonComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor\n{\n /* identity / label / labelKey / disabled (isDisabled) all inherited from\n AbstractEfFormControl. A selectbutton has no clearable concept, so the\n base's `hasValue`/`clearValue` defaults (no ✕) are left untouched. */\n\n @Input() options: any[] = [];\n @Input() optionLabel = 'label';\n @Input() optionValue = 'value';\n @Input({ transform: booleanAttribute }) multiple = false;\n @Input({ transform: booleanAttribute }) allowEmpty = true;\n @Input() size: 'small' | 'large' = 'small';\n @Input() styleClass?: string;\n\n @ContentChild('item') itemTemplate?: TemplateRef<any>;\n\n value: any = null;\n\n private onChange: (value: any) => void = () => { /* noop */ };\n private onTouched: () => void = () => { /* noop */ };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n writeValue(value: any): void {\n this.value = value;\n }\n\n registerOnChange(fn: (value: any) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n handleChange(event: any): void {\n this.value = event.value;\n this.onChange(event.value);\n this.onTouched();\n }\n}\n","@if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" />\n}\n<p-selectbutton\n [ngModel]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n (onChange)=\"handleChange($event)\"\n [options]=\"options\"\n [optionLabel]=\"optionLabel\"\n [optionValue]=\"optionValue\"\n [multiple]=\"multiple\"\n [allowEmpty]=\"allowEmpty\"\n [disabled]=\"isDisabled()\"\n [size]=\"size\"\n [styleClass]=\"styleClass\"\n>\n @if (itemTemplate) {\n <ng-template let-item pTemplate=\"item\">\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\" />\n </ng-template>\n }\n</p-selectbutton>\n","// Form components\nexport { EfInputTextComponent } from './ef-input-text/ef-input-text.component';\nexport { EfSelectComponent } from './ef-select/ef-select.component';\nexport { EfCheckboxComponent } from './ef-checkbox/ef-checkbox.component';\nexport { EfToggleSwitchComponent } from './ef-toggleswitch/ef-toggleswitch.component';\nexport { EfDatepickerComponent } from './ef-datepicker/ef-datepicker.component';\nexport { EfInputNumberComponent } from './ef-inputnumber/ef-inputnumber.component';\nexport { EfPasswordComponent } from './ef-password/ef-password.component';\nexport { EfMultiSelectComponent } from './ef-multi-select/ef-multi-select.component';\nexport { EfSelectButtonComponent } from './ef-selectbutton/ef-selectbutton.component';\nexport { EfQuantityStepperComponent } from './ef-quantity-stepper/ef-quantity-stepper.component';\n","import { TemplateRef } from '@angular/core';\n\n/**\n * Column alignment options for ef-datatable\n */\nexport type EfDatatableColumnAlign = 'start' | 'center' | 'end';\n\n/**\n * Column data types for automatic formatting\n */\nexport type EfDatatableColumnType =\n | 'text'\n | 'number'\n | 'money'\n | 'date'\n | 'datetime'\n | 'boolean'\n | 'reference';\n\n/**\n * Column definition interface for ef-datatable\n */\nexport interface EfDatatableColumn {\n /** Property name in data object */\n field: string;\n\n /** Column header text */\n header: string;\n\n /** Data type for automatic formatting (default: 'text') */\n type?: EfDatatableColumnType;\n\n /** Text alignment (default: 'start' except money/number = 'end') */\n align?: EfDatatableColumnAlign;\n\n /** Enable sorting for this column (default: true) */\n sortable?: boolean;\n\n /** Enable resizing for this column (default: true) */\n resizable?: boolean;\n\n /** CSS width (e.g., '100px', 'w-[200px]') */\n width?: string;\n\n /** Custom Tailwind or CSS classes */\n styleClass?: string;\n\n // Type-specific formatting options\n\n /** Date format string for DatePipe (default: 'shortDate') */\n dateFormat?: string;\n\n /** Currency code for money type (default: 'EUR') */\n currencyCode?: string;\n\n /** Currency display format (default: 'symbol') */\n currencyDisplay?: 'symbol' | 'code' | 'name';\n\n /** Locale for number/date/currency formatting (default: 'fr-FR') */\n locale?: string;\n\n /** Minimum fraction digits for numbers (default: 2) */\n minFractionDigits?: number;\n\n /** Maximum fraction digits for numbers (default: 2) */\n maxFractionDigits?: number;\n\n // Reference data integration\n\n /** Key for context.ref.get() to lookup reference data */\n referenceKey?: string;\n\n /** Field to match in reference data (default: 'code') */\n referenceValueField?: string;\n\n /** Field to display from reference data (default: 'name') */\n referenceLabelField?: string;\n\n // Template support\n\n /** Custom cell template (receives rowData and column) */\n template?: TemplateRef<unknown>;\n\n /** Custom header template (receives column) */\n headerTemplate?: TemplateRef<unknown>;\n}\n\n/**\n * Action column configuration for edit/delete/duplicate buttons\n */\nexport interface EfDatatableActions {\n /** Show action column (default: true if config provided) */\n show?: boolean;\n\n /** Action column width (default: 'w-20') */\n width?: string;\n\n /** Show edit button (default: true) */\n showEdit?: boolean;\n\n /** Show delete button (default: true) */\n showDelete?: boolean;\n\n /** Show duplicate button (default: false) */\n showDuplicate?: boolean;\n\n /** Position of action column (default: 'end') */\n position?: 'start' | 'end';\n}\n\n/**\n * Main table configuration options\n */\nexport interface EfDatatableConfig {\n // Data binding\n\n /** Enable lazy loading (default: true) */\n lazy?: boolean;\n\n /** Unique identifier field name (default: 'id') */\n dataKey?: string;\n\n // Pagination\n\n /** Enable pagination (default: true) */\n paginator?: boolean;\n\n /** Rows per page (default: 10) */\n rows?: number;\n\n /** Page size options (default: [5, 10, 25, 50]) */\n rowsPerPageOptions?: number[];\n\n // Scrolling\n\n /** Enable scrolling (default: true) */\n scrollable?: boolean;\n\n /** Scroll viewport height (default: '300px') */\n scrollHeight?: string;\n\n // Column features\n\n /** Enable column resizing (default: true) */\n resizableColumns?: boolean;\n\n /** Column resize behavior (default: 'expand') */\n columnResizeMode?: 'fit' | 'expand';\n\n // State persistence\n\n /** State storage location (default: 'local') */\n stateStorage?: 'local' | 'session';\n\n /** State storage key (auto-generated if not provided) */\n stateKey?: string;\n\n // Styling\n\n /** Table size (default: 'small') */\n size?: 'small' | 'large';\n\n /** Custom CSS classes (default: 'text-sm') */\n styleClass?: string;\n\n /** Inline table styles */\n tableStyle?: Record<string, string>;\n\n // i18n\n\n /** Message when no data (default: 'Aucune entree trouvee') */\n emptyMessage?: string;\n\n /** Pagination report template */\n currentPageReportTemplate?: string;\n}\n\n/**\n * Default table configuration values\n */\nexport const EF_DATATABLE_DEFAULTS: Required<EfDatatableConfig> = {\n lazy: true,\n dataKey: 'id',\n paginator: true,\n rows: 10,\n rowsPerPageOptions: [5, 10, 25, 50],\n scrollable: true,\n scrollHeight: '300px',\n resizableColumns: true,\n columnResizeMode: 'expand',\n stateStorage: 'local',\n stateKey: '',\n size: 'small',\n styleClass: 'text-sm',\n tableStyle: { 'min-width': '50rem' },\n emptyMessage: 'Aucune entree trouvee',\n currentPageReportTemplate: '{currentPage} de {totalPages}',\n};\n\n/**\n * Default column configuration values\n */\nexport const EF_DATATABLE_COLUMN_DEFAULTS: Partial<EfDatatableColumn> = {\n type: 'text',\n sortable: true,\n resizable: true,\n dateFormat: 'shortDate',\n currencyCode: 'MAD',\n currencyDisplay: 'symbol',\n locale: 'fr-FR',\n minFractionDigits: 2,\n maxFractionDigits: 2,\n referenceValueField: 'code',\n referenceLabelField: 'label',\n};\n\n/**\n * Default action column configuration\n */\nexport const EF_DATATABLE_ACTIONS_DEFAULTS: Required<EfDatatableActions> = {\n show: true,\n width: 'w-20',\n showEdit: true,\n showDelete: true,\n showDuplicate: false,\n position: 'end',\n};\n\n/**\n * Helper function to determine column alignment based on type\n * @param column - The column configuration\n * @returns The computed alignment\n */\nexport function getColumnAlignment(\n column: EfDatatableColumn,\n): EfDatatableColumnAlign {\n if (column.align) return column.align;\n if (column.type === 'money' || column.type === 'number') return 'end';\n return 'start';\n}\n\n/**\n * Helper function to merge column configuration with defaults\n * @param column - The column configuration\n * @returns Column with defaults applied\n */\nexport function mergeColumnDefaults(\n column: EfDatatableColumn,\n): EfDatatableColumn {\n return { ...EF_DATATABLE_COLUMN_DEFAULTS, ...column };\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ScreenContext } from '@elasticias/screens';\nimport { Permissions } from '@elasticias/types';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfButtonComponent } from '../../layout/ef-button/ef-button.component';\n\n@Component({\n selector: 'ef-datatable-actionbar',\n standalone: true,\n templateUrl: 'ef-datatable-actionbar.component.html',\n imports: [\n EfButtonComponent,\n TranslateModule,\n ],\n})\nexport class EfDatatableActionBarComponent {\n @Input() context?: ScreenContext;\n\n @Input() state?: string;\n\n @Output() duplicate = new EventEmitter();\n @Output() edit = new EventEmitter();\n @Output() delete = new EventEmitter();\n\n // Flags\n @Input() duplicateButton = true;\n @Input() editButton = true;\n @Input() deleteButton = true;\n\n get hasReadPermission(): boolean {\n return this.context?.isGranted(Permissions.Read) ?? false;\n }\n\n get hasEditPermission(): boolean {\n return this.context?.isGranted(Permissions.Edit) ?? false;\n }\n\n get hasDeletePermission(): boolean {\n return this.context?.isGranted(Permissions.Delete) ?? false;\n }\n\n duplicateAction() {\n this.duplicate.emit();\n }\n\n editAction() {\n this.edit.emit();\n }\n\n deleteAction() {\n this.delete.emit();\n }\n}\n","<div class=\"flex justify-end\" role=\"toolbar\" tabindex=\"0\" (click)=\"$event.stopPropagation()\" (keyup.enter)=\"$event.stopPropagation()\">\n @if (duplicateButton) {\n <ef-button\n icon=\"pi pi-copy\"\n severity=\"primary\"\n styleClass=\"action-btn\"\n tooltipKey=\"common.duplicate\"\n (clickEvent)=\"duplicateAction()\" />\n }\n @if (editButton && hasEditPermission) {\n <ef-button\n icon=\"pi pi-pencil\"\n severity=\"primary\"\n styleClass=\"action-btn\"\n size=\"small\"\n tooltipKey=\"common.edit\"\n (clickEvent)=\"editAction()\" />\n }\n @if (deleteButton && hasDeletePermission) {\n <ef-button\n icon=\"pi pi-trash\"\n severity=\"primary\"\n styleClass=\"action-btn\"\n size=\"small\"\n tooltipPosition=\"top\"\n tooltipKey=\"common.delete\"\n (clickEvent)=\"deleteAction()\" />\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n LOCALE_ID,\n OnInit,\n output,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule, CurrencyPipe, DatePipe, DecimalPipe } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { Table, TableLazyLoadEvent, TableModule } from 'primeng/table';\nimport {\n EfDatatableActions,\n EfDatatableColumn,\n EfDatatableColumnAlign,\n EfDatatableConfig,\n EF_DATATABLE_ACTIONS_DEFAULTS,\n EF_DATATABLE_DEFAULTS,\n getColumnAlignment,\n mergeColumnDefaults,\n} from './ef-datatable.component.types';\nimport { ScreenContext } from '@elasticias/screens';\nimport { EfDatatableActionBarComponent } from '../ef-datatable-actionbar/ef-datatable-actionbar.component';\n\n/**\n * SearchEntity interface for datatable consumption.\n * Matches the shape expected from the consuming application's SearchEntity.\n */\nexport interface DatatableSearchEntity {\n items?: Record<string, unknown>[];\n totalCount?: number;\n pagination?: {\n pageNumber: number;\n pageSize: number;\n };\n sort?: Array<{\n field: string;\n sortDirection: string;\n }>;\n}\n\n/**\n * ef-datatable - Reusable table component wrapping PrimeNG Table\n *\n * Features:\n * - Typed columns with automatic formatting (text, number, money, date, datetime, boolean, reference)\n * - Built-in action column with edit/delete/duplicate buttons\n * - Support for custom templates\n * - PassThrough (PT) support for deep customization\n * - Lazy loading, pagination, sorting, column resizing\n * - State persistence (localStorage/sessionStorage)\n * - Reference data integration via ScreenContext\n *\n * @example\n * ```html\n * <ef-datatable\n * [columns]=\"tableColumns\"\n * [searchEntity]=\"searchEntity\"\n * [context]=\"context\"\n * [screenStateKey]=\"screenStateKey\"\n * [actions]=\"{ showDuplicate: true }\"\n * (editRow)=\"edit($event)\"\n * (deleteRow)=\"delete($event)\"\n * (lazyLoad)=\"search($event)\">\n * </ef-datatable>\n * ```\n */\n@Component({\n selector: 'ef-datatable',\n standalone: true,\n templateUrl: './ef-datatable.component.html',\n styleUrl: './ef-datatable.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n TableModule,\n TranslateModule,\n EfDatatableActionBarComponent,\n ],\n})\nexport class EfDatatableComponent implements OnInit {\n /**\n * Reference to the underlying PrimeNG Table component\n */\n @ViewChild('pTable') pTable?: Table;\n\n selectedItem: Record<string, unknown> | undefined;\n\n // ============================================================================\n // INPUTS\n // ============================================================================\n\n /**\n * Column definitions with type, alignment, and formatting options\n */\n columns = input<EfDatatableColumn[]>([]);\n\n /**\n * Table configuration (pagination, scrolling, sizing, etc.)\n */\n config = input<EfDatatableConfig>({});\n\n /**\n * Action column configuration (edit/delete/duplicate buttons)\n */\n actions = input<EfDatatableActions | undefined>();\n\n /**\n * SearchEntity containing items, pagination, etc.\n */\n searchEntity = input<DatatableSearchEntity | undefined>();\n\n /**\n * ScreenContext for reference data access\n */\n context = input<ScreenContext | undefined>();\n\n /**\n * PassThrough options for deep DOM customization\n */\n pt = input<Record<string, unknown>>();\n\n /**\n * Screen state key for state persistence (auto-generates stateKey if not provided in config)\n */\n screenStateKey = input<string | undefined>();\n\n // ============================================================================\n // OUTPUTS\n // ============================================================================\n\n /**\n * Emitted when edit button is clicked (emits row ID)\n */\n editRow = output<unknown>();\n\n /**\n * Emitted when delete button is clicked (emits row ID)\n */\n deleteRow = output<unknown>();\n\n /**\n * Emitted when duplicate button is clicked (emits row ID)\n */\n duplicateRow = output<unknown>();\n\n /**\n * Emitted on lazy load events (pagination, sorting, filtering)\n */\n lazyLoad = output<TableLazyLoadEvent>();\n\n /**\n * Emitted when a row is selected\n */\n rowSelect = output<unknown>();\n\n // ============================================================================\n // INTERNAL STATE\n // ============================================================================\n\n /**\n * Loading indicator\n */\n loading = signal(false);\n\n /**\n * Merged configuration with defaults\n */\n mergedConfig!: Required<EfDatatableConfig>;\n\n /**\n * Merged action configuration with defaults\n */\n mergedActions!: Required<EfDatatableActions>;\n\n /**\n * Processed columns with defaults and computed alignment\n * Reactive to changes in columns input\n */\n processedColumns = computed(() => {\n return this.columns().map(col => {\n const merged = mergeColumnDefaults(col);\n return {\n ...merged,\n align: getColumnAlignment(merged)\n };\n });\n });\n\n /**\n * Computed sort field from searchEntity for restoring table state\n */\n sortField = computed(() => {\n const sort = this.searchEntity()?.sort;\n return sort && sort.length > 0 ? sort[0].field : undefined;\n });\n\n /**\n * Computed sort order from searchEntity for restoring table state\n * 1 = ascending, -1 = descending\n */\n sortOrder = computed(() => {\n const sort = this.searchEntity()?.sort;\n if (sort && sort.length > 0) {\n return sort[0].sortDirection === 'Ascending' ? 1 : -1;\n }\n return 1;\n });\n\n // Angular pipes for formatting (use app's configured locale)\n private readonly locale = inject(LOCALE_ID);\n private readonly datePipe = new DatePipe(this.locale);\n private readonly decimalPipe = new DecimalPipe(this.locale);\n private readonly currencyPipe = new CurrencyPipe(this.locale);\n\n // ============================================================================\n // LIFECYCLE HOOKS\n // ============================================================================\n\n ngOnInit(): void {\n // Merge config with defaults\n this.mergedConfig = { ...EF_DATATABLE_DEFAULTS, ...this.config() };\n\n // Merge action config with defaults (only if actions are provided)\n if (this.actions()) {\n this.mergedActions = { ...EF_DATATABLE_ACTIONS_DEFAULTS, ...this.actions() };\n } else {\n this.mergedActions = { ...EF_DATATABLE_ACTIONS_DEFAULTS, show: false };\n }\n\n // Auto-generate state key if not provided\n if (!this.mergedConfig.stateKey && this.screenStateKey()) {\n this.mergedConfig.stateKey = `APP_TABLE_${this.screenStateKey()}`;\n }\n }\n\n // ============================================================================\n // EVENT HANDLERS\n // ============================================================================\n\n /**\n * Handle lazy loading events from PrimeNG Table\n * Prevents duplicate events caused by reactive sortField/sortOrder binding updates\n * @param event - Table lazy load event containing pagination, sorting, filtering info\n */\n handleLazyLoad(event: TableLazyLoadEvent): void {\n // Skip if this event matches the current searchEntity state exactly.\n // This indicates a reactive binding echo: after parent updates searchEntity,\n // our sortField()/sortOrder() computed signals update, PrimeNG detects the\n // binding change and fires onLazyLoad again with the same values.\n if (this.isBindingEcho(event)) {\n return;\n }\n\n this.lazyLoad.emit(event);\n }\n\n /**\n * Detects if the event is a reactive binding echo (matches current searchEntity state)\n */\n private isBindingEcho(event: TableLazyLoadEvent): boolean {\n const entity = this.searchEntity();\n if (!entity?.sort || entity.sort.length === 0) {\n return false;\n }\n\n const currentSort = entity.sort[0];\n const eventSortField = Array.isArray(event.sortField)\n ? event.sortField[0]\n : event.sortField;\n const eventSortOrder = event.sortOrder ?? 1;\n const currentSortOrder = currentSort.sortDirection === 'Ascending' ? 1 : -1;\n\n // Calculate current and event page numbers\n const currentPage = entity.pagination?.pageNumber || 1;\n const currentPageSize = entity.pagination?.pageSize || 10;\n const eventFirst = event.first ?? 0;\n const eventRows = event.rows ?? 10;\n const eventPage = Math.floor(eventFirst / eventRows) + 1;\n\n // If event matches current state exactly, it's a binding echo\n return (\n currentSort.field === eventSortField &&\n currentSortOrder === eventSortOrder &&\n currentPage === eventPage &&\n currentPageSize === eventRows\n );\n }\n\n /**\n * Handle edit button click\n * @param rowData - The row data object\n */\n handleEdit(rowData: Record<string, unknown>): void {\n const id = rowData[this.mergedConfig.dataKey];\n this.editRow.emit(id);\n }\n\n handleDelete(rowData: Record<string, unknown>): void {\n const id = rowData[this.mergedConfig.dataKey];\n this.deleteRow.emit(id);\n }\n\n handleDuplicate(rowData: Record<string, unknown>): void {\n const id = rowData[this.mergedConfig.dataKey];\n this.duplicateRow.emit(id);\n }\n\n // ============================================================================\n // FORMATTING METHODS\n // ============================================================================\n\n /**\n * Format cell value based on column type\n * @param rowData - The row data object\n * @param column - The column configuration\n * @returns Formatted string value\n */\n formatCellValue(rowData: Record<string, unknown>, column: EfDatatableColumn): string | null {\n const value = rowData[column.field];\n if (value == null) return '';\n\n switch (column.type) {\n case 'date':\n return this.datePipe.transform(value as string | number | Date, column.dateFormat);\n\n case 'datetime':\n return this.datePipe.transform(value as string | number | Date, 'short');\n\n case 'number':\n return this.decimalPipe.transform(\n value as string | number,\n `1.${column.minFractionDigits}-${column.maxFractionDigits}`\n );\n\n case 'money':\n return this.currencyPipe.transform(\n value as string | number,\n column.currencyCode,\n column.currencyDisplay,\n `1.${column.minFractionDigits}-${column.maxFractionDigits}`\n );\n\n case 'boolean':\n return value ? 'Oui' : 'Non';\n\n case 'reference':\n return this.resolveReferenceValue(rowData, column);\n\n default:\n return String(value);\n }\n }\n\n /**\n * Resolve reference data value to display label\n * @param rowData - The row data object\n * @param column - The column configuration\n * @returns Display label from reference data\n */\n private resolveReferenceValue(rowData: Record<string, unknown>, column: EfDatatableColumn): string {\n const ctx = this.context();\n if (!ctx || !column.referenceKey) {\n return String(rowData[column.field]);\n }\n\n const refData = ctx.ref.get(column.referenceKey)();\n const value = rowData[column.field];\n\n if (!refData || !Array.isArray(refData)) {\n return String(value);\n }\n\n const valueField = column.referenceValueField ?? 'code';\n const labelField = column.referenceLabelField ?? 'name';\n const match = refData.find(\n (item: Record<string, unknown>) => item[valueField] === value\n );\n\n return match ? String(match[labelField]) : String(value);\n }\n\n /**\n * Get CSS class for text alignment\n * @param align - Alignment option\n * @returns CSS class name\n */\n getAlignmentClass(align?: EfDatatableColumnAlign): string {\n switch (align) {\n case 'start':\n return 'text-start';\n case 'center':\n return 'text-center';\n case 'end':\n return 'text-end';\n default:\n return 'text-start';\n }\n }\n\n // ============================================================================\n // PUBLIC API\n // ============================================================================\n\n /**\n * Reset table to first page and clear filters\n */\n reset(): void {\n this.pTable?.reset();\n }\n\n /**\n * Export table data as CSV\n */\n exportCSV(): void {\n this.pTable?.exportCSV();\n }\n\n /**\n * Get the current filter state\n */\n getFilters(): Record<string, unknown> | undefined {\n return this.pTable?.filters as Record<string, unknown> | undefined;\n }\n}\n","<p-table #pTable\n [value]=\"searchEntity()?.items || []\"\n [columns]=\"processedColumns()\"\n [dataKey]=\"mergedConfig.dataKey\"\n\n [lazy]=\"mergedConfig.lazy\"\n (onLazyLoad)=\"handleLazyLoad($event)\"\n\n [paginator]=\"mergedConfig.paginator\"\n [rows]=\"searchEntity()?.pagination?.pageSize || mergedConfig.rows\"\n [rowsPerPageOptions]=\"mergedConfig.rowsPerPageOptions\"\n [totalRecords]=\"searchEntity()?.totalCount || 0\"\n [first]=\"searchEntity()?.pagination ? (searchEntity()!.pagination!.pageNumber - 1) * searchEntity()!.pagination!.pageSize : 0\"\n\n [scrollable]=\"mergedConfig.scrollable\"\n [scrollHeight]=\"mergedConfig.scrollHeight\"\n\n [resizableColumns]=\"mergedConfig.resizableColumns\"\n [columnResizeMode]=\"mergedConfig.columnResizeMode\"\n\n [stateStorage]=\"mergedConfig.stateStorage\"\n [stateKey]=\"mergedConfig.stateKey\"\n\n [size]=\"mergedConfig.size\"\n [class]=\"mergedConfig.styleClass\"\n [tableStyle]=\"mergedConfig.tableStyle\"\n\n [currentPageReportTemplate]=\"searchEntity()?.totalCount ? 'Affichage de {first} a {last} sur {totalRecords} entrees' : mergedConfig.emptyMessage\"\n [showCurrentPageReport]=\"true\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n [loading]=\"loading()\"\n\n [pt]=\"pt()\"\n\n selectionMode=\"single\" [(selection)]=\"selectedItem\">\n\n <!-- Header Template -->\n <ng-template #header>\n <tr>\n <!-- Action column at start if configured -->\n @if (mergedActions.show && mergedActions.position === 'start') {\n <th [class]=\"mergedActions.width\"></th>\n }\n\n <!-- Data columns -->\n @for (column of processedColumns(); track column.field) {\n @if (column.sortable && column.resizable) {\n <th\n [pSortableColumn]=\"column.field\"\n pResizableColumn\n [class]=\"column.width || ''\"\n [ngClass]=\"column.styleClass\">\n\n @if (column.headerTemplate) {\n <ng-container *ngTemplateOutlet=\"column.headerTemplate; context: { $implicit: column }\"></ng-container>\n } @else {\n {{ column.header | translate }}\n <p-sortIcon [field]=\"column.field\" />\n }\n </th>\n } @else if (column.sortable) {\n <th\n [pSortableColumn]=\"column.field\"\n [class]=\"column.width || ''\"\n [ngClass]=\"column.styleClass\">\n\n @if (column.headerTemplate) {\n <ng-container *ngTemplateOutlet=\"column.headerTemplate; context: { $implicit: column }\"></ng-container>\n } @else {\n {{ column.header | translate }}\n <p-sortIcon [field]=\"column.field\" />\n }\n </th>\n } @else if (column.resizable) {\n <th\n pResizableColumn\n [class]=\"column.width || ''\"\n [ngClass]=\"column.styleClass\">\n\n @if (column.headerTemplate) {\n <ng-container *ngTemplateOutlet=\"column.headerTemplate; context: { $implicit: column }\"></ng-container>\n } @else {\n {{ column.header | translate }}\n }\n </th>\n } @else {\n <th\n [class]=\"column.width || ''\"\n [ngClass]=\"column.styleClass\">\n\n @if (column.headerTemplate) {\n <ng-container *ngTemplateOutlet=\"column.headerTemplate; context: { $implicit: column }\"></ng-container>\n } @else {\n {{ column.header | translate }}\n }\n </th>\n }\n }\n\n <!-- Action column at end if configured -->\n @if (mergedActions.show && mergedActions.position === 'end') {\n <th [class]=\"mergedActions.width\"></th>\n }\n </tr>\n </ng-template>\n\n <!-- Body Template -->\n <ng-template #body let-rowData let-rowIndex=\"rowIndex\">\n <tr (dblclick)=\"handleEdit(rowData)\" style=\"cursor: pointer\"\n [pSelectableRow]=\"rowData\" [pSelectableRowIndex]=\"rowIndex\">\n <!-- Action column at start if configured -->\n @if (mergedActions.show && mergedActions.position === 'start') {\n <td>\n <ef-datatable-actionbar\n [context]=\"context()\"\n (edit)=\"handleEdit(rowData)\"\n (delete)=\"handleDelete(rowData)\"\n (duplicate)=\"handleDuplicate(rowData)\">\n </ef-datatable-actionbar>\n </td>\n }\n\n <!-- Data columns -->\n @for (column of processedColumns(); track column.field) {\n <td [ngClass]=\"getAlignmentClass(column.align)\">\n @if (column.template) {\n <ng-container *ngTemplateOutlet=\"column.template; context: { $implicit: rowData, column: column }\"></ng-container>\n } @else {\n {{ formatCellValue(rowData, column) }}\n }\n </td>\n }\n\n <!-- Action column at end if configured -->\n @if (mergedActions.show && mergedActions.position === 'end') {\n <td>\n <ef-datatable-actionbar\n [context]=\"context()\"\n (edit)=\"handleEdit(rowData)\"\n (delete)=\"handleDelete(rowData)\"\n (duplicate)=\"handleDuplicate(rowData)\">\n </ef-datatable-actionbar>\n </td>\n }\n </tr>\n </ng-template>\n</p-table>\n","import { InjectionToken } from '@angular/core';\n\n/**\n * How `ef-data-card` presents a row once the table becomes a list.\n *\n * - `row` — a dense two-line row: the primary field, a muted secondary line,\n * a status badge and the actions menu. Roughly eight to a screen,\n * which is what a list of thousands needs.\n * - `card` — one card per record, every field on its own labelled line.\n * Easier to read a single record, at about a record and a half\n * per screen.\n *\n * Both expand to the same labelled detail; they differ only in the collapsed\n * state.\n */\nexport type EfDataCardMobileLayout = 'row' | 'card';\n\n/**\n * App-wide default, so screens don't drift apart. Provide it once at the\n * application root; a screen that genuinely needs the other shape overrides\n * it with `[mobileLayout]`.\n *\n * ```ts\n * { provide: EF_DATA_CARD_MOBILE_LAYOUT, useValue: 'card' }\n * ```\n */\nexport const EF_DATA_CARD_MOBILE_LAYOUT = new InjectionToken<EfDataCardMobileLayout>(\n 'EF_DATA_CARD_MOBILE_LAYOUT',\n);\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfSelectComponent } from '../../forms/ef-select/ef-select.component';\n\ninterface PageBtn {\n kind: 'page' | 'ellipsis';\n value: number;\n}\n\n/**\n * Pagination control matching the Comptoir prototype's `.pager`\n * shape (lines-per-page selector · range · page buttons).\n *\n * ```html\n * <ef-pager\n * [pageNumber]=\"criteria().pagination.pageNumber\"\n * [pageSize]=\"criteria().pagination.pageSize\"\n * [totalCount]=\"totalCount()\"\n * (pageChange)=\"setPage($event)\"\n * (pageSizeChange)=\"setPage(1, $event)\"\n * />\n * ```\n *\n * Renders a windowed page list (first / current ±1 / last with\n * ellipsis) for total > 7 pages. Below 7 pages all buttons show.\n */\n@Component({\n selector: 'ef-pager',\n standalone: true,\n imports: [CommonModule, TranslateModule, EfSelectComponent],\n templateUrl: './ef-pager.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfPagerComponent {\n readonly pageNumber = input<number>(1);\n readonly pageSize = input<number>(25);\n readonly totalCount = input<number>(0);\n readonly pageSizeOptions = input<ReadonlyArray<number>>([10, 25, 50, 100]);\n\n /** Translation keys (preferred — consumer-side i18n). */\n readonly linesPerPageLabelKey = input<string>('common_lines_per_page');\n readonly ofLabelKey = input<string>('common_of');\n readonly prevLabelKey = input<string>('common_page_previous');\n readonly nextLabelKey = input<string>('common_page_next');\n\n /** Hide the lines-per-page selector + range when only paging is wanted. */\n readonly hideSize = input<boolean>(false);\n\n readonly pageChange = output<number>();\n readonly pageSizeChange = output<number>();\n\n /** Falls back to the first configured option if the value ever goes empty. */\n private get defaultSize(): number {\n return this.pageSizeOptions()[0] ?? this.pageSize();\n }\n\n /** `pageSizeOptions` shaped for `ef-select`, which reads a label and a\n * value off each option rather than taking bare primitives. */\n readonly sizeOptions = computed(() =>\n this.pageSizeOptions().map(n => ({ label: String(n), value: n })),\n );\n\n readonly totalPages = computed(() => {\n const size = this.pageSize();\n return size > 0 ? Math.max(1, Math.ceil(this.totalCount() / size)) : 1;\n });\n\n readonly range = computed(() => {\n const total = this.totalCount();\n if (total === 0) return { start: 0, end: 0 };\n const start = (this.pageNumber() - 1) * this.pageSize() + 1;\n const end = Math.min(this.pageNumber() * this.pageSize(), total);\n return { start, end };\n });\n\n /** First page · current ±1 · last page, with ellipsis fillers. */\n readonly pageButtons = computed<ReadonlyArray<PageBtn>>(() => {\n const total = this.totalPages();\n const current = this.pageNumber();\n const out: PageBtn[] = [];\n if (total <= 7) {\n for (let i = 1; i <= total; i++) out.push({ kind: 'page', value: i });\n return out;\n }\n out.push({ kind: 'page', value: 1 });\n if (current > 3) out.push({ kind: 'ellipsis', value: 0 });\n const start = Math.max(2, current - 1);\n const end = Math.min(total - 1, current + 1);\n for (let i = start; i <= end; i++) out.push({ kind: 'page', value: i });\n if (current < total - 2) out.push({ kind: 'ellipsis', value: 0 });\n out.push({ kind: 'page', value: total });\n return out;\n });\n\n goToPage(page: number): void {\n const total = this.totalPages();\n if (page < 1 || page > total || page === this.pageNumber()) return;\n this.pageChange.emit(page);\n }\n\n onSizeChange(value: number | string | null): void {\n const size = typeof value === 'number' ? value : parseInt(value ?? '', 10);\n\n if (Number.isNaN(size) || size <= 0) {\n // \"No page size\" has no meaning. The control is not clearable\n // (see the template), so this only guards a value arriving empty\n // from somewhere else: fall back to the first configured option.\n const fallback = this.defaultSize;\n if (fallback !== this.pageSize()) this.pageSizeChange.emit(fallback);\n return;\n }\n\n if (size !== this.pageSize()) this.pageSizeChange.emit(size);\n }\n\n trackBtn(index: number, btn: PageBtn): string {\n return btn.kind === 'page' ? `p${btn.value}` : `e${index}`;\n }\n}\n","<div class=\"pager\">\n @if (!hideSize()) {\n <div class=\"size\">\n <span>{{ linesPerPageLabelKey() | translate }}</span>\n <ef-select\n size=\"small\"\n appendTo=\"body\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [options]=\"sizeOptions()\"\n [value]=\"pageSize()\"\n [ariaLabelKey]=\"linesPerPageLabelKey()\"\n [showClear]=\"false\"\n (selectionChangeEvent)=\"onSizeChange($event)\"\n />\n @if (totalCount() > 0) {\n <span>· {{ range().start }}–{{ range().end }} {{ ofLabelKey() | translate }} {{ totalCount() }}</span>\n }\n </div>\n } @else {\n <span></span>\n }\n\n <div class=\"pages\">\n <button\n class=\"pg\"\n type=\"button\"\n [disabled]=\"pageNumber() <= 1\"\n [attr.aria-label]=\"prevLabelKey() | translate\"\n (click)=\"goToPage(pageNumber() - 1)\"\n >‹</button>\n\n @for (btn of pageButtons(); track trackBtn($index, btn)) {\n @if (btn.kind === 'page') {\n <button\n class=\"pg\"\n type=\"button\"\n [class.active]=\"btn.value === pageNumber()\"\n (click)=\"goToPage(btn.value)\"\n >{{ btn.value }}</button>\n } @else {\n <span class=\"pg\" aria-hidden=\"true\" style=\"cursor: default;\">…</span>\n }\n }\n\n <button\n class=\"pg\"\n type=\"button\"\n [disabled]=\"pageNumber() >= totalPages()\"\n [attr.aria-label]=\"nextLabelKey() | translate\"\n (click)=\"goToPage(pageNumber() + 1)\"\n >›</button>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ScreenContext } from '@elasticias/screens';\nimport { EfRowAction } from './ef-row-actions.types';\n\n/**\n * Row-actions dropdown — V2 successor to `ef-datatable-actionbar`.\n *\n * Renders a discreet trailing-cell ⋯ trigger (34×28 pill) that opens\n * a small Comptoir-styled menu with the items declared in TS:\n *\n * ```ts\n * actions: ReadonlyArray<EfRowAction> = [\n * { id: 'view', labelKey: 'common_view', icon: 'pi pi-eye', kbd: '↵',\n * permission: Permissions.Read, command: () => view(row) },\n * { id: 'edit', labelKey: 'common_edit', icon: 'pi pi-pencil', kbd: 'E',\n * permission: Permissions.Edit, command: () => edit(row) },\n * { id: 'duplicate', labelKey: 'common_duplicate', icon: 'pi pi-copy',\n * command: () => duplicate(row) },\n * { separator: true },\n * { id: 'delete', labelKey: 'common_delete', icon: 'pi pi-trash', severity: 'danger',\n * permission: Permissions.Delete, command: () => delete(row) },\n * ];\n * ```\n *\n * ```html\n * <ng-template efColumnTemplate=\"actions\" let-row>\n * <ef-row-actions [items]=\"rowActions(row)\" [context]=\"context\" />\n * </ng-template>\n * ```\n *\n * Behaviour:\n * - Click the trigger to toggle. Trigger gets `.open` (ink-active) while the menu is open.\n * - Only one row menu is open at a time — opening one closes the last.\n * - The menu flips above the trigger when there isn't room below it.\n * - Click outside or press `Escape` to close.\n * - Clicking an item runs its `command` then closes the menu.\n * - dblclick on the trigger or menu does NOT propagate, so the data-card's\n * `rowDoubleClickable` won't fire from this column.\n *\n * Permission filtering: pass `[context]=\"...\"` (a `ScreenContext`); items\n * declaring a `permission` are hidden unless that permission is granted.\n * Items with no `permission` always show.\n */\n@Component({\n selector: 'ef-row-actions',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n templateUrl: './ef-row-actions.component.html',\n styleUrl: './ef-row-actions.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfRowActionsComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Action descriptors. */\n readonly items = input<ReadonlyArray<EfRowAction>>([]);\n\n /** Optional context — when present, items with a `permission` are\n * filtered against `context.isGranted(permission)`. */\n readonly context = input<ScreenContext | undefined>(undefined);\n\n /** Override the trigger icon (default ellipsis). */\n readonly triggerIcon = input<string>('pi pi-ellipsis-h');\n\n /** Override the trigger aria-label translation key. */\n readonly triggerAriaKey = input<string>('common_actions');\n\n /** Disable the entire trigger (e.g., row not actionable). */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Pin the menu to the inline-start edge of the trigger instead of\n * inline-end. Use when the actions cell sits at the start of the row.\n */\n readonly menuLeft = input(false, { transform: booleanAttribute });\n\n /** Forwarded when the menu opens (e.g., for a data-card to lift overflow). */\n readonly opened = output<void>();\n /** Forwarded when the menu closes. */\n readonly closed = output<void>();\n\n /** Visible items (after permission + visible filtering). */\n readonly visibleItems = computed<ReadonlyArray<EfRowAction>>(() => {\n const ctx = this.context();\n return this.items().filter(a => this.isVisible(a, ctx));\n });\n\n /** Open state. */\n readonly open = signal(false);\n\n /** Menu renders above the trigger instead of below it. */\n readonly dropUp = signal(false);\n\n /**\n * The one menu currently open, app-wide.\n *\n * The trigger click is stopped from reaching `document` so it can't\n * select or open the row, which also means no other instance's\n * outside-click listener ever sees it. Without an explicit hand-off\n * every menu clicked stays open and they stack up on screen.\n */\n private static openInstance: EfRowActionsComponent | null = null;\n\n toggle(event: MouseEvent): void {\n event.stopPropagation();\n if (this.disabled() || this.visibleItems().length === 0) return;\n this.open.update(v => !v);\n const isOpen = this.open();\n\n if (isOpen) {\n EfRowActionsComponent.openInstance?.close();\n EfRowActionsComponent.openInstance = this;\n // Place it from an estimate first so it never renders in the\n // wrong direction, then correct against the real height once\n // the menu is in the DOM.\n this.dropUp.set(this.shouldDropUp(this.estimateMenuHeight()));\n this.correctPlacementAfterRender();\n }\n\n this.dispatchToggle(isOpen);\n if (isOpen) this.opened.emit();\n else this.closed.emit();\n }\n\n runCommand(action: EfRowAction, event: MouseEvent): void {\n event.stopPropagation();\n if (action.disabled || action.separator) return;\n action.command?.();\n this.close();\n }\n\n close(): void {\n if (!this.open()) return;\n this.open.set(false);\n if (EfRowActionsComponent.openInstance === this) {\n EfRowActionsComponent.openInstance = null;\n }\n this.dispatchToggle(false);\n this.closed.emit();\n }\n\n /* ── Placement ──────────────────────────────────────────────── */\n\n /** Gap between the trigger and the menu, plus a little breathing room\n * against the viewport edge. Matches `top: calc(100% + 8px)`. */\n private static readonly EDGE_GAP = 16;\n\n /**\n * Drop upward when the menu would not fit below the trigger and there\n * is more room above. On a short viewport where it fits neither way,\n * below wins, which is where it has always been.\n */\n private shouldDropUp(menuHeight: number): boolean {\n const rect = this.host.nativeElement.getBoundingClientRect();\n const below = window.innerHeight - rect.bottom;\n const above = rect.top;\n return below < menuHeight + EfRowActionsComponent.EDGE_GAP && above > below;\n }\n\n /** Rough height before the menu exists: item padding + line box, with\n * dividers and the menu's own padding and border. */\n private estimateMenuHeight(): number {\n const items = this.visibleItems();\n const separators = items.filter(a => a.separator).length;\n return 14 + (items.length - separators) * 39 + separators * 10;\n }\n\n /** Re-decide against the rendered height — item labels wrap, and the\n * estimate can't know that. */\n private correctPlacementAfterRender(): void {\n requestAnimationFrame(() => {\n if (!this.open()) return;\n const menu = this.host.nativeElement.querySelector<HTMLElement>('.row-actions__menu');\n if (!menu) return;\n this.dropUp.set(this.shouldDropUp(menu.offsetHeight));\n });\n }\n\n /** Bubbling DOM event so ancestors (e.g. ef-data-card) can react —\n * see `.tbl-wrap.has-open-menu { overflow: visible }`. */\n private dispatchToggle(open: boolean): void {\n this.host.nativeElement.dispatchEvent(\n new CustomEvent('ef-row-actions-toggle', {\n bubbles: true,\n composed: true,\n detail: { open },\n }),\n );\n }\n\n /** Outside click — closes the menu. */\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.open()) return;\n const target = event.target as Node | null;\n if (target && this.host.nativeElement.contains(target)) return;\n this.close();\n }\n\n /** Escape closes the menu. */\n @HostListener('document:keydown.escape')\n onEscape(): void {\n this.close();\n }\n\n /** Swallow dblclick so row-double-click doesn't fire from this column. */\n onDblClick(event: MouseEvent): void {\n event.stopPropagation();\n }\n\n private isVisible(action: EfRowAction, ctx: ScreenContext | undefined): boolean {\n if (action.separator) return true;\n if (action.visible === false) return false;\n if (action.permission && ctx && !ctx.isGranted(action.permission)) return false;\n return true;\n }\n\n /** Stable trackBy across renders. */\n trackByItem = (i: number, action: EfRowAction): unknown =>\n action.id ?? (action.separator ? `__sep_${i}` : action.label ?? action.labelKey ?? i);\n}\n","<div class=\"row-actions\">\n <button\n type=\"button\"\n class=\"row-actions__trigger\"\n [class.open]=\"open()\"\n [disabled]=\"disabled() || visibleItems().length === 0\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-label]=\"triggerAriaKey() | translate\"\n (click)=\"toggle($event)\"\n (dblclick)=\"onDblClick($event)\"\n >\n <i [class]=\"triggerIcon()\" aria-hidden=\"true\"></i>\n </button>\n\n @if (open()) {\n <div\n class=\"row-actions__menu open\"\n [class.left]=\"menuLeft()\"\n [class.up]=\"dropUp()\"\n role=\"menu\"\n [attr.aria-label]=\"triggerAriaKey() | translate\"\n (dblclick)=\"onDblClick($event)\"\n >\n @for (action of visibleItems(); track trackByItem($index, action)) {\n @if (action.separator) {\n <div class=\"row-actions__divider\" role=\"separator\"></div>\n } @else {\n <button\n type=\"button\"\n class=\"row-actions__item\"\n [class.danger]=\"action.severity === 'danger'\"\n [disabled]=\"action.disabled\"\n role=\"menuitem\"\n (click)=\"runCommand(action, $event)\"\n >\n @if (action.icon) {\n <i class=\"ico\" [class]=\"'ico ' + action.icon\" aria-hidden=\"true\"></i>\n }\n <span class=\"lbl\">\n {{ action.labelKey ? (action.labelKey | translate) : action.label }}\n </span>\n @if (action.kbd) {\n <span class=\"kbd\" aria-hidden=\"true\">{{ action.kbd }}</span>\n }\n </button>\n }\n }\n </div>\n }\n</div>\n","import { Directive, Input, TemplateRef, inject } from '@angular/core';\n\n/**\n * Marks an `<ng-template>` as the body cell renderer for a given\n * column id on `<ef-data-card>`.\n *\n * ```html\n * <ng-template efColumnTemplate=\"status\" let-row let-col=\"col\">\n * <span class=\"chip\" [class]=\"'chip chip-' + row.status\">…</span>\n * </ng-template>\n * ```\n *\n * Context:\n * - `$implicit` — the row data\n * - `col` — the column config (`EfDataCardColumn`)\n * - `index` — the row index in the current page\n */\n@Directive({\n selector: '[efColumnTemplate]',\n standalone: true,\n})\nexport class EfColumnTemplateDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n\n @Input({ alias: 'efColumnTemplate', required: true })\n columnId!: string;\n}\n\n/**\n * Marks an `<ng-template>` as the **header** cell renderer for a\n * given column id. Use this when the header needs richer markup\n * than a translated string (e.g. a select-all checkbox).\n *\n * ```html\n * <ng-template efColumnHeaderTemplate=\"select\">\n * <input type=\"checkbox\" class=\"cb\"\n * [checked]=\"allSelected()\" (change)=\"toggleAll()\" />\n * </ng-template>\n * ```\n */\n@Directive({\n selector: '[efColumnHeaderTemplate]',\n standalone: true,\n})\nexport class EfColumnHeaderTemplateDirective {\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n\n @Input({ alias: 'efColumnHeaderTemplate', required: true })\n columnId!: string;\n}\n","import {\n AfterContentInit,\n ChangeDetectionStrategy,\n Component,\n ContentChildren,\n HostListener,\n QueryList,\n TemplateRef,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport {\n SCREEN_REF_DATA_SERVICE,\n ScreenContext,\n ScreenReferenceDataService,\n} from '@elasticias/screens';\nimport { Permissions } from '@elasticias/types';\nimport { StorageUtils } from '@elasticias/utils';\nimport { EfViewportService } from '@elasticias/core';\nimport {\n EF_DATA_CARD_MOBILE_LAYOUT,\n EfDataCardMobileLayout,\n} from './ef-data-card.mobile';\nimport { EfPagerComponent } from '../ef-pager/ef-pager.component';\nimport { EfStatusChipComponent } from '../../feedback/ef-status-chip/ef-status-chip.component';\nimport { EfRowActionsComponent } from '../ef-row-actions/ef-row-actions.component';\nimport { EfRowAction } from '../ef-row-actions/ef-row-actions.types';\nimport {\n EfColumnHeaderTemplateDirective,\n EfColumnTemplateDirective,\n} from './ef-column-template.directive';\nimport {\n EfDataCardColumn,\n EfDataCardSort,\n EfDataCardSortDirection,\n} from './ef-data-card.types';\n\n/** Action identifier emitted by `ef-data-card`'s auto row-actions cell. */\nexport type EfDataCardRowAction = 'view' | 'edit' | 'duplicate' | 'delete';\n\n/** Row height presets offered by the Density control. */\nexport type EfTableDensity = 'compact' | 'default' | 'comfortable';\n\n/**\n * Comptoir data card — column-driven `.tbl-wrap` with header (count\n * info + actions) and integrated pager.\n *\n * Two consumer surfaces:\n * 1. **Columns + rows + templates** (preferred): declare columns in\n * TS as `EfDataCardColumn[]`, project body / header templates via\n * `*efColumnTemplate` / `*efColumnHeaderTemplate` for cells that\n * need rich HTML. Built-in cell renderers handle text / number /\n * money / date / datetime / boolean / mono / chip / reference.\n * 2. **`tbl-head-info` / `tbl-head-actions` slots**: still projected\n * so the consumer can render the count text + density / columns /\n * view-toggle buttons next to the table header.\n *\n * ```html\n * <ef-data-card\n * [columns]=\"cols\"\n * [rows]=\"orders()\"\n * [pageNumber]=\"criteria().pagination.pageNumber\"\n * [pageSize]=\"criteria().pagination.pageSize\"\n * [totalCount]=\"totalCount()\"\n * [loading]=\"loading()\"\n * [sort]=\"currentSort()\"\n * (pageChange)=\"setPage($event)\"\n * (sortChange)=\"setSort($event.field, $event.direction)\"\n * trackByField=\"id\"\n * >\n * <span tbl-head-info>…count…</span>\n *\n * <ng-template efColumnTemplate=\"status\" let-row>\n * <span class=\"chip\" [class]=\"'chip chip-' + row.status\">…</span>\n * </ng-template>\n * </ef-data-card>\n * ```\n */\n@Component({\n selector: 'ef-data-card',\n standalone: true,\n imports: [\n CommonModule,\n TranslateModule,\n EfPagerComponent,\n EfStatusChipComponent,\n EfRowActionsComponent,\n ],\n templateUrl: './ef-data-card.component.html',\n styleUrl: './ef-data-card.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfDataCardComponent<TRow = any> implements AfterContentInit {\n /* ── Mobile presentation ─────────────────────────────────────\n Under 768px a table stops being readable: six columns on a\n 390px screen either overflow or squeeze to nothing. The rows\n become a list instead, driven by the same column config —\n each column declares (or is given) a role. */\n\n private readonly viewport = inject(EfViewportService);\n private readonly configuredMobileLayout = inject(EF_DATA_CARD_MOBILE_LAYOUT, { optional: true });\n\n readonly isMobile = this.viewport.isMobile;\n\n /** Per-screen override of the app-wide default. */\n readonly mobileLayout = input<EfDataCardMobileLayout | null>(null);\n\n protected readonly effectiveMobileLayout = computed<EfDataCardMobileLayout>(\n () => this.mobileLayout() ?? this.configuredMobileLayout ?? 'row',\n );\n\n /** Rows currently showing their detail, keyed the same way as trackByRow. */\n private readonly expandedRows = signal<ReadonlySet<unknown>>(new Set());\n\n protected isExpanded(row: unknown, index: number): boolean {\n return this.expandedRows().has(this.rowKey(row, index));\n }\n\n /**\n * The row head is the expander, but the actions menu lives inside it.\n * Filtering here rather than stopping propagation on a wrapper keeps the\n * wrapper a plain span — a click handler on one would need a keyboard\n * equivalent and a tabindex to be usable, which a decorative box should\n * not have.\n */\n protected onRowHeadActivate(row: unknown, index: number, event: Event): void {\n if (!this.hasDetail()) return;\n const target = event.target as HTMLElement | null;\n if (target?.closest('.mrow__actions')) return;\n this.toggleExpanded(row, index);\n }\n\n protected toggleExpanded(row: unknown, index: number): void {\n const key = this.rowKey(row, index);\n const next = new Set(this.expandedRows());\n if (!next.delete(key)) next.add(key);\n this.expandedRows.set(next);\n }\n\n private rowKey(row: unknown, index: number): unknown {\n const id = (row as Record<string, unknown> | null)?.['id'];\n return id ?? index;\n }\n\n /**\n * Columns that carry data on mobile, in role order. Structural columns\n * (select, actions) are handled by the row chrome, not as fields.\n */\n private readonly mobileColumns = computed(() =>\n this.effectiveColumns().filter(c => c.id !== 'select' && c.id !== 'actions'),\n );\n\n /**\n * The role a column plays on mobile. An explicit `mobile` wins; otherwise\n * it is derived so every existing screen gets a sensible list without\n * touching its column definitions: the first text-ish column is what you\n * scan for, a status chip is a badge, money and dates sit on the muted\n * line, and the rest waits behind the expander.\n */\n protected roleOf(col: { id: string; mobile?: string; type?: string }): string {\n if (col.mobile) return col.mobile;\n if (col.type === 'status' || col.type === 'chip') return 'status';\n if (col.id === this.derivedPrimaryId()) return 'primary';\n if (col.type === 'money' || col.type === 'date' || col.type === 'datetime') return 'secondary';\n return 'detail';\n }\n\n private readonly derivedPrimaryId = computed(() => {\n const cols = this.mobileColumns();\n // Screens already mark the row's identity column `cellClass: 'strong'`\n // so it reads as the row's title in the table — that is a better\n // signal than position. Products, for one, leads with an external\n // reference that is usually blank; its title is second.\n const strong = cols.find(c => (c.cellClass ?? '').split(/\\s+/).includes('strong'));\n if (strong) return strong.id;\n const textish = cols.find(c => !c.type || c.type === 'text' || c.type === 'mono');\n return (textish ?? cols[0])?.id ?? '';\n });\n\n protected readonly primaryColumn = computed(() =>\n this.mobileColumns().find(c => this.roleOf(c) === 'primary'),\n );\n\n protected readonly statusColumn = computed(() =>\n this.mobileColumns().find(c => this.roleOf(c) === 'status'),\n );\n\n protected readonly secondaryColumns = computed(() =>\n this.mobileColumns().filter(c => this.roleOf(c) === 'secondary'),\n );\n\n /**\n * Fields shown once a row opens. The primary column is excluded: the\n * header already carries it, and repeating it is the first thing you\n * notice. Status is excluded for the same reason.\n */\n protected readonly detailColumns = computed(() =>\n this.mobileColumns().filter(c => {\n const role = this.roleOf(c);\n return role === 'detail' || role === 'secondary';\n }),\n );\n\n /** How many fields a card shows before \"view more\". */\n private static readonly CARD_PREVIEW_FIELDS = 4;\n\n /** Fields a collapsed card shows. A row shows none until it opens. */\n protected readonly cardPreviewColumns = computed(() =>\n this.detailColumns().slice(0, EfDataCardComponent.CARD_PREVIEW_FIELDS),\n );\n\n protected readonly hasDetail = computed(() => this.detailColumns().length > 0);\n\n /** Only worth a toggle when opening actually reveals something. */\n protected readonly hasMoreThanPreview = computed(\n () => this.detailColumns().length > EfDataCardComponent.CARD_PREVIEW_FIELDS,\n );\n\n /** Fields visible for a row right now, given layout and open state. */\n protected visibleDetail(row: unknown, index: number): ReadonlyArray<{ id: string }> {\n const open = this.isExpanded(row, index);\n if (this.effectiveMobileLayout() === 'card') {\n return open ? this.detailColumns() : this.cardPreviewColumns();\n }\n return open ? this.detailColumns() : [];\n }\n\n private readonly refDataService = inject<ScreenReferenceDataService | null>(\n SCREEN_REF_DATA_SERVICE,\n { optional: true },\n );\n\n /* ── Data inputs ────────────────────────────────────────────── */\n\n readonly columns = input<ReadonlyArray<EfDataCardColumn>>([]);\n readonly rows = input<ReadonlyArray<TRow>>([]);\n\n /** Field path on each row used as the trackBy key. */\n readonly trackByField = input<string>('id');\n\n /* ── Pagination ─────────────────────────────────────────────── */\n\n readonly pageNumber = input<number>(1);\n readonly pageSize = input<number>(25);\n readonly totalCount = input<number>(0);\n readonly pageSizeOptions = input<ReadonlyArray<number>>([10, 25, 50, 100]);\n readonly hidePager = input(false, { transform: booleanAttribute });\n\n /* ── Sorting ────────────────────────────────────────────────── */\n\n /** Currently active sort. Header click toggles asc / desc. */\n readonly sort = input<EfDataCardSort | undefined>(undefined);\n\n /* ── State ──────────────────────────────────────────────────── */\n\n readonly loading = input(false, { transform: booleanAttribute });\n /** Empty string = no error. Non-empty triggers an error chip in tbl-head. */\n readonly errorMsg = input<string>('');\n readonly loadingKey = input<string>('common_loading_msg');\n\n /* ── Row interactions ──────────────────────────────────────── */\n\n /**\n * When `true`, double-clicking anywhere on a `<tr>` emits the row\n * via `rowDoubleClick` and the body rows render with\n * `cursor: pointer`. Consumers typically wire the output to\n * `navigateToDetails(row.id)` from {@link AbstractSearchScreenV2}.\n *\n * Double-clicks that originate inside an interactive child\n * (checkbox, button, link, form control) are ignored — those keep\n * their native behaviour (toggle selection, run an action, …).\n */\n readonly rowDoubleClickable = input(false, { transform: booleanAttribute });\n\n /* ── Auto row-actions cell ─────────────────────────────────────\n When `[hasActionsColumn]` is set, ef-data-card appends a 48px\n `actions` column at the right edge with a built-in\n `<ef-row-actions>` per row. The standard four CRUD actions are\n wired via the show* flags; emitted commands flip back through\n `(rowAction)`. Permission filtering happens through the bound\n `[rowActionsContext]` (a ScreenContext).\n\n Consumers that want a custom actions cell can keep declaring\n their own `'actions'` column + projected template — the\n built-in cell only auto-appears when this flag is on AND no\n column with id 'actions' is already declared. */\n\n readonly hasActionsColumn = input(false, { transform: booleanAttribute });\n readonly rowActionsContext = input<ScreenContext | undefined>(undefined);\n\n readonly showViewAction = input(true, { transform: booleanAttribute });\n readonly showEditAction = input(true, { transform: booleanAttribute });\n readonly showDuplicateAction = input(true, { transform: booleanAttribute });\n readonly showDeleteAction = input(true, { transform: booleanAttribute });\n\n /* ── Table tools (density / column picker) ──────────────────── */\n\n /** Render the Density control in the head row. */\n readonly showDensityControl = input(false, { transform: booleanAttribute });\n\n /** Render the Columns picker in the head row. */\n readonly showColumnPicker = input(false, { transform: booleanAttribute });\n\n /**\n * Stable key used to remember density and hidden columns for this\n * table. Preferences are a per-viewer convenience, so they live in\n * localStorage and are read defensively -- a private window or\n * cleared site data simply falls back to the defaults.\n */\n readonly tableKey = input<string>('');\n\n /* ── Outputs ────────────────────────────────────────────────── */\n\n readonly pageChange = output<number>();\n readonly pageSizeChange = output<number>();\n readonly sortChange = output<EfDataCardSort>();\n readonly rowDoubleClick = output<TRow>();\n\n /** Emitted by the auto row-actions cell — `{ action, row }`. */\n readonly rowAction = output<{ action: EfDataCardRowAction; row: TRow }>();\n\n /* ── Content children ──────────────────────────────────────── */\n\n @ContentChildren(EfColumnTemplateDirective)\n private readonly bodyTemplates!: QueryList<EfColumnTemplateDirective>;\n\n @ContentChildren(EfColumnHeaderTemplateDirective)\n private readonly headerTemplates!: QueryList<EfColumnHeaderTemplateDirective>;\n\n private readonly bodyTemplateMap = signal<Map<string, TemplateRef<unknown>>>(new Map());\n private readonly headerTemplateMap = signal<Map<string, TemplateRef<unknown>>>(new Map());\n\n ngAfterContentInit(): void {\n this.loadPreferences();\n this.bodyTemplateMap.set(toMap(this.bodyTemplates));\n this.headerTemplateMap.set(toMap(this.headerTemplates));\n this.bodyTemplates.changes.subscribe(() =>\n this.bodyTemplateMap.set(toMap(this.bodyTemplates)),\n );\n this.headerTemplates.changes.subscribe(() =>\n this.headerTemplateMap.set(toMap(this.headerTemplates)),\n );\n }\n\n /* ── Computed views ─────────────────────────────────────────── */\n\n /** Columns enriched with effective alignment / sortField defaults\n * + the auto `'actions'` column when `[hasActionsColumn]` is on\n * and the consumer hasn't declared one already. */\n readonly effectiveColumns = computed<ReadonlyArray<EfDataCardColumn>>(() => {\n const hidden = this.hiddenColumnIds();\n const declared = this.columns()\n .filter(col => !hidden.includes(col.id))\n .map(col => ({\n ...col,\n type: col.type ?? 'text',\n align:\n col.align ??\n (col.type === 'number' || col.type === 'money' ? 'end' : 'start'),\n sortField: col.sortField ?? col.field ?? col.id,\n }));\n\n if (!this.hasActionsColumn()) return declared;\n if (declared.some(c => c.id === 'actions')) return declared;\n return [...declared, { id: 'actions', width: '48px' } as EfDataCardColumn];\n });\n\n /** Items array for the auto row-actions cell. Rebuilt per call so\n * the ef-row-actions component receives a fresh closure per row.\n * Visibility is filtered later by ef-row-actions against\n * `rowActionsContext` (ScreenContext.isGranted). */\n defaultRowActions(row: TRow): ReadonlyArray<EfRowAction> {\n const items: EfRowAction[] = [];\n\n if (this.showViewAction()) {\n items.push({\n id: 'view',\n labelKey: 'common_view',\n icon: 'pi pi-eye',\n kbd: '↵',\n permission: Permissions.Read,\n command: () => this.rowAction.emit({ action: 'view', row }),\n });\n }\n if (this.showEditAction()) {\n items.push({\n id: 'edit',\n labelKey: 'common_edit',\n icon: 'pi pi-pencil',\n kbd: 'E',\n permission: Permissions.Edit,\n command: () => this.rowAction.emit({ action: 'edit', row }),\n });\n }\n if (this.showDuplicateAction()) {\n items.push({\n id: 'duplicate',\n labelKey: 'common_duplicate',\n icon: 'pi pi-copy',\n kbd: '⌘D',\n permission: Permissions.Duplicate,\n command: () => this.rowAction.emit({ action: 'duplicate', row }),\n });\n }\n if (this.showDeleteAction()) {\n if (items.length > 0) items.push({ separator: true });\n items.push({\n id: 'delete',\n labelKey: 'common_delete',\n icon: 'pi pi-trash',\n kbd: '⌫',\n severity: 'danger',\n permission: Permissions.Delete,\n command: () => this.rowAction.emit({ action: 'delete', row }),\n });\n }\n\n return items;\n }\n\n /* ── Cell helpers (used in template) ───────────────────────── */\n\n bodyTemplate(columnId: string): TemplateRef<unknown> | undefined {\n return this.bodyTemplateMap().get(columnId);\n }\n\n headerTemplate(columnId: string): TemplateRef<unknown> | undefined {\n return this.headerTemplateMap().get(columnId);\n }\n\n /** Pluck `column.field` (or `column.id`) from a row, dotted-path safe. */\n cellValue(row: TRow, col: EfDataCardColumn): unknown {\n const path = col.field ?? col.id;\n if (!path) return undefined;\n return path.split('.').reduce<any>((obj, key) => (obj == null ? obj : obj[key]), row);\n }\n\n headerAlignClass(col: EfDataCardColumn): string {\n if (col.align === 'end') return 'num';\n return '';\n }\n\n cellAlignClass(col: EfDataCardColumn): string {\n const align = col.align ?? (col.type === 'number' || col.type === 'money' ? 'end' : 'start');\n const classes: string[] = [];\n if (align === 'end') classes.push('num');\n if (col.cellClass) classes.push(col.cellClass);\n return classes.join(' ');\n }\n\n /** Sort indicator: '↑' / '↓' / '' for the given column. */\n sortIndicator(col: EfDataCardColumn): string {\n const s = this.sort();\n if (!s) return '';\n const field = col.sortField ?? col.field ?? col.id;\n if (s.field !== field) return '';\n return s.direction === 'asc' ? '↑' : '↓';\n }\n\n /**\n * Resolve a reference cell — looks up the row's value in\n * `referenceKey`, finds the entry where\n * `entry[referenceValueField] === value`, returns\n * `entry[referenceLabelField]`. Falls back to the raw value when\n * no match is found.\n */\n resolveReference(value: unknown, col: EfDataCardColumn): string {\n if (value == null) return '';\n if (!this.refDataService || !col.referenceKey) return String(value);\n\n const list = this.refDataService.getReference(col.referenceKey)();\n const valueField = col.referenceValueField || 'code';\n const labelField = col.referenceLabelField || 'label';\n const match = list.find((item: any) => item?.[valueField] === value);\n if (!match) return String(value);\n return String(match[labelField] ?? value);\n }\n\n /** Build an Angular DigitInfo string from min/max fraction-digit hints. */\n numberFormat(col: EfDataCardColumn): string {\n const min = col.minFractionDigits ?? 2;\n const max = col.maxFractionDigits ?? 2;\n return `1.${min}-${max}`;\n }\n\n /* ── Table tools state ──────────────────────────────────────── */\n\n /** Which tools panel is open, if any. */\n readonly openTool = signal<'density' | 'columns' | null>(null);\n\n /** Row density. Applied as a class on `.tbl-wrap`. */\n readonly density = signal<EfTableDensity>('default');\n\n /** Column ids the viewer has hidden. */\n readonly hiddenColumnIds = signal<ReadonlyArray<string>>([]);\n\n readonly densityOptions: ReadonlyArray<{\n value: EfTableDensity;\n labelKey: string;\n icon: string;\n }> = [\n { value: 'compact', labelKey: 'common_density_compact', icon: 'pi-align-justify' },\n { value: 'default', labelKey: 'common_density_default', icon: 'pi-bars' },\n { value: 'comfortable', labelKey: 'common_density_comfortable', icon: 'pi-list' },\n ];\n\n /** Columns the viewer may hide -- structural ones stay put, since\n * hiding the selection checkbox or the row-actions cell would strand\n * the bulk bar and the per-row menu with no way back. */\n readonly hideableColumns = computed(() =>\n // Derived from the DECLARED columns, not `effectiveColumns` --\n // that one already drops hidden columns, so a hidden column would\n // vanish from its own picker and could never be restored.\n this.columns().filter(\n c => c.id !== 'select' && c.id !== 'actions' && c.hideable !== false,\n ),\n );\n\n toggleTool(tool: 'density' | 'columns'): void {\n this.openTool.update(cur => (cur === tool ? null : tool));\n }\n\n setDensity(value: EfTableDensity): void {\n this.density.set(value);\n this.openTool.set(null);\n this.savePreferences();\n }\n\n isColumnHidden(id: string): boolean {\n return this.hiddenColumnIds().includes(id);\n }\n\n toggleColumn(id: string): void {\n this.hiddenColumnIds.update(ids =>\n ids.includes(id) ? ids.filter(x => x !== id) : [...ids, id],\n );\n this.savePreferences();\n }\n\n resetColumns(): void {\n this.hiddenColumnIds.set([]);\n this.savePreferences();\n }\n\n /** Close an open panel on an outside click or Escape. */\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.openTool()) return;\n const target = event.target as HTMLElement | null;\n if (target?.closest('.tbl-tools')) return;\n this.openTool.set(null);\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n this.openTool.set(null);\n }\n\n private storageKey(): string | null {\n const key = this.tableKey();\n return key ? `TABLE_PREFS_${key}` : null;\n }\n\n private loadPreferences(): void {\n const key = this.storageKey();\n if (!key) return;\n try {\n const saved = StorageUtils.getLocal<{\n density?: EfTableDensity;\n hiddenColumnIds?: string[];\n }>(key);\n if (!saved) return;\n if (saved.density) this.density.set(saved.density);\n if (Array.isArray(saved.hiddenColumnIds))\n this.hiddenColumnIds.set(saved.hiddenColumnIds);\n } catch {\n // Storage can throw outright (blocked site data, previews) --\n // the defaults are a perfectly good table.\n }\n }\n\n private savePreferences(): void {\n const key = this.storageKey();\n if (!key) return;\n try {\n StorageUtils.setLocal(key, {\n density: this.density(),\n hiddenColumnIds: this.hiddenColumnIds(),\n });\n } catch {\n // Preferences are a convenience; losing them must never break\n // the table.\n }\n }\n\n /** Tracks how many `ef-row-actions` are currently open inside this\n * card. When > 0, `.tbl-wrap` lifts its `overflow: hidden` so the\n * popup can escape its rounded edges. */\n readonly openMenuCount = signal(0);\n\n @HostListener('ef-row-actions-toggle', ['$event'])\n onRowActionsToggle(event: Event): void {\n const detail = (event as CustomEvent<{ open: boolean }>).detail;\n this.openMenuCount.update(c => Math.max(0, c + (detail?.open ? 1 : -1)));\n }\n\n /** Fires `rowDoubleClick` unless the dblclick originated on an\n * interactive child (checkbox, button, link, form control). */\n onRowDoubleClick(row: TRow, event: MouseEvent): void {\n if (!this.rowDoubleClickable()) return;\n const target = event.target as HTMLElement | null;\n if (target?.closest('button, a, input, select, textarea, label')) return;\n this.rowDoubleClick.emit(row);\n }\n\n onHeaderClick(col: EfDataCardColumn): void {\n if (!col.sortable) return;\n const field = col.sortField ?? col.field ?? col.id;\n const current = this.sort();\n const direction: EfDataCardSortDirection =\n current?.field === field && current.direction === 'desc' ? 'asc' : 'desc';\n this.sortChange.emit({ field, direction });\n }\n\n trackByRow = (_: number, row: TRow): unknown => {\n const f = this.trackByField();\n return f ? (row as any)?.[f] : row;\n };\n\n trackByColumn = (_: number, col: EfDataCardColumn): string => col.id;\n}\n\nfunction toMap<T extends { columnId: string; templateRef: TemplateRef<unknown> }>(\n list: QueryList<T>,\n): Map<string, TemplateRef<unknown>> {\n const m = new Map<string, TemplateRef<unknown>>();\n list.forEach(d => m.set(d.columnId, d.templateRef));\n return m;\n}\n","<!-- One cell renderer, shared by the table, the mobile row and the mobile\n detail. A new column type is added here once, not three times. -->\n<ng-template #cellTpl let-row let-col=\"col\">\n @if (bodyTemplate(col.id); as bodyTpl) {\n <ng-container *ngTemplateOutlet=\"bodyTpl; context: { $implicit: row, col: col }\"></ng-container>\n } @else {\n @switch (col.type) {\n @case ('number') {\n {{ $any(cellValue(row, col)) | number:numberFormat(col):col.locale }}\n }\n @case ('money') {\n {{ $any(cellValue(row, col)) | currency:(col.currencyCode || 'EUR'):(col.currencyDisplay || 'symbol'):numberFormat(col):col.locale }}\n }\n @case ('date') {\n {{ $any(cellValue(row, col)) | date:(col.dateFormat || 'dd/MM/yyyy'):undefined:col.locale }}\n }\n @case ('datetime') {\n {{ $any(cellValue(row, col)) | date:(col.dateFormat || 'dd/MM/yyyy HH:mm'):undefined:col.locale }}\n }\n @case ('boolean') {\n @if (cellValue(row, col)) {\n <span class=\"bool yes\"><span class=\"dot\"></span> ✓</span>\n } @else {\n <span class=\"bool no\"><span class=\"dot\"></span> —</span>\n }\n }\n @case ('mono') {\n <span class=\"ref\">{{ cellValue(row, col) }}</span>\n }\n @case ('chip') {\n <span [class]=\"'chip ' + (col.chipPrefix || 'chip-') + cellValue(row, col)\">\n ● {{ cellValue(row, col) }}\n </span>\n }\n @case ('status') {\n <ef-status-chip\n [referenceKey]=\"col.referenceKey || ''\"\n [code]=\"$any(cellValue(row, col))\"\n />\n }\n @case ('reference') {\n {{ resolveReference(cellValue(row, col), col) }}\n }\n @default {\n {{ cellValue(row, col) }}\n }\n }\n }\n</ng-template>\n\n<div class=\"tbl-wrap\" [class.has-open-menu]=\"openMenuCount() > 0 || openTool() !== null\" [attr.data-density]=\"density()\">\n <!-- ── HEAD ROW ────────────────────────────────────────────── -->\n <div class=\"tbl-head\">\n <div class=\"count small\">\n @if (loading()) {\n <span>{{ loadingKey() | translate }}</span>\n } @else if (errorMsg()) {\n <span style=\"color: var(--st-cancelled-fg); font-weight: 600;\">⚠ {{ errorMsg() }}</span>\n } @else {\n <ng-content select=\"[tbl-head-info]\"></ng-content>\n }\n </div>\n <div class=\"tbl-tools\">\n <ng-content select=\"[tbl-head-actions]\"></ng-content>\n\n @if (showDensityControl()) {\n <div class=\"tbl-tool\">\n <button\n class=\"btn btn-ghost btn-sm\"\n type=\"button\"\n [class.open]=\"openTool() === 'density'\"\n [attr.aria-expanded]=\"openTool() === 'density'\"\n aria-haspopup=\"menu\"\n (click)=\"toggleTool('density')\"\n >\n <i class=\"pi pi-bars\" aria-hidden=\"true\"></i>\n {{ 'common_density' | translate }}\n </button>\n @if (openTool() === 'density') {\n <div class=\"tbl-tool__menu\" role=\"menu\">\n @for (opt of densityOptions; track opt.value) {\n <button\n type=\"button\"\n role=\"menuitemradio\"\n [attr.aria-checked]=\"density() === opt.value\"\n [class.is-active]=\"density() === opt.value\"\n (click)=\"setDensity(opt.value)\"\n >\n <i class=\"pi\" [ngClass]=\"opt.icon\" aria-hidden=\"true\"></i>\n <span class=\"tbl-tool__label\">{{ opt.labelKey | translate }}</span>\n @if (density() === opt.value) {\n <i class=\"pi pi-check tbl-tool__check\" aria-hidden=\"true\"></i>\n }\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (showColumnPicker()) {\n <div class=\"tbl-tool\">\n <button\n class=\"btn btn-ghost btn-sm\"\n type=\"button\"\n [class.open]=\"openTool() === 'columns'\"\n [attr.aria-expanded]=\"openTool() === 'columns'\"\n aria-haspopup=\"menu\"\n (click)=\"toggleTool('columns')\"\n >\n <i class=\"pi pi-th-large\" aria-hidden=\"true\"></i>\n {{ 'common_columns' | translate }}\n </button>\n @if (openTool() === 'columns') {\n <div class=\"tbl-tool__menu tbl-tool__menu--wide\" role=\"menu\">\n @for (col of hideableColumns(); track col.id) {\n <button\n type=\"button\"\n role=\"menuitemcheckbox\"\n [attr.aria-checked]=\"!isColumnHidden(col.id)\"\n [class.is-active]=\"!isColumnHidden(col.id)\"\n (click)=\"toggleColumn(col.id)\"\n >\n <i class=\"pi\" [class.pi-check]=\"!isColumnHidden(col.id)\" aria-hidden=\"true\"></i>\n <span class=\"tbl-tool__label\">{{\n col.headerKey ? (col.headerKey | translate) : (col.header || col.id)\n }}</span>\n </button>\n }\n <div class=\"tbl-tool__sep\"></div>\n <button type=\"button\" role=\"menuitem\" (click)=\"resetColumns()\">\n <i class=\"pi pi-refresh\" aria-hidden=\"true\"></i>\n <span class=\"tbl-tool__label\">{{ 'common_columns_reset' | translate }}</span>\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- ── TABLE ─────────────────────────────────────────────── -->\n @if (isMobile()) {\n <!-- ── MOBILE LIST ──────────────────────────────────────────\n A six-column table on a 390px screen either overflows or\n squeezes every column to nothing, so the rows become a list.\n Same columns, same cell renderers; each column just declares\n (or is given) a role. Both shapes expand to the same detail —\n they differ only in how much they show collapsed. -->\n <ul class=\"mlist\" [attr.data-layout]=\"effectiveMobileLayout()\">\n @for (row of rows(); track trackByRow($index, row); let i = $index) {\n <li class=\"mrow\" [class.is-open]=\"isExpanded(row, i)\">\n <div\n class=\"mrow__head\"\n [class.is-tappable]=\"hasDetail()\"\n [attr.role]=\"hasDetail() ? 'button' : null\"\n [attr.tabindex]=\"hasDetail() ? 0 : null\"\n [attr.aria-expanded]=\"hasDetail() ? isExpanded(row, i) : null\"\n (click)=\"onRowHeadActivate(row, i, $event)\"\n (keydown.enter)=\"onRowHeadActivate(row, i, $event)\"\n (keydown.space)=\"onRowHeadActivate(row, i, $event)\"\n >\n <div class=\"mrow__lead\">\n @if (primaryColumn(); as pc) {\n <span class=\"mrow__primary\">\n <ng-container *ngTemplateOutlet=\"cellTpl; context: { $implicit: row, col: pc }\"></ng-container>\n </span>\n }\n @if (effectiveMobileLayout() === 'row' && secondaryColumns().length) {\n <span class=\"mrow__secondary\">\n @for (sc of secondaryColumns(); track sc.id) {\n <span class=\"mrow__sec-part\">\n <ng-container *ngTemplateOutlet=\"cellTpl; context: { $implicit: row, col: sc }\"></ng-container>\n </span>\n }\n </span>\n }\n </div>\n\n <div class=\"mrow__trail\">\n @if (statusColumn(); as st) {\n <ng-container *ngTemplateOutlet=\"cellTpl; context: { $implicit: row, col: st }\"></ng-container>\n }\n @if (hasActionsColumn()) {\n <span class=\"mrow__actions\">\n <ef-row-actions [items]=\"defaultRowActions(row)\" [context]=\"rowActionsContext()\" />\n </span>\n }\n @if (hasDetail() && effectiveMobileLayout() === 'row') {\n <!-- Says the row opens, and which way it is now. Decorative:\n the whole head is the control, and it carries the state. -->\n <i\n class=\"pi pi-chevron-down mrow__chevron\"\n [class.is-open]=\"isExpanded(row, i)\"\n aria-hidden=\"true\"\n ></i>\n }\n </div>\n </div>\n\n @if (visibleDetail(row, i).length) {\n <dl class=\"mrow__detail\">\n @for (col of visibleDetail(row, i); track col.id) {\n <div class=\"mrow__field\">\n <dt>{{ $any(col).headerKey ? ($any(col).headerKey | translate) : $any(col).header }}</dt>\n <dd [class]=\"cellAlignClass($any(col))\">\n <ng-container *ngTemplateOutlet=\"cellTpl; context: { $implicit: row, col: col }\"></ng-container>\n </dd>\n </div>\n }\n </dl>\n }\n\n @if (hasMoreThanPreview() && effectiveMobileLayout() === 'card') {\n <button class=\"mrow__more\" type=\"button\" (click)=\"toggleExpanded(row, i)\">\n <span>{{ (isExpanded(row, i) ? 'common_view_less' : 'common_view_more') | translate }}</span>\n <i class=\"pi pi-chevron-down mrow__chevron\" [class.is-open]=\"isExpanded(row, i)\" aria-hidden=\"true\"></i>\n </button>\n }\n </li>\n } @empty {\n <li class=\"mrow mrow--empty\">\n <ng-content select=\"[empty-state-mobile]\"></ng-content>\n </li>\n }\n </ul>\n } @else {\n <table class=\"tbl\">\n <thead>\n <tr>\n @for (col of effectiveColumns(); track trackByColumn($index, col)) {\n <th\n [class]=\"headerAlignClass(col)\"\n [class.is-sortable]=\"col.sortable\"\n [style.width]=\"col.width || null\"\n [attr.data-col]=\"col.id\"\n (click)=\"onHeaderClick(col)\"\n [style.cursor]=\"col.sortable ? 'pointer' : null\"\n >\n @if (headerTemplate(col.id); as headerTpl) {\n <ng-container *ngTemplateOutlet=\"headerTpl; context: { $implicit: col, col: col }\"></ng-container>\n } @else if (col.headerKey) {\n <span>{{ col.headerKey | translate }}</span>\n } @else if (col.header) {\n <span>{{ col.header }}</span>\n }\n @if (col.sortable && sortIndicator(col)) {\n <span aria-hidden=\"true\" style=\"margin-inline-start: 4px; opacity: 0.7;\">{{ sortIndicator(col) }}</span>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @for (row of rows(); track trackByRow($index, row)) {\n <tr\n [class.is-row-clickable]=\"rowDoubleClickable()\"\n (dblclick)=\"onRowDoubleClick(row, $event)\"\n >\n @for (col of effectiveColumns(); track trackByColumn($index, col); let colIdx = $index) {\n <td [class]=\"cellAlignClass(col)\" [attr.data-col]=\"col.id\">\n @if (col.id === 'actions' && hasActionsColumn()) {\n <!-- Auto row-actions cell: View / Edit / Duplicate / Delete,\n gated by [show*Action] flags + ScreenContext perms. -->\n <ef-row-actions\n [items]=\"defaultRowActions(row)\"\n [context]=\"rowActionsContext()\"\n />\n } @else {\n <ng-container\n *ngTemplateOutlet=\"cellTpl; context: { $implicit: row, col: col }\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n } @empty {\n <tr>\n <td [attr.colspan]=\"effectiveColumns().length\">\n <ng-content select=\"[empty-state]\"></ng-content>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- ── PAGER ─────────────────────────────────────────────── -->\n @if (!hidePager()) {\n <ef-pager\n [pageNumber]=\"pageNumber()\"\n [pageSize]=\"pageSize()\"\n [totalCount]=\"totalCount()\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n (pageChange)=\"pageChange.emit($event)\"\n (pageSizeChange)=\"pageSizeChange.emit($event)\"\n />\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Comptoir bulk-action bar — ink-active pill that shows a selection\n * count + projected action buttons. Auto-hides when count is 0.\n *\n * ```html\n * <ef-bulk-bar [count]=\"selectionCount()\">\n * <button class=\"btn\">{{ 'common_export' | translate }}</button>\n * <button class=\"btn\">{{ 'sales_orders_bulk_approve' | translate }}</button>\n * </ef-bulk-bar>\n * ```\n */\n@Component({\n selector: 'ef-bulk-bar',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n @if (count() > 0) {\n <div class=\"bulk\">\n <span>\n <strong>{{ count() }}</strong>\n <span class=\"count\">\n {{ (suffixKey() ? (suffixKey() | translate) : suffix()) }}\n </span>\n </span>\n <ng-content></ng-content>\n </div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfBulkBarComponent {\n readonly count = input<number>(0);\n /** Translation key for the suffix word (\"selected\"). */\n readonly suffixKey = input<string>('common_selected');\n /** Direct suffix text (used only when `suffixKey` is empty). */\n readonly suffix = input<string>('');\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Comptoir empty-state — circular dashed icon + title + optional\n * message + projected actions slot. Drop into a data-card body when\n * results are zero.\n *\n * ```html\n * <ef-empty-state\n * icon=\"pi pi-inbox\"\n * titleKey=\"sales_orders_empty_title\"\n * messageKey=\"sales_orders_empty_msg\">\n * <button class=\"btn btn-tenant btn-sm\">{{ 'sales_orders_new' | translate }}</button>\n * </ef-empty-state>\n * ```\n */\n@Component({\n selector: 'ef-empty-state',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n <div class=\"empty\">\n <span class=\"ic\" aria-hidden=\"true\">\n <i [class]=\"icon()\"></i>\n </span>\n\n @if (titleKey() || title()) {\n <span class=\"title\">\n {{ (titleKey() ? (titleKey() | translate) : title()) }}\n </span>\n }\n\n @if (messageKey() || message()) {\n <span class=\"small\">\n {{ (messageKey() ? (messageKey() | translate) : message()) }}\n </span>\n }\n\n <div class=\"actions\" style=\"display: inline-flex; gap: 8px; flex-wrap: wrap; justify-content: center; margin-top: 4px;\">\n <ng-content></ng-content>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfEmptyStateComponent {\n readonly icon = input<string>('pi pi-inbox');\n readonly titleKey = input<string>('');\n readonly title = input<string>('');\n readonly messageKey = input<string>('');\n readonly message = input<string>('');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n input,\n model,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Comptoir smart bar — the search/filter card every list screen\n * starts with. Composes:\n * 1. Search input (with `⌘K` kbd hint) + Effacer / Rechercher\n * action buttons.\n * 2. A filter-row slot for `[filters]` (pill-group + filter-pill +\n * preset-pill + \"+ Plus de filtres\").\n * 3. A drawer slot for `[drawer]` (advanced filters via\n * `ef-filter-drawer`).\n *\n * The `searchText` is a `model()` so consumers can `[(searchText)]`\n * for two-way binding, or watch the (search) output for explicit\n * Rechercher clicks.\n *\n * ```html\n * <ef-smart-bar\n * [(searchText)]=\"searchQuery\"\n * placeholderKey=\"sales_orders_search_placeholder\"\n * (search)=\"setSearchText($event)\"\n * (clear)=\"clearAll()\"\n * >\n * <ng-container filters>\n * <ef-pill-group …/>\n * <ef-filter-pill …/>\n * <ef-preset-pill …/>\n * </ng-container>\n * <ng-container drawer>\n * <ef-filter-drawer …/>\n * </ng-container>\n * </ef-smart-bar>\n * ```\n */\n@Component({\n selector: 'ef-smart-bar',\n standalone: true,\n imports: [CommonModule, FormsModule, TranslateModule],\n template: `\n <div class=\"screen-search\">\n <div class=\"smart-bar\">\n <label class=\"search\">\n <input\n type=\"text\"\n [placeholder]=\"(placeholderKey() ? (placeholderKey() | translate) : placeholder())\"\n [ngModel]=\"searchText()\"\n (ngModelChange)=\"searchText.set($event)\"\n (keydown.enter)=\"onSubmit()\"\n />\n @if (showKbdHint()) {\n <span class=\"kbd\">⌘K</span>\n }\n </label>\n <div class=\"actions\">\n @if (!hideClear()) {\n <button\n class=\"btn btn-ghost btn-sm\"\n type=\"button\"\n [attr.title]=\"clearTitleKey() | translate\"\n (click)=\"onClear()\"\n >\n {{ clearLabelKey() | translate }}\n </button>\n }\n @if (!hideSearch()) {\n <button\n class=\"btn btn-primary btn-sm\"\n type=\"button\"\n [disabled]=\"loading()\"\n (click)=\"onSubmit()\"\n >\n {{ searchLabelKey() | translate }}\n </button>\n }\n </div>\n </div>\n\n <div class=\"filter-row\">\n <ng-content select=\"[filters]\"></ng-content>\n </div>\n\n <ng-content select=\"[drawer]\"></ng-content>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfSmartBarComponent {\n /** Two-way bound search input. */\n readonly searchText = model<string>('');\n\n readonly placeholderKey = input<string>('');\n readonly placeholder = input<string>('');\n\n readonly clearLabelKey = input<string>('common_clear');\n readonly clearTitleKey = input<string>('common_clear');\n readonly searchLabelKey = input<string>('common_search');\n\n readonly showKbdHint = input(true, { transform: booleanAttribute });\n readonly hideClear = input(false, { transform: booleanAttribute });\n readonly hideSearch = input(false, { transform: booleanAttribute });\n readonly loading = input(false, { transform: booleanAttribute });\n\n // `search` shadows a native DOM event name. Renaming this output would\n // churn every consumer template, so the name stays and the rule is\n // suppressed here deliberately.\n // eslint-disable-next-line @angular-eslint/no-output-native\n readonly search = output<string>();\n readonly clear = output<void>();\n\n onSubmit(): void {\n this.search.emit(this.searchText());\n }\n\n onClear(): void {\n this.searchText.set('');\n this.clear.emit();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Comptoir filter pill — value-bearing button used in the smart-bar's\n * filter row. Three tones (`neutral` / `active` / `tenant`), optional\n * caret (when the pill toggles a popover), optional ✕ clear button.\n *\n * The popover content is consumer-projected via the `[popover]` slot\n * — the pill positions it absolutely below itself per the prototype's\n * `.popover` class. Visibility is driven by the `popoverOpen` input.\n *\n * ```html\n * <!-- value-bearing, removable -->\n * <ef-filter-pill\n * icon=\"pi pi-user\"\n * labelKey=\"filter_client\"\n * value=\"Leila Bennani\"\n * tone=\"active\"\n * hasClear\n * (clearClick)=\"removeFilter('client')\"\n * />\n *\n * <!-- with popover (consumer renders preset list inside) -->\n * <ef-filter-pill\n * icon=\"pi pi-calendar\"\n * labelKey=\"filter_date\"\n * [value]=\"activeDatePreset().labelKey | translate\"\n * hasPopover\n * [popoverOpen]=\"datePopoverOpen()\"\n * (pillClick)=\"toggleDatePopover()\"\n * >\n * <ng-container popover>\n * @for (p of presets; track p.key) {\n * <div class=\"preset\" [class.active]=\"p === active\">…</div>\n * }\n * </ng-container>\n * </ef-filter-pill>\n * ```\n */\n@Component({\n selector: 'ef-filter-pill',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n templateUrl: './ef-filter-pill.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfFilterPillComponent {\n /** PrimeNG icon class (e.g. `pi pi-calendar`). */\n readonly icon = input<string>('');\n\n /** Translation key — preferred. */\n readonly labelKey = input<string>('');\n /** Direct label text (used only when `labelKey` is empty). */\n readonly label = input<string>('');\n\n /** Current value displayed after the label. */\n readonly value = input<string>('');\n\n /** `'active'` paints ink-active; `'tenant'` paints the tenant-50 surface. */\n readonly tone = input<'neutral' | 'active' | 'tenant'>('neutral');\n\n /** Show the ✕ clear button at the end of the pill. */\n readonly hasClear = input(false, { transform: booleanAttribute });\n\n /** Show a chevron + position the projected `[popover]` slot. */\n readonly hasPopover = input(false, { transform: booleanAttribute });\n\n /** Whether the popover is currently open (consumer-controlled). */\n readonly popoverOpen = input(false, { transform: booleanAttribute });\n\n /** Translation key for the ✕ clear button's aria-label. */\n readonly clearAriaKey = input<string>('filter_remove_aria');\n\n /** Emitted when the pill body is clicked (open popover, etc.). */\n readonly pillClick = output<void>();\n\n /** Emitted when the ✕ clear button is clicked (stops propagation). */\n readonly clearClick = output<void>();\n\n onPillClick(): void {\n this.pillClick.emit();\n }\n\n onClearClick(event: Event): void {\n event.stopPropagation();\n this.clearClick.emit();\n }\n}\n","<button\n type=\"button\"\n class=\"f-pill\"\n [class.active]=\"tone() === 'active'\"\n [class.tenant]=\"tone() === 'tenant'\"\n [class.has-pop]=\"hasPopover()\"\n [attr.aria-haspopup]=\"hasPopover() ? 'listbox' : null\"\n [attr.aria-expanded]=\"hasPopover() ? popoverOpen() : null\"\n (click)=\"onPillClick()\"\n>\n @if (icon()) {\n <i class=\"ico\" [class]=\"icon()\" aria-hidden=\"true\"></i>\n }\n\n @if (labelKey() || label()) {\n <span class=\"lbl\">\n {{ labelKey() ? (labelKey() | translate) : label() }}\n </span>\n }\n\n @if (value()) {\n <span class=\"val\">{{ value() }}</span>\n }\n\n @if (hasClear()) {\n <span\n class=\"clear\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"clearAriaKey() | translate\"\n (click)=\"onClearClick($event)\"\n (keydown.enter)=\"onClearClick($event)\"\n (keydown.space)=\"onClearClick($event)\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\" style=\"font-size: 8px;\"></i>\n </span>\n } @else if (hasPopover()) {\n <i class=\"caret pi pi-chevron-down\" aria-hidden=\"true\"></i>\n }\n\n @if (hasPopover()) {\n <div class=\"popover\" [class.open]=\"popoverOpen()\" role=\"listbox\">\n <ng-content select=\"[popover]\"></ng-content>\n </div>\n }\n</button>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl, FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { EfLabelComponent } from '../../layout/ef-label/ef-label.component';\nimport { EfClearButtonComponent } from '../ef-clear-button/ef-clear-button.component';\nimport { AbstractEfFormControl } from '../abstract-ef-form-control.component';\n\n/**\n * Native Comptoir textarea — no PrimeNG wrapper. Pairs with the\n * `.ef-textarea` rule in `@elasticias/ui/styles/patterns` (focus\n * ring, paper-alt bg, rule border).\n *\n * Identity / label / placeholder / aria / required / readonly /\n * disabled inherited from `AbstractEfFormControl`. Implements\n * ControlValueAccessor so it slots into reactive forms AND works\n * with `[(value)]` two-way binding via `(valueChangeEvent)`.\n *\n * ```html\n * <ef-textarea\n * labelKey=\"products_details_description_label\"\n * placeholderKey=\"products_details_description_placeholder\"\n * [rows]=\"4\"\n * [(value)]=\"description\"\n * />\n * ```\n */\n@Component({\n selector: 'ef-textarea',\n standalone: true,\n templateUrl: './ef-textarea.component.html',\n imports: [FormsModule, TranslateModule, EfLabelComponent, EfClearButtonComponent],\n})\nexport class EfTextareaComponent\n extends AbstractEfFormControl\n implements ControlValueAccessor\n{\n @Input() rows = 4;\n @Input() maxlength?: number;\n @Input({ transform: booleanAttribute }) autofocus = false;\n\n @Output() valueChangeEvent = new EventEmitter<string>();\n\n /** Two-way-bindable as `[value]` (one-way) or\n * `[(value)]=\"signal()\"` (set + listen via `valueChangeEvent`). */\n @Input() value = '';\n\n /** Clearable (showClear / canClear) inherited from AbstractEfFormControl. */\n protected override get hasValue(): boolean {\n return !!this.value;\n }\n\n override clearValue(): void {\n this.handleInput('');\n }\n\n private onChange: (value: string) => void = () => {\n /* noop */\n };\n private onTouched: () => void = () => {\n /* noop */\n };\n\n readonly ngControl = inject(NgControl, { self: true, optional: true });\n\n constructor() {\n super();\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n get isInvalid(): boolean {\n if (this.resolvedExternalErrors()?.length) return true;\n const ctrl = this.ngControl?.control;\n return !!ctrl?.invalid && (!!ctrl?.touched || !!ctrl?.dirty);\n }\n\n get serverErrors(): string[] | null {\n return this.resolvedExternalErrors() ?? this.ngControl?.control?.errors?.['serverError'] ?? null;\n }\n\n get showRequired(): boolean {\n const ctrl = this.ngControl?.control;\n return !!(ctrl?.hasError('required') && ctrl?.touched);\n }\n\n writeValue(value: string): void {\n this.value = value ?? '';\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.updateDisabledState(isDisabled);\n }\n\n handleInput(value: string): void {\n this.value = value;\n this.onChange(value);\n this.valueChangeEvent.emit(value);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n}\n","@if (labelKey() || label()) {\n <ef-label [labelKey]=\"labelKey()\" [label]=\"label()\" [for]=\"effectiveId\" [required]=\"required()\" />\n}\n<div class=\"ef-field-control\">\n <div class=\"ef-textarea-wrap\">\n <textarea\n class=\"ef-textarea\"\n [class.has-clear]=\"canClear\"\n [id]=\"effectiveId\"\n [attr.name]=\"name() || null\"\n [rows]=\"rows\"\n [value]=\"value\"\n [attr.placeholder]=\"effectivePlaceholder || null\"\n [attr.maxlength]=\"maxlength ?? null\"\n [readonly]=\"readonly()\"\n [disabled]=\"isDisabled()\"\n [class.is-invalid]=\"isInvalid\"\n [attr.aria-label]=\"effectiveAriaLabel\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.aria-invalid]=\"isInvalid ? 'true' : null\"\n [attr.aria-describedby]=\"(showRequired || serverErrors) ? errorsId : null\"\n (input)=\"handleInput($any($event.target).value)\"\n (blur)=\"handleBlur()\"\n ></textarea>\n @if (canClear) {\n <ef-clear-button\n class=\"ef-textarea-clear\"\n [ariaLabel]=\"'action.clear' | translate\"\n (clear)=\"clearValue()\"\n />\n }\n </div>\n @if (showRequired || serverErrors) {\n <div [id]=\"errorsId\" role=\"alert\" aria-live=\"polite\">\n @if (showRequired) {\n <small class=\"text-danger\">{{ 'validation.required' | translate }}</small>\n }\n @if (serverErrors; as errors) {\n @for (error of errors; track error) {\n <small class=\"text-danger block\">{{ error }}</small>\n }\n }\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { EfFilterPillComponent } from '../ef-filter-pill/ef-filter-pill.component';\n\nexport interface EfPresetItem<T = string> {\n /** Stable identifier (used as the `value`). */\n key: T;\n /** Translation key for the row label (preferred). */\n labelKey?: string;\n /** Direct label (used only when `labelKey` is empty). */\n label?: string;\n /** Mono hint to the right (date range, count, …). */\n hint?: string;\n}\n\n/**\n * Filter pill that opens a list of presets on click. Consumer-side\n * use cases: date ranges (`Aujourd'hui · 30 derniers jours · …`),\n * non-date enums (`Jamais connecté`), any short canned list.\n *\n * State model: `open` is a `model()` so callers can let the pill\n * manage its own visibility (default) or hoist it into a parent\n * signal for fully controlled use (`[(open)]`).\n *\n * ```html\n * <ef-preset-pill\n * icon=\"pi pi-calendar\"\n * labelKey=\"filter_date\"\n * [presets]=\"datePresets\"\n * [(activeKey)]=\"activeDateKey\"\n * (presetChange)=\"onDateRangeChange($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'ef-preset-pill',\n standalone: true,\n imports: [CommonModule, TranslateModule, EfFilterPillComponent],\n template: `\n <ef-filter-pill\n [icon]=\"icon()\"\n [labelKey]=\"labelKey()\"\n [label]=\"label()\"\n [value]=\"activeLabel()\"\n [tone]=\"tone()\"\n [hasPopover]=\"true\"\n [popoverOpen]=\"open()\"\n (pillClick)=\"toggle()\"\n >\n <ng-container popover>\n @for (preset of presets(); track preset.key) {\n <div\n class=\"preset\"\n role=\"button\"\n tabindex=\"0\"\n [class.active]=\"preset.key === activeKey()\"\n (click)=\"select(preset); $event.stopPropagation()\"\n (keydown.enter)=\"select(preset); $event.stopPropagation()\"\n (keydown.space)=\"select(preset); $event.stopPropagation()\"\n >\n <span>\n {{ preset.labelKey ? (preset.labelKey | translate) : (preset.label ?? '') }}\n </span>\n @if (preset.hint) {\n <span class=\"hint\">{{ preset.hint }}</span>\n }\n </div>\n }\n </ng-container>\n </ef-filter-pill>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfPresetPillComponent<T = string> {\n private readonly translate = inject(TranslateService);\n\n readonly icon = input<string>('pi pi-list');\n readonly labelKey = input<string>('');\n readonly label = input<string>('');\n readonly tone = input<'neutral' | 'active' | 'tenant'>('neutral');\n\n readonly presets = input.required<ReadonlyArray<EfPresetItem<T>>>();\n readonly activeKey = model<T | null>(null);\n\n /** Two-way; consumer can hoist for controlled mode. */\n readonly open = model<boolean>(false);\n\n /** Auto-close the popover after selection (default on). */\n readonly closeOnSelect = input(true, { transform: booleanAttribute });\n\n readonly presetChange = output<EfPresetItem<T>>();\n\n /** Displayed value — translates `labelKey` of the active preset if present. */\n readonly activeLabel = computed(() => {\n const key = this.activeKey();\n const match = this.presets().find(p => p.key === key);\n if (!match) return '';\n if (match.labelKey) return this.translate.instant(match.labelKey);\n return match.label ?? '';\n });\n\n toggle(): void {\n this.open.update(o => !o);\n }\n\n select(preset: EfPresetItem<T>): void {\n this.activeKey.set(preset.key);\n this.presetChange.emit(preset);\n if (this.closeOnSelect()) this.open.set(false);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n input,\n output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Comptoir advanced-filter drawer — collapsible card that lives at\n * the bottom of the smart-bar. Consumer projects their grid of\n * `<div class=\"field\">` controls; the component handles the open\n * animation, the footer Reset / Apply buttons, and the optional hint\n * line on the left of the footer.\n *\n * ```html\n * <ef-filter-drawer\n * [open]=\"drawerOpen()\"\n * hintKey=\"sales_orders_adv_hint\"\n * (apply)=\"runSearch()\"\n * (reset)=\"clearAll()\"\n * >\n * <div class=\"field\">\n * <label for=\"adv-employee\">{{ 'sales_orders_adv_employee' | translate }}</label>\n * <select id=\"adv-employee\">…</select>\n * </div>\n * …\n * </ef-filter-drawer>\n * ```\n */\n@Component({\n selector: 'ef-filter-drawer',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n <div class=\"f-drawer\" [class.open]=\"open()\" [attr.aria-hidden]=\"!open()\">\n <div class=\"grid\">\n <ng-content></ng-content>\n </div>\n <div class=\"foot\">\n <span class=\"left\">\n @if (hintKey()) {\n {{ hintKey() | translate }}\n } @else {\n {{ hint() }}\n }\n </span>\n <div style=\"display: flex; gap: 8px;\">\n <button class=\"btn btn-ghost btn-sm\" type=\"button\" (click)=\"reset.emit()\">\n {{ resetLabelKey() | translate }}\n </button>\n @if (!hideApply()) {\n <button class=\"btn btn-primary btn-sm\" type=\"button\" (click)=\"apply.emit()\">\n {{ applyLabelKey() | translate }}\n </button>\n }\n </div>\n </div>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfFilterDrawerComponent {\n readonly open = input(false, { transform: booleanAttribute });\n readonly hintKey = input<string>('');\n readonly hint = input<string>('');\n readonly resetLabelKey = input<string>('common_reset');\n readonly applyLabelKey = input<string>('common_apply');\n readonly hideApply = input(false, { transform: booleanAttribute });\n\n readonly apply = output<void>();\n // `reset` shadows a native DOM event name. Renaming this output would\n // churn every consumer template, so the name stays and the rule is\n // suppressed here deliberately.\n // eslint-disable-next-line @angular-eslint/no-output-native\n readonly reset = output<void>();\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Comptoir activation tri-state filter — a `.field`-anatomy pill group\n * (all / active / inactive) for boolean activation criteria\n * (`IsActive: bool?` pattern).\n *\n * `value` is the criteria value itself: `true`, `false`, or\n * `undefined`/`null` for \"all\". `valueChange` emits the same shape, so\n * the component binds straight onto a search screen's advanced-filter\n * state; pair with `AbstractSearchScreenV2.activationFilterKey` for\n * apply / baseline-clear / cache-restore.\n *\n * ```html\n * <ef-activation-filter\n * [value]=\"advancedValues()['isActive']\"\n * (valueChange)=\"setAdvancedValue('isActive', $event)\"\n * />\n * ```\n */\n@Component({\n selector: 'ef-activation-filter',\n standalone: true,\n imports: [TranslateModule],\n template: `\n <div class=\"field\">\n <span class=\"field-label\" [id]=\"labelId\">{{ labelKey() | translate }}</span>\n <div class=\"pill-group\" role=\"tablist\" [attr.aria-labelledby]=\"labelId\">\n @for (bucket of buckets(); track bucket.key) {\n <button\n type=\"button\"\n role=\"tab\"\n [class.active]=\"selected() === bucket.key\"\n [attr.aria-selected]=\"selected() === bucket.key\"\n (click)=\"valueChange.emit(bucket.value)\"\n >\n {{ bucket.labelKey | translate }}\n </button>\n }\n </div>\n </div>\n `,\n styles: `\n :host {\n display: block;\n }\n /* Center the pills on the 40px control line so the field aligns\n with sibling comptoir selects/inputs in a drawer row. */\n .pill-group {\n min-height: var(--hit-base, 40px);\n align-items: center;\n align-self: start;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EfActivationFilterComponent {\n private static nextId = 0;\n readonly labelId = `ef-activation-filter-label-${++EfActivationFilterComponent.nextId}`;\n\n /** Current criteria value: `true` / `false` / `undefined` (= all). */\n readonly value = input<unknown>();\n\n readonly labelKey = input('common_activation');\n readonly allLabelKey = input('common_all');\n readonly activeLabelKey = input('common_active');\n readonly inactiveLabelKey = input('common_inactive');\n\n readonly valueChange = output<boolean | undefined>();\n\n readonly selected = computed(() => {\n const v = this.value();\n return v === true ? 'active' : v === false ? 'inactive' : 'all';\n });\n\n readonly buckets = computed(() => [\n { key: 'all', labelKey: this.allLabelKey(), value: undefined },\n { key: 'active', labelKey: this.activeLabelKey(), value: true },\n { key: 'inactive', labelKey: this.inactiveLabelKey(), value: false },\n ]);\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, Input, OnInit, PLATFORM_ID } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { $t, updatePreset, updateSurfacePalette } from '@primeng/themes';\nimport Aura from '@primeng/themes/aura';\nimport Lara from '@primeng/themes/lara';\nimport Material from '@primeng/themes/material';\nimport Nora from '@primeng/themes/nora';\nimport { PrimeNG } from 'primeng/config';\nimport { SelectButton } from 'primeng/selectbutton';\nimport { ToggleSwitchModule } from 'primeng/toggleswitch';\nimport { EfThemeConfigService } from '@elasticias/core';\n\nconst PRESETS: Record<string, Record<string, unknown>> = {\n Aura,\n Lara,\n Material,\n Nora,\n};\n\n/**\n * Theme configurator panel for switching PrimeNG presets, primary colors,\n * surface palettes, ripple effect, and RTL direction.\n *\n * All labels use translation keys (ngx-translate). Pass keys via inputs.\n *\n * Usage:\n * ```html\n * <ef-theme-configurator\n * primaryLabelKey=\"configurator.primary_color\"\n * surfaceLabelKey=\"configurator.surface\"\n * presetLabelKey=\"configurator.preset\"\n * rippleLabelKey=\"configurator.ripple\"\n * rtlLabelKey=\"configurator.rtl\"\n * [presetsDisplayNameKeys]=\"{ Aura: 'configurator.preset_compact', Lara: 'configurator.preset_modern', Material: 'configurator.preset_google', Nora: 'configurator.preset_classic' }\"\n * />\n * ```\n */\n@Component({\n selector: 'ef-theme-configurator',\n standalone: true,\n template: `\n <div class=\"config-panel-content\">\n <div class=\"config-panel-colors\">\n <span class=\"config-panel-label\">{{ primaryLabelKey | translate }}</span>\n <div>\n @for (primaryColor of primaryColors(); track primaryColor.name) {\n <button\n type=\"button\"\n [title]=\"primaryColor.name\"\n (click)=\"updateColors($event, 'primary', primaryColor)\"\n [ngClass]=\"{ 'active-color': primaryColor.name === selectedPrimaryColor() }\"\n [style]=\"{\n 'background-color': primaryColor.name === 'noir' ? 'var(--text-color)' : primaryColor?.palette['500']\n }\"\n ></button>\n }\n </div>\n </div>\n\n <div class=\"config-panel-colors\">\n <span class=\"config-panel-label\">{{ surfaceLabelKey | translate }}</span>\n <div>\n @for (surface of surfaces; track surface.name) {\n <button\n type=\"button\"\n [title]=\"surface.name\"\n (click)=\"updateColors($event, 'surface', surface)\"\n [ngClass]=\"{ 'active-color': selectedSurfaceColor() ? selectedSurfaceColor() === surface.name : configService.appState().darkTheme ? surface.name === 'zinc' : surface.name === 'slate' }\"\n [style]=\"{\n 'background-color': surface.name === 'noir' ? 'var(--text-color)' : surface?.palette['500']\n }\"\n ></button>\n }\n </div>\n </div>\n\n <div class=\"config-panel-settings\">\n <span class=\"config-panel-label\">{{ presetLabelKey | translate }}</span>\n <p-selectbutton\n [options]=\"presetsOptions\"\n [ngModel]=\"selectedPreset()\"\n (ngModelChange)=\"onPresetChange($event)\"\n [allowEmpty]=\"false\"\n size=\"small\"\n >\n <ng-template #item let-item>\n {{ (presetsDisplayNameKeys[item] || item) | translate }}\n </ng-template>\n </p-selectbutton>\n </div>\n\n <div class=\"flex\">\n <div class=\"flex-1\">\n <div class=\"config-panel-settings\">\n <span class=\"config-panel-label\">{{ rippleLabelKey | translate }}</span>\n <p-toggleswitch [(ngModel)]=\"ripple\" />\n </div>\n </div>\n <div class=\"flex-1\">\n <div class=\"config-panel-settings items-end\">\n <span class=\"config-panel-label\">{{ rtlLabelKey | translate }}</span>\n <p-toggleswitch [ngModel]=\"isRTL\" (ngModelChange)=\"onRTLChange($event)\" />\n </div>\n </div>\n </div>\n </div>\n `,\n host: {},\n imports: [\n CommonModule,\n FormsModule,\n TranslateModule,\n SelectButton,\n ToggleSwitchModule,\n ],\n})\nexport class EfThemeConfiguratorComponent implements OnInit {\n @Input() primaryLabelKey = 'configurator.primary_color';\n @Input() surfaceLabelKey = 'configurator.surface';\n @Input() presetLabelKey = 'configurator.preset';\n @Input() rippleLabelKey = 'configurator.ripple';\n @Input() rtlLabelKey = 'configurator.rtl';\n @Input() presetsDisplayNameKeys: Record<string, string> = {\n Aura: 'configurator.preset_compact',\n Lara: 'configurator.preset_modern',\n Material: 'configurator.preset_google',\n Nora: 'configurator.preset_classic',\n };\n\n get ripple() {\n return this.config.ripple();\n }\n\n set ripple(value: boolean) {\n this.config.ripple.set(value);\n }\n\n get isRTL() {\n return this.configService.appState().RTL;\n }\n\n config: PrimeNG = inject(PrimeNG);\n configService: EfThemeConfigService = inject(EfThemeConfigService);\n platformId = inject(PLATFORM_ID);\n\n presetsOptions = Object.keys(PRESETS);\n\n onRTLChange(value: boolean) {\n this.configService.appState.update((state) => ({ ...state, RTL: value }));\n }\n\n ngOnInit() {\n this.onPresetChange(this.configService.appState().preset);\n }\n\n surfaces = [\n { name: 'slate', palette: { 0: '#ffffff', 50: '#f8fafc', 100: '#f1f5f9', 200: '#e2e8f0', 300: '#cbd5e1', 400: '#94a3b8', 500: '#64748b', 600: '#475569', 700: '#334155', 800: '#1e293b', 900: '#0f172a', 950: '#020617' } },\n { name: 'gray', palette: { 0: '#ffffff', 50: '#f9fafb', 100: '#f3f4f6', 200: '#e5e7eb', 300: '#d1d5db', 400: '#9ca3af', 500: '#6b7280', 600: '#4b5563', 700: '#374151', 800: '#1f2937', 900: '#111827', 950: '#030712' } },\n { name: 'zinc', palette: { 0: '#ffffff', 50: '#fafafa', 100: '#f4f4f5', 200: '#e4e4e7', 300: '#d4d4d8', 400: '#a1a1aa', 500: '#71717a', 600: '#52525b', 700: '#3f3f46', 800: '#27272a', 900: '#18181b', 950: '#09090b' } },\n { name: 'neutral', palette: { 0: '#ffffff', 50: '#fafafa', 100: '#f5f5f5', 200: '#e5e5e5', 300: '#d4d4d4', 400: '#a3a3a3', 500: '#737373', 600: '#525252', 700: '#404040', 800: '#262626', 900: '#171717', 950: '#0a0a0a' } },\n { name: 'stone', palette: { 0: '#ffffff', 50: '#fafaf9', 100: '#f5f5f4', 200: '#e7e5e4', 300: '#d6d3d1', 400: '#a8a29e', 500: '#78716c', 600: '#57534e', 700: '#44403c', 800: '#292524', 900: '#1c1917', 950: '#0c0a09' } },\n { name: 'soho', palette: { 0: '#ffffff', 50: '#ececec', 100: '#dedfdf', 200: '#c4c4c6', 300: '#adaeb0', 400: '#97979b', 500: '#7f8084', 600: '#6a6b70', 700: '#55565b', 800: '#3f4046', 900: '#2c2c34', 950: '#16161d' } },\n { name: 'viva', palette: { 0: '#ffffff', 50: '#f3f3f3', 100: '#e7e7e8', 200: '#cfd0d0', 300: '#b7b8b9', 400: '#9fa1a1', 500: '#87898a', 600: '#6e7173', 700: '#565a5b', 800: '#3e4244', 900: '#262b2c', 950: '#0e1315' } },\n { name: 'ocean', palette: { 0: '#ffffff', 50: '#fbfcfc', 100: '#F7F9F8', 200: '#EFF3F2', 300: '#DADEDD', 400: '#B1B7B6', 500: '#828787', 600: '#5F7274', 700: '#415B61', 800: '#29444E', 900: '#183240', 950: '#0c1920' } },\n ];\n\n selectedPrimaryColor = computed(() => this.configService.appState().primary);\n selectedSurfaceColor = computed(() => this.configService.appState().surface);\n selectedPreset = computed(() => this.configService.appState().preset);\n\n primaryColors = computed(() => {\n const presetPalette = (PRESETS[this.configService.appState().preset ?? ''] as Record<string, Record<string, unknown>> | undefined)?.primitive;\n const colors = ['emerald', 'green', 'lime', 'orange', 'amber', 'yellow', 'teal', 'cyan', 'sky', 'blue', 'indigo', 'violet', 'purple', 'fuchsia', 'pink', 'rose'];\n const palettes: { name: string; palette: Record<string, string> }[] = [{ name: 'noir', palette: {} }];\n\n colors.forEach((color) => {\n if (presetPalette?.[color]) {\n palettes.push({ name: color, palette: presetPalette[color] as Record<string, string> });\n }\n });\n\n return palettes;\n });\n\n getPresetExt(): Record<string, unknown> {\n const color = this.primaryColors().find((c) => c.name === this.selectedPrimaryColor());\n\n if (color?.name === 'noir') {\n return {\n semantic: {\n primary: {\n 50: '{surface.50}', 100: '{surface.100}', 200: '{surface.200}', 300: '{surface.300}',\n 400: '{surface.400}', 500: '{surface.500}', 600: '{surface.600}', 700: '{surface.700}',\n 800: '{surface.800}', 900: '{surface.900}', 950: '{surface.950}',\n },\n colorScheme: {\n light: {\n primary: { color: '{primary.950}', contrastColor: '#ffffff', hoverColor: '{primary.800}', activeColor: '{primary.700}' },\n highlight: { background: '{primary.950}', focusBackground: '{primary.700}', color: '#ffffff', focusColor: '#ffffff' },\n },\n dark: {\n primary: { color: '{primary.50}', contrastColor: '{primary.950}', hoverColor: '{primary.200}', activeColor: '{primary.300}' },\n highlight: { background: '{primary.50}', focusBackground: '{primary.300}', color: '{primary.950}', focusColor: '{primary.950}' },\n },\n },\n },\n };\n }\n\n const preset = this.configService.appState().preset;\n if (preset === 'Nora') {\n return {\n semantic: {\n primary: color?.palette,\n colorScheme: {\n light: {\n primary: { color: '{primary.600}', contrastColor: '#ffffff', hoverColor: '{primary.700}', activeColor: '{primary.800}' },\n highlight: { background: '{primary.600}', focusBackground: '{primary.700}', color: '#ffffff', focusColor: '#ffffff' },\n },\n dark: {\n primary: { color: '{primary.500}', contrastColor: '{surface.900}', hoverColor: '{primary.400}', activeColor: '{primary.300}' },\n highlight: { background: '{primary.500}', focusBackground: '{primary.400}', color: '{surface.900}', focusColor: '{surface.900}' },\n },\n },\n },\n };\n } else if (preset === 'Material') {\n return {\n semantic: {\n primary: color?.palette,\n colorScheme: {\n light: {\n primary: { color: '{primary.500}', contrastColor: '#ffffff', hoverColor: '{primary.400}', activeColor: '{primary.300}' },\n highlight: { background: 'color-mix(in srgb, {primary.color}, transparent 88%)', focusBackground: 'color-mix(in srgb, {primary.color}, transparent 76%)', color: '{primary.700}', focusColor: '{primary.800}' },\n },\n dark: {\n primary: { color: '{primary.400}', contrastColor: '{surface.900}', hoverColor: '{primary.300}', activeColor: '{primary.200}' },\n highlight: { background: 'color-mix(in srgb, {primary.400}, transparent 84%)', focusBackground: 'color-mix(in srgb, {primary.400}, transparent 76%)', color: 'rgba(255,255,255,.87)', focusColor: 'rgba(255,255,255,.87)' },\n },\n },\n },\n };\n }\n\n return {\n semantic: {\n primary: color?.palette,\n colorScheme: {\n light: {\n primary: { color: '{primary.500}', contrastColor: '#ffffff', hoverColor: '{primary.600}', activeColor: '{primary.700}' },\n highlight: { background: '{primary.50}', focusBackground: '{primary.100}', color: '{primary.700}', focusColor: '{primary.800}' },\n },\n dark: {\n primary: { color: '{primary.400}', contrastColor: '{surface.900}', hoverColor: '{primary.300}', activeColor: '{primary.200}' },\n highlight: { background: 'color-mix(in srgb, {primary.400}, transparent 84%)', focusBackground: 'color-mix(in srgb, {primary.400}, transparent 76%)', color: 'rgba(255,255,255,.87)', focusColor: 'rgba(255,255,255,.87)' },\n },\n },\n },\n };\n }\n\n updateColors(event: Event, type: string, color: { name: string; palette: Record<string, string> }) {\n if (type === 'primary') {\n this.configService.appState.update((state) => ({ ...state, primary: color.name }));\n } else if (type === 'surface') {\n this.configService.appState.update((state) => ({ ...state, surface: color.name }));\n }\n this.applyTheme(type, color);\n event.stopPropagation();\n }\n\n applyTheme(type: string, color: { name: string; palette: Record<string, string> }) {\n if (type === 'primary') {\n updatePreset(this.getPresetExt());\n } else if (type === 'surface') {\n updateSurfacePalette(color.palette);\n }\n }\n\n onPresetChange(event: string) {\n this.configService.appState.update((state) => ({ ...state, preset: event }));\n const preset = PRESETS[event];\n const surfacePalette = this.surfaces.find((s) => s.name === this.selectedSurfaceColor())?.palette;\n\n if (this.configService.appState().preset === 'Material') {\n document.body.classList.add('material');\n this.config.ripple.set(true);\n } else {\n document.body.classList.remove('material');\n this.config.ripple.set(false);\n }\n\n $t()\n .preset(preset)\n .preset(this.getPresetExt())\n .surfacePalette(surfacePalette)\n .use({ useDefaultOptions: true });\n\n // Lara gets fully rounded (pill-shaped) components; others use default preset radius\n updatePreset({\n primitive: {\n borderRadius: event === 'Lara'\n ? { none: '0', xs: '6px', sm: '12px', md: '16px', lg: '20px', xl: '28px' }\n : { none: '0', xs: '2px', sm: '4px', md: '6px', lg: '8px', xl: '12px' },\n },\n });\n }\n}\n","import { Component, computed, input, output } from '@angular/core';\nimport { CommonModule, DecimalPipe, DatePipe } from '@angular/common';\nimport { CardModule } from 'primeng/card';\nimport { TableModule } from 'primeng/table';\nimport { TagModule } from 'primeng/tag';\nimport { ButtonModule } from 'primeng/button';\nimport { SelectButtonModule } from 'primeng/selectbutton';\nimport { FormsModule } from '@angular/forms';\nimport type { EmailMetrics, EmailEventRecord, EmailEventKind } from '@elasticias/types';\n\ntype RangeKey = '7d' | '30d' | '90d';\n\n/**\n * Manager dashboard widget: email engagement KPIs, category breakdown, recent events.\n * Keep this presentational — host app fetches metrics + supplies `rangeChange` callback.\n *\n * @example\n * <ef-email-metrics-card\n * [metrics]=\"metrics()\"\n * [recentEvents]=\"events()\"\n * [loading]=\"loading()\"\n * (rangeChange)=\"reload($event)\"\n * />\n */\n@Component({\n selector: 'ef-email-metrics-card',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n CardModule,\n TableModule,\n TagModule,\n ButtonModule,\n SelectButtonModule,\n DecimalPipe,\n DatePipe,\n ],\n templateUrl: './ef-email-metrics-card.component.html',\n styleUrl: './ef-email-metrics-card.component.scss',\n})\nexport class EfEmailMetricsCardComponent {\n metrics = input<EmailMetrics | null>(null);\n recentEvents = input<EmailEventRecord[]>([]);\n loading = input<boolean>(false);\n title = input<string>('Email engagement');\n\n selectedRange: RangeKey = '7d';\n rangeOptions = [\n { label: '7 j', value: '7d' },\n { label: '30 j', value: '30d' },\n { label: '90 j', value: '90d' },\n ];\n\n hasData = computed(() => (this.metrics()?.sent ?? 0) > 0);\n\n kpis = computed(() => {\n const m = this.metrics();\n if (!m) return [];\n return [\n { label: 'Envoyés', value: m.sent, tone: 'neutral' as const },\n { label: 'Taux d’ouverture', value: m.openRate, rate: true, tone: this.rateTone(m.openRate, 0.2, 0.35) },\n { label: 'Taux de clic', value: m.clickRate, rate: true, tone: this.rateTone(m.clickRate, 0.02, 0.05) },\n { label: 'Taux de rebond', value: m.bounceRate, rate: true, tone: this.rateTone(m.bounceRate, 0.05, 0.02, true) },\n ];\n });\n\n onRangeChange(value: RangeKey) {\n this.selectedRange = value;\n this.rangeChange.emit(value);\n }\n\n readonly rangeChange = output<RangeKey>();\n\n kindSeverity(kind: EmailEventKind): 'success' | 'info' | 'warn' | 'danger' | 'secondary' {\n switch (kind) {\n case 'Open': return 'success';\n case 'Click': return 'info';\n case 'SoftBounce': return 'warn';\n case 'HardBounce':\n case 'Spam': return 'danger';\n default: return 'secondary';\n }\n }\n\n private rateTone(rate: number, warnThreshold: number, goodThreshold: number, lowerIsBetter = false): 'good' | 'warn' | 'neutral' {\n if (lowerIsBetter) {\n if (rate > warnThreshold) return 'warn';\n if (rate < goodThreshold) return 'good';\n return 'neutral';\n }\n if (rate >= goodThreshold) return 'good';\n if (rate >= warnThreshold) return 'neutral';\n return 'warn';\n }\n}\n","<p-card styleClass=\"ef-email-metrics-card\">\n <ng-template pTemplate=\"header\">\n <div class=\"ef-email-metrics-card__header\">\n <div>\n <h3 class=\"ef-email-metrics-card__title\">{{ title() }}</h3>\n @if (metrics(); as m) {\n <p class=\"ef-email-metrics-card__subtitle\">\n {{ m.from | date: 'dd MMM' }} – {{ m.to | date: 'dd MMM yyyy' }}\n </p>\n }\n </div>\n <p-selectButton\n [options]=\"rangeOptions\"\n [(ngModel)]=\"selectedRange\"\n optionLabel=\"label\"\n optionValue=\"value\"\n styleClass=\"ef-email-metrics-card__range\"\n (onChange)=\"onRangeChange($event.value)\"\n />\n </div>\n </ng-template>\n\n @if (metrics(); as m) {\n <div class=\"ef-email-metrics-card__kpis\">\n @for (kpi of kpis(); track kpi.label) {\n <div class=\"ef-email-metrics-card__kpi\" [attr.data-tone]=\"kpi.tone\">\n <span class=\"ef-email-metrics-card__kpi-label\">{{ kpi.label }}</span>\n <span class=\"ef-email-metrics-card__kpi-value\">\n @if (kpi.rate) {\n {{ kpi.value | number: '1.1-1' : 'fr' }}\n <span class=\"ef-email-metrics-card__kpi-unit\">%</span>\n } @else {\n {{ kpi.value | number: '1.0-0' : 'fr' }}\n }\n </span>\n </div>\n }\n </div>\n\n @if (m.categories.length > 0) {\n <div class=\"ef-email-metrics-card__section\">\n <h4 class=\"ef-email-metrics-card__section-title\">Par catégorie</h4>\n <p-table [value]=\"m.categories\" styleClass=\"ef-email-metrics-card__table\" [scrollable]=\"true\" scrollHeight=\"180px\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th>Catégorie</th>\n <th class=\"ef-email-metrics-card__num\">Envoyés</th>\n <th class=\"ef-email-metrics-card__num\">Ouverts</th>\n <th class=\"ef-email-metrics-card__num\">Cliqués</th>\n <th class=\"ef-email-metrics-card__num\">Rebonds</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-row>\n <tr>\n <td class=\"ef-email-metrics-card__category\">{{ row.category }}</td>\n <td class=\"ef-email-metrics-card__num\">{{ row.sent }}</td>\n <td class=\"ef-email-metrics-card__num\">{{ row.opened }}</td>\n <td class=\"ef-email-metrics-card__num\">{{ row.clicked }}</td>\n <td class=\"ef-email-metrics-card__num\" [class.ef-email-metrics-card__num--danger]=\"row.bounced > 0\">{{ row.bounced }}</td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n }\n\n @if (recentEvents().length > 0) {\n <div class=\"ef-email-metrics-card__section\">\n <h4 class=\"ef-email-metrics-card__section-title\">Événements récents</h4>\n <p-table [value]=\"recentEvents()\" styleClass=\"ef-email-metrics-card__table\" [scrollable]=\"true\" scrollHeight=\"240px\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th>Quand</th>\n <th>Destinataire</th>\n <th>Catégorie</th>\n <th>Type</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-row>\n <tr>\n <td class=\"ef-email-metrics-card__when\">{{ row.occurredAt | date: 'dd/MM HH:mm' }}</td>\n <td class=\"ef-email-metrics-card__recipient\">{{ row.recipient }}</td>\n <td>{{ row.category || '—' }}</td>\n <td>\n <p-tag [severity]=\"kindSeverity(row.kind)\" [value]=\"row.kind\" styleClass=\"ef-email-metrics-card__kind\" />\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n }\n } @else {\n <div class=\"ef-email-metrics-card__empty\">\n <p-button label=\"Aucune donnée encore\" [text]=\"true\" icon=\"pi pi-envelope\" [disabled]=\"true\" />\n </div>\n }\n</p-card>\n","// Pipes\nexport { EfCurrencyPipe } from './lib/pipes/ef-currency.pipe';\nexport { TruncatePipe } from './lib/pipes/truncate.pipe';\nexport { EfCompactPipe } from './lib/pipes/ef-compact.pipe';\n\n// Commerce\nexport { EfPriceDisplayComponent } from './lib/commerce/ef-price-display.component';\nexport { EfQuantitySelectorComponent } from './lib/commerce/ef-quantity-selector.component';\nexport { EfOrderBuilderComponent } from './lib/commerce/ef-order-builder/ef-order-builder.component';\nexport * from './lib/commerce/ef-order-builder/ef-order-builder.component.types';\nexport { EfProductTypeaheadComponent } from './lib/commerce/ef-product-typeahead/ef-product-typeahead.component';\nexport * from './lib/commerce/ef-product-typeahead/ef-product-typeahead.component.types';\nexport { EfOrderSummaryComponent } from './lib/commerce/ef-order-summary/ef-order-summary.component';\nexport type { ProductCountGroup, ProductCountGroupLabel, ProductWithCountGroup } from './lib/commerce/ef-order-summary/ef-order-summary.component';\nexport { EfProductCatalogueFilterComponent } from './lib/commerce/ef-product-catalogue-filter/ef-product-catalogue-filter.component';\nexport type { CategoryItem, CategoryGroup, CategoryAssignment, SelectedFilter } from './lib/commerce/ef-product-catalogue-filter/ef-product-catalogue-filter.component';\nexport { EfProductCatalogueComponent } from './lib/commerce/ef-product-catalogue/ef-product-catalogue.component';\nexport type { CatalogueProduct, CatalogueProductVariant } from './lib/commerce/ef-product-catalogue/ef-product-catalogue.component';\n\n// Layout components\nexport { EfDialogComponent } from './lib/layout/ef-dialog/ef-dialog.component';\nexport { EfConfirmDialogComponent } from './lib/layout/ef-confirm-dialog/ef-confirm-dialog.component';\nexport { EfThemeToggleComponent } from './lib/layout/ef-theme-toggle/ef-theme-toggle.component';\nexport { EfBuildStampComponent } from './lib/layout/ef-build-stamp/ef-build-stamp.component';\nexport { EfAboutDialogComponent } from './lib/layout/ef-about-dialog/ef-about-dialog.component';\nexport { EfTooltipDirective } from './lib/overlays/ef-tooltip.directive';\nexport type {\n EfDialogAction,\n EfDialogSeverity,\n EfDialogSize,\n} from './lib/layout/ef-dialog/ef-dialog.component';\nexport { EfFieldsetComponent } from './lib/layout/ef-fieldset/ef-fieldset.component';\nexport { EfButtonComponent } from './lib/layout/ef-button/ef-button.component';\nexport type {\n EfButtonSeverity,\n EfButtonPrimeNGSeverity,\n EfButtonComptoirSeverity,\n} from './lib/layout/ef-button/ef-button.component';\nexport { EfButtonGroupComponent } from './lib/layout/ef-button-group/ef-button-group.component';\nexport { EfLabelComponent } from './lib/layout/ef-label/ef-label.component';\nexport { EfBadgeComponent } from './lib/layout/ef-badge/ef-badge.component';\nexport * from './lib/layout/ef-badge/ef-badge.component.types';\nexport { EfToolbarComponent } from './lib/layout/ef-toolbar/ef-toolbar.component';\n\n// Comptoir shell components (Phase 2)\nexport { EfAppShellComponent } from './lib/layout/ef-app-shell/ef-app-shell.component';\nexport { EfAppShellMobileComponent } from './lib/layout/ef-app-shell-mobile/ef-app-shell-mobile.component';\nexport { EfAppMainComponent } from './lib/layout/ef-app-main/ef-app-main.component';\nexport { EfAppTopComponent } from './lib/layout/ef-app-top/ef-app-top.component';\nexport { EfModuleRailComponent } from './lib/layout/ef-module-rail/ef-module-rail.component';\nexport { EfModuleSideComponent } from './lib/layout/ef-module-side/ef-module-side.component';\nexport { EfBottomSheetComponent } from './lib/layout/ef-bottom-sheet/ef-bottom-sheet.component';\nexport { EfFabComponent } from './lib/layout/ef-fab/ef-fab.component';\nexport type { EfFabPosition } from './lib/layout/ef-fab/ef-fab.component';\nexport { EfPillGroupComponent } from './lib/layout/ef-pill-group/ef-pill-group.component';\nexport type { EfPillItem } from './lib/layout/ef-pill-group/ef-pill-group.component';\nexport { EfTabsComponent } from './lib/layout/ef-tabs/ef-tabs.component';\nexport type {\n EfTabItem,\n EfTabsVariant,\n EfTabsModule,\n} from './lib/layout/ef-tabs/ef-tabs.component';\nexport { EfTabPanelDirective } from './lib/layout/ef-tabs/ef-tab-panel.directive';\nexport { EfProfileChipComponent } from './lib/layout/ef-profile-chip/ef-profile-chip.component';\n\n// Feedback components\nexport { EfBlockUiComponent } from './lib/feedback/ef-block-ui/ef-block-ui.component';\nexport { EfBlockableDivComponent } from './lib/feedback/ef-blockable-div/ef-blockable-div.component';\nexport { EfPulseComponent } from './lib/feedback/ef-pulse/ef-pulse.component';\nexport { EfPdfPreviewComponent } from './lib/feedback/ef-pdf-preview/ef-pdf-preview.component';\nexport { EfStatusChipComponent } from './lib/feedback/ef-status-chip/ef-status-chip.component';\nexport type { EfStatusColor, EfStatusReferenceItem } from './lib/feedback/ef-status-chip/ef-status-chip.types';\nexport {\n EF_STATUS_COLORS,\n EF_STATUS_COLOR_ALIASES,\n resolveEfStatusColor,\n} from './lib/feedback/ef-status-chip/ef-status-chip.types';\nexport { EfToastRegionComponent } from './lib/feedback/ef-toast-region/ef-toast-region.component';\nexport type { EfToastRegionPosition } from './lib/feedback/ef-toast-region/ef-toast-region.component';\nexport { EfSkeletonComponent } from './lib/feedback/ef-skeleton/ef-skeleton.component';\nexport type { EfSkeletonVariant } from './lib/feedback/ef-skeleton/ef-skeleton.component';\n\n// Phase 7 — detail-screen primitives\nexport { EfCardComponent } from './lib/layout/ef-card/ef-card.component';\nexport { EfFormGridComponent } from './lib/layout/ef-form-grid/ef-form-grid.component';\nexport { EfDetailToolbarComponent } from './lib/layout/ef-detail-toolbar/ef-detail-toolbar.component';\nexport type { EfDetailToolbarAction } from './lib/layout/ef-detail-toolbar/ef-detail-toolbar.types';\nexport { EfSearchToolbarComponent } from './lib/layout/ef-search-toolbar/ef-search-toolbar.component';\nexport type { EfSearchToolbarAction } from './lib/layout/ef-search-toolbar/ef-search-toolbar.types';\nexport { EfTotalsComponent } from './lib/data/ef-totals/ef-totals.component';\nexport type { EfTotalsRow, EfTotalsGrand } from './lib/data/ef-totals/ef-totals.types';\nexport { EfStatsComponent } from './lib/data/ef-stats/ef-stats.component';\nexport type { EfStatsRow } from './lib/data/ef-stats/ef-stats.types';\nexport { EfTimelineComponent } from './lib/data/ef-timeline/ef-timeline.component';\nexport type { EfTimelineItem, EfTimelineState } from './lib/data/ef-timeline/ef-timeline.types';\nexport { EfChangeHistoryComponent } from './lib/data/ef-change-history/ef-change-history.component';\nexport type { EfChangeHistoryEntry, EfChangeHistoryFieldChange } from './lib/data/ef-change-history/ef-change-history.types';\nexport { EfKpiCardComponent } from './lib/data/ef-kpi-card/ef-kpi-card.component';\nexport type { EfKpiSparkline, EfKpiDeltaTone } from './lib/data/ef-kpi-card/ef-kpi-card.types';\nexport { EfChartComponent } from './lib/data/ef-chart/ef-chart.component';\nexport { buildChartConfig, EF_CHART_PALETTE } from './lib/data/ef-chart/ef-chart.config';\nexport type { EfChartSeries, EfChartType } from './lib/data/ef-chart/ef-chart.config';\nexport { EfRankListComponent } from './lib/data/ef-rank-list/ef-rank-list.component';\nexport type { EfRankRow } from './lib/data/ef-rank-list/ef-rank-list.component';\n\n// Forms\nexport * from './lib/forms';\n\n// Data components\nexport { EfDatatableComponent } from './lib/data/ef-datatable/ef-datatable.component';\nexport type { DatatableSearchEntity } from './lib/data/ef-datatable/ef-datatable.component';\nexport * from './lib/data/ef-datatable/ef-datatable.component.types';\nexport { EfDatatableActionBarComponent } from './lib/data/ef-datatable-actionbar/ef-datatable-actionbar.component';\n\n// Comptoir data primitives (Phase 6)\nexport { EfDataCardComponent } from './lib/data/ef-data-card/ef-data-card.component';\nexport { EF_DATA_CARD_MOBILE_LAYOUT } from './lib/data/ef-data-card/ef-data-card.mobile';\nexport type { EfDataCardMobileLayout } from './lib/data/ef-data-card/ef-data-card.mobile';\nexport type { EfDataCardRowAction } from './lib/data/ef-data-card/ef-data-card.component';\nexport {\n EfColumnTemplateDirective,\n EfColumnHeaderTemplateDirective,\n} from './lib/data/ef-data-card/ef-column-template.directive';\nexport type {\n EfDataCardColumn,\n EfDataCardColumnType,\n EfDataCardColumnMobileRole,\n EfDataCardColumnAlign,\n EfDataCardSort,\n EfDataCardSortDirection,\n} from './lib/data/ef-data-card/ef-data-card.types';\nexport { EfRowActionsComponent } from './lib/data/ef-row-actions/ef-row-actions.component';\nexport type { EfRowAction } from './lib/data/ef-row-actions/ef-row-actions.types';\nexport { EfPagerComponent } from './lib/data/ef-pager/ef-pager.component';\nexport { EfBulkBarComponent } from './lib/data/ef-bulk-bar/ef-bulk-bar.component';\nexport { EfEmptyStateComponent } from './lib/feedback/ef-empty-state/ef-empty-state.component';\nexport { EfSmartBarComponent } from './lib/data/ef-smart-bar/ef-smart-bar.component';\nexport { EfFilterPillComponent } from './lib/forms/ef-filter-pill/ef-filter-pill.component';\nexport { EfServerErrorsDirective } from './lib/forms/ef-server-errors.directive';\nexport { EfClearButtonComponent } from './lib/forms/ef-clear-button/ef-clear-button.component';\nexport { EfInputTextComponent } from './lib/forms/ef-input-text/ef-input-text.component';\nexport { EfPasswordComponent } from './lib/forms/ef-password/ef-password.component';\nexport { EfCheckboxComponent } from './lib/forms/ef-checkbox/ef-checkbox.component';\nexport { EfTextareaComponent } from './lib/forms/ef-textarea/ef-textarea.component';\nexport { EfSelectComponent } from './lib/forms/ef-select/ef-select.component';\nexport { EfPresetPillComponent } from './lib/forms/ef-preset-pill/ef-preset-pill.component';\nexport type { EfPresetItem } from './lib/forms/ef-preset-pill/ef-preset-pill.component';\nexport {\n EfDatepickerAdvancedComponent,\n type EfDateFieldValue,\n} from './lib/forms/ef-datepicker-advanced/ef-datepicker-advanced.component';\nexport type {\n EfDatePreset,\n EfDatePresetKey,\n EfDateRange,\n} from './lib/forms/ef-datepicker-advanced/ef-datepicker-advanced.types';\nexport { EfFilterDrawerComponent } from './lib/forms/ef-filter-drawer/ef-filter-drawer.component';\nexport { EfActivationFilterComponent } from './lib/forms/ef-activation-filter/ef-activation-filter.component';\n\n// Theme\nexport { EfThemeConfiguratorComponent } from './lib/ef-theme-configurator/ef-theme-configurator.component';\n\n// Analytics\nexport { EfEmailMetricsCardComponent } from './lib/analytics/ef-email-metrics-card/ef-email-metrics-card.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i3","i4","i5","i2","i6","i7","i8","i9","i10","Tooltip"],"mappings":"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"}