{"version":3,"file":"mozaic-ds-angular.mjs","sources":["../../../../projects/mozaic-ng/src/lib/breadcrumb/breadcrumb.ts","../../../../projects/mozaic-ng/src/lib/breadcrumb/breadcrumb.html","../../../../projects/mozaic-ng/src/lib/button/button.ts","../../../../projects/mozaic-ng/src/lib/button/button.html","../../../../projects/mozaic-ng/src/lib/checkbox/checkbox.ts","../../../../projects/mozaic-ng/src/lib/checkbox/checkbox.html","../../../../projects/mozaic-ng/src/lib/checkbox-group/checkbox-group.ts","../../../../projects/mozaic-ng/src/lib/checkbox-group/checkbox-group.html","../../../../projects/mozaic-ng/src/lib/divider/divider.ts","../../../../projects/mozaic-ng/src/lib/divider/divider.html","../../../../projects/mozaic-ng/src/lib/field/field.ts","../../../../projects/mozaic-ng/src/lib/field/field.html","../../../../projects/mozaic-ng/src/lib/field-group/field-group.ts","../../../../projects/mozaic-ng/src/lib/field-group/field-group.html","../../../../projects/mozaic-ng/src/lib/icon-button/icon-button.ts","../../../../projects/mozaic-ng/src/lib/icon-button/icon-button.html","../../../../projects/mozaic-ng/src/lib/linear-progress-bar-buffer/linear-progress-bar-buffer.ts","../../../../projects/mozaic-ng/src/lib/linear-progress-bar-buffer/linear-progress-bar-buffer.html","../../../../projects/mozaic-ng/src/lib/file-uploader/item/file-uploader-item.ts","../../../../projects/mozaic-ng/src/lib/file-uploader/item/file-uploader-item.html","../../../../projects/mozaic-ng/src/lib/file-uploader/file-uploader.ts","../../../../projects/mozaic-ng/src/lib/file-uploader/file-uploader.html","../../../../projects/mozaic-ng/src/lib/link/link.ts","../../../../projects/mozaic-ng/src/lib/link/link.html","../../../../projects/mozaic-ng/src/lib/loader/loader.ts","../../../../projects/mozaic-ng/src/lib/loader/loader.html","../../../../projects/mozaic-ng/src/lib/loading-overlay/loading-overlay.ts","../../../../projects/mozaic-ng/src/lib/loading-overlay/loading-overlay.html","../../../../projects/mozaic-ng/src/lib/modal/modal.ts","../../../../projects/mozaic-ng/src/lib/modal/modal.html","../../../../projects/mozaic-ng/src/lib/modal/config/modal.config.ts","../../../../projects/mozaic-ng/src/lib/modal/ref/modal-ref.ts","../../../../projects/mozaic-ng/src/lib/modal/container/modal-container.ts","../../../../projects/mozaic-ng/src/lib/modal/container/modal-container.html","../../../../projects/mozaic-ng/src/lib/modal/service/modal.service.ts","../../../../projects/mozaic-ng/src/lib/modal/directive/modal-footer.directive.ts","../../../../projects/mozaic-ng/src/lib/number-badge/number-badge.ts","../../../../projects/mozaic-ng/src/lib/number-badge/number-badge.html","../../../../projects/mozaic-ng/src/lib/overlay/overlay.ts","../../../../projects/mozaic-ng/src/lib/overlay/overlay.html","../../../../projects/mozaic-ng/src/lib/select/select.ts","../../../../projects/mozaic-ng/src/lib/select/select.html","../../../../projects/mozaic-ng/src/lib/pagination/pagination.ts","../../../../projects/mozaic-ng/src/lib/pagination/pagination.html","../../../../projects/mozaic-ng/src/lib/password-input/password-input.directive.ts","../../../../projects/mozaic-ng/src/lib/pincode/pincode.ts","../../../../projects/mozaic-ng/src/lib/pincode/pincode.html","../../../../projects/mozaic-ng/src/lib/quantity-selector/quantity-selector.ts","../../../../projects/mozaic-ng/src/lib/quantity-selector/quantity-selector.html","../../../../projects/mozaic-ng/src/lib/radio/radio.ts","../../../../projects/mozaic-ng/src/lib/radio/radio.html","../../../../projects/mozaic-ng/src/lib/radio-group/radio-group.ts","../../../../projects/mozaic-ng/src/lib/radio-group/radio-group.html","../../../../projects/mozaic-ng/src/lib/status-dot/status-dot.ts","../../../../projects/mozaic-ng/src/lib/status-dot/status-dot.html","../../../../projects/mozaic-ng/src/lib/status-badge/status-badge.ts","../../../../projects/mozaic-ng/src/lib/status-badge/status-badge.html","../../../../projects/mozaic-ng/src/lib/status-notification/status-notification.ts","../../../../projects/mozaic-ng/src/lib/status-notification/status-notification.html","../../../../projects/mozaic-ng/src/lib/tabs/tab/tab.ts","../../../../projects/mozaic-ng/src/lib/tabs/tabs.ts","../../../../projects/mozaic-ng/src/lib/tabs/tabs.html","../../../../projects/mozaic-ng/src/lib/tag/tag.ts","../../../../projects/mozaic-ng/src/lib/tag/tag.html","../../../../projects/mozaic-ng/src/lib/text-area/text-area.directive.ts","../../../../projects/mozaic-ng/src/lib/text-input/text-input.directive.ts","../../../../projects/mozaic-ng/src/lib/toggle/toggle.ts","../../../../projects/mozaic-ng/src/lib/toggle/toggle.html","../../../../projects/mozaic-ng/src/lib/flag/flag.ts","../../../../projects/mozaic-ng/src/lib/flag/flag.html","../../../../projects/mozaic-ng/src/lib/datepicker/datepicker.ts","../../../../projects/mozaic-ng/src/lib/datepicker/datepicker.html","../../../../projects/mozaic-ng/src/lib/tooltip/tooltip.ts","../../../../projects/mozaic-ng/src/lib/tooltip/tooltip.html","../../../../projects/mozaic-ng/src/lib/tooltip/tooltip.directive.ts","../../../../projects/mozaic-ng/src/lib/circular-progress-bar/circular-progress-bar.ts","../../../../projects/mozaic-ng/src/lib/circular-progress-bar/ciruclar-progress-bar.html","../../../../projects/mozaic-ng/src/lib/linear-progress-bar-percentage/linear-progress-bar-percentage.ts","../../../../projects/mozaic-ng/src/lib/linear-progress-bar-percentage/linear-progress-bar-percentage.html","../../../../projects/mozaic-ng/src/lib/callout/callout.ts","../../../../projects/mozaic-ng/src/lib/callout/callout.html","../../../../projects/mozaic-ng/src/lib/avatar/avatar.ts","../../../../projects/mozaic-ng/src/lib/avatar/avatar.html","../../../../projects/mozaic-ng/src/lib/phone-number-input/phone-number-input.ts","../../../../projects/mozaic-ng/src/lib/phone-number-input/phone-number-input.html","../../../../projects/mozaic-ng/src/lib/toaster/toaster.ts","../../../../projects/mozaic-ng/src/lib/toaster/toaster.html","../../../../projects/mozaic-ng/src/lib/toaster/config/toaster.config.ts","../../../../projects/mozaic-ng/src/lib/toaster/ref/toaster-ref.ts","../../../../projects/mozaic-ng/src/lib/toaster/container/toaster-container.ts","../../../../projects/mozaic-ng/src/lib/toaster/container/toaster-container.html","../../../../projects/mozaic-ng/src/lib/toaster/service/toaster.service.ts","../../../../projects/mozaic-ng/src/lib/sidebar/sidebar.ts","../../../../projects/mozaic-ng/src/lib/sidebar/sidebar.html","../../../../projects/mozaic-ng/src/lib/segmented-control/segmented-control.ts","../../../../projects/mozaic-ng/src/lib/segmented-control/segmented-control.html","../../../../projects/mozaic-ng/src/lib/accordion/components/header/accordion-header.ts","../../../../projects/mozaic-ng/src/lib/accordion/components/header/accordion-header.html","../../../../projects/mozaic-ng/src/lib/accordion/components/content/accordion-content.ts","../../../../projects/mozaic-ng/src/lib/accordion/components/content/accordion-content.html","../../../../projects/mozaic-ng/src/lib/accordion/components/panel/accordion-panel.ts","../../../../projects/mozaic-ng/src/lib/accordion/accordion.ts","../../../../projects/mozaic-ng/src/lib/accordion/accordion.html","../../../../projects/mozaic-ng/src/lib/action-bottom-bar/action-bottom-bar.ts","../../../../projects/mozaic-ng/src/lib/action-bottom-bar/action-bottom-bar.html","../../../../projects/mozaic-ng/src/lib/action-listbox/action-listbox.ts","../../../../projects/mozaic-ng/src/lib/action-listbox/action-listbox.html","../../../../projects/mozaic-ng/src/lib/action-listbox/ref/action-listbox-ref.ts","../../../../projects/mozaic-ng/src/lib/action-listbox/config/action-listbox.config.ts","../../../../projects/mozaic-ng/src/lib/action-listbox/container/action-listbox-container.ts","../../../../projects/mozaic-ng/src/lib/action-listbox/container/action-listbox-container.html","../../../../projects/mozaic-ng/src/lib/action-listbox/directive/action-listbox-trigger.directive.ts","../../../../projects/mozaic-ng/src/lib/carousel/carousel.ts","../../../../projects/mozaic-ng/src/lib/carousel/carousel.html","../../../../projects/mozaic-ng/src/lib/status-message/status-message.ts","../../../../projects/mozaic-ng/src/lib/status-message/status-message.html","../../../../projects/mozaic-ng/src/lib/kpi/kpi.ts","../../../../projects/mozaic-ng/src/lib/kpi/kpi.html","../../../../projects/mozaic-ng/src/lib/stepper-compact/stepper-compact.ts","../../../../projects/mozaic-ng/src/lib/stepper-compact/stepper-compact.html","../../../../projects/mozaic-ng/src/lib/star-rating/star-rating.ts","../../../../projects/mozaic-ng/src/lib/star-rating/star-rating.html","../../../../projects/mozaic-ng/src/lib/built-in-menu/built-in-menu.ts","../../../../projects/mozaic-ng/src/lib/built-in-menu/built-in-menu.html","../../../../projects/mozaic-ng/src/lib/check-list-menu/check-list-menu.ts","../../../../projects/mozaic-ng/src/lib/check-list-menu/check-list-menu.html","../../../../projects/mozaic-ng/src/lib/stepper-inline/stepper-inline.ts","../../../../projects/mozaic-ng/src/lib/stepper-inline/stepper-inline.html","../../../../projects/mozaic-ng/src/lib/stepper-stacked/stepper-stacked.ts","../../../../projects/mozaic-ng/src/lib/stepper-stacked/stepper-stacked.html","../../../../projects/mozaic-ng/src/lib/stepper-bottom-bar/stepper-bottom-bar.ts","../../../../projects/mozaic-ng/src/lib/stepper-bottom-bar/stepper-bottom-bar.html","../../../../projects/mozaic-ng/src/lib/page-header/page-header.ts","../../../../projects/mozaic-ng/src/lib/page-header/page-header.html","../../../../projects/mozaic-ng/src/lib/tiles/tile/tile.ts","../../../../projects/mozaic-ng/src/lib/tiles/tile/tile.html","../../../../projects/mozaic-ng/src/lib/tiles/selectable/selectable-tile.ts","../../../../projects/mozaic-ng/src/lib/tiles/selectable/selectable-tile.html","../../../../projects/mozaic-ng/src/lib/tiles/expandable/expandable-tile.ts","../../../../projects/mozaic-ng/src/lib/tiles/expandable/expandable-tile.html","../../../../projects/mozaic-ng/src/lib/drawer/config/drawer.config.ts","../../../../projects/mozaic-ng/src/lib/drawer/ref/drawer-ref.ts","../../../../projects/mozaic-ng/src/lib/drawer/container/drawer-container.ts","../../../../projects/mozaic-ng/src/lib/drawer/container/drawer-container.html","../../../../projects/mozaic-ng/src/lib/drawer/service/drawer.service.ts","../../../../projects/mozaic-ng/src/lib/drawer/directive/drawer-footer.directive.ts","../../../../projects/mozaic-ng/src/lib/drawer/drawer.ts","../../../../projects/mozaic-ng/src/lib/drawer/drawer.html","../../../../projects/mozaic-ng/src/lib/popover/popover.ts","../../../../projects/mozaic-ng/src/lib/popover/popover.html","../../../../projects/mozaic-ng/src/lib/popover/config/popover.config.ts","../../../../projects/mozaic-ng/src/lib/popover/ref/popover-ref.ts","../../../../projects/mozaic-ng/src/lib/popover/container/popover-container.ts","../../../../projects/mozaic-ng/src/lib/popover/directives/popover-trigger.directive.ts","../../../../projects/mozaic-ng/src/lib/popover/service/popover.service.ts","../../../../projects/mozaic-ng/src/lib/popover/directives/popover-footer.directive.ts","../../../../projects/mozaic-ng/src/lib/popover/index.ts","../../../../projects/mozaic-ng/src/lib/navigation-indicator/navigation-indicator.ts","../../../../projects/mozaic-ng/src/lib/navigation-indicator/navigation-indicator.html","../../../../projects/mozaic-ng/src/lib/grid/state/grid-state.ts","../../../../projects/mozaic-ng/src/lib/grid/features/sort.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/models/filter.model.ts","../../../../projects/mozaic-ng/src/lib/grid/features/filter.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/group.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/engine/grid-engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/column-resize.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/formula/formula-ast.ts","../../../../projects/mozaic-ng/src/lib/grid/features/formula/formula-shift.ts","../../../../projects/mozaic-ng/src/lib/grid/features/clipboard.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/history.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/models/formula.model.ts","../../../../projects/mozaic-ng/src/lib/grid/features/formula/formula-dag.ts","../../../../projects/mozaic-ng/src/lib/grid/features/formula/formula-evaluator.ts","../../../../projects/mozaic-ng/src/lib/grid/features/formula/formula-functions.default.ts","../../../../projects/mozaic-ng/src/lib/grid/features/formula/formula-parser.ts","../../../../projects/mozaic-ng/src/lib/grid/features/formula/formula-ref-mapper.ts","../../../../projects/mozaic-ng/src/lib/grid/features/formula/formula.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/inline-edit.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/row-selection.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/cell-selection.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/cell-validation.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/keyboard.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/column-reorder.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/horizontal-virtual-scroll.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/column-drag.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/expandable-row.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/state-persistence.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/export.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/tree.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/vertical-virtual-scroll.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/pagination.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/infinite-scroll.engine.ts","../../../../projects/mozaic-ng/src/lib/grid/features/formula/formula-ref-palette.ts","../../../../projects/mozaic-ng/src/lib/grid/features/formula/formula-ref-highlight.service.ts","../../../../projects/mozaic-ng/src/lib/grid/directives/grid-column-def.ts","../../../../projects/mozaic-ng/src/lib/grid/directives/grid-toolbar-def.ts","../../../../projects/mozaic-ng/src/lib/grid/directives/grid-empty-def.ts","../../../../projects/mozaic-ng/src/lib/grid/components/empty-state/grid-empty-state.ts","../../../../projects/mozaic-ng/src/lib/grid/components/empty-state/grid-empty-state.html","../../../../projects/mozaic-ng/src/lib/grid/components/filter-builder/moz-custom-filter-host.directive.ts","../../../../projects/mozaic-ng/src/lib/grid/components/filter-builder/grid-filter-builder.ts","../../../../projects/mozaic-ng/src/lib/grid/components/filter-builder/grid-filter-builder.html","../../../../projects/mozaic-ng/src/lib/grid/directives/grid-filter-overlay.directive.ts","../../../../projects/mozaic-ng/src/lib/grid/components/header/grid-header-cell.ts","../../../../projects/mozaic-ng/src/lib/grid/components/header/grid-header-cell.html","../../../../projects/mozaic-ng/src/lib/grid/utils/track-by.ts","../../../../projects/mozaic-ng/src/lib/grid/components/header/grid-header.ts","../../../../projects/mozaic-ng/src/lib/grid/components/header/grid-header.html","../../../../projects/mozaic-ng/src/lib/grid/features/formula/formula-tokenizer.ts","../../../../projects/mozaic-ng/src/lib/grid/features/formula/formula-suggestions.ts","../../../../projects/mozaic-ng/src/lib/grid/components/formula-editor/formula-editor.ts","../../../../projects/mozaic-ng/src/lib/grid/components/formula-editor/formula-editor.html","../../../../projects/mozaic-ng/src/lib/grid/components/cell/grid-cell.ts","../../../../projects/mozaic-ng/src/lib/grid/components/cell/grid-cell.html","../../../../projects/mozaic-ng/src/lib/grid/components/row/grid-row.ts","../../../../projects/mozaic-ng/src/lib/grid/components/row/grid-row.html","../../../../projects/mozaic-ng/src/lib/grid/components/group-row/grid-group-row.ts","../../../../projects/mozaic-ng/src/lib/grid/components/group-row/grid-group-row.html","../../../../projects/mozaic-ng/src/lib/grid/components/detail-row/grid-detail-row.ts","../../../../projects/mozaic-ng/src/lib/grid/components/detail-row/grid-detail-row.html","../../../../projects/mozaic-ng/src/lib/grid/components/skeleton-row/grid-skeleton-row.ts","../../../../projects/mozaic-ng/src/lib/grid/components/body/grid-body.ts","../../../../projects/mozaic-ng/src/lib/grid/components/body/grid-body.html","../../../../projects/mozaic-ng/src/lib/grid/components/footer/grid-footer.ts","../../../../projects/mozaic-ng/src/lib/grid/components/footer/grid-footer.html","../../../../projects/mozaic-ng/src/lib/grid/components/loading-indicator/grid-loading-indicator.ts","../../../../projects/mozaic-ng/src/lib/grid/components/selection-bar/grid-selection-bar.ts","../../../../projects/mozaic-ng/src/lib/grid/components/selection-bar/grid-selection-bar.html","../../../../projects/mozaic-ng/src/lib/grid/components/settings-drawer/grid-settings-drawer.ts","../../../../projects/mozaic-ng/src/lib/grid/components/settings-drawer/grid-settings-drawer.html","../../../../projects/mozaic-ng/src/lib/grid/components/group-drawer/grid-group-drawer.ts","../../../../projects/mozaic-ng/src/lib/grid/components/group-drawer/grid-group-drawer.html","../../../../projects/mozaic-ng/src/lib/grid/components/keyboard-shortcuts-drawer/grid-keyboard-shortcuts-drawer.ts","../../../../projects/mozaic-ng/src/lib/grid/components/keyboard-shortcuts-drawer/grid-keyboard-shortcuts-drawer.html","../../../../projects/mozaic-ng/src/lib/grid/components/formula-reference-drawer/grid-formula-reference-drawer.ts","../../../../projects/mozaic-ng/src/lib/grid/components/formula-reference-drawer/grid-formula-reference-drawer.html","../../../../projects/mozaic-ng/src/lib/grid/components/filter-drawer/grid-filter-drawer.ts","../../../../projects/mozaic-ng/src/lib/grid/components/filter-drawer/grid-filter-drawer.html","../../../../projects/mozaic-ng/src/lib/grid/grid.ts","../../../../projects/mozaic-ng/src/lib/grid/models/grid-options.model.ts","../../../../projects/mozaic-ng/src/lib/grid/components/column-visibility-panel/grid-column-visibility-panel.ts","../../../../projects/mozaic-ng/src/lib/grid/components/column-visibility-panel/grid-column-visibility-panel.html","../../../../projects/mozaic-ng/src/lib/grid/components/header-menu/grid-header-menu.ts","../../../../projects/mozaic-ng/src/lib/grid/components/header-menu/grid-header-menu.html","../../../../projects/mozaic-ng/src/lib/utils/generate-random-int.ts","../../../../projects/mozaic-ng/src/lib/combobox/combobox.model.ts","../../../../projects/mozaic-ng/src/lib/combobox/combobox.component.ts","../../../../projects/mozaic-ng/src/lib/combobox/combobox.component.html","../../../../projects/mozaic-ng/src/lib/combobox/combobox.harness.ts","../../../../projects/mozaic-ng/src/lib/tree/services/tree-state.ts","../../../../projects/mozaic-ng/src/lib/tree/services/tree-selection.ts","../../../../projects/mozaic-ng/src/lib/tree/services/tree-keyboard.ts","../../../../projects/mozaic-ng/src/lib/tree/components/tree-node/tree-node.ts","../../../../projects/mozaic-ng/src/lib/tree/components/tree-node/tree-node.html","../../../../projects/mozaic-ng/src/lib/tree/tree.ts","../../../../projects/mozaic-ng/src/lib/tree/tree.html","../../../../projects/mozaic-ng/src/mozaic-ds-angular.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { MozBreadcrumbAppearance, MozBreadcrumbLink } from './model/breadcrumb.model';\n\n@Component({\n  selector: 'moz-breadcrumb',\n  templateUrl: './breadcrumb.html',\n  styleUrls: ['./breadcrumb.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [RouterLink],\n})\nexport class MozBreadcrumbComponent {\n  readonly appearance = input<MozBreadcrumbAppearance>('standard');\n  readonly links = input<MozBreadcrumbLink[]>([]);\n\n  readonly classObject = computed(() => {\n    return {\n      'breadcrumb': true,\n      [`breadcrumb--${this.appearance()}`]: this.appearance(),\n    };\n  });\n\n  getLinkClass(): string {\n    const linkClass = this.appearance() !== 'standard' ? ` link--${this.appearance()}` : '';\n    return `link link--inline${linkClass}`;\n  }\n\n  getCurrentLinkClass(): string {\n    const linkClass = this.appearance() !== 'standard' ? ` link--${this.appearance()}` : '';\n    return `link breadcrumb__current${linkClass}`;\n  }\n}\n","<nav [class]=\"classObject()\" aria-label=\"Breadcrumb\">\n  <ol class=\"breadcrumb__container\">\n    @for (link of links(); track $index; let isLast = $last) {\n    <li class=\"breadcrumb__item\">\n      @if (isLast) { @if (link.router) {\n      <a [routerLink]=\"link.href\" [class]=\"getCurrentLinkClass()\" aria-current=\"page\">\n        <span class=\"link__label\">{{ link.label }}</span>\n      </a>\n      } @else {\n      <a [href]=\"link.href\" [class]=\"getCurrentLinkClass()\" aria-current=\"page\">\n        <span class=\"link__label\">{{ link.label }}</span>\n      </a>\n      } } @else { @if (link.router) {\n      <a [routerLink]=\"link.href\" [class]=\"getLinkClass()\">\n        <span class=\"link__label\">{{ link.label }}</span>\n      </a>\n      } @else {\n      <a [href]=\"link.href\" [class]=\"getLinkClass()\">\n        <span class=\"link__label\">{{ link.label }}</span>\n      </a>\n      } }\n    </li>\n    }\n  </ol>\n</nav>\n","import {\n  Component,\n  TemplateRef,\n  computed,\n  contentChild,\n  input,\n  ChangeDetectionStrategy,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n  MozButtonAppearance,\n  MozButtonSize,\n  MozButtonIconPosition,\n  MozButtonType,\n} from './model/button.model';\n\n@Component({\n  selector: 'button[moz-button]',\n  templateUrl: './button.html',\n  styleUrls: ['./button.scss'],\n  imports: [NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    '[class]': 'classes()',\n    '[attr.disabled]': 'disabled() ? \"\" : null',\n    '[attr.type]': 'type()',\n  },\n  encapsulation: ViewEncapsulation.None,\n})\nexport class MozButtonComponent {\n  readonly appearance = input<MozButtonAppearance>('standard');\n  readonly size = input<MozButtonSize>();\n  readonly disabled = input<boolean>();\n  readonly ghost = input<boolean>();\n  readonly outlined = input<boolean>();\n  readonly iconPosition = input<MozButtonIconPosition>(null);\n  readonly type = input<MozButtonType>('button');\n  readonly isLoading = input<boolean>();\n  readonly iconTpl = contentChild<TemplateRef<void>>('icon', { descendants: false });\n\n  readonly classes = computed(() => {\n    const classes = ['button'];\n\n    if (this.appearance()) {\n      classes.push(`button--${this.appearance()}`);\n    }\n    if (this.size()) {\n      classes.push(`button--${this.size()}`);\n    }\n    if (this.ghost()) {\n      classes.push('button--ghost');\n    }\n    if (this.outlined()) {\n      classes.push('button--outlined');\n    }\n    if (this.iconPosition() === 'only') {\n      classes.push('button--icon-only');\n    }\n    if (this.isLoading()) {\n      classes.push('button--loading');\n    }\n\n    return classes.join(' ');\n  });\n}\n","@if (isLoading()) {\n<div class=\"loader loader--s button__loader\">\n  <span class=\"loader__spinner\">\n    <svg\n      class=\"loader__icon\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox=\"0 0 24 24\"\n      width=\"24\"\n      height=\"24\"\n      aria-hidden=\"true\"\n    >\n      <circle class=\"loader__path\" cx=\"50%\" cy=\"50%\" r=\"6\"></circle>\n    </svg>\n  </span>\n</div>\n} @if ((iconPosition() === 'left' || iconPosition() === 'only') && !isLoading()) {\n<ng-container [ngTemplateOutlet]=\"iconTemplate\"></ng-container>\n} @if (iconPosition() !== 'only') {\n<span class=\"button__label\">\n  <ng-content></ng-content>\n</span>\n} @if (iconPosition() === 'right' && !isLoading()) {\n<ng-container [ngTemplateOutlet]=\"iconTemplate\"></ng-container>\n}\n<ng-template #iconTemplate>\n  <ng-content select=\"[icon]\"></ng-content>\n</ng-template>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  forwardRef,\n  input,\n  signal,\n} from '@angular/core';\nimport {\n  ControlValueAccessor,\n  FormsModule,\n  NG_VALUE_ACCESSOR,\n  ReactiveFormsModule,\n} from '@angular/forms';\n\n@Component({\n  selector: 'moz-checkbox',\n  imports: [FormsModule, ReactiveFormsModule],\n  templateUrl: './checkbox.html',\n  styleUrls: ['./checkbox.scss'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozCheckboxComponent),\n      multi: true,\n    },\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozCheckboxComponent implements ControlValueAccessor {\n  readonly id = input.required<string>();\n  readonly name = input<string | undefined>();\n  readonly label = input<string | undefined>();\n  readonly indeterminate = input(false);\n  readonly isInvalid = input(false);\n  readonly disabled = input(false);\n  readonly indented = input(false);\n\n  public _value = signal(false);\n\n  onChange: (_: boolean) => void = () => void 0;\n  onTouched: () => void = () => void 0;\n\n  readonly classObject = computed(() => {\n    return {\n      'is-invalid': this.isInvalid(),\n    };\n  });\n\n  readonly classes = computed(() => {\n    return {\n      'checkbox': true,\n      'checkbox--indented': this.indented(),\n    };\n  });\n\n  writeValue(value: boolean): void {\n    this._value.set(value);\n  }\n\n  registerOnChange(fn: (_: boolean) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  onInputChange(event: Event): void {\n    const checked = (event.target as HTMLInputElement).checked;\n    this._value.set(checked);\n    this.onChange(checked);\n    this.onTouched();\n  }\n}\n","<div [class]=\"classes()\">\n  <input\n    class=\"checkbox__input\"\n    type=\"checkbox\"\n    [id]=\"id()\"\n    [name]=\"name()\"\n    [checked]=\"_value()\"\n    [class]=\"classObject()\"\n    [attr.aria-invalid]=\"isInvalid()\"\n    [indeterminate]=\"indeterminate()\"\n    [disabled]=\"disabled()\"\n    (change)=\"onInputChange($event)\"\n    [attr.aria-label]=\"label()\"\n    [attr.aria-disabled]=\"disabled()\"\n    [attr.aria-checked]=\"_value()\"\n  />\n  @if (label()) {\n  <label class=\"checkbox__label\" [for]=\"id()\"> {{ label() }} </label>\n  }\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  forwardRef,\n  input,\n  signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n  selector: 'moz-checkbox-group',\n  templateUrl: './checkbox-group.html',\n  styleUrls: ['./checkbox-group.scss'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozCheckboxGroupComponent),\n      multi: true,\n    },\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozCheckboxGroupComponent implements ControlValueAccessor {\n  readonly name = input.required<string>();\n  readonly legend = input<string>();\n  readonly necessityIndicator = input<string>();\n  readonly helpText = input<string>();\n  readonly helpId = input<string>();\n  readonly options = input<\n    {\n      id: string;\n      label: string;\n      value: string;\n      disabled?: boolean;\n      isInvalid?: boolean;\n    }[]\n  >();\n  readonly inline = input<boolean>(false);\n\n  readonly _value = signal<string[]>([]);\n  readonly containerClass = computed(() => {\n    return {\n      'field__content': true,\n      'field__content--inline': this.inline(),\n    };\n  });\n\n  onChange: (_: string[]) => void = () => void 0;\n  onTouched: () => void = () => void 0;\n\n  writeValue(value: string[]): void {\n    this._value.set(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  toggleSelection(event: Event, val: string) {\n    const isChecked = (event.target as HTMLInputElement).checked;\n    const values = [...this._value()];\n\n    if (isChecked && !values.includes(val)) {\n      values.push(val);\n    } else if (!isChecked && values.includes(val)) {\n      const index = values.indexOf(val);\n      values.splice(index, 1);\n    }\n\n    this._value.set(values);\n    this.onChange(values);\n    this.onTouched();\n  }\n\n  isChecked(value: string): boolean {\n    return this._value().includes(value);\n  }\n\n  getCheckboxInputClass(option: { isInvalid?: boolean }): { [key: string]: boolean } {\n    return {\n      'checkbox__input': true,\n      'is-invalid': !!option.isInvalid,\n    };\n  }\n}\n","<fieldset class=\"field field--group\">\n  <legend class=\"field__legend\">\n    {{ legend() }}\n    @if (necessityIndicator()) {\n    <span class=\"field__requirement\">{{ necessityIndicator() }}</span>\n    }\n  </legend>\n  @if (helpText()) {\n  <span [id]=\"helpId()\" class=\"field__help\">{{ helpText() }}</span>\n  }\n\n  <div [class]=\"containerClass()\">\n    @for (option of options(); track $index) {\n    <div class=\"field__item checkbox\">\n      <input\n        type=\"checkbox\"\n        [class]=\"getCheckboxInputClass(option)\"\n        [id]=\"option.id\"\n        [name]=\"name()\"\n        [checked]=\"isChecked(option.value)\"\n        [disabled]=\"option.disabled ?? false\"\n        (change)=\"toggleSelection($event, option.value)\"\n      />\n      <label [for]=\"option.id\" class=\"checkbox__label\">{{ option.label }}</label>\n    </div>\n    }\n  </div>\n</fieldset>\n","import { Component, input, ChangeDetectionStrategy, computed } from '@angular/core';\nimport { MozDividerOrientation, MozDividerAppearance, MozDividerSize } from './model/divider.model';\n\n/**\n * A divider is a visual element used to separate content or sections within an interface. It helps improve readability and organization by creating clear distinctions between groups of information. Dividers can be thin lines, thick separators, or even styled with spacing variations, adapting to different layouts. They are commonly used in menus, lists, forms, and content blocks to create a structured visual hierarchy.\n */\n@Component({\n  selector: 'moz-divider',\n  templateUrl: './divider.html',\n  styleUrls: ['./divider.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozDividerComponent {\n  /**\n   * Determines the orientation of the divider.\n   */\n  readonly orientation = input<MozDividerOrientation>('horizontal');\n  /**\n   * Determines the appearance of the divider.\n   */\n  readonly appearance = input<MozDividerAppearance>('primary');\n  /**\n   * Determines the size of the divider.\n   */\n  readonly size = input<MozDividerSize>('s');\n\n  readonly classes = computed(() => {\n    return {\n      [`divider-${this.orientation()}`]: this.orientation(),\n      [`divider-horizontal--${this.appearance()}`]:\n        this.appearance() && this.appearance() !== 'primary',\n      [`divider-horizontal--${this.size()}`]: this.size() && this.size() !== 's',\n    };\n  });\n}\n","<div class=\"divider\">\n  <div [class]=\"classes()\" aria-hidden=\"true\"></div>\n  <ng-content></ng-content>\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  contentChild,\n  input,\n  TemplateRef,\n} from '@angular/core';\n\n@Component({\n  selector: 'moz-field',\n  templateUrl: './field.html',\n  styleUrls: ['./field.scss'],\n  imports: [NgTemplateOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozFieldComponent {\n  readonly id = input<string>();\n  readonly labelTemplate = contentChild<TemplateRef<unknown>>('label');\n  readonly requirementTemplate = contentChild<TemplateRef<unknown>>('requirementText');\n  readonly helpTemplate = contentChild<TemplateRef<unknown>>('helpText');\n  readonly helpId = input<string | undefined>();\n  readonly isValid = input<boolean>(false);\n  readonly isInvalid = input<boolean>(false);\n  readonly messageId = input<string | undefined>();\n  readonly message = input<string | undefined>();\n\n  readonly classes = computed(() => {\n    return {\n      'mc-field__validation-message': true,\n      'is-valid': this.isValid(),\n      'is-invalid': this.isInvalid(),\n    };\n  });\n}\n","<div class=\"field\">\n  <label class=\"field__label\" [attr.for]=\"id()\">\n    <ng-container [ngTemplateOutlet]=\"labelTemplate()!\"></ng-container>\n    @if (requirementTemplate()) {\n    <span class=\"field__requirement\">\n      (<ng-container [ngTemplateOutlet]=\"requirementTemplate()!\"></ng-container>)\n    </span>\n    }\n  </label>\n\n  @if (helpTemplate()) {\n  <span class=\"field__help\" [id]=\"helpId()\">\n    <ng-container [ngTemplateOutlet]=\"helpTemplate()!\"></ng-container>\n  </span>\n  }\n\n  <!-- <ng-content select=\"moz-field-content\"></ng-content> -->\n\n  <div class=\"field__content\">\n    <ng-content></ng-content>\n  </div>\n\n  @if ((isValid() || isInvalid()) && message()) {\n  <span [id]=\"messageId()\" [class]=\"classes()\">\n    {{ message() }}\n  </span>\n  }\n</div>\n","import { Component, ChangeDetectionStrategy, input } from '@angular/core';\n\n@Component({\n  selector: 'moz-field-group',\n  templateUrl: './field-group.html',\n  styleUrl: './field-group.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozFieldGroupComponent {\n  readonly id = input.required<string>();\n  readonly legend = input.required<string>();\n  readonly requirementText = input<string | undefined>();\n  readonly helpText = input<string | undefined>();\n  readonly isValid = input(false);\n  readonly isInvalid = input(false);\n  readonly message = input<string | undefined>();\n}\n","<fieldset class=\"field--group\">\n  <legend class=\"field__legend\" [attr.for]=\"id()\">\n    {{ legend() }} @if (requirementText()) {\n    <span class=\"field__requirement\">({{ requirementText() }})</span>\n    }\n  </legend>\n\n  @if (helpText()) {\n  <span class=\"field__help\">{{ helpText() }}</span>\n  }\n\n  <div class=\"field__content\">\n    <ng-content></ng-content>\n  </div>\n\n  @if ((isValid() || isInvalid()) && message()) {\n  <span\n    class=\"field__validation-message\"\n    [class.is-valid]=\"isValid()\"\n    [class.is-invalid]=\"isInvalid()\"\n  >\n    {{ message() }}\n  </span>\n  }\n</fieldset>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport {\n  MozIconButtonAppearance,\n  MozIconButtonSize,\n  MozIconButtonType,\n} from './model/icon-button.model';\n\n@Component({\n  selector: 'moz-icon-button',\n  templateUrl: './icon-button.html',\n  styleUrls: ['./icon-button.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozIconButtonComponent {\n  readonly id = input.required<string>();\n  readonly appearance = input<MozIconButtonAppearance>('standard');\n  readonly size = input<MozIconButtonSize>('m');\n  readonly disabled = input<boolean>();\n  readonly ghost = input<boolean>();\n  readonly outlined = input<boolean>();\n  readonly type = input<MozIconButtonType>('button');\n  readonly ariaLabel = input<string>();\n  readonly activated = output<MouseEvent>();\n\n  readonly classes = computed(() => {\n    return {\n      'mc-button': true,\n      'mc-button--icon-button': true,\n      [`mc-button--${this.appearance()}`]: this.appearance(),\n      [`mc-button--${this.size()}`]: this.size(),\n      'mc-button--ghost': this.ghost() ?? false,\n      'mc-button--outlined': this.outlined() ?? false,\n    };\n  });\n\n  onActivated(event: MouseEvent): void {\n    event.stopPropagation();\n    this.activated.emit(event);\n  }\n}\n","<button\n  (click)=\"onActivated($event)\"\n  [disabled]=\"disabled()\"\n  [attr.type]=\"type()\"\n  [class]=\"classes()\"\n  [attr.aria-label]=\"ariaLabel()\"\n  [id]=\"id()\"\n>\n  <span class=\"mc-button__icon\">\n    <ng-content select=\"[icon]\"></ng-content>\n  </span>\n</button>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { MozLinearProgressBarBufferSize } from './model/linear-progress-bar-buffer.model';\n\n@Component({\n  selector: 'moz-linear-progress-bar-buffer',\n  templateUrl: './linear-progress-bar-buffer.html',\n  styleUrls: ['./linear-progress-bar-buffer.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozLinearProgressBarBufferComponent {\n  readonly valuePercent = input<number>(0);\n  readonly size = input<MozLinearProgressBarBufferSize>('l');\n  readonly ariaLabel = input<string>('Progress bar');\n\n  readonly classes = computed(() => {\n    const classes = ['mc-linear-progressbar-buffer'];\n    if (this.size() === 's') classes.push('mc-linear-progressbar-buffer--s');\n    if (this.size() === 'm') classes.push('mc-linear-progressbar-buffer--m');\n    if (this.size() === 'l') classes.push('mc-linear-progressbar-buffer--l');\n    return classes.join(' ');\n  });\n}\n","<div [class]=\"classes()\">\n    <div\n        class=\"mc-linear-progressbar-buffer__indicator\"\n        role=\"progressbar\"\n        [style.--progress-value]=\"valuePercent()\"\n        [attr.aria-label]=\"ariaLabel()\"\n        [attr.aria-valuenow]=\"valuePercent()\"\n        aria-valuemin=\"0\"\n        aria-valuemax=\"100\"\n    ></div>\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport {\n  CheckCircle32,\n  CrossCircleFilled20,\n  Uploading32,\n  WarningCircle32,\n  Refresh20,\n  Refresh32,\n  Eye20,\n} from '@mozaic-ds/icons-angular';\nimport { MozDividerComponent } from '../../divider/divider';\nimport { MozIconButtonComponent } from '../../icon-button/icon-button';\nimport { MozLinearProgressBarBufferComponent } from '../../linear-progress-bar-buffer/linear-progress-bar-buffer';\nimport { MozButtonComponent } from '../../button/button';\nimport { MozFileUploaderItemFormat } from './model/file-uploader-item.model';\n\n@Component({\n  selector: 'moz-file-uploader-item',\n  templateUrl: './file-uploader-item.html',\n  styleUrls: ['./file-uploader-item.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    MozLinearProgressBarBufferComponent,\n    MozButtonComponent,\n    CheckCircle32,\n    CrossCircleFilled20,\n    Refresh32,\n    MozDividerComponent,\n    MozIconButtonComponent,\n    Refresh20,\n    Uploading32,\n    Eye20,\n    WarningCircle32,\n  ],\n})\nexport class MozFileUploaderItemComponent {\n  readonly format = input<MozFileUploaderItemFormat>('inline');\n  readonly invalid = input<boolean>(false);\n  readonly uploading = input<boolean>(false);\n  readonly errorMessage = input<string>();\n  readonly hasPreview = input<boolean>(false);\n  readonly file = input.required<File>();\n  readonly fileInformation = input<(file: File) => string>();\n  readonly retryButtonLabel = input<string>('Retry');\n  readonly deleteButtonLabel = input<string>('Delete');\n  readonly previewButtonLabel = input<string>('Preview');\n\n  readonly delete = output<File>();\n  readonly retry = output<File>();\n  readonly preview = output<File>();\n\n  readonly fileName = computed(() => this.file().name);\n\n  readonly fileInfo = computed(() => {\n    const customInfo = this.fileInformation();\n    if (customInfo) {\n      return customInfo(this.file());\n    }\n\n    // Default information\n    const file = this.file();\n    const size = this.formatFileSize(file.size);\n    return `${size} • ${file.type || 'Unknown type'}`;\n  });\n\n  readonly isInline = computed(() => this.format() === 'inline');\n\n  readonly stateModifier = computed(() => {\n    if (this.invalid()) return 'error';\n    if (this.uploading()) return 'loading';\n    return 'default';\n  });\n\n  readonly modifierClass = computed(() => {\n    const state = this.stateModifier();\n    return state !== 'default' ? `mc-file-uploader-item--${state}` : '';\n  });\n\n  readonly isUploading = computed(() => this.stateModifier() === 'loading');\n\n  readonly stateIcon = computed(() => {\n    const state = this.stateModifier();\n    const iconMap = {\n      default: CheckCircle32,\n      loading: Uploading32,\n      error: WarningCircle32,\n    };\n    return iconMap[state];\n  });\n\n  readonly showInlineActions = computed(() => this.isInline() && !this.isUploading());\n\n  readonly showStackedActions = computed(() => !this.isInline() && !this.isUploading());\n\n  onDelete(): void {\n    this.delete.emit(this.file());\n  }\n\n  onRetry(): void {\n    this.retry.emit(this.file());\n  }\n\n  onPreview(): void {\n    this.preview.emit(this.file());\n  }\n\n  private formatFileSize(bytes: number): string {\n    if (bytes === 0) return '0 Bytes';\n\n    const k = 1024;\n    const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n    return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\n  }\n}\n","<div class=\"mc-file-uploader-item\" [class]=\"modifierClass()\">\n  <div class=\"mc-file-uploader-item__container mc-file-uploader-item__container--{{ format() }}\">\n    <div\n      class=\"mc-file-uploader-item__meta-row\"\n      [class.mc-file-uploader-item__meta-row--with-info]=\"true\"\n    >\n      @if (isUploading() && !invalid()) {\n      <Uploading32 class=\"mc-file-uploader-item__status-icon\" />\n      } @else if(invalid()) {\n      <WarningCircle32 class=\"mc-file-uploader-item__status-icon\" />\n      } @else {\n      <CheckCircle32 class=\"mc-file-uploader-item__status-icon\" />\n      }\n      <div class=\"mc-file-uploader-item__info-content\">\n        <span class=\"mc-file-uploader-item__label\">{{ fileName() }}</span>\n        <span class=\"mc-file-uploader-item__details\">{{ fileInfo() }}</span>\n      </div>\n    </div>\n\n    @if (showInlineActions()) {\n    <div class=\"mc-file-uploader-item__inline-actions\">\n      @if (invalid()) {\n      <button\n        moz-button\n        [ghost]=\"true\"\n        size=\"s\"\n        class=\"mc-file-uploader-item__action\"\n        (click)=\"onRetry()\"\n      >\n        <Refresh32 icon />\n        <span class=\"mc-button__label\">{{ retryButtonLabel() }}</span>\n      </button>\n      } @if (!invalid() && hasPreview()) {\n      <button\n        moz-button\n        [ghost]=\"true\"\n        size=\"s\"\n        class=\"mc-file-uploader-item__action\"\n        (click)=\"onPreview()\"\n      >\n        <span class=\"mc-button__label\">{{ previewButtonLabel() }}</span>\n      </button>\n      }\n    </div>\n    <div class=\"mc-file-uploader-item__delete-button-container\">\n      <moz-icon-button\n        [id]=\"'file-uploader-item-delete-button'\"\n        (activated)=\"onDelete()\"\n        [size]=\"'s'\"\n        [ghost]=\"true\"\n      >\n        <CrossCircleFilled20 icon />\n      </moz-icon-button>\n    </div>\n    } @if (showStackedActions()) {\n    <moz-divider orientation=\"horizontal\"></moz-divider>\n    <div class=\"mc-file-uploader-item__actions-container\">\n      @if (!invalid() && hasPreview()) {\n      <button\n        moz-button\n        [ghost]=\"true\"\n        size=\"s\"\n        class=\"mc-file-uploader-item__action\"\n        (click)=\"onPreview()\"\n        [iconPosition]=\"'left'\"\n      >\n        <Eye20 icon />\n        <span class=\"mc-button__label\">{{ previewButtonLabel() }}</span>\n      </button>\n      } @if (invalid()) {\n      <button\n        moz-button\n        [ghost]=\"true\"\n        size=\"s\"\n        class=\"mc-file-uploader-item__action\"\n        (click)=\"onRetry()\"\n        [iconPosition]=\"'left'\"\n      >\n        <Refresh20 icon />\n        <span class=\"mc-button__label\">{{ retryButtonLabel() }}</span>\n      </button>\n      }\n\n      <button\n        moz-button\n        [ghost]=\"true\"\n        size=\"s\"\n        class=\"mc-file-uploader-item__action\"\n        (click)=\"onDelete()\"\n        [iconPosition]=\"'left'\"\n      >\n        <CrossCircleFilled20 icon />\n        <span class=\"mc-button__label\">{{ deleteButtonLabel() }}</span>\n      </button>\n    </div>\n    } @if (isUploading() && !invalid()) {\n    <moz-linear-progress-bar-buffer size=\"l\" [valuePercent]=\"75\" />\n    }\n  </div>\n\n  @if (errorMessage() && invalid()) {\n  <span class=\"mc-file-uploader-item__error-message\">{{ errorMessage() }}</span>\n  }\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ContentChild,\n  computed,\n  input,\n  OnInit,\n  signal,\n  output,\n  viewChild,\n  ElementRef,\n} from '@angular/core';\nimport { Upload24 } from '@mozaic-ds/icons-angular';\nimport { MozFileUploaderItemComponent } from './item/file-uploader-item';\nexport type MozFileUploaderFormat = 'inline' | 'stacked';\n\n@Component({\n  selector: 'moz-file-uploader',\n  templateUrl: './file-uploader.html',\n  styleUrls: ['./file-uploader.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [MozFileUploaderItemComponent, Upload24],\n})\nexport class MozFileUploaderComponent implements OnInit {\n  // File input props\n  readonly id = input.required<string>();\n  readonly label = input<string>();\n  readonly helpText = input<string>();\n  readonly helpId = input<string>();\n  readonly necessityIndicator = input<string>('');\n  readonly hasDragDrop = input<boolean>(true);\n  readonly showFilesList = input<boolean>(true);\n  readonly disabled = input<boolean>(false);\n  readonly multipleFiles = input<boolean>(true);\n  readonly accept = input<string>();\n  readonly title = input<string>('Drag & drop');\n  readonly subtitle = input<string>('or');\n  readonly uploadButtonLabel = input<string>('Upload file(s)');\n\n  // File item props\n  readonly format = input<MozFileUploaderFormat>('inline');\n  readonly errorMessage = input<string>();\n  readonly invalid = input<boolean>(false);\n  readonly uploading = input<boolean>(false);\n  readonly hasPreview = input<boolean>(false);\n  readonly retryButtonLabel = input<string>('Retry');\n  readonly deleteButtonLabel = input<string>('Delete');\n  readonly previewButtonLabel = input<string>('Preview');\n  readonly information = input<string>();\n  readonly fileInformation = input<(file: File) => string>();\n\n  // Outputs for file operations\n  readonly retryFile = output<File>();\n  readonly previewFile = output<File>();\n\n  // Internal state\n  readonly files = signal<File[]>([]);\n  readonly isDragged = signal<boolean>(false);\n\n  // Initial files for stories/testing\n  readonly initialFiles = input<File[]>([]);\n\n  readonly classes = computed(() => ({\n    'file-uploader--draggable': this.hasDragDrop(),\n  }));\n\n  readonly inputClasses = computed(() => ({\n    'file-uploader__input--disabled': this.disabled(),\n    'file-uploader__input--dragged': this.isDragged(),\n  }));\n\n  readonly iconTpl = ContentChild('icon', { descendants: false });\n  readonly fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n  ngOnInit(): void {\n    const initial = this.initialFiles();\n    if (initial.length > 0) {\n      this.files.set(initial);\n    }\n  }\n\n  removeFile(index: number): void {\n    const currentFiles = this.files();\n    const newFiles = currentFiles.filter((_, i) => i !== index);\n    this.files.set(newFiles);\n  }\n\n  onDeleteFile(file: File): void {\n    const currentFiles = this.files();\n    const newFiles = currentFiles.filter((f) => f.name !== file.name);\n    this.files.set(newFiles);\n  }\n\n  onRetryFile(file: File): void {\n    this.retryFile.emit(file);\n  }\n\n  onPreviewFile(file: File): void {\n    this.previewFile.emit(file);\n  }\n\n  onFileSelect(event: Event): void {\n    const target = event.target as HTMLInputElement;\n    if (target.files) {\n      const newFiles = Array.from(target.files);\n\n      if (this.multipleFiles()) {\n        // Mode multiple : ajoute les nouveaux fichiers aux existants\n        const currentFiles = this.files();\n        this.files.set([...currentFiles, ...newFiles]);\n      } else {\n        // Mode simple : remplace tous les fichiers\n        this.files.set(newFiles);\n      }\n    }\n  }\n\n  onDrop(event: DragEvent): void {\n    event.preventDefault();\n    this.isDragged.set(false);\n\n    if (event.dataTransfer?.files) {\n      const newFiles = Array.from(event.dataTransfer.files);\n\n      if (this.multipleFiles()) {\n        // Mode multiple : ajoute les nouveaux fichiers aux existants\n        const currentFiles = this.files();\n        this.files.set([...currentFiles, ...newFiles]);\n      } else {\n        // Mode simple : remplace tous les fichiers\n        this.files.set(newFiles);\n      }\n    }\n  }\n\n  openFileDialog(): void {\n    if (this.disabled()) return;\n\n    const input = this.fileInput()?.nativeElement;\n    input?.click();\n  }\n\n  onDragOver(event: DragEvent): void {\n    event.preventDefault();\n    this.isDragged.set(true);\n  }\n\n  onDragLeave(event: DragEvent): void {\n    event.preventDefault();\n    this.isDragged.set(false);\n  }\n}\n","<div class=\"file-uploader\" [class]=\"classes()\">\n  <div class=\"file-uploader__container\">\n    <div class=\"field\">\n      <label class=\"field__label\" [attr.for]=\"id()\">\n        {{ label() }}\n        @if (necessityIndicator()) {\n        <span class=\"field__requirement\">\n          {{ necessityIndicator() }}\n        </span>\n        }\n      </label>\n      @if (helpText()) {\n      <span [id]=\"helpId()\" class=\"field__help\">\n        {{ helpText() }}\n      </span>\n      }\n      <div class=\"field__content\">\n        <input\n          #fileInput\n          [id]=\"id()\"\n          aria-label=\"file input\"\n          type=\"file\"\n          class=\"file-uploader__hidden-input\"\n          [disabled]=\"disabled()\"\n          (change)=\"onFileSelect($event)\"\n          [multiple]=\"multipleFiles()\"\n          [accept]=\"accept()\"\n        />\n\n        <div\n          class=\"file-uploader__input\"\n          [class]=\"inputClasses()\"\n          (click)=\"openFileDialog()\"\n          (dragover)=\"onDragOver($event)\"\n          (dragleave)=\"onDragLeave($event)\"\n          (drop)=\"onDrop($event)\"\n        >\n          @if (hasDragDrop()) {\n          <span class=\"file-uploader__input-title\">{{ title() }}</span>\n          <span class=\"file-uploader__input-subtitle\">{{ subtitle() }}</span>\n          }\n\n          <div class=\"button button--outlined file-uploader__button\">\n            <Upload24 />\n            <span class=\"button__label\">{{ uploadButtonLabel() }}</span>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  @if (showFilesList() && files().length > 0) {\n  <div class=\"file-uploader__files-list\">\n    @for (file of files(); track file; let i = $index) {\n    <moz-file-uploader-item\n      [format]=\"format()\"\n      [invalid]=\"invalid()\"\n      [uploading]=\"uploading()\"\n      [errorMessage]=\"errorMessage()\"\n      [hasPreview]=\"hasPreview()\"\n      [file]=\"file\"\n      [fileInformation]=\"fileInformation()\"\n      [retryButtonLabel]=\"retryButtonLabel()\"\n      [deleteButtonLabel]=\"deleteButtonLabel()\"\n      [previewButtonLabel]=\"previewButtonLabel()\"\n      (delete)=\"onDeleteFile($event)\"\n      (retry)=\"onRetryFile($event)\"\n      (preview)=\"onPreviewFile($event)\"\n    />\n    }\n  </div>\n  }\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { RouterLink, RouterLinkActive, RouterLinkWithHref } from '@angular/router';\nimport { MozLinkAppearance, MozLinkSize, MozLinkIconPosition } from './model/link.model';\n\n@Component({\n  selector: 'moz-link',\n  imports: [NgTemplateOutlet, RouterLink],\n  templateUrl: './link.html',\n  styleUrls: ['./link.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozLinkComponent {\n  readonly href = input<string | undefined>();\n  readonly target = input<string | undefined>();\n  readonly appearance = input<MozLinkAppearance>('standard');\n  readonly size = input<MozLinkSize>('m');\n  readonly inline = input<boolean>(false);\n  readonly router = input<boolean>(false);\n  readonly iconPosition = input<MozLinkIconPosition>('left');\n  readonly current = input<boolean>(false);\n  readonly ariaCurrent = input<string | null>(null);\n\n  private readonly routerLinkActive = inject(RouterLinkActive, {\n    optional: true,\n  });\n\n  public readonly routerLink = inject(RouterLinkWithHref, { optional: true });\n\n  readonly classes = computed(() => {\n    return {\n      'link': true,\n      [`link--${this.appearance()}`]: this.appearance(),\n      [`link--${this.size()}`]: this.size(),\n      'link--inline': this.inline() && !this.current(),\n      'link--stand-alone': !this.inline(),\n      'link--active': this.routerLinkActive?.isActive ?? false,\n      'link--breadcrumb__current': this.current(),\n    };\n  });\n}\n","@if (router()) {\n<a\n  [routerLink]=\"href()\"\n  [attr.href]=\"href()\"\n  [class]=\"classes()\"\n  [attr.target]=\"target()\"\n  [attr.aria-current]=\"ariaCurrent()\"\n  (click)=\"$event.preventDefault()\"\n>\n  <ng-container [ngTemplateOutlet]=\"linkContent\"></ng-container>\n</a>\n} @else {\n<a\n  [attr.href]=\"href()\"\n  [class]=\"classes()\"\n  [attr.target]=\"target()\"\n  [attr.aria-current]=\"ariaCurrent()\"\n>\n  <ng-container [ngTemplateOutlet]=\"linkContent\"></ng-container>\n</a>\n}\n\n<ng-template #linkContent>\n  @if(iconPosition() === 'left'){\n  <span class=\"link__icon\" aria-hidden=\"true\">\n    <ng-container [ngTemplateOutlet]=\"iconTemplate\"></ng-container>\n  </span>\n  }\n\n  <span class=\"link__label\">\n    <ng-container [ngTemplateOutlet]=\"labelTemplate\"></ng-container>\n  </span>\n\n  @if(iconPosition() === 'right'){\n  <span class=\"link__icon\" aria-hidden=\"true\">\n    <ng-container [ngTemplateOutlet]=\"iconTemplate\"></ng-container>\n  </span>\n  }\n</ng-template>\n\n<ng-template #iconTemplate>\n  <ng-content select=\"[icon]\"></ng-content>\n</ng-template>\n\n<ng-template #labelTemplate>\n  <ng-content></ng-content>\n</ng-template>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { MozLoaderAppearance, MozLoaderSize } from './model/loader.model';\n\n@Component({\n  selector: 'moz-loader',\n  templateUrl: './loader.html',\n  styleUrls: ['./loader.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozLoaderComponent {\n  readonly appearance = input<MozLoaderAppearance>('standard');\n  readonly size = input<MozLoaderSize>('m');\n  readonly text = input<string>();\n\n  readonly classes = computed(() => {\n    return {\n      'loader': true,\n      [`loader--${this.size()}`]: this.size(),\n      [`loader--${this.appearance()}`]: this.appearance(),\n      [`loader--text-visible`]: this.text() !== '',\n    };\n  });\n\n  readonly viewBox = computed(() => {\n    switch (this.size()) {\n      case 'xs':\n        return '0 0 20 20';\n      case 's':\n        return '0 0 24 24';\n      case 'l':\n        return '0 0 64 64';\n      default:\n        return '0 0 32 32';\n    }\n  });\n\n  readonly circleRadius = computed(() => {\n    switch (this.size()) {\n      case 'xs':\n        return 3;\n      case 's':\n        return 6;\n      case 'l':\n        return 19;\n      default:\n        return 9;\n    }\n  });\n}\n","<div [class]=\"classes()\">\n  <span class=\"loader__spinner\">\n    <svg\n      class=\"loader__icon\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      [attr.viewBox]=\"viewBox()\"\n      aria-hidden=\"true\"\n    >\n      <circle class=\"loader__path\" cx=\"50%\" cy=\"50%\" [attr.r]=\"circleRadius()\"></circle>\n    </svg>\n  </span>\n\n  @if (text()) {\n  <span class=\"loader__text\" role=\"status\">{{ text() }}</span>\n  }\n</div>\n","import { Component, input } from '@angular/core';\nimport { MozLoaderComponent } from '../loader/loader';\n\n@Component({\n  selector: 'moz-loading-overlay',\n  imports: [MozLoaderComponent],\n  templateUrl: './loading-overlay.html',\n  styleUrl: './loading-overlay.scss',\n})\nexport class MozLoadingOverlayComponent {\n  readonly label = input<string>('Loading...');\n  readonly visible = input<boolean>(true);\n}\n","@if (visible()) {\n<div class=\"mc-loading-loader\" [class.is-visible]=\"visible()\">\n    <div role=\"dialog\" tabindex=\"-1\" [attr.aria-labelledby]=\"'dialogLabel'\">\n        <moz-loader [size]=\"'l'\" [appearance]=\"'inverse'\" [text]=\"label()\">\n        </moz-loader>\n    </div>\n</div>\n}\n","// standalone/modal.component.ts\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  contentChild,\n  input,\n  model,\n  TemplateRef,\n} from '@angular/core';\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { Cross24 } from '@mozaic-ds/icons-angular';\nimport { MozIconButtonComponent } from '../icon-button';\nimport { MozModalSize } from './model/modal.model';\n\n@Component({\n  selector: 'moz-modal',\n  imports: [MozIconButtonComponent, Cross24, NgClass, NgTemplateOutlet],\n  templateUrl: './modal.html',\n  styleUrls: ['./modal.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozModalComponent {\n  readonly title = input.required<string>();\n  readonly size = input<MozModalSize>('m');\n  readonly hasCloseButton = input(true);\n  readonly closeOnBackdrop = input(true);\n  readonly isOpen = model<boolean>(false);\n\n  readonly footerTpl = contentChild<TemplateRef<void>>('modalFooter');\n\n  readonly classes = computed(() => ({\n    'modal': true,\n    'is-open': this.isOpen(),\n    [`modal--${this.size()}`]: this.size() !== 'm',\n  }));\n\n  open(): void {\n    this.isOpen.set(true);\n  }\n\n  close(): void {\n    this.isOpen.set(false);\n  }\n\n  onBackdropClick(): void {\n    if (this.closeOnBackdrop()) {\n      this.close();\n    }\n  }\n}\n","<div\n  [class]=\"classes()\"\n  tabindex=\"-1\"\n  role=\"dialog\"\n  aria-labelledby=\"modalTitle\"\n  [attr.aria-modal]=\"isOpen() ? 'true' : 'false'\"\n>\n  <div class=\"modal__dialog\" role=\"document\" (click)=\"$event.stopPropagation()\">\n    <header class=\"modal__header\">\n      <h2 class=\"modal__title\" id=\"modalTitle\">{{ title() }}</h2>\n\n      @if (hasCloseButton()) {\n      <moz-icon-button\n        class=\"modal__close\"\n        aria-label=\"Close\"\n        [ghost]=\"true\"\n        (activated)=\"close()\"\n        [id]=\"'modal-close-button'\"\n      >\n        <Cross24 icon />\n      </moz-icon-button>\n      }\n    </header>\n\n    <main class=\"modal__body\">\n      <ng-content />\n    </main>\n\n    @if (footerTpl()) {\n    <footer class=\"modal__footer\">\n      <ng-container *ngTemplateOutlet=\"footerTpl()!\" />\n    </footer>\n    }\n  </div>\n\n  @if (isOpen()) {\n  <div class=\"overlay is-visible\" tabindex=\"-1\" (click)=\"onBackdropClick()\"></div>\n  }\n</div>\n","import { InjectionToken } from '@angular/core';\nimport { MozModalSize } from '../model/modal.model';\n\nexport interface MozModalConfig<D = unknown> {\n  title: string;\n  size?: MozModalSize;\n  hasCloseButton?: boolean;\n  closeOnBackdrop?: boolean;\n  closeOnEscape?: boolean;\n  data?: D;\n}\n\nexport const MODAL_CONFIG = new InjectionToken<MozModalConfig>('MODAL_CONFIG');\nexport const MODAL_DATA = new InjectionToken<unknown>('MODAL_DATA');\n\nexport const DEFAULT_MODAL_CONFIG: Partial<MozModalConfig> = {\n  size: 'm',\n  hasCloseButton: true,\n  closeOnBackdrop: true,\n  closeOnEscape: true,\n};\n","import { OverlayRef } from '@angular/cdk/overlay';\nimport { Subject, Observable } from 'rxjs';\nimport { signal } from '@angular/core';\nimport { MozModalSize } from '../model/modal.model';\n\nexport class MozModalRef<R = unknown> {\n  private readonly afterClosed$ = new Subject<R | undefined>();\n  private readonly afterOpened$ = new Subject<void>();\n\n  readonly isOpen = signal(false);\n  readonly title = signal('');\n  readonly size = signal<MozModalSize>('m');\n  readonly hasCloseButton = signal(true);\n  readonly closeOnBackdrop = signal(true);\n  readonly closeOnEscape = signal(true);\n\n  private animationDuration = 300;\n\n  constructor(private readonly overlayRef: OverlayRef) {}\n\n  open(): void {\n    requestAnimationFrame(() => {\n      this.isOpen.set(true);\n      this.afterOpened$.next();\n      this.afterOpened$.complete();\n    });\n  }\n\n  close(result?: R): void {\n    this.isOpen.set(false);\n\n    setTimeout(() => {\n      this.overlayRef.dispose();\n      this.afterClosed$.next(result);\n      this.afterClosed$.complete();\n    }, this.animationDuration);\n  }\n\n  afterClosed(): Observable<R | undefined> {\n    return this.afterClosed$.asObservable();\n  }\n\n  afterOpened(): Observable<void> {\n    return this.afterOpened$.asObservable();\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ComponentRef,\n  HostListener,\n  TemplateRef,\n  computed,\n  inject,\n  viewChild,\n  Type,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { CdkPortalOutlet, ComponentPortal } from '@angular/cdk/portal';\nimport { Cross24 } from '@mozaic-ds/icons-angular';\nimport { MozIconButtonComponent } from '../../icon-button/icon-button';\nimport { MODAL_CONFIG, MozModalConfig } from '../config/modal.config';\nimport { MozModalRef } from '../ref/modal-ref';\n\n@Component({\n  selector: 'moz-modal-container',\n  imports: [MozIconButtonComponent, Cross24, NgTemplateOutlet, CdkPortalOutlet],\n  templateUrl: './modal-container.html',\n  styleUrls: ['../modal.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ModalContainerComponent {\n  readonly modalRef = inject(MozModalRef);\n  readonly config = inject<MozModalConfig>(MODAL_CONFIG);\n\n  readonly portalOutlet = viewChild(CdkPortalOutlet);\n\n  footerTpl: TemplateRef<void> | null = null;\n\n  private componentRef: ComponentRef<unknown> | null = null;\n\n  readonly classes = computed(() => ({\n    'modal': true,\n    'is-open': this.modalRef.isOpen(),\n    [`modal--${this.modalRef.size()}`]: this.modalRef.size() !== 'm',\n  }));\n\n  readonly ariaModal = computed(() => (this.modalRef.isOpen() ? 'true' : 'false'));\n\n  attachComponent<C>(component: Type<C>): ComponentRef<C> {\n    const portal = new ComponentPortal(component);\n    const outlet = this.portalOutlet();\n\n    if (!outlet) {\n      throw new Error('Portal outlet is not available');\n    }\n\n    this.componentRef = outlet.attachComponentPortal(portal);\n    return this.componentRef as ComponentRef<C>;\n  }\n\n  registerFooter(tpl: TemplateRef<void>): void {\n    this.footerTpl = tpl;\n  }\n\n  onBackdropClick(event: MouseEvent): void {\n    event.stopPropagation();\n    if (this.modalRef.closeOnBackdrop()) {\n      this.modalRef.close();\n    }\n  }\n\n  @HostListener('keydown.escape')\n  onEscape(): void {\n    if (this.modalRef.closeOnEscape() && this.modalRef.isOpen()) {\n      this.modalRef.close();\n    }\n  }\n}\n","<div\n  [class]=\"classes()\"\n  tabindex=\"-1\"\n  role=\"dialog\"\n  aria-labelledby=\"modalTitle\"\n  [attr.aria-modal]=\"ariaModal()\"\n  [attr.aria-hidden]=\"!modalRef.isOpen()\"\n>\n  <div class=\"modal__dialog\" role=\"document\" (click)=\"$event.stopPropagation()\">\n    <header class=\"modal__header\">\n      <h2 class=\"modal__title\" id=\"modalTitle\">{{ modalRef.title() }}</h2>\n\n      @if (modalRef.hasCloseButton()) {\n      <moz-icon-button\n        class=\"modal__close\"\n        aria-label=\"Close\"\n        [ghost]=\"true\"\n        (activated)=\"modalRef.close()\"\n        [id]=\"'modal-close-button'\"\n      >\n        <Cross24 icon />\n      </moz-icon-button>\n      }\n    </header>\n\n    <main class=\"modal__body\">\n      <ng-template cdkPortalOutlet />\n    </main>\n\n    @if (footerTpl) {\n    <footer class=\"modal__footer\">\n      <ng-container *ngTemplateOutlet=\"footerTpl\" />\n    </footer>\n    }\n  </div>\n\n  @if (modalRef.isOpen()) {\n  <div class=\"overlay is-visible\" tabindex=\"-1\" (click)=\"onBackdropClick($event)\"></div>\n  }\n</div>\n","// service/modal.service.ts\nimport { Injectable, Injector, Type, inject } from '@angular/core';\nimport { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n  MozModalConfig,\n  MODAL_CONFIG,\n  MODAL_DATA,\n  DEFAULT_MODAL_CONFIG,\n} from '../config/modal.config';\nimport { MozModalRef } from '../ref/modal-ref';\nimport { ModalContainerComponent } from '../container/modal-container';\n\n@Injectable({ providedIn: 'root' })\nexport class MozModalService {\n  private readonly overlay = inject(Overlay);\n  private readonly injector = inject(Injector);\n\n  open<C, D = unknown, R = unknown>(component: Type<C>, config: MozModalConfig<D>): MozModalRef<R> {\n    const mergedConfig: MozModalConfig<D> = {\n      ...DEFAULT_MODAL_CONFIG,\n      ...config,\n    } as MozModalConfig<D>;\n\n    const overlayRef = this.createOverlay();\n    const modalRef = new MozModalRef<R>(overlayRef);\n\n    modalRef.title.set(mergedConfig.title);\n    modalRef.size.set(mergedConfig.size ?? 'm');\n    modalRef.hasCloseButton.set(mergedConfig.hasCloseButton ?? true);\n    modalRef.closeOnBackdrop.set(mergedConfig.closeOnBackdrop ?? true);\n    modalRef.closeOnEscape.set(mergedConfig.closeOnEscape ?? true);\n\n    const injector = Injector.create({\n      parent: this.injector,\n      providers: [\n        { provide: MozModalRef, useValue: modalRef },\n        { provide: MODAL_CONFIG, useValue: mergedConfig },\n        { provide: MODAL_DATA, useValue: mergedConfig.data },\n      ],\n    });\n\n    const containerPortal = new ComponentPortal(ModalContainerComponent, null, injector);\n    const containerRef = overlayRef.attach(containerPortal);\n\n    // Attacher le composant contenu dans le portal outlet\n    containerRef.instance.attachComponent(component);\n\n    modalRef.open();\n\n    return modalRef;\n  }\n\n  private createOverlay(): OverlayRef {\n    const config = new OverlayConfig({\n      hasBackdrop: false,\n      positionStrategy: this.overlay.position().global().centerHorizontally().centerVertically(),\n      scrollStrategy: this.overlay.scrollStrategies.block(),\n    });\n\n    return this.overlay.create(config);\n  }\n}\n","import { Directive, TemplateRef, inject, afterNextRender } from '@angular/core';\nimport { ModalContainerComponent } from '../container/modal-container';\n\n@Directive({\n  selector: '[mozModalFooter]',\n  standalone: true,\n})\nexport class MozModalFooterDirective {\n  private readonly tpl = inject(TemplateRef<void>);\n  private readonly container = inject(ModalContainerComponent);\n\n  constructor() {\n    afterNextRender(() => {\n      this.container.registerFooter(this.tpl);\n    });\n  }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { MozNumberBadgeAppearance, MozNumberBadgeSize } from './model/number-badge.model';\n\n@Component({\n  selector: 'moz-number-badge',\n  templateUrl: './number-badge.html',\n  styleUrls: ['./number-badge.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    'style': 'display: flex;',\n  },\n})\nexport class MozNumberBadgeComponent {\n  readonly label = input<number>(0);\n  readonly appearance = input<MozNumberBadgeAppearance>('standard');\n  readonly size = input<MozNumberBadgeSize>('s');\n\n  readonly classes = computed(() => {\n    return {\n      'mc-number-badge': true,\n      [`mc-number-badge--${this.appearance()}`]: this.appearance(),\n      [`mc-number-badge--${this.size()}`]: this.size(),\n    };\n  });\n}\n","<span [class]=\"classes()\">{{ label() }}</span>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\n\n@Component({\n  selector: 'moz-overlay',\n  templateUrl: './overlay.html',\n  styleUrls: ['./overlay.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozOverlayComponent {\n  readonly backdropClick = output<void>();\n  readonly backdropKeydown = output<void>();\n\n  /**\n   * Controls the visibility of the overlay.\n   */\n  readonly isVisible = input<boolean>();\n\n  /**\n   * Accessible label for the overlay dialog.\n   */\n  readonly dialogLabel = input<string>();\n\n  readonly classes = computed(() => {\n    return {\n      'overlay': true,\n      'is-visible': this.isVisible(),\n    };\n  });\n\n  onBackdropClick() {\n    this.backdropClick.emit();\n  }\n\n  noop() {}\n}\n","<div\n  [class]=\"classes()\"\n  (click)=\"onBackdropClick()\"\n  (keydown)=\"noop()\"\n  tabindex=\"-1\"\n  aria-label=\"Close pannel\"\n>\n  <div role=\"dialog\" tabindex=\"-1\" [attr.aria-labelledby]=\"dialogLabel()\">\n    <ng-content></ng-content>\n  </div>\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  forwardRef,\n  input,\n  signal,\n} from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MozSelectOption, MozSelectSize, MozSelectValue } from './model/select.model';\n\n@Component({\n  selector: 'moz-select',\n  templateUrl: './select.html',\n  styleUrls: ['./select.scss'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozSelectComponent),\n      multi: true,\n    },\n  ],\n  imports: [FormsModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozSelectComponent implements ControlValueAccessor {\n  readonly id = input<string>();\n  readonly name = input.required<string>();\n  readonly options = input<MozSelectOption[]>();\n  readonly placeholder = input<string>();\n  readonly isInvalid = input<boolean>(false);\n  readonly disabled = input<boolean>(false);\n  readonly readonly = input<boolean>(false);\n  readonly size = input<MozSelectSize>('m');\n\n  readonly _value = signal<MozSelectValue>(null);\n\n  onChange: (value: MozSelectValue) => void = () => void 0;\n  onTouched: () => void = () => void 0;\n\n  writeValue(value: MozSelectValue): void {\n    this._value.set(value);\n  }\n\n  registerOnChange(fn: (value: MozSelectValue) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  handleChange(event: Event) {\n    const target = event.target as HTMLSelectElement;\n    const value = target.value;\n    this._value.set(value);\n    this.onChange(value);\n  }\n\n  readonly hostClasses = computed(() => {\n    return {\n      'select': true,\n      [`select--${this.size()}`]: this.size(),\n    };\n  });\n\n  readonly classes = computed(() => {\n    return {\n      'select--control': true,\n      'select--readonly': this.readonly(),\n      'is-invalid': this.isInvalid(),\n    };\n  });\n}\n","<div [class]=\"hostClasses()\">\n  <select\n    [id]=\"id()\"\n    [class]=\"classes()\"\n    [name]=\"name()\"\n    [disabled]=\"disabled() || readonly()\"\n    (change)=\"handleChange($event)\"\n  >\n    <option value=\"\" [selected]=\"!_value()\" disabled>\n      {{ placeholder() || 'Select an option' }}\n    </option>\n    @for (option of options(); track $index) {\n    <option\n      [value]=\"option.value\"\n      [selected]=\"_value() === option.value\"\n      [disabled]=\"option.disabled\"\n      [attr.data-id]=\"option.id\"\n      [attr.*]=\"option.attributes\"\n    >\n      {{ option.text }}\n    </option>\n    }\n  </select>\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  input,\n  linkedSignal,\n  output,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MozSelectComponent } from '../select/select';\nimport {\n  ChevronLeft24,\n  ChevronRight24,\n  ChevronLeft20,\n  ChevronRight20,\n} from '@mozaic-ds/icons-angular';\nimport { MozIconButtonComponent } from '../icon-button/icon-button';\nimport { MozButtonComponent } from '../button/button';\nimport { MozPaginationButtonAppearance, MozPaginationButtonSize } from './model/pagination.model';\n\n@Component({\n  selector: 'moz-pagination',\n  imports: [\n    MozIconButtonComponent,\n    MozSelectComponent,\n    MozButtonComponent,\n    ChevronLeft24,\n    ChevronRight24,\n    FormsModule,\n    ChevronLeft20,\n    ChevronRight20,\n  ],\n  templateUrl: './pagination.html',\n  styleUrls: ['./pagination.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozPaginationComponent {\n  readonly id = input.required<string>();\n  readonly compact = input<boolean>(false);\n  readonly options = input.required<{ text: string; value: number }[]>();\n  readonly selectLabel = input<string>('Select page');\n  readonly buttonAppearance = input<MozPaginationButtonAppearance>('square');\n  readonly buttonSize = input<MozPaginationButtonSize>('m');\n\n  readonly value = input<number>();\n  readonly updateValue = output<number>();\n\n  readonly _currentValue = linkedSignal(this.value);\n\n  readonly currentIndex = computed(\n    () => this.options()?.findIndex((opt) => opt.value === this._currentValue()) ?? 0\n  );\n\n  readonly isFirstPage = computed(() => this.currentIndex() === 0);\n  readonly isLastPage = computed(() => this.currentIndex() === this.options().length - 1);\n\n  readonly currentPageText = computed(\n    () => this.options().find((option) => option.value === this._currentValue())?.text || ''\n  );\n\n  previous(): void {\n    const currentIndex = this.currentIndex();\n    if (currentIndex > 0) {\n      const newValue = this.options()[currentIndex - 1].value;\n      this._currentValue.set(newValue);\n      this.updateValue.emit(newValue);\n    }\n  }\n\n  next(): void {\n    const currentIndex = this.currentIndex();\n    if (currentIndex < this.options().length - 1) {\n      const newValue = this.options()[currentIndex + 1].value;\n      this._currentValue.set(newValue);\n      this.updateValue.emit(newValue);\n    }\n  }\n\n  onSelectChange(value: string): void {\n    this._currentValue.set(+value);\n    this.updateValue.emit(+value);\n  }\n}\n","<nav class=\"pagination\" role=\"navigation\">\n  @if (!compact() && buttonAppearance() === 'square') {\n  <button\n    moz-button\n    iconPosition=\"only\"\n    aria-label=\"Previous page\"\n    [disabled]=\"isFirstPage()\"\n    (click)=\"previous()\"\n    [size]=\"buttonSize()\"\n  >\n    @if(buttonSize() === 'm') {\n    <ChevronLeft24 icon />\n    } @else {\n    <ChevronLeft20 icon />\n    }\n  </button>\n  } @else {\n  <moz-icon-button\n    aria-label=\"Previous page\"\n    [disabled]=\"isFirstPage()\"\n    (activated)=\"previous()\"\n    [size]=\"buttonSize()\"\n    [id]=\"'pagination-previous-button'\"\n  >\n    @if(buttonSize() === 'm') {\n    <ChevronLeft24 icon />\n    } @else {\n    <ChevronLeft20 icon />\n    }\n  </moz-icon-button>\n  } @if (!compact()) {\n  <div class=\"pagination__field\">\n    <moz-select\n      class=\"pagination__select\"\n      [id]=\"id()\"\n      [name]=\"id()\"\n      [options]=\"options()\"\n      [ngModel]=\"_currentValue()\"\n      (ngModelChange)=\"onSelectChange($event)\"\n      [ariaLabel]=\"selectLabel()\"\n      [size]=\"buttonSize()\"\n    />\n  </div>\n  } @else {\n  <span class=\"pagination__label\" aria-current=\"page\">\n    {{ currentPageText() }}\n  </span>\n  } @if (!compact() && buttonAppearance() === 'square') {\n  <button\n    moz-button\n    iconPosition=\"only\"\n    aria-label=\"Next page\"\n    [disabled]=\"isLastPage()\"\n    (click)=\"next()\"\n    [size]=\"buttonSize()\"\n  >\n    @if(buttonSize() === 'm') {\n    <ChevronRight24 icon />\n    } @else {\n    <ChevronRight20 icon />\n    }\n  </button>\n  } @else {\n  <moz-icon-button\n    aria-label=\"Next page\"\n    [disabled]=\"isLastPage()\"\n    (activated)=\"next()\"\n    [size]=\"buttonSize()\"\n    [id]=\"'pagination-next-button'\"\n  >\n    @if(buttonSize() === 'm') {\n    <ChevronRight24 icon />\n    } @else {\n    <ChevronRight20 icon />\n    }\n  </moz-icon-button>\n  }\n</nav>\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  ComponentRef,\n  computed,\n  createComponent,\n  ElementRef,\n  EnvironmentInjector,\n  forwardRef,\n  inject,\n  input,\n  OnDestroy,\n  Renderer2,\n  signal,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CrossCircleFilled24 } from '@mozaic-ds/icons-angular';\n\n/**\n * Directive that transforms a simple input into a styled password input with toggle visibility and clearable button.\n * Wraps the input element in a container and adds additional elements as needed.\n */\n@Component({\n  selector: 'input[moz-password-input]',\n  template: '',\n  styleUrls: ['./password-input.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozPasswordInputDirective),\n      multi: true,\n    },\n  ],\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    '[class]': '\"password-input__control text-input__control\"',\n    '[attr.aria-invalid]': 'isInvalid()',\n    '[attr.aria-valuetext]': 'getValue()',\n    '[type]': 'inputType()',\n    '(input)': 'onInput($event)',\n    '(blur)': 'onTouched()',\n    '[disabled]': 'disabled()',\n  },\n})\nexport class MozPasswordInputDirective implements ControlValueAccessor, AfterViewInit, OnDestroy {\n  readonly isInvalid = input<boolean>(false);\n  readonly disabled = input<boolean>(false);\n  readonly clearable = input<boolean>(false);\n  readonly clearLabel = input<string>('Clear content');\n  readonly buttonLabel = input<{ show: string; hide: string }>({\n    show: 'Show',\n    hide: 'Hide',\n  });\n\n  private wrapper: HTMLElement | null = null;\n  private clearButton: HTMLElement | null = null;\n  private toggleButton: HTMLElement | null = null;\n  private clearIconComponentRef: ComponentRef<CrossCircleFilled24> | null = null;\n  private environmentInjector = inject(EnvironmentInjector);\n  protected _value = signal<string>('');\n  private _isVisible = signal(false);\n\n  readonly inputType = computed(() => (this._isVisible() ? 'text' : 'password'));\n  readonly ariaChecked = computed(() => (this._isVisible() ? 'true' : 'false'));\n  readonly isClearable = computed(() => this.clearable() && this._value().length > 0);\n\n  /** Get the current value of the input */\n  getValue(): string {\n    return this._value();\n  }\n\n  onChange: (value: string) => void = () => void 0;\n  onTouched: () => void = () => void 0;\n\n  constructor(private elementRef: ElementRef<HTMLInputElement>, private renderer: Renderer2) {}\n\n  ngAfterViewInit(): void {\n    this.wrapInput();\n  }\n\n  ngOnDestroy(): void {\n    if (this.clearIconComponentRef) {\n      this.clearIconComponentRef.destroy();\n    }\n  }\n\n  private wrapInput(): void {\n    const input = this.elementRef.nativeElement;\n    const parent = input.parentElement;\n\n    if (!parent) return;\n\n    // Create wrapper div\n    this.wrapper = this.renderer.createElement('div');\n    this.renderer.addClass(this.wrapper, 'password-input');\n    this.renderer.addClass(this.wrapper, 'text-input');\n\n    if (this.isInvalid()) {\n      this.renderer.addClass(this.wrapper, 'is-invalid');\n    }\n\n    // Insert wrapper before input\n    this.renderer.insertBefore(parent, this.wrapper, input);\n\n    // Move input into wrapper\n    this.renderer.appendChild(this.wrapper, input);\n\n    // Add clearable button if needed\n    if (this.clearable()) {\n      this.createClearButton();\n    }\n\n    // Add toggle visibility button\n    this.createToggleButton();\n  }\n\n  private createClearButton(): void {\n    if (!this.wrapper) return;\n\n    this.clearButton = this.renderer.createElement('button');\n    this.renderer.setAttribute(this.clearButton, 'type', 'button');\n    this.renderer.addClass(this.clearButton, 'controls-options__button');\n    this.renderer.listen(this.clearButton, 'click', () => this.clearValue());\n\n    // Create icon component dynamically\n    this.clearIconComponentRef = createComponent(CrossCircleFilled24, {\n      environmentInjector: this.environmentInjector,\n    });\n\n    const iconElement = this.clearIconComponentRef.location.nativeElement;\n    this.renderer.addClass(iconElement, 'controls-options__icon');\n    this.renderer.setAttribute(iconElement, 'aria-hidden', 'true');\n\n    const label = this.renderer.createElement('span');\n    this.renderer.addClass(label, 'controls-options__label');\n    this.renderer.setProperty(label, 'textContent', this.clearLabel());\n\n    this.renderer.appendChild(this.clearButton, iconElement);\n    this.renderer.appendChild(this.clearButton, label);\n    this.renderer.appendChild(this.wrapper, this.clearButton);\n\n    // Initially hide if no value\n    this.updateClearButtonVisibility();\n  }\n\n  private createToggleButton(): void {\n    if (!this.wrapper) return;\n\n    // Create button element with manual CSS classes\n    this.toggleButton = this.renderer.createElement('button');\n    this.renderer.setAttribute(this.toggleButton, 'type', 'button');\n    this.renderer.setAttribute(this.toggleButton, 'role', 'switch');\n    this.renderer.addClass(this.toggleButton, 'button');\n    this.renderer.addClass(this.toggleButton, 'button--s');\n    this.renderer.addClass(this.toggleButton, 'button--ghost');\n\n    // Add click listener\n    this.renderer.listen(this.toggleButton, 'click', () => this.toggleVisibility());\n\n    // Set initial button text and aria-checked\n    this.updateToggleButtonText(this.toggleButton || undefined);\n\n    this.renderer.appendChild(this.wrapper, this.toggleButton);\n  }\n\n  private updateClearButtonVisibility(): void {\n    if (!this.clearButton || !this.clearable()) return;\n\n    if (this.isClearable()) {\n      this.renderer.setStyle(this.clearButton, 'display', 'block');\n    } else {\n      this.renderer.setStyle(this.clearButton, 'display', 'none');\n    }\n  }\n\n  private updateToggleButtonText(buttonElement?: HTMLElement): void {\n    const button = buttonElement || this.toggleButton;\n    if (!button) return;\n\n    const text = this._isVisible() ? this.buttonLabel().hide : this.buttonLabel().show;\n    this.renderer.setProperty(button, 'textContent', text);\n    this.renderer.setAttribute(button, 'aria-checked', this.ariaChecked());\n  }\n\n  clearValue(): void {\n    this._value.set('');\n    this.renderer.setProperty(this.elementRef.nativeElement, 'value', '');\n    this.onChange('');\n    this.onTouched();\n    this.updateClearButtonVisibility();\n  }\n\n  toggleVisibility(): void {\n    this._isVisible.update((v) => !v);\n    this.updateToggleButtonText();\n  }\n\n  onInput(event: Event): void {\n    const value = (event.target as HTMLInputElement).value;\n    this._value.set(value);\n    this.onChange(value);\n    this.updateClearButtonVisibility();\n  }\n\n  writeValue(value: string): void {\n    const normalizedValue = value ?? '';\n    this._value.set(normalizedValue);\n    this.renderer.setProperty(this.elementRef.nativeElement, 'value', normalizedValue);\n    this.updateClearButtonVisibility();\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","import {\n  Component,\n  forwardRef,\n  ElementRef,\n  OnInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  NgZone,\n  signal,\n  WritableSignal,\n  input,\n  inject,\n  computed,\n  viewChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MozPincodeLength } from './model/pincode.model';\n\n@Component({\n  selector: 'moz-pincode',\n  templateUrl: './pincode.html',\n  styleUrls: ['./pincode.scss'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozPincodeInputComponent),\n      multi: true,\n    },\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozPincodeInputComponent implements OnInit, ControlValueAccessor {\n  private readonly cdr = inject(ChangeDetectorRef);\n  private readonly ngZone = inject(NgZone);\n\n  readonly id = input.required<string>();\n  readonly length = input<MozPincodeLength>(6);\n  readonly name = input<string | undefined>(undefined);\n  readonly isInvalid = input<boolean>(false);\n  readonly disabled = input<boolean>(false);\n  readonly readonly = input<boolean>(false);\n  readonly otp: WritableSignal<string[]> = signal([]);\n\n  readonly inputRefs = viewChildren<ElementRef<HTMLInputElement>>('pincodeItem');\n\n  private _value = '';\n\n  public onChange: (value: string) => void = () => void 0;\n  public onTouched: () => void = () => void 0;\n\n  readonly classes = computed(() => ({\n    'mc-pincode-input': true,\n    'is-invalid': this.isInvalid(),\n  }));\n\n  ngOnInit(): void {\n    this.otp.set(Array(this.length()).fill(''));\n    if (this._value) {\n      this.writeValue(this._value);\n    }\n  }\n\n  writeValue(value: string): void {\n    this._value = String(value ?? '');\n    const newOtp = Array.from({ length: this.length() }, (_, i) => this._value[i] ?? '');\n    this.otp.set(newOtp);\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  private focusInput(index: number): void {\n    const refs = this.inputRefs();\n    if (refs && refs.length > index && index >= 0) {\n      this.ngZone.runOutsideAngular(() => {\n        refs[index]?.nativeElement.focus();\n      });\n    }\n  }\n\n  onInput(event: Event, index: number): void {\n    this.ngZone.runOutsideAngular(() => {\n      const inputElement = event.target as HTMLInputElement;\n      const val = inputElement.value.replace(/\\D/g, '');\n\n      this.otp.update((currentOtp) => {\n        const newOtp = [...currentOtp];\n        newOtp[index] = val ? val[0] : '';\n        return newOtp;\n      });\n\n      inputElement.value = this.otp()[index];\n\n      const newValue = this.otp().join('');\n      this._value = newValue;\n      this.onChange(newValue);\n      if (val && index + 1 < this.length()) {\n        this.focusInput(index + 1);\n      }\n      this.onTouched();\n      this.cdr.detectChanges();\n    });\n  }\n\n  onKeyDown(event: KeyboardEvent, index: number): void {\n    this.ngZone.runOutsideAngular(() => {\n      if (event.key === 'ArrowLeft' && index > 0) {\n        this.focusInput(index - 1);\n      } else if (event.key === 'ArrowRight' && index < this.length() - 1) {\n        this.focusInput(index + 1);\n      } else if (event.key === 'Backspace') {\n        this.onBackspace(event, index);\n      }\n      this.onTouched();\n    });\n  }\n\n  onBackspace(event: KeyboardEvent, index: number): void {\n    this.ngZone.runOutsideAngular(() => {\n      if (!this.otp()[index] && index > 0) {\n        event.preventDefault();\n\n        this.otp.update((currentOtp) => {\n          const newOtp = [...currentOtp];\n          newOtp[index - 1] = '';\n          return newOtp;\n        });\n\n        const newValue = this.otp().join('');\n        this._value = newValue;\n        this.onChange(newValue);\n        this.focusInput(index - 1);\n        this.cdr.detectChanges();\n      }\n    });\n  }\n\n  onPaste(event: ClipboardEvent): void {\n    this.ngZone.runOutsideAngular(() => {\n      event.preventDefault();\n      const pasted = event.clipboardData?.getData('text') ?? '';\n      const digits = pasted.replace(/\\D/g, '').slice(0, this.length()).split('');\n\n      this.otp.set(Array.from({ length: this.length() }, (_, i) => digits[i] ?? ''));\n\n      const newValue = this.otp().join('');\n      this._value = newValue;\n      this.onChange(newValue);\n      this.focusInput(Math.min(digits.length - 1, this.length() - 1));\n      this.onTouched();\n      this.cdr.detectChanges();\n    });\n  }\n}\n","<div [class]=\"classes()\" (paste)=\"onPaste($event)\">\n  @for (digit of otp(); track $index) {\n  <input\n    #pincodeItem\n    [id]=\"'pincodeItem' + $index\"\n    type=\"text\"\n    inputmode=\"numeric\"\n    maxlength=\"1\"\n    pattern=\"\\d*\"\n    autocomplete=\"one-time-code\"\n    [name]=\"name()\"\n    class=\"mc-pincode-input__control\"\n    [disabled]=\"disabled()\"\n    [readonly]=\"readonly()\"\n    [value]=\"digit\"\n    (input)=\"onInput($event, $index)\"\n    (keydown)=\"onKeyDown($event, $index)\"\n    (blur)=\"onTouched()\"\n  />\n  }\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  forwardRef,\n  input,\n  signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { Less24, More24 } from '@mozaic-ds/icons-angular';\nimport { MozQuantitySelectorSize } from './model/quantity-selector.model';\n\n@Component({\n  selector: 'moz-quantity-selector',\n  imports: [More24, Less24],\n  templateUrl: './quantity-selector.html',\n  styleUrls: ['./quantity-selector.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozQuantitySelectorComponent),\n      multi: true,\n    },\n  ],\n})\nexport class MozQuantitySelectorComponent implements ControlValueAccessor {\n  readonly id = input.required<string>();\n  readonly name = input<string>('quantity-selector-input');\n  readonly size = input<MozQuantitySelectorSize>('m');\n  readonly isInvalid = input<boolean>(false);\n  readonly disabled = input<boolean>(false);\n  readonly readonly = input<boolean>(false);\n  readonly min = input<number>(1);\n  readonly max = input<number>(100);\n  readonly step = input<number>(1);\n  readonly incrementLabel = input<string>('Increment');\n  readonly decrementLabel = input<string>('Decrement');\n\n  readonly _value = signal<number>(1);\n\n  readonly classes = computed(() => ({\n    'quantity-selector': true,\n    [`quantity-selector--${this.size()}`]: this.size(),\n    'is-invalid': this.isInvalid(),\n  }));\n\n  private onChange: (value: number) => void = () => void 0;\n  private onTouched: () => void = () => void 0;\n\n  writeValue(value: number): void {\n    this._value.set(value);\n  }\n\n  registerOnChange(fn: (value: number) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  onChangeInput(event: Event): void {\n    let value = Number((event.target as HTMLInputElement).value);\n\n    value = Math.max(this.min(), Math.min(this.max(), value));\n    this._value.set(value);\n    this.onChange(value);\n    this.onTouched();\n  }\n\n  increment(): void {\n    const value = Math.min(this.max(), this._value() + this.step());\n    this._value.set(value);\n    this.onChange(value);\n    this.onTouched();\n  }\n\n  decrement(): void {\n    const value = Math.max(this.min(), this._value() - this.step());\n    this._value.set(value);\n    this.onChange(value);\n    this.onTouched();\n  }\n}\n","<div [class]=\"classes()\">\n  <input\n    class=\"quantity-selector__control\"\n    type=\"number\"\n    [id]=\"id()\"\n    [name]=\"name()\"\n    [disabled]=\"disabled()\"\n    [min]=\"min()\"\n    [max]=\"max()\"\n    [step]=\"step()\"\n    [readonly]=\"readonly()\"\n    [attr.aria-invalid]=\"isInvalid()\"\n    [attr.aria-valuemin]=\"min()\"\n    [attr.aria-valuemax]=\"max()\"\n    [attr.aria-valuenow]=\"_value()\"\n    [value]=\"_value()\"\n    (change)=\"onChangeInput($event)\"\n  />\n\n  @if (!readonly()) {\n  <button\n    type=\"button\"\n    [attr.aria-controls]=\"id()\"\n    class=\"quantity-selector__button quantity-selector__button--increase\"\n    tabindex=\"-1\"\n    [disabled]=\"disabled() || _value() === max()\"\n    (click)=\"increment()\"\n  >\n    <span class=\"quantity-selector__icon\">\n      <More24 />\n    </span>\n    <span class=\"quantity-selector__label\">{{ incrementLabel() }}</span>\n  </button>\n\n  <button\n    type=\"button\"\n    [attr.aria-controls]=\"id()\"\n    class=\"quantity-selector__button quantity-selector__button--decrease\"\n    tabindex=\"-1\"\n    [disabled]=\"disabled() || _value() === min()\"\n    (click)=\"decrement()\"\n  >\n    <span class=\"quantity-selector__icon\">\n      <Less24 />\n    </span>\n    <span class=\"quantity-selector__label\">{{ decrementLabel() }}</span>\n  </button>\n  }\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  forwardRef,\n  input,\n  signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n  selector: 'moz-radio',\n  templateUrl: './radio.html',\n  styleUrls: ['./radio.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozRadioComponent),\n      multi: true,\n    },\n  ],\n})\nexport class MozRadioComponent implements ControlValueAccessor {\n  readonly id = input.required<string>();\n  readonly name = input<string | undefined>();\n  readonly label = input<string | undefined>();\n  readonly isInvalid = input<boolean>(false);\n  readonly disabled = input<boolean>(false);\n\n  readonly _value = signal<boolean>(false);\n\n  onChange: (_: boolean) => void = () => void 0;\n  onTouched: () => void = () => void 0;\n\n  handleChange(event: Event): void {\n    const isChecked = (event.target as HTMLInputElement).checked;\n    this._value.set(isChecked);\n    this.onChange(isChecked);\n    this.onTouched();\n  }\n\n  writeValue(value: boolean): void {\n    this._value.set(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  readonly classes = computed(() => {\n    return {\n      'radio__input': true,\n      'is-invalid': this.isInvalid(),\n    };\n  });\n}\n","<div class=\"radio\">\n  <input\n    [class]=\"classes()\"\n    [id]=\"id()\"\n    [type]=\"'radio'\"\n    [name]=\"name()\"\n    [checked]=\"_value()\"\n    [disabled]=\"disabled()\"\n    [attr.aria-invalid]=\"isInvalid()\"\n    (change)=\"handleChange($event)\"\n  />\n  @if (label()) {\n  <label class=\"radio__label\" [for]=\"id()\"> {{ label() }} </label>\n  }\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  forwardRef,\n  input,\n  signal,\n} from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MozRadioComponent } from '../radio/radio';\n\n@Component({\n  selector: 'moz-radio-group',\n  templateUrl: './radio-group.html',\n  styleUrls: ['./radio-group.scss'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozRadioGroupComponent),\n      multi: true,\n    },\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [MozRadioComponent, FormsModule],\n})\nexport class MozRadioGroupComponent implements ControlValueAccessor {\n  readonly name = input.required<string>();\n  readonly options = input<{ id: string; label: string; value: string; disabled?: boolean }[]>([]);\n  readonly isInvalid = input(false);\n  readonly inline = input(false);\n\n  readonly _value = signal<string | null>(null);\n\n  onChange: (value: string) => void = () => void 0;\n  onTouched: () => void = () => void 0;\n\n  writeValue(value: string): void {\n    this._value.set(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  select(value: string) {\n    this._value.set(value);\n    this.onChange(value);\n    this.onTouched();\n  }\n\n  readonly classes = computed(() => {\n    return {\n      'field__content': true,\n      'field__content--inline': this.inline(),\n    };\n  });\n}\n","<fieldset class=\"field field--group\">\n  <div [class]=\"classes()\">\n    @for (option of options(); track $index) {\n    <moz-radio\n      [id]=\"option.id\"\n      [label]=\"option.label\"\n      [name]=\"name()\"\n      [ngModel]=\"_value() === option.value\"\n      [disabled]=\"option.disabled ?? false\"\n      [isInvalid]=\"isInvalid()\"\n      (change)=\"select(option.value)\"\n    ></moz-radio>\n    }\n  </div>\n</fieldset>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { MozStatusDotStatus, MozStatusDotSize } from './model/status-dot.model';\n\n@Component({\n  selector: 'moz-status-dot',\n  templateUrl: './status-dot.html',\n  styleUrls: ['./status-dot.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozStatusDotComponent {\n  readonly status = input<MozStatusDotStatus>('info');\n  readonly size = input<MozStatusDotSize>('m');\n\n  readonly classes = computed(() => {\n    return {\n      'mc-status-dot': true,\n      [`mc-status-dot--${this.status()}`]: this.status(),\n      [`mc-status-dot--${this.size()}`]: this.size(),\n    };\n  });\n}\n","<span [class]=\"classes()\"></span>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { MozStatusDotComponent } from '../status-dot/status-dot';\nimport { MozStatusBadgeStatus } from './model/status-badge.model';\n\n@Component({\n  selector: 'moz-status-badge',\n  imports: [MozStatusDotComponent],\n  templateUrl: './status-badge.html',\n  styleUrls: ['./status-badge.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozStatusBadgeComponent {\n  readonly label = input<string>();\n  readonly status = input<MozStatusBadgeStatus>('info');\n\n  readonly classes = computed(() => {\n    return {\n      'mc-status-badge': true,\n      [`mc-status-badge--${this.status()}`]: this.status(),\n    };\n  });\n}\n","<div [class]=\"classes()\">\n  <moz-status-dot [status]=\"status()\" />\n  <span class=\"mc-status-badge__label\">{{ label() }}</span>\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  contentChild,\n  input,\n  output,\n  Signal,\n  TemplateRef,\n  Type,\n} from '@angular/core';\nimport {\n  CheckCircle32,\n  Cross20,\n  CrossCircle32,\n  InfoCircle32,\n  WarningCircle32,\n} from '@mozaic-ds/icons-angular';\nimport { MozIconButtonComponent } from '../icon-button/icon-button';\nimport { NgComponentOutlet, NgTemplateOutlet } from '@angular/common';\nimport { MozStatusNotificationStatus } from './model/status-notification.model';\n\n@Component({\n  selector: 'moz-status-notification',\n  templateUrl: './status-notification.html',\n  styleUrls: ['./status-notification.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [Cross20, MozIconButtonComponent, NgComponentOutlet, NgTemplateOutlet],\n})\nexport class MozStatusNotificationComponent {\n  readonly id = input<string>('status-notification');\n  readonly title = input<string>();\n  readonly status = input<MozStatusNotificationStatus>('info');\n  readonly closable = input<boolean>(false);\n  readonly closed = output<void>();\n  readonly descriptionTpl = contentChild<TemplateRef<void>>('description', { descendants: false });\n  readonly footerTpl = contentChild<TemplateRef<void>>('footer', { descendants: false });\n\n  readonly classes = computed(() => ({\n    'mc-status-notification': true,\n    [`mc-status-notification--${this.status()}`]: this.status(),\n  }));\n\n  readonly iconComponent: Signal<Type<unknown>> = computed(() => {\n    switch (this.status()) {\n      case 'success':\n        return CheckCircle32;\n      case 'warning':\n        return WarningCircle32;\n      case 'error':\n        return CrossCircle32;\n      default:\n        return InfoCircle32;\n    }\n  });\n\n  onCloseClick(): void {\n    this.closed.emit();\n  }\n}\n","<section role=\"status\" [class]=\"classes()\" [id]=\"id()\">\n  <div class=\"mc-status-notification__icon\">\n    <ng-container [ngComponentOutlet]=\"iconComponent()\" />\n  </div>\n\n  <div class=\"mc-status-notification__content\">\n    @if(title()){\n    <span class=\"mc-status-notification__title\">{{ title() }}</span>\n    } @if (descriptionTpl()) {\n    <div class=\"mc-status-notification__message\">\n      <ng-container [ngTemplateOutlet]=\"descriptionTpl()\" />\n    </div>\n    } @if (footerTpl()) {\n    <div class=\"mc-status-notification__footer\">\n      <ng-container [ngTemplateOutlet]=\"footerTpl()\" />\n    </div>\n    }\n  </div>\n\n  @if (closable()) {\n  <moz-icon-button\n    size=\"s\"\n    class=\"mc-status-notification-closable__close\"\n    [ghost]=\"true\"\n    type=\"button\"\n    [appearance]=\"'standard'\"\n    (activated)=\"onCloseClick()\"\n    ariaLabel=\"Close notification\"\n    [id]=\"'status-notification-close-button'\"\n  >\n    <Cross20 icon />\n  </moz-icon-button>\n  }\n</section>\n","import { ChangeDetectionStrategy, Component, Type, input } from '@angular/core';\n\n@Component({\n  selector: 'moz-tab',\n  template: `<ng-content></ng-content>`,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozTabComponent {\n  id = input.required<string>();\n  label = input.required<string>();\n  icon = input<Type<unknown>>();\n  disabled = input(false);\n  routerLink = input<string>();\n  badge = input<number | string | undefined>();\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport {\n  AfterContentInit,\n  ChangeDetectionStrategy,\n  Component,\n  ContentChildren,\n  EventEmitter,\n  Output,\n  QueryList,\n  computed,\n  effect,\n  input,\n  model,\n  signal,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { MozDividerComponent } from '../divider/divider';\nimport { MozTabComponent } from './tab/tab';\nimport { MozTabItem } from './model/tab.model';\n\n@Component({\n  selector: 'moz-tabs',\n  templateUrl: './tabs.html',\n  styleUrls: ['./tabs.scss'],\n  imports: [NgComponentOutlet, RouterLink, MozDividerComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozTabsComponent implements AfterContentInit {\n  @ContentChildren(MozTabComponent) tabs!: QueryList<MozTabComponent>;\n\n  description = input<string | undefined>();\n  divider = input(true);\n  centered = input(false);\n  selectedIndex = model<number>(0);\n  tabsInput = input<MozTabItem[]>([], { alias: 'tabs' });\n\n  @Output() selectedIndexChange = new EventEmitter<number>();\n\n  tabsArray = signal<MozTabComponent[]>([]);\n  virtualTabs = signal<MozTabItem[]>([]);\n\n  constructor() {\n    effect(() => {\n      const inputTabs = this.tabsInput();\n      if (inputTabs.length > 0) {\n        this.virtualTabs.set(inputTabs);\n      }\n    });\n  }\n\n  ngAfterContentInit(): void {\n    this.tabsArray.set(this.tabs.toArray());\n    this.tabs.changes.subscribe(() => {\n      this.tabsArray.set(this.tabs.toArray());\n    });\n  }\n\n  hasVirtualTabs = computed(() => this.virtualTabs().length > 0);\n\n  readonly classes = computed(() => ({\n    'tabs': true,\n    'tabs--centered': this.centered(),\n  }));\n\n  isTabSelected = (index: number): boolean => index === this.selectedIndex();\n\n  getTabClasses(index: number) {\n    return computed(() => {\n      const tab = this.tabsArray()[index];\n      return {\n        'tabs__tab': true,\n        'tabs__tab--selected': this.isTabSelected(index),\n        'tabs__tab--disabled': !!tab?.disabled(),\n      };\n    });\n  }\n\n  getVirtualTabClasses(index: number) {\n    return computed(() => {\n      const tab = this.virtualTabs()[index];\n      return {\n        'tabs__tab': true,\n        'tabs__tab--selected': this.isTabSelected(index),\n        'tabs__tab--disabled': !!tab?.disabled,\n      };\n    });\n  }\n\n  onClickTab(index: number): void {\n    const tab = this.tabsArray()[index];\n    if (!tab || tab.disabled()) return;\n    if (index !== this.selectedIndex()) {\n      this.selectedIndexChange.emit(index);\n      this.selectedIndex.set(index);\n    }\n  }\n\n  onClickVirtualTab(index: number, tab: MozTabItem): void {\n    if (tab.disabled) return;\n    if (index !== this.selectedIndex()) {\n      this.selectedIndexChange.emit(index);\n      this.selectedIndex.set(index);\n    }\n  }\n}\n","<nav [class]=\"classes()\" aria-label=\"Tabs\">\n  <ul class=\"tabs__list\" role=\"tablist\" [attr.aria-label]=\"description()\">\n    @if (hasVirtualTabs()) { @for (tab of virtualTabs(); let index = $index; track index) {\n    <li class=\"tabs__item\" role=\"presentation\">\n      @if (tab.routerLink) {\n      <button\n        type=\"button\"\n        role=\"tab\"\n        [id]=\"tab.id\"\n        [class]=\"getVirtualTabClasses(index)()\"\n        [routerLink]=\"tab.routerLink\"\n        [attr.aria-selected]=\"isTabSelected(index)\"\n        (click)=\"onClickTab(index)\"\n      >\n        @if (tab.icon) {\n        <span class=\"tabs__icon\" aria-hidden=\"true\">\n          <ng-container [ngComponentOutlet]=\"tab.icon\"></ng-container>\n        </span>\n        }\n        <div class=\"tabs__label\">\n          <span>{{ tab.label }}</span>\n        </div>\n        @if (tab.badge != null) {\n        <span class=\"mc-number-badge mc-tabs__badge\" [class.mc-number-badge--accent]=\"isTabSelected(index)\">{{ tab.badge }}</span>\n        }\n      </button>\n      } @else {\n      <button\n        type=\"button\"\n        role=\"tab\"\n        [id]=\"tab.id\"\n        [class]=\"getVirtualTabClasses(index)()\"\n        [attr.aria-selected]=\"isTabSelected(index)\"\n        (click)=\"onClickVirtualTab(index, tab)\"\n      >\n        @if (tab.icon) {\n        <span class=\"tabs__icon\" aria-hidden=\"true\">\n          <ng-container [ngComponentOutlet]=\"tab.icon\"></ng-container>\n        </span>\n        }\n        <div class=\"tabs__label\">\n          <span>{{ tab.label }}</span>\n        </div>\n        @if (tab.badge != null) {\n        <span class=\"mc-number-badge mc-tabs__badge\" [class.mc-number-badge--accent]=\"isTabSelected(index)\">{{ tab.badge }}</span>\n        }\n      </button>\n      }\n    </li>\n    } } @else { @for (tab of tabsArray(); let index = $index; track index) {\n    <li class=\"tabs__item\" role=\"presentation\">\n      @if (tab.routerLink()) {\n      <button\n        type=\"button\"\n        role=\"tab\"\n        [id]=\"tab.id()\"\n        [class]=\"getTabClasses(index)()\"\n        [routerLink]=\"tab.routerLink()\"\n        [attr.aria-selected]=\"isTabSelected(index)\"\n        (click)=\"onClickTab(index)\"\n      >\n        @if (tab.icon()) {\n        <span class=\"tabs__icon\" aria-hidden=\"true\">\n          <ng-container [ngComponentOutlet]=\"tab.icon() ?? null\"></ng-container>\n        </span>\n        }\n        <div class=\"tabs__label\">\n          <span>{{ tab.label() }}</span>\n        </div>\n        @if (tab.badge() != null) {\n        <span class=\"mc-number-badge mc-tabs__badge\" [class.mc-number-badge--accent]=\"isTabSelected(index)\">{{ tab.badge() }}</span>\n        }\n      </button>\n      } @else {\n      <button\n        type=\"button\"\n        role=\"tab\"\n        [id]=\"tab.id()\"\n        [class]=\"getTabClasses(index)()\"\n        [attr.aria-selected]=\"isTabSelected(index)\"\n        (click)=\"onClickTab(index)\"\n      >\n        @if (tab.icon()) {\n        <span class=\"tabs__icon\" aria-hidden=\"true\">\n          <ng-container [ngComponentOutlet]=\"tab.icon() ?? null\"></ng-container>\n        </span>\n        }\n        <div class=\"tabs__label\">\n          <span>{{ tab.label() }}</span>\n        </div>\n        @if (tab.badge() != null) {\n        <span class=\"mc-number-badge mc-tabs__badge\" [class.mc-number-badge--accent]=\"isTabSelected(index)\">{{ tab.badge() }}</span>\n        }\n      </button>\n      }\n    </li>\n    } }\n  </ul>\n\n  @if (divider()) {\n  <moz-divider></moz-divider>\n  }\n</nav>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  forwardRef,\n  input,\n  output,\n  signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CrossCircleFilled24 } from '@mozaic-ds/icons-angular';\nimport { MozNumberBadgeComponent } from '../number-badge/number-badge';\nimport { MozTagSize, MozTagType } from './model/tag.model';\n\n@Component({\n  selector: 'moz-tag',\n  imports: [CrossCircleFilled24, MozNumberBadgeComponent, NgTemplateOutlet],\n  templateUrl: './tag.html',\n  styleUrls: ['./tag.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozTagComponent),\n      multi: true,\n    },\n  ],\n})\nexport class MozTagComponent implements ControlValueAccessor {\n  readonly type = input<MozTagType>('informative');\n  readonly size = input<MozTagSize>('m');\n  readonly id = input.required<string>();\n  readonly name = input<string>();\n  readonly disabled = input<boolean>(false);\n  readonly contextualisedNumber = input<number>(99);\n  readonly removableLabel = input<string>('Remove');\n\n  readonly _value = signal<boolean>(true);\n\n  readonly removeTag = output<string>();\n\n  readonly classes = computed(() => ({\n    [`tag-${this.type()}`]: this.type(),\n    [`tag--${this.size()}`]: this.size(),\n  }));\n\n  private onChange: (value: boolean) => void = () => void 0;\n  private onTouched: () => void = () => void 0;\n\n  writeValue(value: boolean): void {\n    this._value.set(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  onCheckboxChange(event: Event): void {\n    const checked = (event.target as HTMLInputElement).checked;\n    this._value.set(checked);\n    this.onChange(checked);\n    this.onTouched();\n  }\n\n  onRemove(): void {\n    this.removeTag.emit(this.id());\n  }\n}\n","<ng-template #labelTemplate>\n  <ng-content />\n</ng-template>\n\n<!-- Selectable -->\n@if (type() === 'selectable') {\n<label class=\"tag\" [class]=\"classes()\" [attr.for]=\"id()\">\n  <input\n    type=\"checkbox\"\n    class=\"tag__input\"\n    [id]=\"id()\"\n    [name]=\"name()\"\n    [checked]=\"_value()\"\n    [disabled]=\"disabled()\"\n    (change)=\"onCheckboxChange($event)\"\n  />\n  <span class=\"tag__label\">\n    <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\n  </span>\n</label>\n}\n<!-- Interactive -->\n@if (type() === 'interactive') {\n<button type=\"button\" class=\"tag\" [class]=\"classes()\" [disabled]=\"disabled()\">\n  <span class=\"tag__label\">\n    <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\n  </span>\n</button>\n}\n<!-- Contextualised -->\n@if (type() === 'contextualised') {\n<button type=\"button\" class=\"tag\" [class]=\"classes()\" [disabled]=\"disabled()\">\n  <moz-number-badge\n    appearance=\"inverse\"\n    [label]=\"contextualisedNumber()\"\n    [size]=\"size() === 'l' ? 'm' : 's'\"\n  />\n  <span class=\"tag__label\">\n    <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\n  </span>\n</button>\n}\n<!-- Removable -->\n@if (type() === 'removable') {\n<span class=\"tag\" [class]=\"classes()\">\n  <span class=\"tag__label\">\n    <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\n  </span>\n  <button class=\"tag-removable__remove\" type=\"button\" (click)=\"onRemove()\">\n    <CrossCircleFilled24 class=\"tag-removable__icon\" aria-hidden=\"true\" />\n    <span class=\"tag-removable__text\">{{ removableLabel() }}</span>\n  </button>\n</span>\n}\n<!-- Informative -->\n@if (type() === 'informative') {\n<span class=\"tag\" [class]=\"classes()\">\n  <span class=\"tag__label\">\n    <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\n  </span>\n</span>\n}\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  ElementRef,\n  forwardRef,\n  input,\n  OnDestroy,\n  Renderer2,\n  signal,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/**\n * Directive that transforms a simple textarea into a styled textarea.\n * Applies Mozaic Design System styles to native textarea elements.\n */\n@Component({\n  selector: 'textarea[moz-text-area]',\n  template: '',\n  styleUrls: ['./text-area.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozTextarea),\n      multi: true,\n    },\n  ],\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    '[class.textarea]': 'true',\n    '[class.is-invalid]': 'isInvalid()',\n    '[class.is-disabled]': 'isDisabledState()',\n    '[attr.aria-invalid]': 'isInvalid()',\n    '[disabled]': 'isDisabledState()',\n    '(input)': 'handleInput($event)',\n    '(blur)': 'onTouched()',\n  },\n})\nexport class MozTextarea implements ControlValueAccessor, AfterViewInit, OnDestroy {\n  readonly isInvalid = input<boolean>(false);\n  readonly disabled = input<boolean>(false);\n  readonly rows = input<number>(2);\n  readonly minLength = input<number | undefined>();\n  readonly maxLength = input<number | undefined>();\n\n  private _value = signal<string>('');\n  private _isDisabled = signal<boolean>(false);\n\n  readonly isDisabledState = computed(() => this.disabled() || this._isDisabled());\n\n  onChange: (value: string) => void = () => void 0;\n  onTouched: () => void = () => void 0;\n\n  constructor(private elementRef: ElementRef<HTMLTextAreaElement>, private renderer: Renderer2) {}\n\n  ngAfterViewInit(): void {\n    this.applyAttributes();\n  }\n\n  ngOnDestroy(): void {\n    // Cleanup if needed\n  }\n\n  private applyAttributes(): void {\n    const textarea = this.elementRef.nativeElement;\n\n    if (this.rows()) {\n      this.renderer.setAttribute(textarea, 'rows', String(this.rows()));\n    }\n\n    if (this.minLength() !== undefined) {\n      this.renderer.setAttribute(textarea, 'minlength', String(this.minLength()));\n    }\n\n    if (this.maxLength() !== undefined) {\n      this.renderer.setAttribute(textarea, 'maxlength', String(this.maxLength()));\n    }\n  }\n\n  handleInput(event: Event): void {\n    const value = (event.target as HTMLTextAreaElement).value;\n    this._value.set(value);\n    this.onChange(value);\n  }\n\n  writeValue(value: string): void {\n    const normalizedValue = value ?? '';\n    this._value.set(normalizedValue);\n    this.renderer.setProperty(this.elementRef.nativeElement, 'value', normalizedValue);\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._isDisabled.set(isDisabled);\n    this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);\n  }\n}\n","import {\n  AfterViewInit,\n  ApplicationRef,\n  ChangeDetectionStrategy,\n  Component,\n  ComponentRef,\n  computed,\n  createComponent,\n  effect,\n  ElementRef,\n  EnvironmentInjector,\n  forwardRef,\n  inject,\n  input,\n  Injector,\n  OnDestroy,\n  Renderer2,\n  signal,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CrossCircleFilled24 } from '@mozaic-ds/icons-angular';\n\nexport type MozTextInputSize = 's' | 'm';\n\n@Component({\n  selector: 'input[moz-text-input]',\n  template: '',\n  styleUrls: ['./text-input.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozTextInput),\n      multi: true,\n    },\n  ],\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    '[class]': '\"text-input__control\"',\n    '[attr.aria-invalid]': 'isInvalid()',\n    '[readOnly]': 'readonly()',\n    '[disabled]': 'isDisabledState()',\n    '(input)': 'onInput($event)',\n    '(blur)': 'onTouched()',\n  },\n})\nexport class MozTextInput implements ControlValueAccessor, AfterViewInit, OnDestroy {\n  readonly isInvalid = input<boolean>(false);\n  readonly disabled = input<boolean>(false);\n  readonly readonly = input<boolean>(false);\n  readonly size = input<MozTextInputSize>('m');\n  readonly clearable = input<boolean>(false);\n  readonly clearLabel = input<string>('Clear content');\n  readonly prefix = input<string>('');\n  readonly suffix = input<string>('');\n\n  private wrapper: HTMLElement | null = null;\n  private clearButton: HTMLElement | null = null;\n  private iconContainer: HTMLElement | null = null;\n  private iconComponentRef: ComponentRef<CrossCircleFilled24> | null = null;\n  private _value = signal<string>('');\n  private _isDisabled = signal<boolean>(false);\n\n  readonly isClearable = computed(() => this.clearable() && this._value());\n  readonly isDisabledState = computed(() => this.disabled() || this._isDisabled());\n\n  private environmentInjector = inject(EnvironmentInjector);\n  private applicationRef = inject(ApplicationRef);\n  private renderer = inject(Renderer2);\n  private elementRef = inject(ElementRef<HTMLInputElement>);\n  private injector = inject(Injector);\n\n  ngAfterViewInit(): void {\n    this.wrapInput();\n    this.setupEffects();\n  }\n\n  ngOnDestroy(): void {\n    if (this.iconComponentRef) {\n      this.applicationRef.detachView(this.iconComponentRef.hostView);\n      this.iconComponentRef.destroy();\n    }\n  }\n\n  private setupEffects(): void {\n    // Effect pour mettre à jour la classe 'is-invalid'\n    effect(\n      () => {\n        if (this.wrapper) {\n          if (this.isInvalid()) {\n            this.renderer.addClass(this.wrapper, 'is-invalid');\n          } else {\n            this.renderer.removeClass(this.wrapper, 'is-invalid');\n          }\n        }\n      },\n      { injector: this.injector }\n    );\n\n    // Effect pour mettre à jour la classe de taille\n    effect(\n      () => {\n        if (this.wrapper) {\n          // Retirer toutes les classes de taille existantes\n          this.renderer.removeClass(this.wrapper, 'text-input--s');\n          this.renderer.removeClass(this.wrapper, 'text-input--m');\n\n          // Ajouter la nouvelle classe de taille\n          if (this.size()) {\n            this.renderer.addClass(this.wrapper, `text-input--${this.size()}`);\n          }\n        }\n      },\n      { injector: this.injector }\n    );\n\n    // Effect pour mettre à jour la visibilité du bouton clear\n    effect(\n      () => {\n        this.updateClearButtonVisibility();\n      },\n      { injector: this.injector }\n    );\n  }\n\n  private wrapInput(): void {\n    const input = this.elementRef.nativeElement;\n    const parent = input.parentElement;\n\n    if (!parent) return;\n\n    this.wrapper = this.renderer.createElement('div');\n    this.renderer.addClass(this.wrapper, 'text-input');\n\n    // Appliquer les classes initiales\n    if (this.size()) {\n      this.renderer.addClass(this.wrapper, `text-input--${this.size()}`);\n    }\n    if (this.isInvalid()) {\n      this.renderer.addClass(this.wrapper, 'is-invalid');\n    }\n\n    this.renderer.insertBefore(parent, this.wrapper, input);\n\n    const iconElement = this.findIconElement(parent);\n    if (iconElement) {\n      this.createIconContainer(iconElement);\n    }\n\n    // Add prefix before input\n    if (this.prefix()) {\n      this.createAddon(this.prefix(), 'prefix');\n    }\n\n    // Move input into wrapper\n    this.renderer.appendChild(this.wrapper, input);\n\n    // Add suffix after input\n    if (this.suffix()) {\n      this.createAddon(this.suffix(), 'suffix');\n    }\n\n    if (this.clearable()) {\n      this.createClearButton();\n    }\n  }\n\n  private createAddon(text: string, type: 'prefix' | 'suffix'): void {\n    if (!this.wrapper) return;\n\n    const addon = this.renderer.createElement('span');\n    this.renderer.addClass(addon, 'text-input__addon');\n    this.renderer.addClass(addon, `text-input__addon--${type}`);\n    this.renderer.setProperty(addon, 'textContent', text);\n    this.renderer.appendChild(this.wrapper, addon);\n  }\n\n  private findIconElement(parent: HTMLElement): Element | null {\n    const children = Array.from(parent.children);\n    return children.find((child) => child.hasAttribute('icon')) || null;\n  }\n\n  private createIconContainer(iconElement: Element): void {\n    if (!this.wrapper) return;\n\n    this.iconContainer = this.renderer.createElement('div');\n    this.renderer.addClass(this.iconContainer, 'text-input__icon');\n    this.renderer.appendChild(this.iconContainer, iconElement);\n    this.renderer.appendChild(this.wrapper, this.iconContainer);\n  }\n\n  private createClearButton(): void {\n    if (!this.wrapper) return;\n\n    const controlsDiv = this.renderer.createElement('div');\n    this.renderer.addClass(controlsDiv, 'controls-options');\n\n    this.clearButton = this.renderer.createElement('button');\n    this.renderer.setAttribute(this.clearButton, 'type', 'button');\n    this.renderer.addClass(this.clearButton, 'controls-options__button');\n    this.renderer.listen(this.clearButton, 'click', () => this.clearValue());\n\n    this.iconComponentRef = createComponent(CrossCircleFilled24, {\n      environmentInjector: this.environmentInjector,\n    });\n\n    // Attacher la vue à ApplicationRef pour activer la détection de changements\n    this.applicationRef.attachView(this.iconComponentRef.hostView);\n\n    const iconElement = this.iconComponentRef.location.nativeElement;\n    this.renderer.addClass(iconElement, 'controls-options__icon');\n    this.renderer.setAttribute(iconElement, 'aria-hidden', 'true');\n\n    const label = this.renderer.createElement('span');\n    this.renderer.addClass(label, 'controls-options__label');\n    this.renderer.setProperty(label, 'textContent', this.clearLabel());\n\n    this.renderer.appendChild(this.clearButton, iconElement);\n    this.renderer.appendChild(this.clearButton, label);\n    this.renderer.appendChild(controlsDiv, this.clearButton);\n    this.renderer.appendChild(this.wrapper, controlsDiv);\n\n    this.updateClearButtonVisibility();\n  }\n\n  private updateClearButtonVisibility(): void {\n    if (!this.clearButton || !this.clearable()) return;\n\n    const parent = this.clearButton.parentElement;\n    if (parent) {\n      if (this.isClearable()) {\n        this.renderer.setStyle(parent, 'display', 'flex');\n      } else {\n        this.renderer.setStyle(parent, 'display', 'none');\n      }\n    }\n  }\n\n  clearValue(): void {\n    this._value.set('');\n    const input = this.elementRef.nativeElement;\n    this.renderer.setProperty(input, 'value', '');\n    this.onChange('');\n    this.onTouched();\n    const event = new Event('input', { bubbles: true });\n    input.dispatchEvent(event);\n  }\n\n  onInput(event: Event): void {\n    const value = (event.target as HTMLInputElement).value;\n    this._value.set(value);\n    this.onChange(value);\n  }\n\n  onChange: (value: string | number) => void = () => void 0;\n  onTouched: () => void = () => void 0;\n\n  writeValue(value: string | number): void {\n    const normalizedValue = value == null ? '' : String(value);\n    this._value.set(normalizedValue);\n    this.renderer.setProperty(this.elementRef.nativeElement, 'value', normalizedValue);\n  }\n\n  registerOnChange(fn: (value: string | number) => 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._isDisabled.set(isDisabled);\n    this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  forwardRef,\n  input,\n  signal,\n} from '@angular/core';\nimport {\n  ControlValueAccessor,\n  FormsModule,\n  NG_VALUE_ACCESSOR,\n  ReactiveFormsModule,\n} from '@angular/forms';\nimport { MozToggleSize } from './model/toggle.model';\n\n@Component({\n  selector: 'moz-toggle',\n  imports: [FormsModule, ReactiveFormsModule],\n  templateUrl: './toggle.html',\n  styleUrls: ['./toggle.scss'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozToggleComponent),\n      multi: true,\n    },\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozToggleComponent implements ControlValueAccessor {\n  readonly id = input.required<string>();\n  readonly name = input<string | undefined>();\n  readonly size = input<MozToggleSize>('s');\n  readonly disabled = input<boolean>(false);\n  readonly classes = computed(() => {\n    return {\n      'toggle': true,\n      [`toggle--${this.size()}`]: this.size(),\n    };\n  });\n\n  _value = signal(false);\n\n  onChange: (_: boolean) => void = () => void 0;\n  onTouched: () => void = () => void 0;\n\n  writeValue(value: boolean): void {\n    this._value.set(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  onInputChange(event: Event): void {\n    const checked = (event.target as HTMLInputElement).checked;\n    this._value.set(checked);\n    this.onChange(checked);\n    this.onTouched();\n  }\n}\n","<div [class]=\"classes()\">\n  <label class=\"toggle__container\">\n    <input\n      [id]=\"id()\"\n      type=\"checkbox\"\n      class=\"toggle__input\"\n      [name]=\"name()\"\n      [checked]=\"_value()\"\n      [disabled]=\"disabled()\"\n      (change)=\"onInputChange($event)\"\n      [attr.aria-labelledby]=\"id() + '-label'\"\n      [attr.aria-disabled]=\"disabled()\"\n      [attr.aria-checked]=\"_value()\"\n    />\n    <span class=\"toggle__label\" [id]=\"id() + '-label'\" [attr.for]=\"id()\">\n      <ng-content></ng-content>\n    </span>\n  </label>\n</div>\n","import { Component, input, ChangeDetectionStrategy, computed } from '@angular/core';\nimport { MozFlagType } from './model/flag.model';\n\n@Component({\n  selector: 'moz-flag',\n  templateUrl: './flag.html',\n  styleUrls: ['./flag.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozFlagComponent {\n  readonly type = input<MozFlagType>('default');\n\n  readonly classes = computed(() => {\n    const baseClass = 'flag';\n    switch (this.type()) {\n      case 'accent':\n        return `${baseClass} flag--accent`;\n      case 'danger':\n        return `${baseClass} flag--danger`;\n      case 'inverse':\n        return `${baseClass} flag--inverse`;\n      default:\n        return baseClass;\n    }\n  });\n}\n","<div [class]=\"classes()\">\n  <span class=\"flag__label\">\n    <ng-content />\n  </span>\n</div>\n","import {\n  Component,\n  input,\n  signal,\n  ChangeDetectionStrategy,\n  forwardRef,\n  computed,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CrossCircle24 } from '@mozaic-ds/icons-angular';\nimport { MozDatepickerSize } from './model/datepicker.model';\n\n@Component({\n  selector: 'moz-datepicker',\n  templateUrl: './datepicker.html',\n  styleUrls: ['./datepicker.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozDatepickerComponent),\n      multi: true,\n    },\n  ],\n  imports: [CrossCircle24],\n})\nexport class MozDatepickerComponent implements ControlValueAccessor {\n  readonly id = input.required<string>();\n  readonly disabled = input<boolean>(false);\n  readonly readonly = input<boolean>(false);\n  readonly invalid = input<boolean>(false);\n  readonly error = input<string | undefined>(undefined);\n  readonly clearable = input<boolean>(false);\n  readonly size = input<MozDatepickerSize>('default');\n  readonly label = input<string>('Date');\n\n  readonly _value = signal<string | null>(null);\n\n  readonly classes = computed(() => ({\n    'mc-datepicker': true,\n    'mc-text-input': true,\n    'is-invalid': this.invalid(),\n    'mc-datepicker--s': this.size() === 's',\n    'mc-text-input--s': this.size() === 's',\n  }));\n\n  private onChange: (value: string | null) => void = () => void 0;\n  private onTouched: () => void = () => void 0;\n\n  writeValue(val: string | null): void {\n    this._value.set(val);\n  }\n\n  registerOnChange(fn: (val: string | null) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  onInput(event: Event) {\n    const input = event.target as HTMLInputElement;\n    const newVal = input.value || null;\n    this._value.set(newVal);\n    this.onChange(newVal);\n  }\n\n  onClear() {\n    this._value.set(null);\n    this.onChange(null);\n  }\n\n  onBlur() {\n    this.onTouched();\n  }\n}\n","<div class=\"mc-field\">\n  <label class=\"mc-field__label\" [attr.for]=\"id()\"> {{ label() }} </label>\n\n  <div class=\"mc-field__content\">\n    <div [class]=\"classes()\">\n      <input\n        type=\"date\"\n        [id]=\"id()\"\n        class=\"mc-datepicker__control mc-text-input__control\"\n        [value]=\"_value() ?? ''\"\n        [disabled]=\"disabled()\"\n        [readonly]=\"readonly()\"\n        (input)=\"onInput($event)\"\n        (blur)=\"onBlur()\"\n        [attr.aria-invalid]=\"invalid()\"\n      />\n\n      @if (clearable() && !disabled() && !readonly() && _value()) {\n      <div class=\"mc-controls-options mc-datepicker__controls-options\">\n        <button\n          type=\"button\"\n          class=\"mc-controls-options__button\"\n          (click)=\"onClear()\"\n          aria-label=\"Clear\"\n          tabindex=\"-1\"\n        >\n          <CrossCircle24 class=\"mc-controls-options__icon\" />\n          <span class=\"mc-controls-options__label\">Clear content</span>\n        </button>\n      </div>\n      }\n    </div>\n  </div>\n\n  @if (invalid() && error()) {\n  <span class=\"mc-field__validation-message is-invalid\"> {{ error() }} </span>\n  }\n</div>\n","import { Component, input, computed, ChangeDetectionStrategy } from '@angular/core';\nimport { MozTooltipPosition } from './model/tooltip.model';\n\n@Component({\n  selector: 'moz-tooltip',\n  templateUrl: './tooltip.html',\n  styleUrls: ['./tooltip.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozTooltipComponent {\n  readonly id = input.required<string>();\n  readonly position = input<MozTooltipPosition>('top');\n  readonly noPointer = input<boolean>(false);\n  readonly standalone = input<boolean>(false);\n  content = '';\n\n  readonly classes = computed(() => ({\n    'tooltip': true,\n    [`tooltip--${this.position()}`]: !!this.position(),\n    'tooltip--no-pointer': this.noPointer(),\n    'tooltip--standalone': this.standalone(),\n  }));\n}\n","<div [class]=\"classes()\">\n  @if (!standalone()) {\n  <div>\n    <ng-content select=\"[trigger]\"></ng-content>\n  </div>\n  }\n\n  <span [id]=\"id()\" class=\"tooltip__content\" role=\"tooltip\">\n    @if (content) {\n    {{ content }}\n    } @else {\n    <ng-content select=\"[content]\"></ng-content>\n    }\n  </span>\n</div>\n","import { Directive, ElementRef, HostListener, OnDestroy, inject, Input } from '@angular/core';\nimport {\n  Overlay,\n  OverlayRef,\n  OverlayPositionBuilder,\n  ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { MozTooltipComponent } from './tooltip';\nimport { MozTooltipPosition } from './model/tooltip.model';\n\n@Directive({\n  selector: '[mozTooltip]',\n})\nexport class MozTooltipDirective implements OnDestroy {\n  @Input('mozTooltip') content = '';\n  @Input() tooltipPosition: MozTooltipPosition = 'top';\n  @Input() tooltipNoPointer = false;\n\n  private overlayRef: OverlayRef | null = null;\n  private overlay = inject(Overlay);\n  private overlayPositionBuilder = inject(OverlayPositionBuilder);\n  private elementRef = inject(ElementRef);\n\n  @HostListener('mouseenter')\n  show(): void {\n    if (this.overlayRef?.hasAttached()) {\n      return;\n    }\n\n    const offset = 20;\n    const positionStrategy = this.overlayPositionBuilder\n      .flexibleConnectedTo(this.elementRef)\n      .withPositions(this.getPositions());\n\n    if (this.tooltipPosition === 'top') {\n      positionStrategy.withDefaultOffsetY(-offset);\n    } else if (this.tooltipPosition === 'bottom') {\n      positionStrategy.withDefaultOffsetY(offset);\n    } else if (this.tooltipPosition === 'left') {\n      positionStrategy.withDefaultOffsetX(-offset);\n    } else if (this.tooltipPosition === 'right') {\n      positionStrategy.withDefaultOffsetX(offset);\n    }\n\n    this.overlayRef = this.overlay.create({\n      positionStrategy,\n      scrollStrategy: this.overlay.scrollStrategies.reposition(),\n    });\n\n    const tooltipPortal = new ComponentPortal(MozTooltipComponent);\n    const tooltipRef = this.overlayRef.attach(tooltipPortal);\n\n    tooltipRef.setInput('id', `tooltip-${Math.random().toString(36).substr(2, 9)}`);\n    tooltipRef.setInput('position', this.tooltipPosition);\n    tooltipRef.setInput('noPointer', this.tooltipNoPointer);\n    tooltipRef.setInput('standalone', true);\n    tooltipRef.instance.content = this.content;\n  }\n\n  @HostListener('mouseleave')\n  hide(): void {\n    if (this.overlayRef) {\n      this.overlayRef.detach();\n    }\n  }\n\n  ngOnDestroy(): void {\n    if (this.overlayRef) {\n      this.overlayRef.dispose();\n    }\n  }\n\n  private getPositions(): ConnectedPosition[] {\n    const positions: Record<MozTooltipPosition, ConnectedPosition> = {\n      top: {\n        originX: 'center',\n        originY: 'top',\n        overlayX: 'center',\n        overlayY: 'bottom',\n      },\n      bottom: {\n        originX: 'center',\n        originY: 'bottom',\n        overlayX: 'center',\n        overlayY: 'top',\n      },\n      left: {\n        originX: 'start',\n        originY: 'center',\n        overlayX: 'end',\n        overlayY: 'center',\n      },\n      right: {\n        originX: 'end',\n        originY: 'center',\n        overlayX: 'start',\n        overlayY: 'center',\n      },\n    };\n\n    return [positions[this.tooltipPosition]];\n  }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { MozCircularProgessBarSize } from './model/circular-progress-bar.model';\n\n@Component({\n  selector: 'moz-circular-progress-bar',\n  templateUrl: './ciruclar-progress-bar.html',\n  styleUrls: ['./circular-progress-bar.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozCircularProgressBarComponent {\n  readonly valuePercent = input<number>(0);\n  readonly size = input<MozCircularProgessBarSize>('l');\n  readonly ariaLabel = input<string>('Progress bar');\n  readonly numberLabel = input<string | null>(null);\n  readonly textLabel = input<string | null>(null);\n  readonly showPercentage = input<boolean>(false);\n\n  readonly classes = computed(() => {\n    const classes = ['mc-circular-progressbar'];\n    if (this.size() === 's') classes.push('mc-circular-progressbar--s');\n    if (this.size() === 'm') classes.push('mc-circular-progressbar--m');\n    return classes.join(' ');\n  });\n\n  readonly hasNumberOrText = computed(() => !!(this.numberLabel() || this.textLabel()));\n}\n","<div\n  [class]=\"classes()\"\n  role=\"progressbar\"\n  [attr.aria-label]=\"ariaLabel()\"\n  aria-valuemin=\"0\"\n  aria-valuemax=\"100\"\n  [attr.aria-valuenow]=\"valuePercent()\"\n  [style.--progress-value]=\"valuePercent()\"\n>\n  <svg\n    class=\"mc-circular-progressbar__line\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    aria-hidden=\"true\"\n    viewBox=\"0 0 100 100\"\n  >\n    <circle class=\"mc-circular-progressbar__track\" cx=\"50\" cy=\"50\" r=\"46\"></circle>\n    <circle class=\"mc-circular-progressbar__indicator\" cx=\"50\" cy=\"50\" r=\"46\"></circle>\n  </svg>\n\n  @if (showPercentage()) {\n  <div class=\"mc-circular-progressbar__percentage\">\n    <p class=\"mc-circular-progressbar__value\">{{ valuePercent() }}</p>\n    <p class=\"mc-circular-progressbar__unit\">%</p>\n  </div>\n  } @else if (hasNumberOrText()) {\n  <div class=\"mc-circular-progressbar__content\">\n    @if (numberLabel()) {\n    <p class=\"mc-circular-progressbar__number\">{{ numberLabel() }}</p>\n    } @if (textLabel()) {\n    <p class=\"mc-circular-progressbar__text\">{{ textLabel() }}</p>\n    }\n  </div>\n  }\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n@Component({\n  selector: 'moz-linear-progress-bar-percentage',\n  templateUrl: './linear-progress-bar-percentage.html',\n  styleUrls: ['./linear-progress-bar-percentage.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozLinearProgressBarPercentageComponent {\n  readonly valuePercent = input<number>(0);\n  readonly ariaLabel = input<string>('Progress bar');\n  readonly showLabel = input<boolean>(false);\n}\n","<div class=\"mc-linear-progressbar-percentage\">\n    <div\n        class=\"mc-linear-progressbar-percentage__indicator\"\n        role=\"progressbar\"\n        [style.--progress-value]=\"valuePercent()\"\n        [attr.aria-label]=\"ariaLabel()\"\n        [attr.aria-valuenow]=\"valuePercent()\"\n        aria-valuemin=\"0\"\n        aria-valuemax=\"100\"\n    >\n        @if (showLabel()) {\n        <div class=\"mc-linear-progressbar-percentage__label\">\n            <p class=\"mc-linear-progressbar-percentage__value\">\n                {{ valuePercent() }}<span\n                    class=\"mc-linear-progressbar-percentage__unit\"\n                    >%</span\n                >\n            </p>\n        </div>\n        }\n    </div>\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  contentChild,\n  input,\n  TemplateRef,\n} from '@angular/core';\nimport { ImageAlt32 } from '@mozaic-ds/icons-angular';\nimport { MozCalloutVariant } from './model/callout.model';\n\n@Component({\n  selector: 'moz-callout',\n  imports: [ImageAlt32, NgTemplateOutlet],\n  templateUrl: './callout.html',\n  styleUrls: ['./callout.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozCalloutComponent {\n  readonly title = input<string | null>(null);\n  readonly message = input<string | null>(null);\n  readonly role = input<string>('status');\n  readonly variant = input<MozCalloutVariant>('default');\n  readonly footerTpl = contentChild<TemplateRef<void>>('footer', { descendants: false });\n\n  readonly classes = computed(() => {\n    const classes = ['mc-callout'];\n    if (this.variant() === 'default') classes.push('mc-callout--default');\n    if (this.variant() === 'inverse') classes.push('mc-callout--inverse');\n    if (this.variant() === 'tips') classes.push('mc-callout--tips');\n    if (this.variant() === 'accent') classes.push('mc-callout--accent');\n    return classes.join(' ');\n  });\n}\n","<section [attr.role]=\"role()\" [class]=\"classes()\">\n  <ImageAlt32 class=\"mc-callout__icon\" />\n  <div class=\"mc-callout__content\">\n    @if (title()) {\n    <h2 class=\"mc-callout__title\">{{ title() }}</h2>\n    } @if (message()) {\n    <p class=\"mc-callout__message\">{{ message() }}</p>\n    } @if (footerTpl()) {\n    <div class=\"mc-callout__footer\">\n      <ng-container [ngTemplateOutlet]=\"footerTpl()\" />\n    </div>\n    }\n  </div>\n</section>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { MozAvatarSize } from './model/avatar.model';\n\n@Component({\n  selector: 'moz-avatar',\n  templateUrl: './avatar.html',\n  styleUrls: ['./avatar.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozAvatarComponent {\n  readonly size = input<MozAvatarSize>('s');\n\n  readonly classes = computed(() => {\n    const size = this.size();\n    return ['mc-avatar', size === 'm' ? 'mc-avatar--m' : '', size === 'l' ? 'mc-avatar--l' : '']\n      .filter(Boolean)\n      .join(' ');\n  });\n}\n","<div [class]=\"classes()\">\n  <ng-content></ng-content>\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  forwardRef,\n  input,\n  computed,\n  booleanAttribute,\n  signal,\n  effect,\n} from '@angular/core';\nimport {\n  NG_VALUE_ACCESSOR,\n  ControlValueAccessor,\n  FormsModule,\n  ReactiveFormsModule,\n} from '@angular/forms';\nimport { ChevronDown24 } from '@mozaic-ds/icons-angular';\nimport parsePhoneNumberFromString, {\n  isValidPhoneNumber,\n  getCountries,\n  getCountryCallingCode,\n  getExampleNumber,\n  type CountryCode,\n  type Examples,\n} from 'libphonenumber-js';\nimport examples from 'libphonenumber-js/mobile/examples';\nimport {\n  MozPhoneNumberCountry,\n  MozPhoneNumberValue,\n  MozPhoneNumberSize,\n} from './model/phone-number-input.model';\n\nlet UID = 0;\n\n@Component({\n  selector: 'moz-phone-number',\n  imports: [FormsModule, ReactiveFormsModule, ChevronDown24],\n  templateUrl: './phone-number-input.html',\n  styleUrls: ['./phone-number-input.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozPhoneNumberComponent),\n      multi: true,\n    },\n  ],\n})\nexport class MozPhoneNumberComponent implements ControlValueAccessor {\n  readonly label = input<string>('Phone number');\n  readonly requirementText = input<string | null>('(required / optional)');\n  readonly showRequirement = input<boolean, unknown>(true, {\n    transform: booleanAttribute,\n  });\n  readonly helpText = input<string | null>('Help text');\n  readonly size = input<MozPhoneNumberSize>('m');\n  readonly placeholder = input<string | null>(null);\n  readonly defaultCountry = input<string>('fr');\n  readonly locale = input<string>('en');\n\n  readonly countryCodes = input<string[] | null>(null);\n\n  readonly countries = input<MozPhoneNumberCountry[]>([\n    {\n      code: 'br',\n      name: 'Brazil',\n      dialCode: '+55',\n    },\n    {\n      code: 'fr',\n      name: 'France',\n      dialCode: '+33',\n    },\n    {\n      code: 'gr',\n      name: 'Greece',\n      dialCode: '+30',\n    },\n    {\n      code: 'it',\n      name: 'Italy',\n      dialCode: '+39',\n    },\n    {\n      code: 'pl',\n      name: 'Poland',\n      dialCode: '+48',\n    },\n    {\n      code: 'pt',\n      name: 'Portugal',\n      dialCode: '+351',\n    },\n    {\n      code: 'ro',\n      name: 'Romania',\n      dialCode: '+40',\n    },\n    {\n      code: 'za',\n      name: 'South Africa',\n      dialCode: '+27',\n    },\n    {\n      code: 'es',\n      name: 'Spain',\n      dialCode: '+34',\n    },\n    {\n      code: 'ua',\n      name: 'Ukraine',\n      dialCode: '+380',\n    },\n  ]);\n\n  readonly showCountrySelect = input<boolean, unknown>(true, {\n    transform: booleanAttribute,\n  });\n  readonly showCountryCode = input<boolean, unknown>(true, {\n    transform: booleanAttribute,\n  });\n\n  readonly disabled = input<boolean, unknown>(false, { transform: booleanAttribute });\n  readonly readonly = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n  readonly invalid = input<boolean | null>(null);\n  readonly errorMessage = input<string | null>(null);\n\n  readonly selectName = input<string>('selectComponentName');\n  readonly inputName = input<string>('example-small');\n\n  private readonly _country = signal<string>('fr');\n  private readonly _number = signal<string>('');\n\n  private readonly uid = ++UID;\n  readonly selectId = `phone_select_${this.uid}`;\n  readonly flagImgId = `phone_flag_${this.uid}`;\n  readonly inputId = `phone_input_${this.uid}`;\n  readonly helpId = `help_${this.uid}`;\n  readonly errorId = `err_${this.uid}`;\n  readonly ccId = `countryCode_${this.uid}`;\n\n  readonly selectedCountryCode = computed(() => this._country());\n  readonly availableCountries = computed(() => {\n    const explicitCodes = this.countryCodes();\n    if (explicitCodes && explicitCodes.length) {\n      return explicitCodes.map((c) => c.toLowerCase());\n    }\n\n    const legacyCountries = this.countries();\n    if (legacyCountries && legacyCountries.length) {\n      return legacyCountries.map((c) => c.code.toLowerCase());\n    }\n\n    return getCountries().map((c) => c.toLowerCase());\n  });\n\n  readonly selectedCountryName = computed(() => this.getCountryName(this._country()));\n  readonly selectedDialCode = computed(() => {\n    const dialCode = this.getCountryCallingCodeFor(this._country());\n    return dialCode ? `+${dialCode}` : '';\n  });\n  readonly selectedFlagUrl = computed(() => `https://flagcdn.com/${this._country()}.svg`);\n\n  readonly number = computed(() => this._number());\n\n  readonly dynamicPlaceholder = computed(() => {\n    const manual = this.placeholder();\n    if (manual && manual.length > 0) {\n      return manual;\n    }\n\n    const country = this.selectedLibCountryCode();\n    if (!country) {\n      return '';\n    }\n\n    try {\n      const example = getExampleNumber(country, examples as Examples);\n      return example?.formatNational() ?? '';\n    } catch {\n      return '';\n    }\n  });\n\n  private selectedLibCountryCode = computed<CountryCode | undefined>(() => {\n    const code = this._country();\n    if (!code) {\n      return undefined;\n    }\n    return code.toUpperCase() as CountryCode;\n  });\n\n  private parsedNumber = computed(() => {\n    const number = this._number().trim();\n    const country = this.selectedLibCountryCode();\n    if (!number || !country) {\n      return null;\n    }\n\n    try {\n      return parsePhoneNumberFromString(number, country);\n    } catch {\n      return null;\n    }\n  });\n\n  private phoneIsValid = computed(() => {\n    const number = this._number().trim();\n    const country = this.selectedLibCountryCode();\n    if (!number || !country) {\n      return false;\n    }\n\n    try {\n      return isValidPhoneNumber(number, country);\n    } catch {\n      return false;\n    }\n  });\n\n  getCountryName(countryCode: string): string {\n    const upper = countryCode.toUpperCase();\n\n    try {\n      const regionNames = new Intl.DisplayNames([this.locale()], {\n        type: 'region',\n      });\n      return regionNames.of(upper) ?? upper;\n    } catch {\n      return upper;\n    }\n  }\n\n  getCountryCallingCodeFor(countryCode: string): string {\n    const upper = countryCode.toUpperCase() as CountryCode;\n\n    try {\n      return getCountryCallingCode(upper);\n    } catch {\n      return '';\n    }\n  }\n\n  // aria-describedby\n  describedBy = computed(() => {\n    const ids: string[] = [];\n    if (this.helpText()) ids.push(this.helpId);\n    if (this.isInvalid() && this.errorToShow()) ids.push(this.errorId);\n    return ids.length ? ids.join(' ') : null;\n  });\n\n  // invalid combiné (input override > form state)\n  private formInvalid = signal<boolean>(false);\n  private formErrorMsg = signal<string | null>(null);\n\n  isInvalid = computed(() => {\n    const explicit = this.invalid();\n    if (explicit !== null) {\n      return !!explicit;\n    }\n\n    if (this.formInvalid()) {\n      return true;\n    }\n\n    const value = this._number().trim();\n    if (!value) {\n      return false;\n    }\n\n    return !this.phoneIsValid();\n  });\n\n  errorToShow = computed(() => this.errorMessage() ?? this.formErrorMsg());\n\n  // ----- CVA\n  private onChange?: (value: MozPhoneNumberValue) => void;\n  onTouched?: () => void;\n\n  writeValue(value: MozPhoneNumberValue | null): void {\n    if (!value) {\n      this._number.set('');\n      return;\n    }\n\n    if (value.country) {\n      this._country.set(value.country.toLowerCase());\n    }\n\n    const incoming = value.number ?? '';\n    if (!incoming) {\n      this._number.set('');\n      return;\n    }\n\n    const current = this._number();\n    if (incoming === current) {\n      return;\n    }\n\n    if (incoming.startsWith('+')) {\n      try {\n        const parsed = parsePhoneNumberFromString(incoming);\n        if (parsed) {\n          if (parsed.country) {\n            this._country.set(parsed.country.toLowerCase());\n          }\n          this._number.set(parsed.formatNational());\n          return;\n        }\n      } catch {\n        // ignore and fallback to raw value\n      }\n    }\n\n    this._number.set(incoming);\n  }\n\n  registerOnChange(fn: (value: MozPhoneNumberValue) => void): void {\n    this.onChange = fn;\n  }\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  // Appels depuis le template\n  onCountryChange(code: string) {\n    this._country.set(code.toLowerCase());\n\n    const parsed = this.parsedNumber();\n    if (parsed && this.phoneIsValid()) {\n      const formatted = parsed.formatNational();\n      if (formatted !== this._number()) {\n        this._number.set(formatted);\n      }\n    }\n\n    this.emitChange();\n  }\n  onNumberChange(val: string) {\n    const sanitized = this.sanitize(val);\n    this._number.set(sanitized);\n\n    const parsed = this.parsedNumber();\n    if (parsed && this.phoneIsValid()) {\n      const formatted = parsed.formatNational();\n      if (formatted !== sanitized) {\n        this._number.set(formatted);\n      }\n    }\n\n    this.emitChange();\n  }\n\n  private emitChange() {\n    if (!this.onChange) {\n      return;\n    }\n\n    const parsed = this.parsedNumber();\n    const fullNumber = parsed?.number ?? this._number();\n\n    this.onChange({\n      country: this._country(),\n      number: fullNumber,\n    });\n  }\n\n  private sanitize(value: string): string {\n    return value.replace(/[^0-9+\\s()-]/g, '');\n  }\n\n  // ---- Sync validation depuis le parent (optionnel)\n  // Tu peux appeler ces helpers depuis un directive/validator externe si besoin.\n  setFormInvalidState(invalid: boolean, message?: string | null) {\n    this.formInvalid.set(invalid);\n    this.formErrorMsg.set(message ?? null);\n  }\n\n  constructor() {\n    // fallback si la country par défaut n'est pas dans la liste\n    effect(() => {\n      const codes = this.availableCountries();\n      if (!codes.length) {\n        return;\n      }\n\n      const preferred = this.defaultCountry()?.toLowerCase();\n      const target = preferred && codes.includes(preferred) ? preferred : codes[0];\n\n      if (!this._country() || !codes.includes(this._country())) {\n        this._country.set(target);\n      }\n    });\n  }\n}\n","<div\n    class=\"field\"\n    [class.is-disabled]=\"disabled()\"\n    [class.is-readonly]=\"readonly()\"\n>\n    <legend class=\"field__legend\">\n        {{ label() }} @if (showRequirement() && requirementText()) {\n        <span class=\"field__requirement\">{{ requirementText() }}</span>\n        }\n    </legend>\n\n    @if (helpText()) {\n    <span [id]=\"helpId\" class=\"field__help\">{{ helpText() }}</span>\n    }\n\n    <div class=\"field__content\">\n        <div id=\"mc-phone-number-input\" class=\"phone-number-input\">\n            <!-- Select pays + flag -->\n            <div\n                class=\"phone-number-input__select-wrapper\"\n                [class.phone-number-input__select-wrapper--hidden]=\"\n                            !showCountrySelect()\n                        \"\n            >\n                <select\n                    [id]=\"selectId\"\n                    [name]=\"selectName()\"\n                    class=\"select phone-number-input__select\"\n                    [class.select--s]=\"size() === 's'\"\n                    [disabled]=\"disabled() || readonly()\"\n                    [ngModel]=\"selectedCountryCode()\"\n                    (ngModelChange)=\"onCountryChange($event)\"\n                    aria-label=\"Country\"\n                >\n                    <option value=\"\" selected hidden></option>\n                    @for (code of availableCountries(); track code) {\n                    <option\n                        [attr.data-flag]=\"code\"\n                        [value]=\"code\"\n                        [selected]=\"code === selectedCountryCode()\"\n                    >\n                        {{ getCountryName(code) }} (+{{ getCountryCallingCodeFor(code) }})\n                    </option>\n                    }\n                </select>\n\n                @if (showCountrySelect()) {\n                <div class=\"phone-number-input__select-display\">\n                    <div class=\"phone-number-input__flag\">\n                        <img\n                            class=\"phone-number-input__flag-image\"\n                            [id]=\"flagImgId\"\n                            [src]=\"selectedFlagUrl()\"\n                            [alt]=\"selectedCountryName()\"\n                            width=\"20\"\n                        />\n                    </div>\n                    <ChevronDown24 class=\"phone-number-input__chevron\" />\n                </div>\n                }\n            </div>\n\n            <!-- Input numéro -->\n            <div\n                class=\"text-input phone-number-input__input\"\n                [class.text-input--s]=\"size() === 's'\"\n                [class.is-invalid]=\"isInvalid()\"\n            >\n                @if (showCountryCode()) {\n                <span [id]=\"ccId\" class=\"phone-number-input__country-code\"\n                    >{{ selectedDialCode() }}</span\n                >\n                }\n\n                <input\n                    type=\"tel\"\n                    [id]=\"inputId\"\n                    class=\"phone-number-input__control text-input__control\"\n                    [placeholder]=\"dynamicPlaceholder()\"\n                    [name]=\"inputName()\"\n                    [disabled]=\"disabled()\"\n                    [readonly]=\"readonly()\"\n                    [attr.aria-invalid]=\"isInvalid() || null\"\n                    [attr.aria-describedby]=\"describedBy()\"\n                    [ngModel]=\"number()\"\n                    (ngModelChange)=\"onNumberChange($event)\"\n                    (blur)=\"onTouched?.()\"\n                />\n            </div>\n        </div>\n    </div>\n\n    <!-- Message d'erreur -->\n    @if (isInvalid() && errorToShow()) {\n    <span [id]=\"errorId\" class=\"field__validation-message is-invalid\">\n        {{ errorToShow() }}\n    </span>\n    }\n</div>\n","import {\n  AfterContentInit,\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  computed,\n  effect,\n  input,\n  output,\n  signal,\n  booleanAttribute,\n  contentChild,\n} from '@angular/core';\nimport { MozLinearProgressBarBufferComponent } from '../linear-progress-bar-buffer/linear-progress-bar-buffer';\nimport {\n  CheckCircleFilled32,\n  WarningCircleFilled32,\n  CrossCircleFilled32,\n  InfoCircleFilled32,\n  Cross20,\n} from '@mozaic-ds/icons-angular';\nimport { MozIconButtonComponent } from '../icon-button/icon-button';\nimport { MozToasterPosition, MozToasterStatus, MozToasterRole } from './model/toaster.model';\n\n@Component({\n  selector: 'moz-toaster',\n  imports: [\n    MozLinearProgressBarBufferComponent,\n    CheckCircleFilled32,\n    WarningCircleFilled32,\n    CrossCircleFilled32,\n    InfoCircleFilled32,\n    Cross20,\n    MozIconButtonComponent,\n  ],\n  templateUrl: './toaster.html',\n  styleUrls: ['./toaster.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozToasterComponent implements AfterContentInit {\n  readonly open = input<boolean, unknown>(false, { transform: booleanAttribute });\n  readonly position = input<MozToasterPosition>('top');\n  readonly description = input<string>('');\n  readonly status = input<MozToasterStatus>('info');\n  readonly closable = input<boolean, unknown>(true, { transform: booleanAttribute });\n  readonly progress = input<boolean, unknown>(false, { transform: booleanAttribute });\n  readonly timeout = input<number | null>(null);\n  readonly role = input<MozToasterRole>('status');\n  readonly closeAriaLabel = input<string>('Close');\n\n  readonly openChange = output<boolean>();\n  readonly closed = output<void>();\n\n  readonly actionSlot = contentChild<ElementRef<HTMLElement>>('[action]', { descendants: false });\n  readonly hasAction = signal(false);\n\n  ngAfterContentInit() {\n    this.hasAction.set(!!this.actionSlot());\n  }\n\n  classes = computed(() => {\n    const classes = [];\n    if (this.open()) {\n      classes.push('is-open');\n    }\n    const s = this.status();\n    const p = this.position();\n    if (s && s !== 'info') {\n      classes.push(`mc-toaster--${s}`);\n    }\n    if (p && p !== 'top') {\n      classes.push(`mc-toaster--${p}`);\n    }\n    return classes.join(' ');\n  });\n\n  private _progressValue = signal(0); // 0 → 100\n  progressValue = () => this._progressValue();\n\n  private intervalId: number | null = null;\n  private timeoutId: number | null = null;\n  private startAt = 0;\n\n  constructor() {\n    effect(() => {\n      const isOpen = this.open();\n      const ms = this.timeout();\n      const showProgress = this.progress();\n\n      this.clearTimers();\n      this._progressValue.set(0);\n\n      if (!isOpen || !ms || ms <= 0) {\n        return;\n      }\n\n      if (showProgress) {\n        this.startAt = Date.now();\n        const step = 100;\n        this.intervalId = setInterval(() => {\n          const elapsed = Date.now() - this.startAt;\n          const pct = Math.min(100, (elapsed / ms) * 100);\n          this._progressValue.set(pct);\n          if (pct >= 100) {\n            this.onCloseClick();\n          }\n        }, step) as unknown as number;\n      } else {\n        this.timeoutId = setTimeout(() => this.onCloseClick(), ms) as unknown as number;\n      }\n    });\n  }\n\n  onCloseClick() {\n    if (!this.open()) {\n      return;\n    }\n    this.clearTimers();\n    this._progressValue.set(100);\n    this.openChange.emit(false);\n    this.closed.emit();\n  }\n\n  private clearTimers() {\n    if (this.intervalId) {\n      clearInterval(this.intervalId);\n      this.intervalId = null;\n    }\n    if (this.timeoutId) {\n      clearTimeout(this.timeoutId);\n      this.timeoutId = null;\n    }\n  }\n}\n","<section class=\"mc-toaster\" [class]=\"classes()\" [attr.role]=\"role()\">\n  <div class=\"mc-toaster__icon\">\n    @switch (status()) { @case ('success') {\n    <CheckCircleFilled32 />\n    } @case ('warning') {\n    <WarningCircleFilled32 />\n    } @case ('error') {\n    <CrossCircleFilled32 />\n    } @case ('info') {\n    <InfoCircleFilled32 />\n    } }\n  </div>\n\n  <div class=\"mc-toaster__content\">\n    <p class=\"mc-toaster__message\">{{ description() }}</p>\n\n    @if (hasAction()) {\n    <div class=\"mc-toaster__action\">\n      <ng-content select=\"[action]\"></ng-content>\n    </div>\n    }\n  </div>\n\n  @if (closable()) {\n  <moz-icon-button\n    type=\"button\"\n    [attr.aria-label]=\"closeAriaLabel()\"\n    (activated)=\"onCloseClick()\"\n    [appearance]=\"'inverse'\"\n    [size]=\"'s'\"\n    [ghost]=\"true\"\n    [id]=\"'toaster-close-button'\"\n  >\n    <Cross20 icon />\n  </moz-icon-button>\n  } @if (progress() && timeout() && timeout()! > 0) {\n  <moz-linear-progress-bar-buffer\n    class=\"mc-toaster__indicator\"\n    [valuePercent]=\"progressValue()\"\n    size=\"m\"\n  >\n  </moz-linear-progress-bar-buffer>\n  }\n</section>\n","import { InjectionToken } from '@angular/core';\nimport { MozToasterPosition, MozToasterRole, MozToasterStatus } from '../model/toaster.model';\n\nexport interface MozToasterConfig {\n  open?: boolean;\n  position?: MozToasterPosition;\n  description: string;\n  status?: MozToasterStatus;\n  closable?: boolean;\n  progress?: boolean;\n  timeout?: number | null;\n  role?: MozToasterRole;\n  closeAriaLabel?: string;\n}\n\nexport const TOASTER_CONFIG = new InjectionToken<MozToasterConfig>('TOASTER_CONFIG');\n\nexport const DEFAULT_TOASTER_CONFIG: Partial<MozToasterConfig> = {\n  open: false,\n  position: 'top',\n  description: '',\n  status: 'info',\n  closable: true,\n  progress: false,\n  timeout: null,\n  role: 'status',\n  closeAriaLabel: 'Close',\n};\n","import { Subject, Observable } from 'rxjs';\nimport { signal } from '@angular/core';\nimport { MozToasterPosition, MozToasterStatus } from '../model/toaster.model';\nimport { OverlayRef } from '@angular/cdk/overlay';\n\nexport class MozToasterRef {\n  private readonly afterClosed$ = new Subject<undefined>();\n  private readonly afterOpened$ = new Subject<void>();\n\n  readonly isOpen = signal<boolean>(false);\n  readonly description = signal<string>('');\n  readonly status = signal<MozToasterStatus>('info');\n  readonly closable = signal<boolean>(true);\n  readonly timeout = signal<number | null>(null);\n  readonly progress = signal<boolean>(false);\n  readonly position = signal<MozToasterPosition>('top');\n\n  private animationDuration = 300;\n\n  constructor(private readonly overlayRef: OverlayRef) {}\n\n  open(): void {\n    requestAnimationFrame(() => {\n      this.isOpen.set(true);\n      this.afterOpened$.next();\n      this.afterOpened$.complete();\n    });\n  }\n\n  close(): void {\n    this.isOpen.set(false);\n\n    setTimeout(() => {\n      this.overlayRef.dispose();\n      this.afterClosed$.next(undefined);\n      this.afterClosed$.complete();\n    }, this.animationDuration);\n  }\n\n  afterClosed(): Observable<undefined> {\n    return this.afterClosed$.asObservable();\n  }\n\n  afterOpened(): Observable<void> {\n    return this.afterOpened$.asObservable();\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  effect,\n  inject,\n  signal,\n} from '@angular/core';\nimport {\n  CheckCircleFilled32,\n  Cross20,\n  CrossCircleFilled32,\n  InfoCircleFilled32,\n  WarningCircleFilled32,\n} from '@mozaic-ds/icons-angular';\nimport { MozIconButtonComponent } from '../../icon-button/icon-button';\nimport { MozLinearProgressBarBufferComponent } from '../../linear-progress-bar-buffer';\nimport { MozToasterConfig, TOASTER_CONFIG } from '../config/toaster.config';\nimport { MozToasterRef } from '../ref/toaster-ref';\n\n@Component({\n  selector: 'moz-toaster-container',\n  imports: [\n    MozLinearProgressBarBufferComponent,\n    CheckCircleFilled32,\n    WarningCircleFilled32,\n    CrossCircleFilled32,\n    InfoCircleFilled32,\n    Cross20,\n    MozIconButtonComponent,\n  ],\n  templateUrl: './toaster-container.html',\n  styleUrls: ['../toaster.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToasterContainerComponent {\n  readonly toasterRef = inject(MozToasterRef);\n  readonly config = inject<MozToasterConfig>(TOASTER_CONFIG);\n\n  classes = computed(() => {\n    const classes = [];\n    if (this.toasterRef.isOpen()) {\n      classes.push('is-open');\n    }\n    const s = this.toasterRef.status();\n    const p = this.toasterRef.position();\n    if (s && s !== 'info') {\n      classes.push(`mc-toaster--${s}`);\n    }\n    if (p && p !== 'top') {\n      classes.push(`mc-toaster--${p}`);\n    }\n    return classes.join(' ');\n  });\n\n  private _progressValue = signal(0); // 0 → 100\n  progressValue = () => this._progressValue();\n\n  private intervalId: number | null = null;\n  private timeoutId: number | null = null;\n  private startAt = 0;\n\n  constructor() {\n    effect(() => {\n      const isOpen = this.toasterRef.isOpen();\n      const ms = this.toasterRef.timeout();\n      const showProgress = this.toasterRef.progress();\n\n      this.clearTimers();\n      this._progressValue.set(0);\n\n      if (!isOpen || !ms || ms <= 0) {\n        return;\n      }\n\n      if (showProgress) {\n        this.startAt = Date.now();\n        const step = 100;\n        this.intervalId = setInterval(() => {\n          const elapsed = Date.now() - this.startAt;\n          const pct = Math.min(100, (elapsed / ms) * 100);\n          this._progressValue.set(pct);\n          if (pct >= 100) {\n            this.toasterRef.close();\n          }\n        }, step) as unknown as number;\n      } else {\n        this.timeoutId = setTimeout(() => this.toasterRef.close(), ms) as unknown as number;\n      }\n    });\n  }\n\n  private clearTimers() {\n    if (this.intervalId) {\n      clearInterval(this.intervalId);\n      this.intervalId = null;\n    }\n    if (this.timeoutId) {\n      clearTimeout(this.timeoutId);\n      this.timeoutId = null;\n    }\n  }\n}\n","<section class=\"mc-toaster\" [class]=\"classes()\">\n  <div class=\"mc-toaster__icon\">\n    @switch (toasterRef.status()) {\n      @case ('success') {\n        <CheckCircleFilled32 />\n      }\n      @case ('warning') {\n        <WarningCircleFilled32 />\n      }\n      @case ('error') {\n        <CrossCircleFilled32 />\n      }\n      @case ('info') {\n        <InfoCircleFilled32 />\n      }\n    }\n  </div>\n\n  <div class=\"mc-toaster__content\">\n    <p class=\"mc-toaster__message\">{{ toasterRef.description() }}</p>\n  </div>\n\n  @if (toasterRef.closable()) {\n    <moz-icon-button\n      type=\"button\"\n      (activated)=\"toasterRef.close()\"\n      [appearance]=\"'inverse'\"\n      [size]=\"'s'\"\n      [ghost]=\"true\"\n      [id]=\"'toaster-close-button'\"\n    >\n      <Cross20 icon />\n    </moz-icon-button>\n  }\n  @if (toasterRef.progress() && toasterRef.timeout() && toasterRef.timeout()! > 0) {\n    <moz-linear-progress-bar-buffer\n      class=\"mc-toaster__indicator\"\n      [valuePercent]=\"progressValue()\"\n      size=\"m\"\n    >\n    </moz-linear-progress-bar-buffer>\n  }\n</section>\n","// service/toaster.service.ts\nimport { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { Injectable, Injector, inject } from '@angular/core';\nimport { DEFAULT_TOASTER_CONFIG, MozToasterConfig, TOASTER_CONFIG } from '../config/toaster.config';\nimport { ToasterContainerComponent } from '../container/toaster-container';\nimport { MozToasterRef } from '../ref/toaster-ref';\n\n@Injectable({ providedIn: 'root' })\nexport class MozToasterService {\n  private readonly overlay = inject(Overlay);\n  private readonly injector = inject(Injector);\n\n  open(config: MozToasterConfig): MozToasterRef {\n    const mergedConfig: MozToasterConfig = {\n      ...DEFAULT_TOASTER_CONFIG,\n      ...config,\n    } as MozToasterConfig;\n\n    const overlayRef = this.createOverlay();\n    const toasterRef = new MozToasterRef(overlayRef);\n\n    toasterRef.description.set(mergedConfig.description);\n    toasterRef.status.set(mergedConfig.status ?? 'info');\n    toasterRef.closable.set(mergedConfig.closable ?? true);\n    toasterRef.timeout.set(mergedConfig.timeout ?? null);\n    toasterRef.progress.set(mergedConfig.progress ?? false);\n    toasterRef.position.set(mergedConfig.position ?? 'top');\n\n    const injector = Injector.create({\n      parent: this.injector,\n      providers: [\n        { provide: MozToasterRef, useValue: toasterRef },\n        { provide: TOASTER_CONFIG, useValue: mergedConfig },\n      ],\n    });\n\n    const containerPortal = new ComponentPortal(ToasterContainerComponent, null, injector);\n    overlayRef.attach(containerPortal);\n\n    toasterRef.open();\n\n    return toasterRef;\n  }\n\n  private createOverlay(): OverlayRef {\n    const config = new OverlayConfig({\n      hasBackdrop: false,\n      positionStrategy: this.overlay.position().global().centerHorizontally().centerVertically(),\n    });\n\n    return this.overlay.create(config);\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  input,\n  output,\n  computed,\n  booleanAttribute,\n} from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { ChevronDown20, SidebarExpand24 } from '@mozaic-ds/icons-angular';\nimport { MozSidebarItem } from './model/sidebar.model';\n\n@Component({\n  selector: 'moz-sidebar',\n  imports: [NgComponentOutlet, SidebarExpand24, ChevronDown20],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './sidebar.html',\n  styleUrls: ['./sidebar.scss'],\n})\nexport class MozSidebarComponent {\n  readonly expanded = input<boolean, unknown>(false, { transform: booleanAttribute });\n  readonly items = input<MozSidebarItem[]>([]);\n  readonly title = input<string>('ADEO Design System');\n  readonly logoSrc = input<string | null>('/images/logo.svg');\n  readonly logoAlt = input<string>('logo');\n\n  readonly showFooter = input<boolean, unknown>(true, { transform: booleanAttribute });\n  readonly showProfile = input<boolean, unknown>(false, {\n    transform: booleanAttribute,\n  });\n  readonly profileName = input<string | null>('Dieter Rams');\n  readonly profileTitle = input<string | null>('Industrial designer');\n  readonly profileAvatarSrc = input<string | null>('/images/Avatar.png');\n\n  readonly expandedChange = output<boolean>();\n  readonly itemClick = output<{ itemId: string; subItemId: string | null }>();\n\n  readonly hostClasses = computed(() =>\n    ['sidebar', this.expanded() ? 'sidebar--expanded' : ''].filter(Boolean).join(' ')\n  );\n\n  readonly expandButtonAriaLabel = computed(() => (this.expanded() ? 'Collapse' : 'Expand'));\n\n  shouldOpen = (i: MozSidebarItem) => !!i.open || !!i.children?.some((c) => c.selected);\n\n  toggleExpanded() {\n    this.expandedChange.emit(!this.expanded());\n  }\n\n  onItemClick(itemId: string, subItemId: string | null, ev: Event) {\n    this.itemClick.emit({ itemId, subItemId });\n    if ((ev.currentTarget as HTMLAnchorElement)?.getAttribute('href') === '#') ev.preventDefault();\n  }\n\n  toggleOpen(item: MozSidebarItem) {\n    item.open = !item.open;\n  }\n}\n","<aside [class]=\"hostClasses()\">\n  <header class=\"sidebar__header\">\n    @if (logoSrc()) {\n    <img class=\"sidebar__header-logo\" [src]=\"logoSrc()!\" [alt]=\"logoAlt()\" />\n    } @if (title()) {\n    <p class=\"sidebar__header-title\">{{ title() }}</p>\n    }\n  </header>\n\n  <section class=\"sidebar__container\">\n    <nav class=\"sidebar__menu\" role=\"navigation\">\n      <ul class=\"sidebar__list\">\n        @for (item of items(); track item.id) {\n        <li class=\"sidebar__item\">\n          @if (expanded() && !!item.children?.length) {\n          <details\n            class=\"sidebar__link-expand\"\n            (click)=\"toggleOpen(item)\"\n            [attr.open]=\"item.open || null\"\n          >\n            <summary class=\"sidebar__link\" (click)=\"$event.preventDefault()\">\n              @if (item.icon) {\n              <span class=\"sidebar__icon\" aria-hidden=\"true\">\n                <ng-container [ngComponentOutlet]=\"item.icon\"></ng-container>\n              </span>\n              }\n              <span class=\"sidebar__text\">{{ item.label }}</span>\n              <span aria-hidden=\"true\" class=\"sidebar__sub\">\n                <ChevronDown20 />\n              </span>\n            </summary>\n\n            <ul class=\"sidebar__sublist\">\n              @for (sub of item.children!; track sub.id) {\n              <li class=\"sidebar__item\">\n                <a\n                  class=\"sidebar__sublink\"\n                  [class.sidebar__sublink--selected]=\"!!sub.selected\"\n                  [attr.href]=\"sub.href || '#'\"\n                  (click)=\"onItemClick(item.id, sub.id, $event)\"\n                >\n                  <span class=\"sidebar__text\">{{ sub.label }}</span>\n                </a>\n              </li>\n              }\n            </ul>\n          </details>\n          } @else {\n          <a\n            class=\"sidebar__link\"\n            [class.sidebar__link--selected]=\"!!item.selected\"\n            [attr.title]=\"item.label\"\n            [attr.href]=\"item.href || '#'\"\n            (click)=\"onItemClick(item.id, null, $event)\"\n          >\n            @if (item.icon) {\n            <span class=\"sidebar__icon\" aria-hidden=\"true\">\n              <ng-container [ngComponentOutlet]=\"item.icon\"></ng-container>\n            </span>\n            }\n            <span class=\"sidebar__text\">{{ item.label }}</span>\n          </a>\n          }\n        </li>\n        }\n      </ul>\n    </nav>\n  </section>\n\n  @if (showFooter()) {\n  <footer class=\"sidebar__footer\">\n    <div class=\"divider-horizontal\"></div>\n    <div class=\"sidebar__footer-container\">\n      @if (showProfile() && (profileName() || profileTitle() || profileAvatarSrc())) {\n      <a href=\"#\" class=\"sidebar__footer-profile\" (click)=\"$event.preventDefault()\">\n        @if (profileAvatarSrc()) {\n        <img\n          class=\"sidebar__footer-avatar\"\n          [src]=\"profileAvatarSrc()!\"\n          [alt]=\"profileName() || 'User'\"\n          loading=\"lazy\"\n        />\n        }\n        <div class=\"sidebar__footer-content\">\n          @if (profileName()) {\n          <p class=\"sidebar__footer-identity\">\n            {{ profileName() }}\n          </p>\n          } @if (profileTitle()) {\n          <p class=\"sidebar__footer-title\">{{ profileTitle() }}</p>\n          }\n        </div>\n      </a>\n      }\n      <button\n        class=\"sidebar__footer-expand button button--ghost\"\n        type=\"button\"\n        [attr.aria-label]=\"expandButtonAriaLabel()\"\n        [attr.aria-expanded]=\"expanded()\"\n        (click)=\"toggleExpanded()\"\n      >\n        <SidebarExpand24 class=\"button__icon\" />\n      </button>\n    </div>\n  </footer>\n  }\n</aside>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  input,\n  output,\n  model,\n  computed,\n  booleanAttribute,\n  viewChildren,\n} from '@angular/core';\nimport { MozSegmentedItem, MozSegmentedControlSize } from './model/segmented-control.model';\n\n@Component({\n  selector: 'moz-segmented-control',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './segmented-control.html',\n  styleUrls: ['./segmented-control.scss'],\n})\nexport class MozSegmentedControlComponent {\n  readonly items = input<MozSegmentedItem[]>([]);\n\n  readonly size = input<MozSegmentedControlSize>('s');\n  readonly full = input<boolean, unknown>(false, { transform: booleanAttribute });\n  readonly disabled = input<boolean, unknown>(false, { transform: booleanAttribute });\n  readonly ariaLabel = input<string>('Segmented control');\n\n  readonly selectedIndex = model<number>(0);\n  readonly change = output<{ index: number; value: string | number }>();\n\n  readonly classes = computed(() => ({\n    'segmented-control': true,\n    'segmented-control--disabled': this.disabled(),\n    'segmented-control--m': this.size() === 'm',\n    'segmented-control--full': this.full(),\n  }));\n\n  readonly segmentClasses = (index: number) =>\n    computed(() => ({\n      'segmented-control__segment--disabled': this.disabled() || !!this.items()[index]?.disabled,\n      'segmented-control__segment': true,\n      'segmented-control__segment--selected': index === this.selectedIndex(),\n    }));\n\n  private readonly buttons = viewChildren<ElementRef<HTMLButtonElement>>('segBtn');\n\n  onSelect(index: number) {\n    if (this.disabled() || this.items()[index]?.disabled) {\n      return;\n    }\n\n    const item = this.items()[index];\n    this.selectedIndex.set(index);\n    this.change.emit({ index, value: item.value });\n    queueMicrotask(() => this.focusIndex(index));\n  }\n\n  private focusIndex(index: number) {\n    const btns = this.buttons();\n    const btn = btns[index]?.nativeElement;\n    btn?.focus();\n  }\n}\n","<div [class]=\"classes()\" role=\"tablist\" [attr.aria-label]=\"ariaLabel()\">\n  @for (item of items(); track item.value; let i = $index) {\n    <button\n      #segBtn\n      type=\"button\"\n      [class]=\"segmentClasses(i)()\"\n      role=\"tab\"\n      [attr.aria-selected]=\"i === selectedIndex()\"\n      [attr.aria-disabled]=\"disabled() || !!item.disabled\"\n      [attr.tabindex]=\"i === selectedIndex() ? 0 : -1\"\n      [disabled]=\"disabled() || !!item.disabled\"\n      (click)=\"onSelect(i)\"\n    >\n      {{ item.label }}\n    </button>\n  }\n</div>\n","import { Component, viewChild, TemplateRef } from '@angular/core';\n\n@Component({\n  selector: 'moz-accordion-header',\n  templateUrl: './accordion-header.html',\n  styleUrls: ['./accordion-header.scss'],\n})\nexport class MozAccordionHeaderComponent {\n  readonly tpl = viewChild('tpl', { read: TemplateRef });\n}\n","<ng-template #tpl>\n  <div class=\"accordion__title-wrapper\">\n    <span class=\"accordion__title-text\" #titleWrapper>\n      <ng-content select=\"[title]\"></ng-content>\n    </span>\n    <span class=\"accordion__subtitle\" #subtitleWrapper>\n      <ng-content select=\"[subtitle]\"></ng-content>\n    </span>\n  </div>\n</ng-template>\n","import { Component, TemplateRef, viewChild } from '@angular/core';\n\n@Component({\n  selector: 'moz-accordion-content',\n  templateUrl: './accordion-content.html',\n})\nexport class MozAccordionContentComponent {\n  readonly tpl = viewChild('tpl', { read: TemplateRef });\n}\n","<ng-template #tpl><ng-content></ng-content></ng-template>\n","import { Component, Type, contentChild, linkedSignal } from '@angular/core';\nimport { input } from '@angular/core';\nimport { MozAccordionHeaderComponent } from '../header/accordion-header';\nimport { MozAccordionContentComponent } from '../content/accordion-content';\n\n@Component({\n  selector: 'moz-accordion-panel',\n  template: ``,\n})\nexport class MozAccordionPanelComponent {\n  readonly icon = input<Type<unknown> | null>(null);\n  readonly open = input(false);\n  readonly state = linkedSignal(() => this.open());\n\n  readonly header = contentChild(MozAccordionHeaderComponent);\n  readonly content = contentChild(MozAccordionContentComponent);\n}\n","import { Component, ChangeDetectionStrategy, contentChildren, computed } from '@angular/core';\nimport { input } from '@angular/core';\nimport { NgTemplateOutlet, NgComponentOutlet } from '@angular/common';\nimport { MozAccordionPanelComponent } from './components/panel/accordion-panel';\n\n/**\n * Accordion component for organizing content in collapsible sections.\n *\n * @description\n * The accordion component allows users to show and hide sections of content.\n * Each section consists of a header and content area that can be expanded or collapsed.\n * Supports both custom and native HTML implementation.\n *\n * @example\n * ```html\n * <moz-accordion [ghost]=\"false\" [native]=\"false\">\n *   <moz-accordion-panel [icon]=\"HomeIcon\" [open]=\"true\">\n *     <moz-accordion-header>\n *       <span title=\"\">Panel Title</span>\n *       <span subtitle=\"\">Panel Subtitle</span>\n *     </moz-accordion-header>\n *     <moz-accordion-content>\n *       <p>Panel content goes here</p>\n *     </moz-accordion-content>\n *   </moz-accordion-panel>\n * </moz-accordion>\n * ```\n */\n@Component({\n  selector: 'moz-accordion',\n  imports: [NgTemplateOutlet, NgComponentOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './accordion.html',\n  styleUrls: ['./accordion.scss'],\n})\nexport class MozAccordionComponent {\n  /**\n   * Applies ghost styling to the accordion for a lighter visual appearance.\n   * Useful for nested or secondary accordions.\n   *\n   * @default false\n   */\n  readonly ghost = input(false);\n\n  /**\n   * Uses native HTML `<details>` and `<summary>` elements instead of custom implementation.\n   * Provides better accessibility and performance with browser-native behavior.\n   *\n   * @default false\n   */\n  readonly native = input(false);\n\n  /**\n   * Computed CSS classes based on component inputs.\n   * Automatically updates when ghost input changes.\n   *\n   * @internal\n   */\n  readonly cssClasses = computed(() => ({\n    'accordion': true,\n    'accordion--ghost': this.ghost(),\n  }));\n\n  /**\n   * Signal containing all accordion panels projected into this component.\n   * Automatically synchronized with content children.\n   *\n   * @internal\n   */\n  readonly panels = contentChildren(MozAccordionPanelComponent);\n\n  /**\n   * Toggles the open/closed state of an accordion panel.\n   *\n   * @param p - The accordion panel to toggle\n   */\n  toggle(p: MozAccordionPanelComponent) {\n    p.state.update((v: boolean) => !v);\n  }\n\n  /**\n   * Handles the native toggle event for accordion panels using HTML details/summary.\n   * Synchronizes the panel state with the native element's open state.\n   *\n   * @param ev - The native toggle event\n   * @param p - The accordion panel being toggled\n   */\n  onNativeToggle(ev: Event, p: MozAccordionPanelComponent) {\n    p.state.set((ev.currentTarget as HTMLDetailsElement).open);\n  }\n}\n","<div [class]=\"cssClasses()\">\n  @for (panel of panels(); track panel; let i = $index) { @if (!native()) {\n  <div class=\"accordion__item\">\n    <div class=\"accordion__header\">\n      <h2 class=\"accordion__title\">\n        <button\n          class=\"accordion__trigger\"\n          type=\"button\"\n          [attr.id]=\"'accordion-' + (i + 1)\"\n          data-mc-component=\"accordion\"\n          [attr.aria-controls]=\"'content-' + (i + 1)\"\n          [attr.aria-expanded]=\"panel.state()\"\n          (click)=\"toggle(panel)\"\n        >\n          @if (panel.icon()) {\n          <span class=\"accordion__icon\" aria-hidden=\"true\">\n            <ng-container [ngComponentOutlet]=\"panel.icon()\"></ng-container>\n          </span>\n          } @if (panel.header()) {\n          <ng-container [ngTemplateOutlet]=\"panel.header()?.tpl()\"></ng-container>\n          }\n        </button>\n      </h2>\n    </div>\n\n    <div\n      class=\"accordion__content\"\n      [class.is-open]=\"panel.state()\"\n      [attr.id]=\"'content-' + (i + 1)\"\n      [attr.aria-labelledby]=\"'accordion-' + (i + 1)\"\n      [attr.aria-hidden]=\"!panel.state()\"\n    >\n      @if (panel.content()) {\n      <ng-container [ngTemplateOutlet]=\"panel.content()?.tpl()\"></ng-container>\n      }\n    </div>\n  </div>\n  } @else {\n  <details\n    class=\"accordion__item\"\n    [attr.open]=\"panel.state() ? '' : null\"\n    (toggle)=\"onNativeToggle($event, panel)\"\n  >\n    <summary class=\"accordion__header\">\n      <span class=\"accordion__title\">\n        <span class=\"accordion__trigger\">\n          @if (panel.icon()) {\n          <span class=\"accordion__icon\" aria-hidden=\"true\">\n            <ng-container [ngComponentOutlet]=\"panel.icon()\"></ng-container>\n          </span>\n          } @if (panel.header()) {\n          <ng-container [ngTemplateOutlet]=\"panel.header()?.tpl()\"></ng-container>\n          }\n        </span>\n      </span>\n    </summary>\n    <div class=\"accordion__content\" [attr.aria-hidden]=\"!panel.state()\">\n      @if (panel.content()) {\n      <ng-container [ngTemplateOutlet]=\"panel.content()?.tpl()\"></ng-container>\n      }\n    </div>\n  </details>\n  } }\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  input,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { MozDividerComponent } from '../divider';\n\n@Component({\n  selector: 'moz-action-bottom-bar',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './action-bottom-bar.html',\n  styleUrls: ['./action-bottom-bar.scss'],\n  imports: [MozDividerComponent],\n  encapsulation: ViewEncapsulation.None,\n})\nexport class MozActionBottomBarComponent {\n  readonly boxShadow = input<boolean>(false);\n\n  readonly classes = computed(() => ({\n    'mc-action-bottom-bar': true,\n    'mc-action-bottom-bar--shadow': this.boxShadow(),\n  }));\n}\n","<div [class]=\"classes()\">\n  <moz-divider\n    class=\"mc-action-bottom-bar__divider\"\n    orientation=\"horizontal\"\n    size=\"s\"\n  ></moz-divider>\n  <div class=\"mc-action-bottom-bar__left\">\n    <ng-content select=\"[left]\"></ng-content>\n  </div>\n\n  <div class=\"mc-action-bottom-bar__right\">\n    <ng-content select=\"[right]\"></ng-content>\n  </div>\n</div>\n","import { Component, ChangeDetectionStrategy, input, computed, output } from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { Cross24 } from '@mozaic-ds/icons-angular';\nimport { MozActionListItem } from './model/action-listbox.model';\n\n/**\n * An action list is a contextual menu that presents a list of available actions related to a specific element or interface area.\n * It allows users to quickly access functions such as editing, sharing, deleting, or navigating to sub-actions.\n * Action Lists are commonly triggered by buttons, icons (e.g., three-dot menus), or right-click interactions, ensuring a clean and efficient UI.\n */\n@Component({\n  selector: 'moz-action-listbox',\n  templateUrl: './action-listbox.html',\n  styleUrls: ['./action-listbox.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [NgComponentOutlet, Cross24],\n})\nexport class MozActionListboxComponent {\n  /**\n   * Title displayed in mobile version.\n   */\n  readonly title = input<string>();\n\n  /**\n   * An array of objects that allows you to provide all the data needed to generate the content for each item.\n   */\n  readonly items = input.required<MozActionListItem[]>();\n\n  /**\n   * Emitted when an item is clicked.\n   */\n  readonly itemClick = output<MozActionListItem>();\n\n  /**\n   * Computed signal that maps items to their CSS classes.\n   */\n  readonly itemsWithClasses = computed(() =>\n    this.items().map((item) => ({\n      item,\n      classes: {\n        'action-list__element': true,\n        'action-list__element--danger': item.appearance === 'danger',\n        'action-list__element--disabled': item.disabled === true,\n      },\n    }))\n  );\n}\n","<div class=\"listbox\">\n  <div class=\"listbox__content\">\n    <div class=\"listbox__header\">\n      @if (title()) {\n      <h3 class=\"listbox__title\">{{ title() }}</h3>\n      }\n      <button\n        class=\"listbox__close button button--icon-button button--ghost\"\n        type=\"button\"\n        aria-label=\"Close\"\n      >\n        <Cross24 icon />\n      </button>\n    </div>\n    <div class=\"listbox__body\">\n      <ul class=\"action-list\" role=\"menu\">\n        @for (itemWithClasses of itemsWithClasses(); track $index) { @if\n        (itemWithClasses.item.divider) {\n        <li class=\"divider-horizontal action-list__divider\"></li>\n        }\n        <li [class]=\"itemWithClasses.classes\" role=\"menuitem\" [attr.id]=\"itemWithClasses.item.id\">\n          <button\n            type=\"button\"\n            class=\"action-list__button\"\n            [disabled]=\"itemWithClasses.item.disabled\"\n            (click)=\"!itemWithClasses.item.disabled && itemClick.emit(itemWithClasses.item)\"\n          >\n            @if (itemWithClasses.item.icon) {\n            <div class=\"action-list__icon\">\n              <ng-container [ngComponentOutlet]=\"itemWithClasses.item.icon\"> </ng-container>\n            </div>\n            }\n            <p class=\"action-list__text\">\n              {{ itemWithClasses.item.label }}\n            </p>\n          </button>\n        </li>\n        }\n      </ul>\n    </div>\n  </div>\n</div>\n","import { OverlayRef } from '@angular/cdk/overlay';\nimport { Subject, Observable } from 'rxjs';\nimport { MozActionListItem } from '../model/action-listbox.model';\n\nexport class ActionListboxRef {\n  private readonly afterClosed$ = new Subject<void>();\n  private readonly itemClicked$ = new Subject<MozActionListItem>();\n\n  constructor(private readonly overlayRef: OverlayRef) {\n    this.overlayRef.backdropClick().subscribe(() => this.close());\n    this.overlayRef.keydownEvents().subscribe((event) => {\n      if (event.key === 'Escape') {\n        this.close();\n      }\n    });\n\n    // Fermeture par scrollStrategy ou autre détachement externe\n    this.overlayRef.detachments().subscribe(() => {\n      this.afterClosed$.next();\n      this.afterClosed$.complete();\n    });\n  }\n\n  close(): void {\n    this.overlayRef.dispose();\n    this.afterClosed$.next();\n    this.afterClosed$.complete();\n  }\n\n  selectItem(item: MozActionListItem): void {\n    this.itemClicked$.next(item);\n    this.close();\n  }\n\n  afterClosed(): Observable<void> {\n    return this.afterClosed$.asObservable();\n  }\n\n  onItemClick(): Observable<MozActionListItem> {\n    return this.itemClicked$.asObservable();\n  }\n}\n","import { InjectionToken } from '@angular/core';\nimport { MozActionListItem } from '../model/action-listbox.model';\n\nexport type ActionListboxPosition = 'below' | 'above' | 'before' | 'after';\n\nexport interface ActionListboxConfig {\n  items: MozActionListItem[];\n  title?: string;\n  position?: ActionListboxPosition;\n  hasBackdrop?: boolean;\n}\n\nexport const ACTION_LISTBOX_CONFIG = new InjectionToken<ActionListboxConfig>(\n  'ACTION_LISTBOX_CONFIG'\n);\n\nexport const DEFAULT_ACTION_LISTBOX_CONFIG: Omit<Partial<ActionListboxConfig>, 'items'> = {\n  position: 'below',\n  hasBackdrop: true,\n};\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { MozActionListboxComponent } from '../action-listbox';\nimport { ActionListboxRef } from '../ref/action-listbox-ref';\nimport { ActionListboxConfig, ACTION_LISTBOX_CONFIG } from '../config/action-listbox.config';\nimport { MozActionListItem } from '../model/action-listbox.model';\n\n@Component({\n  selector: 'moz-action-listbox-container',\n  imports: [MozActionListboxComponent],\n  templateUrl: './action-listbox-container.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ActionListboxContainerComponent {\n  readonly config = inject<ActionListboxConfig>(ACTION_LISTBOX_CONFIG);\n  private readonly listboxRef = inject(ActionListboxRef);\n\n  onItemClick(item: MozActionListItem): void {\n    this.listboxRef.selectItem(item);\n  }\n}\n","<moz-action-listbox\n  [items]=\"config.items\"\n  [title]=\"config.title\"\n  (itemClick)=\"onItemClick($event)\"\n/>\n","import {\n  Directive,\n  ElementRef,\n  Injector,\n  inject,\n  input,\n  output,\n  OnDestroy,\n  HostListener,\n} from '@angular/core';\nimport { Overlay, OverlayConfig, OverlayRef, ConnectedPosition } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { MozActionListItem } from '../model/action-listbox.model';\nimport { ActionListboxRef } from '../ref/action-listbox-ref';\nimport {\n  ActionListboxConfig,\n  ActionListboxPosition,\n  ACTION_LISTBOX_CONFIG,\n  DEFAULT_ACTION_LISTBOX_CONFIG,\n} from '../config/action-listbox.config';\nimport { ActionListboxContainerComponent } from '../container/action-listbox-container';\n\n@Directive({\n  selector: '[mozActionListboxTrigger]',\n  standalone: true,\n  exportAs: 'mozActionListboxTrigger',\n})\nexport class MozActionListboxTriggerDirective implements OnDestroy {\n  private readonly overlay = inject(Overlay);\n  private readonly elementRef = inject(ElementRef);\n  private readonly injector = inject(Injector);\n\n  /** The list of items to display */\n  readonly mozActionListboxTrigger = input.required<MozActionListItem[]>();\n\n  /** Optional title for the listbox */\n  readonly actionListboxTitle = input<string>();\n\n  /** Position relative to the trigger element */\n  readonly actionListboxPosition = input<ActionListboxPosition>('below');\n\n  /** Emits the clicked item */\n  readonly itemClick = output<MozActionListItem>();\n\n  private listboxRef: ActionListboxRef | null = null;\n\n  @HostListener('click')\n  toggle(): void {\n    if (this.listboxRef) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n\n  open(): void {\n    if (this.listboxRef) {\n      return;\n    }\n\n    const config: ActionListboxConfig = {\n      ...DEFAULT_ACTION_LISTBOX_CONFIG,\n      items: this.mozActionListboxTrigger(),\n      title: this.actionListboxTitle(),\n      position: this.actionListboxPosition(),\n    };\n\n    const overlayRef = this.createOverlay(config.position ?? 'below');\n    const listboxRef = new ActionListboxRef(overlayRef);\n    this.listboxRef = listboxRef;\n\n    const injector = Injector.create({\n      parent: this.injector,\n      providers: [\n        { provide: ActionListboxRef, useValue: listboxRef },\n        { provide: ACTION_LISTBOX_CONFIG, useValue: config },\n      ],\n    });\n\n    const portal = new ComponentPortal(ActionListboxContainerComponent, null, injector);\n\n    overlayRef.attach(portal);\n\n    listboxRef.onItemClick().subscribe((item) => {\n      this.itemClick.emit(item);\n    });\n\n    listboxRef.afterClosed().subscribe(() => {\n      this.listboxRef = null;\n    });\n  }\n\n  close(): void {\n    this.listboxRef?.close();\n    this.listboxRef = null;\n  }\n\n  ngOnDestroy(): void {\n    this.close();\n  }\n\n  private createOverlay(position: ActionListboxPosition): OverlayRef {\n    const positions = this.getPositions(position);\n\n    const config = new OverlayConfig({\n      hasBackdrop: true,\n      backdropClass: 'cdk-overlay-transparent-backdrop',\n      positionStrategy: this.overlay\n        .position()\n        .flexibleConnectedTo(this.elementRef)\n        .withPositions(positions)\n        .withPush(true)\n        .withViewportMargin(8),\n      scrollStrategy: this.overlay.scrollStrategies.close(),\n    });\n\n    return this.overlay.create(config);\n  }\n\n  private getPositions(position: ActionListboxPosition): ConnectedPosition[] {\n    const positionMap: Record<ActionListboxPosition, ConnectedPosition[]> = {\n      below: [\n        { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n        { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n        { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n      ],\n      above: [\n        { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n        { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n      ],\n      before: [\n        { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -4 },\n        { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: 4 },\n      ],\n      after: [\n        { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top', offsetX: 4 },\n        { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top', offsetX: -4 },\n      ],\n    };\n\n    return positionMap[position];\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ElementRef,\n  OnDestroy,\n  computed,\n  input,\n  model,\n  signal,\n  viewChild,\n  afterNextRender,\n} from '@angular/core';\nimport { ChevronLeft20, ChevronRight20 } from '@mozaic-ds/icons-angular';\nimport { MozIconButtonComponent } from '../icon-button/icon-button';\n\n@Component({\n  selector: 'moz-carousel',\n  imports: [ChevronLeft20, ChevronRight20, MozIconButtonComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './carousel.html',\n  styleUrls: ['./carousel.scss'],\n})\nexport class MozCarouselComponent implements OnDestroy {\n  readonly ariaLabelledby = input<string | null>(null);\n  readonly previousButtonAriaLabel = input('previous');\n  readonly nextButtonAriaLabel = input('next');\n  readonly index = model(0);\n\n  private readonly contentEl = viewChild<ElementRef<HTMLElement>>('content');\n\n  private metrics = signal({ left: 0, cw: 0, sw: 0 });\n  private raf = 0;\n  private cleanup: Array<() => void> = [];\n\n  private eps = 1;\n\n  readonly canPrev = computed(() => this.metrics().left > this.eps);\n  readonly canNext = computed(() => {\n    const { left, cw, sw } = this.metrics();\n    return left + cw < sw - this.eps;\n  });\n\n  private updateLogicalIndexFromScroll() {\n    const root = this.contentEl()?.nativeElement;\n    if (!root) return;\n    const children = Array.from(root.children) as HTMLElement[];\n    if (!children.length) return;\n\n    const center = this.metrics().left + this.metrics().cw / 2;\n    let best = 0;\n    let bestDist = Number.POSITIVE_INFINITY;\n    children.forEach((el, i) => {\n      const mid = el.offsetLeft + el.offsetWidth / 2;\n      const d = Math.abs(mid - center);\n      if (d < bestDist) {\n        bestDist = d;\n        best = i;\n      }\n    });\n    if (best !== this.index()) this.index.set(best);\n  }\n\n  constructor() {\n    afterNextRender(() => {\n      const root = this.contentEl()?.nativeElement;\n      if (!root) return;\n\n      const update = () => {\n        this.metrics.set({\n          left: root.scrollLeft,\n          cw: root.clientWidth,\n          sw: root.scrollWidth,\n        });\n        this.updateLogicalIndexFromScroll();\n      };\n\n      update();\n\n      const onScroll = () => {\n        cancelAnimationFrame(this.raf);\n        this.raf = requestAnimationFrame(update);\n      };\n      root.addEventListener('scroll', onScroll, { passive: true });\n\n      const onResize = () => update();\n      window.addEventListener('resize', onResize, { passive: true });\n\n      this.cleanup.push(\n        () => root.removeEventListener('scroll', onScroll),\n        () => window.removeEventListener('resize', onResize),\n        () => cancelAnimationFrame(this.raf)\n      );\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.cleanup.forEach((fn) => fn());\n  }\n\n  goPrevious(): void {\n    const root = this.contentEl()?.nativeElement;\n    if (!root) return;\n    root.scrollBy({ left: -root.clientWidth, behavior: 'smooth' });\n  }\n\n  goNext(): void {\n    const root = this.contentEl()?.nativeElement;\n    if (!root) return;\n    root.scrollBy({ left: root.clientWidth, behavior: 'smooth' });\n  }\n}\n","<div\n  class=\"mc-carousel\"\n  role=\"group\"\n  aria-roledescription=\"carousel\"\n  [attr.aria-labelledby]=\"ariaLabelledby()\"\n>\n  <div class=\"mc-carousel__header\">\n    <div class=\"mc-carousel__headings\">\n      <ng-content select=\"[header]\"></ng-content>\n    </div>\n\n    <div class=\"mc-carousel__controls\">\n      <moz-icon-button\n        (activated)=\"goPrevious()\"\n        [disabled]=\"!canPrev()\"\n        [ariaLabel]=\"previousButtonAriaLabel()\"\n        [size]=\"'s'\"\n        [outlined]=\"true\"\n        [id]=\"'carousel-previous-button'\"\n      >\n        <ChevronLeft20 icon aria-hidden=\"true\" />\n      </moz-icon-button>\n\n      <moz-icon-button\n        (activated)=\"goNext()\"\n        [disabled]=\"!canNext()\"\n        [ariaLabel]=\"nextButtonAriaLabel()\"\n        [size]=\"'s'\"\n        [outlined]=\"true\"\n        [id]=\"'carousel-next-button'\"\n      >\n        <ChevronRight20 icon aria-hidden=\"true\" />\n      </moz-icon-button>\n    </div>\n  </div>\n\n  <div class=\"mc-carousel__content\" #content>\n    <ng-content></ng-content>\n  </div>\n</div>\n","import { NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, Signal, Type } from '@angular/core';\nimport {\n  CheckCircleFilled24,\n  CrossCircleFilled24,\n  InfoCircleFilled24,\n  WarningCircleFilled24,\n} from '@mozaic-ds/icons-angular';\nimport { MozLoaderComponent } from '../loader/loader';\nimport { MozStatusMessageStatus } from './model/status-message.model';\n\n@Component({\n  selector: 'moz-status-message',\n  imports: [NgComponentOutlet, MozLoaderComponent],\n  templateUrl: './status-message.html',\n  styleUrls: ['./status-message.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozStatusMessageComponent {\n  readonly status = input<MozStatusMessageStatus>('info');\n  readonly description = input<string | null>(null);\n  readonly id = input<string>('status-message');\n\n  readonly classes = computed(() => ({\n    'mc-status-message': true,\n    [`mc-status-message--${this.status()}`]: this.status(),\n  }));\n\n  readonly iconComponent: Signal<Type<unknown>> = computed(() => {\n    switch (this.status()) {\n      case 'success':\n        return CheckCircleFilled24;\n      case 'warning':\n        return WarningCircleFilled24;\n      case 'error':\n        return CrossCircleFilled24;\n      case 'neutral':\n      case 'inprogress':\n      default:\n        return InfoCircleFilled24;\n    }\n  });\n}\n","<div [class]=\"classes()\" [id]=\"id()\">\n  @if (status() === 'inprogress') {\n  <moz-loader size=\"s\"></moz-loader>\n  } @else {\n  <div class=\"mc-status-message__icon\">\n    <ng-container [ngComponentOutlet]=\"iconComponent()\"></ng-container>\n  </div>\n  }\n\n  <p class=\"mc-status-message__description\">\n    @if (description()) {\n    {{ description() }}\n    }\n  </p>\n</div>\n","import { ChangeDetectionStrategy, Component, Type, computed, input } from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { ArrowBottomRight24, ArrowTopRight24, Less24 } from '@mozaic-ds/icons-angular';\nimport { MozKpiTrend, MozKpiStatus, MozKpiSize } from './model/kpi.model';\n\n@Component({\n  selector: 'moz-kpi',\n  imports: [NgComponentOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './kpi.html',\n  styleUrls: ['./kpi.scss'],\n})\nexport class MozKpiComponent {\n  /** The current value of the KPI item. */\n  readonly value = input.required<string>();\n\n  /** Defines the evolution of the KPI. */\n  readonly trend = input<MozKpiTrend | null>(null);\n\n  /** Label of the KPI item. */\n  readonly label = input<string | null>(null);\n\n  /** Allows to define the KPI item status. */\n  readonly status = input<MozKpiStatus>('info');\n\n  /** The evolution information defining the KPI. */\n  readonly information = input<string | null>(null);\n\n  /** Allows to define the KPI item size. */\n  readonly size = input<MozKpiSize>('s');\n\n  readonly isMedium = computed(() => this.size() === 'm');\n  readonly isLarge = computed(() => this.size() === 'l');\n\n  readonly rootClasses = computed(() => ({\n    'kpi': true,\n    'kpi--s': this.size() === 's',\n    'kpi--m': this.size() === 'm',\n    'kpi--l': this.size() === 'l',\n    'kpi--info': this.status() === 'info',\n    'kpi--warning': this.status() === 'warning',\n    'kpi--error': this.status() === 'error',\n    'kpi--success': this.status() === 'success',\n    'kpi--neutral': this.status() === 'neutral',\n  }));\n\n  private readonly iconMap: Record<MozKpiTrend, Type<unknown>> = {\n    increasing: ArrowTopRight24,\n    decreasing: ArrowBottomRight24,\n    stable: Less24,\n  };\n\n  readonly IconComponent = computed<Type<unknown> | null>(() => {\n    const t = this.trend();\n    return t ? this.iconMap[t] : null;\n  });\n}\n","<div [class]=\"rootClasses()\">\n  @if (isMedium() && label()) {\n  <span class=\"kpi__label\">\n    {{ label() }}\n  </span>\n  }\n\n  <div class=\"kpi__content\">\n    <div class=\"kpi__main\">\n      @if (isLarge() && label()) {\n      <span class=\"kpi__label\">\n        {{ label() }}\n      </span>\n      }\n\n      <span class=\"kpi__value\">\n        {{ value() }}\n      </span>\n    </div>\n\n    @if (trend() || information()) {\n    <div class=\"kpi__aside\">\n      @if (isLarge() && information()) {\n      <span class=\"kpi__detail\">\n        {{ information() }}\n      </span>\n      } @if (IconComponent()) {\n      <div class=\"button__icon\" aria-hidden=\"true\">\n        <ng-container [ngComponentOutlet]=\"IconComponent()\"></ng-container>\n      </div>\n      }\n    </div>\n    }\n  </div>\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n@Component({\n  selector: 'moz-stepper-compact',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './stepper-compact.html',\n  styleUrls: ['./stepper-compact.scss'],\n})\nexport class MozStepperCompactComponent {\n  value = input.required<number>();\n  maxSteps = input<number>(4);\n  label = input<string>('');\n  description = input<string>('');\n\n  readonly hasLabel = computed(() => !!this.label() && this.label().trim().length > 0);\n\n  readonly safeMaxSteps = computed(() => {\n    const max = this.maxSteps();\n    return max && max > 0 ? max : 4;\n  });\n\n  readonly progressPercentage = computed(() => {\n    const max = this.safeMaxSteps();\n    const current = this.value();\n    const clamped = Math.max(0, Math.min(current, max));\n    return (clamped / max) * 100;\n  });\n}\n","<div class=\"mc-stepper-compact\">\n  <div\n    class=\"mc-circular-progressbar mc-stepper-compact__progress\"\n    role=\"progressbar\"\n    aria-label=\"Progress bar\"\n    [attr.aria-valuemin]=\"0\"\n    [attr.aria-valuemax]=\"safeMaxSteps()\"\n    [attr.aria-valuenow]=\"value()\"\n    [style.--progress-value]=\"progressPercentage()\"\n  >\n    <svg\n      class=\"mc-circular-progressbar__line\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      aria-hidden=\"true\"\n      viewBox=\"0 0 100 100\"\n    >\n      <circle class=\"mc-circular-progressbar__track\" cx=\"50\" cy=\"50\" r=\"46\"></circle>\n      <circle\n        class=\"mc-circular-progressbar__indicator mc-stepper-compact__indicator\"\n        cx=\"50\"\n        cy=\"50\"\n        r=\"46\"\n      ></circle>\n    </svg>\n    <div class=\"mc-circular-progressbar__content\">\n      <p class=\"mc-circular-progressbar__number mc-stepper-compact__number\">\n        {{ value() }} / {{ safeMaxSteps() }}\n      </p>\n    </div>\n  </div>\n\n  @if (hasLabel()) {\n  <div class=\"mc-stepper-compact__label-container\">\n    <p class=\"mc-stepper-compact__label\">\n      {{ label() }}\n    </p>\n\n    @if (description().trim().length) {\n    <p class=\"mc-stepper-compact__description\">\n      {{ description() }}\n    </p>\n    }\n  </div>\n  }\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  Type,\n  computed,\n  input,\n  model,\n  signal,\n} from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport {\n  Star20,\n  Star24,\n  Star32,\n  StarFilled20,\n  StarFilled24,\n  StarFilled32,\n  StarHalf20,\n  StarHalf24,\n  StarHalf32,\n} from '@mozaic-ds/icons-angular';\nimport { MozStarRatingSize, MozStarRatingAppearance } from './model/star-rating.model';\n\n@Component({\n  selector: 'moz-star-rating',\n  imports: [NgComponentOutlet],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './star-rating.html',\n  styleUrls: ['./star-rating.scss'],\n})\nexport class MozStarRatingComponent {\n  /**\n   * The current rating value of the component.\n   * Used with two-way binding [(value)].\n   * When the rating changes (via click or keyboard), the model is automatically updated.\n   */\n  readonly value = model<number>(0);\n\n  /**\n   * Determines whether the rating is interactive or read-only.\n   * When true, all user interactions (click, hover, keyboard) are disabled.\n   * Automatically set to true when `compact`, `href`, or `text` are provided.\n   */\n  readonly readonly = input<boolean>(true);\n\n  /**\n   * Enables a compact display mode that shows only one star instead of five.\n   * Typically used for summaries or quick visual cues.\n   * When enabled, the component automatically becomes read-only.\n   */\n  readonly compact = input<boolean>(false);\n\n  /**\n   * Defines the visual size of the star icons and the accompanying text.\n   */\n  readonly size = input<MozStarRatingSize>('s');\n\n  /**\n   * Specifies the color scheme of the stars.\n   */\n  readonly appearance = input<MozStarRatingAppearance>('accent');\n\n  /**\n   * Optional text displayed next to the star rating.\n   * If provided, the component automatically becomes read-only.\n   */\n  readonly text = input<string | null>(null);\n\n  /**\n   * URL for the link (for external links).\n   */\n  readonly href = input<string | null>(null);\n\n  /**\n   * Where to open the link.\n   */\n  readonly target = input<string | null>(null);\n\n  // -------- logique dérivée --------\n\n  readonly maxValue = computed(() => (this.compact() ? 1 : 5));\n\n  readonly isReadonly = computed(\n    () =>\n      this.readonly() ||\n      this.compact() ||\n      !!this.href() ||\n      !!(this.text() && this.text()!.trim().length)\n  );\n\n  readonly hasInfoText = computed(() => !!(this.text() || this.href()));\n\n  readonly ariaLabel = computed(() => `Note ${this.displayValue()} sur ${this.maxValue()}`);\n\n  readonly stars = computed(() => Array.from({ length: this.maxValue() }, (_, i) => i));\n\n  readonly classes = computed(() => ({\n    'star-rating': true,\n    'star-rating--link': !!this.href(),\n    'star-rating--slider': !this.isReadonly(),\n    'star-rating--s': this.size() === 's',\n    'star-rating--m': this.size() === 'm',\n    'star-rating--l': this.size() === 'l',\n    'star-rating--standard': this.appearance() === 'standard',\n    'star-rating--accent': this.appearance() === 'accent',\n  }));\n\n  // Icon maps for each size\n  private readonly iconMaps = {\n    s: {\n      star: Star20,\n      'star-filled': StarFilled20,\n      'star-half': StarHalf20,\n    },\n    m: {\n      star: Star24,\n      'star-filled': StarFilled24,\n      'star-half': StarHalf24,\n    },\n    l: {\n      star: Star32,\n      'star-filled': StarFilled32,\n      'star-half': StarHalf32,\n    },\n  };\n\n  // -------- gestion preview / hover & clavier --------\n\n  private hoverValue = signal<number | null>(null);\n\n  /**\n   * valeur réellement utilisée pour afficher les étoiles :\n   * - en readonly : toujours value()\n   * - en interactif : hoverValue si non nul, sinon value()\n   */\n  readonly displayValue = computed(() => {\n    if (this.isReadonly()) return this.value();\n    return this.hoverValue() ?? this.value();\n  });\n\n  private clampValue(newValue: number): number {\n    const max = this.maxValue();\n    // dans le JS ils ne descendent jamais sous 1 via clavier\n    return Math.min(max, Math.max(1, Math.floor(newValue)));\n  }\n\n  /** JS: onClick(index) -> setValue(index+1) + updateStarIcons */\n  onStarClick(index: number): void {\n    if (this.isReadonly()) return;\n    const newValue = this.clampValue(index + 1);\n    this.hoverValue.set(null);\n    this.value.set(newValue);\n  }\n\n  /** JS: onHover(index) -> hoverValue=index+1 + updateStarIcons(hoverValue) */\n  onStarMouseMove(index: number): void {\n    if (this.isReadonly()) return;\n    this.hoverValue.set(this.clampValue(index + 1));\n  }\n\n  /** JS: resetHoverValue() -> hoverValue=null + updateStarIcons(value) */\n  clearHover(): void {\n    if (this.isReadonly()) return;\n    this.hoverValue.set(null);\n  }\n\n  /** JS: onKeydown (ArrowRight / ArrowLeft) */\n  onWrapperKeydown(event: KeyboardEvent): void {\n    if (this.isReadonly()) return;\n\n    const key = event.key;\n    const max = this.maxValue();\n    let current = Math.floor(this.value() || 0);\n\n    if (key === 'ArrowRight') {\n      current = Math.min(max, current + 1);\n    } else if (key === 'ArrowLeft') {\n      current = Math.max(1, current - 1);\n    } else {\n      return;\n    }\n\n    this.hoverValue.set(null);\n    this.value.set(current);\n    event.preventDefault();\n  }\n\n  // -------- calcul du composant d'étoile (JS: getStarComponent) --------\n\n  getStarComponent(index: number): Type<unknown> {\n    const compact = this.compact();\n    const isReadonly = this.isReadonly();\n    const baseValue = this.displayValue();\n    const size = this.size();\n    const iconMap = this.iconMaps[size];\n\n    if (compact || baseValue >= index + 1) {\n      return iconMap['star-filled'];\n    } else if (isReadonly && baseValue >= index + 0.5) {\n      // half star uniquement en readonly comme en JS\n      return iconMap['star-half'];\n    } else {\n      return iconMap['star'];\n    }\n  }\n}\n","@if (href()) {\n<a [class]=\"classes()\" [href]=\"href()!\" [attr.target]=\"target()\">\n  <div\n    class=\"star-rating__wrapper\"\n    [attr.tabindex]=\"isReadonly() ? -1 : 0\"\n    [attr.role]=\"isReadonly() ? 'img' : 'slider'\"\n    [attr.aria-label]=\"ariaLabel()\"\n    [attr.aria-readonly]=\"isReadonly() ? true : null\"\n    [attr.aria-valuemin]=\"!isReadonly() ? 0 : null\"\n    [attr.aria-valuemax]=\"!isReadonly() ? maxValue() : null\"\n    [attr.aria-valuenow]=\"!isReadonly() ? value() : null\"\n    (keydown)=\"isReadonly() ? null : onWrapperKeydown($event)\"\n    (mouseleave)=\"isReadonly() ? null : clearHover()\"\n    (blur)=\"isReadonly() ? null : clearHover()\"\n  >\n    @for (index of stars(); track index) {\n    <span\n      class=\"star-rating__icon\"\n      (click)=\"isReadonly() ? null : onStarClick(index)\"\n      (mousemove)=\"isReadonly() ? null : onStarMouseMove(index)\"\n    >\n      <ng-container [ngComponentOutlet]=\"getStarComponent(index)\"></ng-container>\n    </span>\n    }\n  </div>\n\n  @if (hasInfoText()) {\n  <span class=\"star-rating__info\">\n    {{ text() || href() }}\n  </span>\n  }\n</a>\n} @else {\n<div [class]=\"classes()\">\n  <div\n    class=\"star-rating__wrapper\"\n    [attr.tabindex]=\"isReadonly() ? -1 : 0\"\n    [attr.role]=\"isReadonly() ? 'img' : 'slider'\"\n    [attr.aria-label]=\"ariaLabel()\"\n    [attr.aria-readonly]=\"isReadonly() ? true : null\"\n    [attr.aria-valuemin]=\"!isReadonly() ? 0 : null\"\n    [attr.aria-valuemax]=\"!isReadonly() ? maxValue() : null\"\n    [attr.aria-valuenow]=\"!isReadonly() ? value() : null\"\n    (keydown)=\"isReadonly() ? null : onWrapperKeydown($event)\"\n    (mouseleave)=\"isReadonly() ? null : clearHover()\"\n    (blur)=\"isReadonly() ? null : clearHover()\"\n  >\n    @for (index of stars(); track index) {\n    <span\n      class=\"star-rating__icon\"\n      (click)=\"isReadonly() ? null : onStarClick(index)\"\n      (mousemove)=\"isReadonly() ? null : onStarMouseMove(index)\"\n    >\n      <ng-container [ngComponentOutlet]=\"getStarComponent(index)\"></ng-container>\n    </span>\n    }\n  </div>\n\n  @if (hasInfoText()) {\n  <span class=\"star-rating__info\">\n    {{ text() || href() }}\n  </span>\n  }\n</div>\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, model } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { ChevronRight20 } from '@mozaic-ds/icons-angular';\nimport { MozBuiltInMenuItem } from './model/built-in-menu.model';\n\n/**\n * A built-in menu is a structured list of navigational or interactive options,\n * typically displayed as a vertical stack.\n */\n@Component({\n  selector: 'moz-built-in-menu',\n  templateUrl: './built-in-menu.html',\n  styleUrls: ['./built-in-menu.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [NgComponentOutlet, ChevronRight20, RouterLink],\n})\nexport class BuiltInMenuComponent {\n  /**\n   * Items displayed in the menu.\n   */\n  readonly items = input.required<MozBuiltInMenuItem[]>();\n\n  /**\n   * Index of the currently selected menu item.\n   * Used with two-way binding: [(selectedIndex)].\n   */\n  readonly selectedIndex = model<number | null>(null);\n\n  /**\n   * When enabled, adds a visible border around the wrapper.\n   */\n  readonly outlined = input(false);\n\n  /**\n   * Accessible label for the navigation.\n   */\n  readonly ariaLabel = input<string>('menu');\n\n  readonly hostClasses = computed(() =>\n    ['mc-built-in-menu', this.outlined() ? 'mc-built-in-menu--outlined' : '']\n      .filter(Boolean)\n      .join(' ')\n  );\n\n  isSelected(index: number): boolean {\n    return this.selectedIndex() === index;\n  }\n\n  onItemClick(index: number, event: Event): void {\n    if (this.selectedIndex() !== index) {\n      this.selectedIndex.set(index);\n    }\n\n    const target = event.currentTarget as HTMLAnchorElement | HTMLButtonElement | null;\n    if (target && target instanceof HTMLAnchorElement && target.getAttribute('href') === '#') {\n      event.preventDefault();\n    }\n  }\n}\n","<nav [class]=\"hostClasses()\" role=\"navigation\" [attr.aria-label]=\"ariaLabel()\">\n  <ul class=\"mc-built-in-menu__list\">\n    @for (item of items(); let index = $index; track index) {\n    <li\n      class=\"mc-built-in-menu__item\"\n      [class.mc-built-in-menu__item--selected]=\"isSelected(index)\"\n      [attr.aria-current]=\"isSelected(index) ? 'true' : null\"\n    >\n      @if (item.href) {\n      <a\n        class=\"mc-built-in-menu__link\"\n        [attr.href]=\"item.href\"\n        [attr.target]=\"item.target || '_self'\"\n        (click)=\"onItemClick(index, $event)\"\n      >\n        @if (item.icon) {\n        <span class=\"mc-built-in-menu__icon\" aria-hidden=\"true\">\n          <ng-container [ngComponentOutlet]=\"item.icon\"></ng-container>\n        </span>\n        }\n\n        <span class=\"mc-built-in-menu__label\">{{ item.label }}</span>\n\n        <ChevronRight20 class=\"mc-built-in-menu__icon\" />\n      </a>\n      } @else if (item.routerLink) {\n      <a\n        class=\"mc-built-in-menu__link\"\n        [routerLink]=\"item.routerLink\"\n        [attr.target]=\"item.target || '_self'\"\n        (click)=\"onItemClick(index, $event)\"\n      >\n        @if (item.icon) {\n        <span class=\"mc-built-in-menu__icon\" aria-hidden=\"true\">\n          <ng-container [ngComponentOutlet]=\"item.icon\"></ng-container>\n        </span>\n        }\n\n        <span class=\"mc-built-in-menu__label\">{{ item.label }}</span>\n\n        <ChevronRight20 class=\"mc-built-in-menu__icon\" />\n      </a>\n      } @else {\n      <button type=\"button\" class=\"mc-built-in-menu__button\" (click)=\"onItemClick(index, $event)\">\n        @if (item.icon) {\n        <span class=\"mc-built-in-menu__icon\" aria-hidden=\"true\">\n          <ng-container [ngComponentOutlet]=\"item.icon\"></ng-container>\n        </span>\n        }\n\n        <span class=\"mc-built-in-menu__label\">{{ item.label }}</span>\n\n        <ChevronRight20 class=\"mc-built-in-menu__icon\" />\n      </button>\n      }\n    </li>\n    }\n  </ul>\n</nav>\n","import { ChangeDetectionStrategy, Component, computed, input, model } from '@angular/core';\nimport { BuiltInMenuComponent } from '../built-in-menu/built-in-menu';\nimport { CheckCircleFilled24 } from '@mozaic-ds/icons-angular';\nimport { MozBuiltInMenuItem } from '../built-in-menu/model/built-in-menu.model';\nimport { MozCheckListMenuItem } from './model/check-list-menu.model';\n\n@Component({\n  selector: 'moz-check-list-menu',\n  templateUrl: './check-list-menu.html',\n  styleUrls: ['./check-list-menu.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [BuiltInMenuComponent],\n})\nexport class MozCheckListMenuComponent {\n  /**\n   * Defines the menu items, each of which sets a checked state and can act as a button or link.\n   */\n  readonly items = input<MozCheckListMenuItem[]>([]);\n\n  /**\n   * When enabled, adds a visible border around the wrapper.\n   */\n  readonly outlined = input(false);\n\n  /**\n   * Currently selected item index (two-way bindable with [(selectedIndex)]).\n   */\n  readonly selectedIndex = model<number | null>(null);\n\n  /**\n   * Internal mapping to BuiltInMenuItem with an icon for checked items.\n   */\n  readonly menuItems = computed<MozBuiltInMenuItem[]>(() =>\n    this.items().map((item) => ({\n      ...item,\n      icon: item.checked ? CheckCircleFilled24 : undefined,\n    }))\n  );\n}\n","<moz-built-in-menu\n  [items]=\"menuItems()\"\n  [outlined]=\"outlined()\"\n  [selectedIndex]=\"selectedIndex()\"\n  (selectedIndexChange)=\"selectedIndex.set($event)\"\n></moz-built-in-menu>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { Check20, ChevronRight20 } from '@mozaic-ds/icons-angular';\nimport { MozStepperInlineStep } from './model/stepper-inline.model';\n\n@Component({\n  selector: 'moz-stepper-inline',\n  templateUrl: './stepper-inline.html',\n  styleUrls: ['./stepper-inline.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [Check20, ChevronRight20],\n})\nexport class MozStepperInlineComponent {\n  /**\n   * Current step of the stepper inline (1-based index).\n   */\n  readonly currentStep = input<number>(1);\n\n  /**\n   * Steps of the stepper inline.\n   */\n  readonly steps = input<MozStepperInlineStep[]>([]);\n\n  /**\n   * Clamped current step between 1 and steps.length.\n   */\n  readonly safeStep = computed(() => {\n    const steps = this.steps();\n    const max = steps.length || 1;\n    const raw = this.currentStep();\n    return Math.min(Math.max(raw, 1), max);\n  });\n\n  /**\n   * Derived state for each step: completed / current.\n   */\n  readonly stepStates = computed(() =>\n    this.steps().map((_, i) => ({\n      completed: i + 1 < this.safeStep(),\n      current: i + 1 === this.safeStep(),\n    }))\n  );\n}\n","<nav class=\"mc-stepper-inline\" aria-label=\"Stepper\">\n  <ol class=\"mc-stepper-inline__container\">\n    @for (step of steps(); let i = $index; track i) {\n    <li\n      class=\"mc-stepper-inline__item\"\n      [class.is-completed]=\"stepStates()[i].completed\"\n      [attr.tabindex]=\"stepStates()[i].completed ? 0 : null\"\n    >\n      @if (stepStates()[i].completed) {\n      <Check20 class=\"mc-stepper-inline__icon mc-stepper-inline__icon--check\" aria-hidden=\"true\" />\n      } @else {\n      <span class=\"mc-stepper-inline__circle\" [class.is-current]=\"stepStates()[i].current\">\n        {{ i + 1 }}\n      </span>\n      }\n\n      <div class=\"mc-stepper-inline__content\">\n        <span class=\"mc-stepper-inline__label\" [class.is-current]=\"stepStates()[i].current\">\n          {{ step.label }}\n        </span>\n        @if (step.additionalInfo) {\n        <span class=\"mc-stepper-inline__additional\">\n          {{ step.additionalInfo }}\n        </span>\n        }\n      </div>\n\n      @if (i < steps().length - 1) {\n      <ChevronRight20 class=\"mc-stepper-inline__icon mc-stepper-inline__icon--chevron\" />\n      }\n    </li>\n    }\n  </ol>\n</nav>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { Check24 } from '@mozaic-ds/icons-angular';\nimport { MozStepperStackedStep } from './model/stepper-stacked.model';\n\nlet _nextId = 0;\n\n@Component({\n  selector: 'moz-stepper-stacked',\n  templateUrl: './stepper-stacked.html',\n  styleUrls: ['./stepper-stacked.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [Check24],\n})\nexport class MozStepperStackedComponent {\n  /**\n   * Optional prefix used to build auto-generated step IDs when a step\n   * doesn't provide its own `id`. Defaults to a unique `moz-stepper-N`.\n   * Override this when multiple steppers share the same page so their\n   * auto-generated IDs don't collide.\n   */\n  readonly componentId = input<string>(`moz-stepper-${++_nextId}`);\n\n  /**\n   * Current step of the stepper stacked (1-based index).\n   */\n  readonly currentStep = input<number>(1);\n\n  /**\n   * Steps of the stepper stacked.\n   */\n  readonly steps = input<MozStepperStackedStep[]>([]);\n\n  /**\n   * Clamped current step between 1 and steps.length.\n   */\n  readonly safeStep = computed(() => {\n    const steps = this.steps();\n    const max = steps.length || 1;\n    const raw = this.currentStep();\n    return Math.min(Math.max(raw, 1), max);\n  });\n\n  /**\n   * Whether all steps are completed (currentStep exceeds the number of steps).\n   */\n  readonly allCompleted = computed(() => this.currentStep() > this.steps().length);\n\n  /**\n   * Derived state for each step: completed / current.\n   */\n  readonly stepStates = computed(() =>\n    this.steps().map((_, i) => ({\n      completed: i + 1 < this.safeStep() || this.allCompleted(),\n      current: i + 1 === this.safeStep() && !this.allCompleted(),\n    }))\n  );\n\n  /**\n   * Returns the resolved ID for the step at index `i`: the explicit\n   * `step.id` if provided, otherwise an auto-generated stable value.\n   */\n  stepId(step: MozStepperStackedStep, i: number): string {\n    return step.id ?? `${this.componentId()}-step-${i}`;\n  }\n}\n","<nav [id]=\"componentId()\" class=\"mc-stepper-stacked\" aria-label=\"Stepper\">\n  <ol [id]=\"componentId() + '-list'\" class=\"mc-stepper-stacked__container\">\n    @for (step of steps(); let i = $index; track i) {\n    <li\n      class=\"mc-stepper-stacked__item\"\n      [id]=\"stepId(step, i)\"\n      [class.is-current]=\"stepStates()[i].current\"\n      [class.has-additional]=\"!!step.additionalInfo\"\n    >\n      <div [id]=\"componentId() + '-step-' + i + '-indicator'\" class=\"mc-stepper-stacked__indicator\">\n        @if (stepStates()[i].completed) {\n        <Check24\n          class=\"mc-stepper-stacked__icon mc-stepper-stacked__icon--check\"\n          aria-hidden=\"true\"\n        />\n        } @else {\n        <span\n          [id]=\"componentId() + '-step-' + i + '-circle'\"\n          class=\"mc-stepper-stacked__circle\"\n          [class.is-current]=\"stepStates()[i].current\"\n        >\n          {{ i + 1 }}\n        </span>\n        }\n      </div>\n      <div [id]=\"componentId() + '-step-' + i + '-content'\" class=\"mc-stepper-stacked__content\">\n        <span\n          [id]=\"componentId() + '-step-' + i + '-label'\"\n          class=\"mc-stepper-stacked__label\"\n          [class.is-current]=\"stepStates()[i].current\"\n        >\n          {{ step.label }}\n        </span>\n        @if (step.additionalInfo) {\n        <span\n          [id]=\"componentId() + '-step-' + i + '-additional'\"\n          class=\"mc-stepper-stacked__additional\"\n        >\n          {{ step.additionalInfo }}\n        </span>\n        }\n      </div>\n    </li>\n    }\n  </ol>\n</nav>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { ArrowBack24, ArrowNext24 } from '@mozaic-ds/icons-angular';\n\n/**\n * Step position in the stepper workflow.\n */\nexport type MozStepperBottomBarStep = 'start' | 'middle' | 'end';\n\n/**\n * Stepper Bottom Bar component for navigation in multi-step processes.\n *\n * @description\n * The stepper bottom bar provides navigation controls for multi-step workflows,\n * with cancel, previous, next, and validate buttons that adapt based on the current step.\n */\n@Component({\n  selector: 'moz-stepper-bottom-bar',\n  templateUrl: './stepper-bottom-bar.html',\n  styleUrls: ['./stepper-bottom-bar.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [ArrowBack24, ArrowNext24],\n})\nexport class MozStepperBottomBarComponent {\n  /**\n   * Base ID for the stepper component.\n   */\n  id = input<string>('stepper-bottom-bar');\n\n  /**\n   * Step of the process.\n   */\n  step = input<MozStepperBottomBarStep>('start');\n\n  /**\n   * If `true`, display the cancel button.\n   */\n  hasCancel = input<boolean>(true);\n\n  /**\n   * Text for the cancel button.\n   */\n  cancelText = input<string>('Cancel');\n\n  /**\n   * Text for the previous button.\n   */\n  previousText = input<string>('Previous');\n\n  /**\n   * Text for the next button.\n   */\n  nextText = input<string>('Next');\n\n  /**\n   * Text for the validate button.\n   */\n  validateText = input<string>('Validate');\n\n  /**\n   * If `true`, disable the next button.\n   */\n  disabledNext = input<boolean>(false);\n\n  /**\n   * Event emitted when cancel button is clicked.\n   */\n  cancel = output<void>();\n\n  /**\n   * Event emitted when previous button is clicked.\n   */\n  previous = output<void>();\n\n  /**\n   * Event emitted when next button is clicked.\n   */\n  next = output<void>();\n\n  /**\n   * Event emitted when validate button is clicked.\n   */\n  validate = output<void>();\n\n  handleCancel() {\n    this.cancel.emit();\n  }\n\n  handlePrevious() {\n    this.previous.emit();\n  }\n\n  handleNext() {\n    this.next.emit();\n  }\n\n  handleValidate() {\n    this.validate.emit();\n  }\n\n  /**\n   * Computed IDs for buttons\n   */\n  cancelButtonId = computed(() => `${this.id()}-cancel`);\n  cancelButtonIconId = computed(() => `${this.id()}-cancel-icon`);\n  previousButtonId = computed(() => `${this.id()}-previous`);\n  previousButtonIconId = computed(() => `${this.id()}-previous-icon`);\n  nextButtonId = computed(() => `${this.id()}-next`);\n  nextButtonIconId = computed(() => `${this.id()}-next-icon`);\n  validateButtonId = computed(() => `${this.id()}-validate`);\n  validateButtonIconId = computed(() => `${this.id()}-validate-icon`);\n}\n","<div class=\"stepper-bottom-bar\">\n  <div class=\"divider-horizontal stepper-bottom-bar__divider\"></div>\n  <div class=\"stepper-bottom-bar__left\">\n    @if (hasCancel()) {\n    <button\n      type=\"button\"\n      class=\"button button--ghost button--s stepper-bottom-bar__button--text\"\n      [id]=\"cancelButtonId()\"\n      (click)=\"handleCancel()\"\n    >\n      {{ cancelText() }}\n    </button>\n\n    <button\n      type=\"button\"\n      class=\"button button--ghost button--icon stepper-bottom-bar__button--icon\"\n      [id]=\"cancelButtonIconId()\"\n      [attr.aria-label]=\"cancelText()\"\n      (click)=\"handleCancel()\"\n    >\n      {{ cancelText() }}\n    </button>\n    }\n    <ng-content [select]=\"'custom-content-left'\"></ng-content>\n  </div>\n\n  <div class=\"stepper-bottom-bar__right\">\n    <ng-content [select]=\"'custom-content-right'\"></ng-content>\n    @if (step() !== 'start') {\n    <button\n      type=\"button\"\n      class=\"button button--outlined button--s stepper-bottom-bar__button--text\"\n      [id]=\"previousButtonId()\"\n      (click)=\"handlePrevious()\"\n    >\n      {{ previousText() }}\n    </button>\n\n    <button\n      type=\"button\"\n      class=\"button button--outlined button--icon stepper-bottom-bar__button--icon\"\n      [id]=\"previousButtonIconId()\"\n      [attr.aria-label]=\"previousText()\"\n      (click)=\"handlePrevious()\"\n    >\n      <ArrowBack24 class=\"stepper-bottom-bar__icon\" />\n    </button>\n    } @if (step() !== 'end') {\n    <button\n      type=\"button\"\n      class=\"button button--accent button--s stepper-bottom-bar__button--text\"\n      [id]=\"nextButtonId()\"\n      [disabled]=\"disabledNext()\"\n      (click)=\"handleNext()\"\n    >\n      {{ nextText() }}\n    </button>\n    <button\n      type=\"button\"\n      class=\"button button--accent button--icon stepper-bottom-bar__button--icon\"\n      [id]=\"nextButtonIconId()\"\n      [attr.aria-label]=\"nextText()\"\n      [disabled]=\"disabledNext()\"\n      (click)=\"handleNext()\"\n    >\n      <ArrowNext24 class=\"stepper-bottom-bar__icon\" />\n    </button>\n    } @if (step() === 'end') {\n    <button\n      type=\"button\"\n      class=\"button button--accent button--s stepper-bottom-bar__button--text\"\n      [id]=\"validateButtonId()\"\n      (click)=\"handleValidate()\"\n      [disabled]=\"disabledNext()\"\n    >\n      {{ validateText() }}\n    </button>\n    <button\n      type=\"button\"\n      class=\"button button--accent button--icon stepper-bottom-bar__button--icon\"\n      [id]=\"validateButtonIconId()\"\n      [attr.aria-label]=\"validateText()\"\n      [disabled]=\"disabledNext()\"\n      (click)=\"handleValidate()\"\n    >\n      {{ validateText() }}\n    </button>\n    }\n  </div>\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input, model, output } from '@angular/core';\nimport {\n  ArrowBack24,\n  HelpCircle24,\n  Menu24,\n  Notification24,\n  Search24,\n} from '@mozaic-ds/icons-angular';\nimport { MozSelectComponent } from '../select/select';\nimport { MozStatusBadgeComponent } from '../status-badge/status-badge';\nimport { MozTagComponent } from '../tag/tag';\nimport { MozTabsComponent } from '../tabs/tabs';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MozIconButtonComponent } from '../icon-button/icon-button';\nimport { MozPageHeaderScope } from './model/page-header.model';\nimport { MozStatusBadgeStatus } from '../status-badge';\nimport { MozTabItem } from '../tabs';\n\n@Component({\n  selector: 'moz-page-header',\n  templateUrl: './page-header.html',\n  styleUrls: ['./page-header.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    MozIconButtonComponent,\n    MozTagComponent,\n    MozSelectComponent,\n    MozStatusBadgeComponent,\n    MozTabsComponent,\n    ArrowBack24,\n    HelpCircle24,\n    Menu24,\n    Notification24,\n    Search24,\n    MozIconButtonComponent,\n    MozTagComponent,\n    ReactiveFormsModule,\n    MozSelectComponent,\n    FormsModule,\n    MozTabsComponent,\n  ],\n})\nexport class MozPageHeaderComponent {\n  readonly title = input.required<string>();\n  readonly shadow = input<boolean>(false);\n  readonly backButton = input<boolean>(false);\n  readonly searchButton = input<boolean>(false);\n  readonly helpButton = input<boolean>(false);\n  readonly notificationButton = input<boolean>(false);\n  readonly status = input<MozStatusBadgeStatus>();\n  readonly statusLabel = input<string>();\n  readonly extraInfo = input<string>();\n  readonly scope = input<string | MozPageHeaderScope[]>();\n  readonly scopeValue = input<string | number | boolean>();\n  readonly scopePlaceholder = input<string>();\n  readonly tabs = input<MozTabItem[]>();\n  readonly activeTab = model<number>(0);\n\n  readonly back = output<void>();\n  readonly search = output<void>();\n  readonly help = output<void>();\n  readonly notification = output<void>();\n  readonly toggleMenu = output<void>();\n  readonly toggleScope = output<boolean | undefined>();\n  readonly scopeValueChange = output<string | number | boolean>();\n  readonly activeTabChange = output<number>();\n\n  readonly classes = computed(() => ({\n    'mc-page-header': true,\n    'mc-page-header--with-shadow': this.shadow(),\n  }));\n\n  readonly isScopeString = computed(() => typeof this.scope() === 'string');\n  readonly isScopeArray = computed(() => Array.isArray(this.scope()));\n  readonly isScopeValueBoolean = computed(() => typeof this.scopeValue() === 'boolean');\n  readonly isScopeValueNotBoolean = computed(() => typeof this.scopeValue() !== 'boolean');\n\n  readonly hasStatusOrExtraInfo = computed(() => this.status() || this.extraInfo());\n  readonly hasStatusBadge = computed(() => this.statusLabel() && this.status());\n  readonly hasIconButtons = computed(\n    () => this.searchButton() || this.helpButton() || this.notificationButton()\n  );\n\n  readonly scopeAsArray = computed(() => {\n    const scope = this.scope();\n    return Array.isArray(scope) ? scope : [];\n  });\n\n  readonly mobileTagLabel = computed(() => {\n    const scope = this.scope();\n    if (!Array.isArray(scope)) return '';\n    const scopeValue = this.scopeValue();\n    if (!scopeValue) {\n      return this.scopePlaceholder() ?? '';\n    }\n    const found = scope.find((opt) => opt.value === scopeValue);\n    return found?.text ?? this.scopePlaceholder() ?? '';\n  });\n\n  onBack(): void {\n    this.back.emit();\n  }\n\n  onSearch(): void {\n    this.search.emit();\n  }\n\n  onHelp(): void {\n    this.help.emit();\n  }\n\n  onNotification(): void {\n    this.notification.emit();\n  }\n\n  onToggleMenu(): void {\n    this.toggleMenu.emit();\n  }\n\n  onToggleScope(): void {\n    this.toggleScope.emit(true);\n  }\n\n  onScopeTagClick(): void {\n    const currentValue = this.scopeValue() as boolean;\n    this.scopeValueChange.emit(!currentValue);\n  }\n\n  onScopeSelectChange(value: string | number): void {\n    this.scopeValueChange.emit(value);\n  }\n\n  onActiveTabChange(index: number): void {\n    this.activeTabChange.emit(index);\n  }\n}\n","<div [class]=\"classes()\">\n  <div class=\"mc-page-header__top-wrapper\">\n    <div class=\"mc-page-header__top-content\">\n      @if (backButton()) {\n      <moz-icon-button\n        [ghost]=\"true\"\n        [id]=\"'page-header-back-button'\"\n        ariaLabel=\"Back button\"\n        (activated)=\"onBack()\"\n      >\n        <ArrowBack24 icon />\n      </moz-icon-button>\n      }\n\n      <div class=\"mc-page-header__content-wrapper\">\n        <span class=\"mc-page-header__title\">\n          {{ title() }}\n        </span>\n\n        @if (hasStatusOrExtraInfo()) {\n        <div class=\"mc-page-header__info-wrapper\">\n          @if (hasStatusBadge()) {\n          <moz-status-badge [label]=\"statusLabel()!\" [status]=\"status()!\" />\n          } @if (extraInfo()) {\n          <span class=\"mc-page-header__extra-info\">\n            {{ extraInfo() }}\n          </span>\n          }\n        </div>\n        }\n\n        <ng-content select=\"[content]\" />\n      </div>\n    </div>\n\n    <div class=\"mc-page-header__actions-wrapper\">\n      <moz-icon-button\n        class=\"mc-page-header__burger-menu\"\n        [ghost]=\"true\"\n        [id]=\"'page-header-burger-menu'\"\n        ariaLabel=\"Burger menu\"\n        (activated)=\"onToggleMenu()\"\n      >\n        <Menu24 icon />\n      </moz-icon-button>\n\n      <ng-content select=\"[actions]\">\n        <div class=\"mc-page-header__actions-content\">\n          @if (hasIconButtons()) {\n          <div class=\"mc-page-header__icons\">\n            @if (searchButton()) {\n            <moz-icon-button\n              [ghost]=\"true\"\n              [id]=\"'page-header-search-button'\"\n              ariaLabel=\"Search button\"\n              (activated)=\"onSearch()\"\n            >\n              <Search24 icon />\n            </moz-icon-button>\n            } @if (helpButton()) {\n            <moz-icon-button\n              [ghost]=\"true\"\n              [id]=\"'page-header-help-button'\"\n              ariaLabel=\"Help button\"\n              (activated)=\"onHelp()\"\n            >\n              <HelpCircle24 icon />\n            </moz-icon-button>\n            } @if (notificationButton()) {\n            <moz-icon-button\n              [ghost]=\"true\"\n              [id]=\"'page-header-notification-button'\"\n              ariaLabel=\"Notification button\"\n              (activated)=\"onNotification()\"\n            >\n              <Notification24 icon />\n            </moz-icon-button>\n            }\n          </div>\n          } @if (isScopeString() && isScopeValueBoolean()) {\n          <moz-tag type=\"interactive\" [id]=\"'scope-tag'\" (click)=\"onScopeTagClick()\">{{\n            $any(scope())\n          }}</moz-tag>\n          } @if (isScopeArray() && isScopeValueNotBoolean()) {\n          <div class=\"mc-page-header__scope--select\">\n            <moz-select\n              [name]=\"'scope-select'\"\n              id=\"scope-select\"\n              size=\"s\"\n              [options]=\"scopeAsArray()\"\n              [placeholder]=\"scopePlaceholder()\"\n              [ngModel]=\"scopeValue()\"\n              (ngModelChange)=\"onScopeSelectChange($event)\"\n            />\n          </div>\n\n          <div class=\"mc-page-header__scope--tag\">\n            <moz-tag type=\"interactive\" [id]=\"'mobile-scope-tag'\" (click)=\"onToggleScope()\">{{\n              mobileTagLabel()\n            }}</moz-tag>\n          </div>\n          }\n        </div>\n      </ng-content>\n    </div>\n  </div>\n\n  @if (tabs() && tabs()!.length > 0) {\n  <div class=\"mc-page-header__tabs\">\n    <moz-tabs\n      [tabs]=\"tabs()!\"\n      [(selectedIndex)]=\"activeTab\"\n      (selectedIndexChange)=\"onActiveTabChange($event)\"\n    />\n  </div>\n  }\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport { MozTileAppearance } from './model/tile.model';\n\n@Component({\n  selector: 'moz-tile',\n  imports: [NgTemplateOutlet],\n  templateUrl: './tile.html',\n  styleUrls: ['./tile.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozTileComponent {\n  readonly appearance = input<MozTileAppearance>('primary');\n  readonly isBordered = input(false);\n  readonly extraAction = input(false);\n\n  readonly classes = computed(() => ({\n    'mc-tile': true,\n    [`mc-tile--${this.appearance()}`]: this.appearance() !== 'primary',\n    'mc-tile--bordered': this.isBordered(),\n  }));\n}\n","<div [class]=\"classes()\">\n  <div class=\"mc-tile__header\">\n    @if (extraAction()) {\n    <div class=\"mc-tile__body\">\n      <ng-container [ngTemplateOutlet]=\"bodyTemplate\"></ng-container>\n    </div>\n    <div class=\"mc-tile__action\">\n      <ng-content select=\"[action]\"></ng-content>\n    </div>\n    } @else {\n    <div class=\"mc-tile__body\">\n      <ng-container [ngTemplateOutlet]=\"bodyTemplate\"></ng-container>\n    </div>\n    }\n  </div>\n  <div class=\"mc-tile__content\">\n    <ng-content select=\"[segmented]\"></ng-content>\n  </div>\n\n  <ng-template #bodyTemplate>\n    <ng-content select=\"[body]\"></ng-content>\n  </ng-template>\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  effect,\n  input,\n  forwardRef,\n  signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n  MozTileSelectableAppearance,\n  MozTileInputVerticalPosition,\n  MozTileInputPosition,\n  MozTileSelectableType,\n} from './model/selectable-tile.model';\n\n@Component({\n  selector: 'moz-tile-selectable',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './selectable-tile.html',\n  styleUrls: ['./selectable-tile.scss'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozTileSelectableComponent),\n      multi: true,\n    },\n  ],\n})\nexport class MozTileSelectableComponent implements ControlValueAccessor {\n  readonly appearance = input<MozTileSelectableAppearance>('primary');\n  readonly bordered = input(false);\n  readonly name = input<string>('tile-select-group');\n  readonly value = input<string>('');\n  readonly checked = input(false);\n  readonly disabled = input(false);\n  readonly inputVerticalPosition = input<MozTileInputVerticalPosition>('top');\n  readonly inputPosition = input<MozTileInputPosition>('right');\n  readonly inputType = input<MozTileSelectableType>('checkbox');\n\n  private readonly innerValue = signal<boolean | string>('');\n  private readonly isControlledByForm = signal(false);\n  private onTouchedCallback: () => void = () => {};\n  private onChangeCallback: (value: boolean | string) => void = () => {};\n\n  constructor() {\n    // Synchronise l'input checked avec innerValue\n    // sauf si le composant est piloté par un formulaire réactif (writeValue)\n    effect(() => {\n      const checkedValue = this.checked();\n      if (!this.isControlledByForm()) {\n        if (this.isCheckbox()) {\n          this.innerValue.set(checkedValue);\n        } else if (checkedValue) {\n          this.innerValue.set(this.value());\n        }\n      }\n    });\n  }\n\n  protected readonly isCheckbox = computed(() => this.inputType() === 'checkbox');\n  protected readonly isRadio = computed(() => this.inputType() === 'radio');\n\n  protected readonly isChecked = computed(() => {\n    if (this.isCheckbox()) {\n      return this.innerValue() === true;\n    }\n    return this.innerValue() === this.value();\n  });\n\n  protected readonly classes = computed(() => {\n    const cls = ['mc-tile', 'mc-tile--selectable'];\n\n    if (this.appearance() !== 'primary') cls.push(`mc-tile--${this.appearance()}`);\n    if (this.bordered()) cls.push('mc-tile--bordered');\n    if (this.disabled()) cls.push('mc-tile--disabled');\n    if (this.isChecked()) cls.push('mc-tile--selected');\n\n    cls.push(`mc-tile--input-${this.inputVerticalPosition()}`);\n    cls.push(`mc-tile--input-${this.inputPosition()}`);\n\n    return cls.join(' ');\n  });\n\n  // ControlValueAccessor methods\n  writeValue(value: boolean | string): void {\n    this.isControlledByForm.set(true);\n    this.innerValue.set(value);\n  }\n\n  registerOnChange(fn: (value: boolean | string) => void): void {\n    this.onChangeCallback = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouchedCallback = fn;\n  }\n\n  onTileChange(event: Event): void {\n    const target = event.target as HTMLInputElement;\n\n    if (this.isCheckbox()) {\n      this.innerValue.set(target.checked);\n      this.onChangeCallback(target.checked);\n    } else {\n      this.innerValue.set(target.value);\n      this.onChangeCallback(target.value);\n    }\n\n    this.onTouchedCallback();\n  }\n}\n","<label [class]=\"classes()\" [class.mc-tile--disabled]=\"disabled()\">\n  <div class=\"mc-tile__header\">\n    <div class=\"mc-tile__body\">\n      <ng-content select=\"[body]\"></ng-content>\n    </div>\n    <div class=\"mc-tile__action\">\n      @if (isCheckbox()) {\n      <input\n        type=\"checkbox\"\n        class=\"mc-checkbox__input\"\n        [name]=\"name()\"\n        [value]=\"value()\"\n        [checked]=\"isChecked()\"\n        [disabled]=\"disabled()\"\n        (change)=\"onTileChange($event)\"\n      />\n      } @else if (isRadio()) {\n      <input\n        type=\"radio\"\n        class=\"mc-radio__input\"\n        [name]=\"name()\"\n        [value]=\"value()\"\n        [checked]=\"isChecked()\"\n        [disabled]=\"disabled()\"\n        (change)=\"onTileChange($event)\"\n      />\n      }\n    </div>\n  </div>\n  <div class=\"mc-tile__content\">\n    <ng-content select=\"[segmented]\"></ng-content>\n  </div>\n</label>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, signal } from '@angular/core';\nimport { MozButtonComponent } from '../../button/button';\nimport { MozIconButtonComponent } from '../../icon-button/icon-button';\nimport { ChevronDown24 } from '@mozaic-ds/icons-angular';\nimport { MozTileExpandableTrigger } from './model/expandable-tile.model';\n\n@Component({\n  selector: 'moz-tile-expandable',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './expandable-tile.html',\n  styleUrls: ['./expandable-tile.scss'],\n  imports: [NgTemplateOutlet, MozButtonComponent, MozIconButtonComponent, ChevronDown24],\n})\nexport class MozTileExpandableComponent {\n  readonly triggerMode = input<MozTileExpandableTrigger>('container');\n  readonly id = input<number>(0);\n  readonly expanded = signal(false);\n  readonly contentId = `tile-content-${this.id()}`;\n\n  readonly isContainerTrigger = computed(() => this.triggerMode() === 'container');\n  readonly isIconTrigger = computed(() => this.triggerMode() === 'icon');\n  readonly isButtonTrigger = computed(() => this.triggerMode() === 'button');\n\n  readonly toggle = () => {\n    this.expanded.update((v) => !v);\n  };\n\n  readonly hostClass = computed(() => {\n    const cls = ['mc-tile', 'mc-tile--expandable'];\n\n    if (!this.isContainerTrigger()) {\n      cls.push(`mc-tile--trigger-${this.triggerMode()}`);\n    }\n\n    return cls.join(' ');\n  });\n}\n","<div [class]=\"hostClass()\">\n  @if (isContainerTrigger()) {\n  <button\n    class=\"mc-tile__header\"\n    type=\"button\"\n    [attr.aria-expanded]=\"expanded()\"\n    [attr.aria-controls]=\"contentId\"\n    (click)=\"toggle()\"\n  >\n    <div class=\"mc-tile__body\">\n      <ng-container [ngTemplateOutlet]=\"bodyTemplate\"></ng-container>\n    </div>\n    <div class=\"mc-tile__action\"></div>\n  </button>\n  } @else {\n  <div class=\"mc-tile__header\">\n    <div class=\"mc-tile__body\">\n      <ng-container [ngTemplateOutlet]=\"bodyTemplate\"></ng-container>\n    </div>\n    <div class=\"mc-tile__action\">\n      @if (isButtonTrigger()) {\n      <button\n        moz-button\n        class=\"mc-tile__action-button\"\n        [ghost]=\"true\"\n        [iconPosition]=\"'right'\"\n        (click)=\"toggle(); $event.stopPropagation()\"\n        [attr.aria-expanded]=\"expanded()\"\n        [attr.aria-controls]=\"contentId\"\n      >\n        <span class=\"mc-tile__action-label\">See more</span>\n        <ChevronDown24 icon />\n      </button>\n      } @else if (isIconTrigger()) {\n      <moz-icon-button\n        class=\"mc-tile__action-button\"\n        [ghost]=\"true\"\n        [ariaLabel]=\"'Toggle content'\"\n        (activated)=\"toggle(); $event.stopPropagation()\"\n        [attr.aria-expanded]=\"expanded()\"\n        [attr.aria-controls]=\"contentId\"\n        [id]=\"'expandable-tile-toggle-button'\"\n      >\n        <ChevronDown24 icon />\n      </moz-icon-button>\n      }\n    </div>\n  </div>\n  }\n\n  <div class=\"mc-tile__content\" [id]=\"contentId\" [attr.aria-hidden]=\"!expanded()\">\n    <ng-content select=\"[segmented]\" />\n  </div>\n\n  <ng-template #bodyTemplate>\n    <ng-content select=\"[body]\" />\n  </ng-template>\n</div>\n","import { InjectionToken } from '@angular/core';\nimport { MozDrawerPosition } from '../model/drawer.model';\n\nexport interface MozDrawerConfig<D = unknown> {\n  title: string;\n  contentTitle?: string;\n  position?: MozDrawerPosition;\n  extended?: boolean;\n  back?: boolean;\n  panelClass?: string;\n  data?: D;\n}\n\nexport const DRAWER_CONFIG = new InjectionToken<MozDrawerConfig>('DRAWER_CONFIG');\nexport const DRAWER_DATA = new InjectionToken<unknown>('DRAWER_DATA');\n\nexport const DEFAULT_DRAWER_CONFIG: Partial<MozDrawerConfig> = {\n  position: 'right',\n  extended: false,\n  back: false,\n};\n","import { OverlayRef } from '@angular/cdk/overlay';\nimport { Subject, Observable } from 'rxjs';\nimport { signal } from '@angular/core';\nimport { MozDrawerPosition } from '../model/drawer.model';\n\nexport class MozDrawerRef<R = unknown> {\n  private readonly afterClosed$ = new Subject<R | undefined>();\n  private readonly afterOpened$ = new Subject<void>();\n  private readonly backClicked$ = new Subject<void>();\n\n  readonly isOpen = signal(false);\n  readonly title = signal('');\n  readonly contentTitle = signal('');\n  readonly position = signal<MozDrawerPosition>('right');\n  readonly extended = signal(false);\n  readonly back = signal(false);\n  readonly panelClass = signal<string | undefined>(undefined);\n\n  private animationDuration = 300;\n\n  constructor(private readonly overlayRef: OverlayRef) {}\n\n  open(): void {\n    requestAnimationFrame(() => {\n      this.isOpen.set(true);\n      this.afterOpened$.next();\n      this.afterOpened$.complete();\n    });\n  }\n\n  close(result?: R): void {\n    this.isOpen.set(false);\n\n    setTimeout(() => {\n      this.overlayRef.dispose();\n      this.afterClosed$.next(result);\n      this.afterClosed$.complete();\n    }, this.animationDuration);\n  }\n\n  backClick(): void {\n    this.backClicked$.next();\n  }\n\n  afterClosed(): Observable<R | undefined> {\n    return this.afterClosed$.asObservable();\n  }\n\n  afterOpened(): Observable<void> {\n    return this.afterOpened$.asObservable();\n  }\n\n  onBackClick(): Observable<void> {\n    return this.backClicked$.asObservable();\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ComponentRef,\n  HostListener,\n  TemplateRef,\n  computed,\n  inject,\n  viewChild,\n  Type,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { CdkPortalOutlet, ComponentPortal } from '@angular/cdk/portal';\nimport { ArrowBack24, Cross24 } from '@mozaic-ds/icons-angular';\nimport { MozIconButtonComponent } from '../../icon-button/icon-button';\nimport { MozDrawerConfig, DRAWER_CONFIG } from '../config/drawer.config';\nimport { MozDrawerRef } from '../ref/drawer-ref';\n\n@Component({\n  selector: 'moz-drawer-container',\n  imports: [MozIconButtonComponent, ArrowBack24, Cross24, NgTemplateOutlet, CdkPortalOutlet],\n  templateUrl: './drawer-container.html',\n  styleUrls: ['../drawer.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DrawerContainerComponent {\n  readonly drawerRef = inject(MozDrawerRef);\n  readonly config = inject<MozDrawerConfig>(DRAWER_CONFIG);\n\n  readonly portalOutlet = viewChild(CdkPortalOutlet);\n\n  footerTpl: TemplateRef<void> | null = null;\n\n  private componentRef: ComponentRef<unknown> | null = null;\n\n  readonly classes = computed(() => ({\n    'mc-drawer': true,\n    'is-open': this.drawerRef.isOpen(),\n    'mc-drawer--extend': this.drawerRef.extended(),\n    [`mc-drawer--${this.drawerRef.position()}`]: this.drawerRef.position() !== 'right',\n  }));\n\n  readonly dialogClasses = computed(() => {\n    const extra = this.drawerRef.panelClass();\n    return extra ? `mc-drawer__dialog ${extra}` : 'mc-drawer__dialog';\n  });\n\n  readonly ariaModal = computed(() => (this.drawerRef.isOpen() ? 'true' : 'false'));\n\n  attachComponent<C>(component: Type<C>): ComponentRef<C> {\n    const portal = new ComponentPortal(component);\n    const outlet = this.portalOutlet();\n\n    if (!outlet) {\n      throw new Error('Portal outlet is not available');\n    }\n\n    this.componentRef = outlet.attachComponentPortal(portal);\n    return this.componentRef as ComponentRef<C>;\n  }\n\n  registerFooter(tpl: TemplateRef<void>): void {\n    this.footerTpl = tpl;\n  }\n\n  noop(): void {}\n\n  onBackClick(): void {\n    this.drawerRef.backClick();\n  }\n\n  onBackdropClick(event: MouseEvent): void {\n    event.stopPropagation();\n    this.drawerRef.close();\n  }\n\n  @HostListener('keydown.escape')\n  onEscape(): void {\n    if (this.drawerRef.isOpen()) {\n      this.drawerRef.close();\n    }\n  }\n}\n","<section\n  (click)=\"$event.stopPropagation()\"\n  (keydown)=\"noop()\"\n  [class]=\"classes()\"\n  role=\"dialog\"\n  aria-labelledby=\"drawerTitle\"\n  [attr.aria-modal]=\"ariaModal()\"\n  tabindex=\"-1\"\n  [attr.aria-hidden]=\"!drawerRef.isOpen()\"\n>\n  <div [class]=\"dialogClasses()\" role=\"document\">\n    <div class=\"mc-drawer__header\">\n      @if (drawerRef.back()) {\n        <moz-icon-button\n          class=\"mc-drawer__back\"\n          aria-label=\"Back\"\n          [ghost]=\"true\"\n          (activated)=\"onBackClick()\"\n          [id]=\"'drawer-back-button'\"\n        >\n          <ArrowBack24 icon />\n        </moz-icon-button>\n      }\n\n      <h2 class=\"mc-drawer__title\" id=\"drawerTitle\">{{ drawerRef.title() }}</h2>\n\n      <moz-icon-button\n        class=\"mc-drawer__close\"\n        aria-label=\"Close\"\n        [ghost]=\"true\"\n        (activated)=\"drawerRef.close()\"\n        [id]=\"'drawer-close-button'\"\n      >\n        <Cross24 icon />\n      </moz-icon-button>\n    </div>\n\n    <div class=\"mc-drawer__body\">\n      <div class=\"mc-drawer__content\" tabindex=\"0\">\n        @if (drawerRef.contentTitle()) {\n        <h2 class=\"mc-drawer__content__title\">\n          {{ drawerRef.contentTitle() }}\n        </h2>\n        }\n\n        <ng-template cdkPortalOutlet />\n      </div>\n    </div>\n\n    @if (footerTpl) {\n    <div class=\"mc-drawer__footer\">\n      <ng-container *ngTemplateOutlet=\"footerTpl\" />\n    </div>\n    }\n  </div>\n\n  @if (drawerRef.isOpen()) {\n  <div class=\"mc-overlay is-visible\" tabindex=\"-1\" (click)=\"onBackdropClick($event)\"></div>\n  }\n</section>\n","import { Injectable, Injector, Type, inject } from '@angular/core';\nimport { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n  MozDrawerConfig,\n  DEFAULT_DRAWER_CONFIG,\n  DRAWER_CONFIG,\n  DRAWER_DATA,\n} from '../config/drawer.config';\nimport { MozDrawerRef } from '../ref/drawer-ref';\nimport { DrawerContainerComponent } from '../container/drawer-container';\n\n@Injectable({ providedIn: 'root' })\nexport class MozDrawerService {\n  private readonly overlay = inject(Overlay);\n  private readonly injector = inject(Injector);\n\n  open<C, D = unknown, R = unknown>(\n    component: Type<C>,\n    config: MozDrawerConfig<D>\n  ): MozDrawerRef<R> {\n    const mergedConfig = {\n      ...DEFAULT_DRAWER_CONFIG,\n      ...config,\n    } as MozDrawerConfig<D>;\n\n    const overlayRef = this.createOverlay();\n    const drawerRef = new MozDrawerRef<R>(overlayRef);\n\n    drawerRef.title.set(mergedConfig.title);\n    drawerRef.contentTitle.set(mergedConfig.contentTitle ?? '');\n    drawerRef.position.set(mergedConfig.position ?? 'right');\n    drawerRef.extended.set(mergedConfig.extended ?? false);\n    drawerRef.back.set(mergedConfig.back ?? false);\n    drawerRef.panelClass.set(mergedConfig.panelClass);\n\n    const injector = Injector.create({\n      parent: this.injector,\n      providers: [\n        { provide: MozDrawerRef, useValue: drawerRef },\n        { provide: DRAWER_CONFIG, useValue: mergedConfig },\n        { provide: DRAWER_DATA, useValue: mergedConfig.data ?? null },\n      ],\n    });\n\n    const containerPortal = new ComponentPortal(DrawerContainerComponent, null, injector);\n\n    const containerRef = overlayRef.attach(containerPortal);\n    const containerInstance = containerRef.instance;\n\n    // Wait for view init, then attach the user component inside the container\n    requestAnimationFrame(() => {\n      // Override the portal outlet's injector so the child component\n      // can inject DrawerRef, DRAWER_DATA, and DrawerContainerComponent\n      const childInjector = Injector.create({\n        parent: injector,\n        providers: [{ provide: DrawerContainerComponent, useValue: containerInstance }],\n      });\n\n      const portal = new ComponentPortal(component, null, childInjector);\n      containerInstance.portalOutlet()?.attach(portal);\n\n      drawerRef.open();\n    });\n\n    return drawerRef;\n  }\n\n  private createOverlay(): OverlayRef {\n    const config = new OverlayConfig({\n      hasBackdrop: false, // We handle backdrop ourselves\n      panelClass: 'moz-drawer-overlay-pane',\n      positionStrategy: this.overlay.position().global(),\n      scrollStrategy: this.overlay.scrollStrategies.block(),\n    });\n\n    return this.overlay.create(config);\n  }\n}\n","import { Directive, TemplateRef, inject, afterNextRender } from '@angular/core';\nimport { DrawerContainerComponent } from '../container/drawer-container';\n\n@Directive({\n  selector: '[mozDrawerFooter]',\n  standalone: true,\n})\nexport class MozDrawerFooterDirective {\n  private readonly tpl = inject(TemplateRef<void>);\n  private readonly container = inject(DrawerContainerComponent);\n\n  constructor() {\n    afterNextRender(() => {\n      this.container.registerFooter(this.tpl);\n    });\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  TemplateRef,\n  contentChild,\n  input,\n  output,\n  signal,\n  effect,\n  computed,\n  HostListener,\n} from '@angular/core';\nimport { ArrowBack24, Cross24 } from '@mozaic-ds/icons-angular';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MozIconButtonComponent } from '../icon-button/icon-button';\nimport { MozDrawerPosition } from './model/drawer.model';\n\n@Component({\n  selector: 'moz-drawer',\n  imports: [MozIconButtonComponent, ArrowBack24, Cross24, NgTemplateOutlet],\n  templateUrl: './drawer.html',\n  styleUrls: ['./drawer.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MozDrawerComponent {\n  readonly open = input<boolean>(false);\n  readonly position = input<MozDrawerPosition>('right');\n  readonly extended = input<boolean>(false);\n  readonly back = input<boolean>(false);\n  readonly title = input.required<string>();\n  readonly contentTitle = input<string | undefined>();\n  readonly panelClass = input<string>();\n\n  readonly updateOpen = output<boolean>();\n  readonly backEvent = output<void>();\n\n  readonly footerTpl = contentChild<TemplateRef<void>>('footer', { descendants: false });\n\n  readonly isOpen = signal(this.open());\n\n  readonly classes = computed(() => ({\n    'mc-drawer': true,\n    'is-open': this.isOpen(),\n    'mc-drawer--extend': this.extended(),\n    [`mc-drawer--${this.position()}`]: this.position() !== 'right',\n  }));\n\n  readonly dialogClasses = computed(() => {\n    const extra = this.panelClass();\n    return extra ? `mc-drawer__dialog ${extra}` : 'mc-drawer__dialog';\n  });\n\n  readonly ariaModal = computed(() => (this.isOpen() ? 'true' : 'false'));\n\n  constructor() {\n    effect(() => {\n      this.isOpen.set(this.open());\n    });\n  }\n\n  close(): void {\n    this.updateOpen.emit(false);\n  }\n\n  backClick(): void {\n    this.backEvent.emit();\n  }\n\n  noop() {}\n\n  @HostListener('keydown.escape')\n  onEscape(): void {\n    if (this.isOpen()) {\n      this.close();\n    }\n  }\n\n  onBackdropClick(event: MouseEvent): void {\n    event.stopPropagation();\n    this.close();\n  }\n}\n","<section\n  (click)=\"$event.stopPropagation()\"\n  (keydown)=\"noop()\"\n  [class]=\"classes()\"\n  role=\"dialog\"\n  aria-labelledby=\"drawerTitle\"\n  [attr.aria-modal]=\"ariaModal()\"\n  tabindex=\"-1\"\n  [attr.aria-hidden]=\"!isOpen()\"\n>\n  <div [class]=\"dialogClasses()\" role=\"document\">\n    <div class=\"mc-drawer__header\">\n      @if (back()) {\n      <moz-icon-button\n        class=\"mc-drawer__back\"\n        aria-label=\"Back\"\n        [ghost]=\"true\"\n        (activated)=\"backClick()\"\n        [id]=\"'drawer-back-button'\"\n      >\n        <ArrowBack24 icon />\n      </moz-icon-button>\n      }\n\n      <h2 class=\"mc-drawer__title\" id=\"drawerTitle\">{{ title() }}</h2>\n\n      <moz-icon-button\n        class=\"mc-drawer__close\"\n        aria-label=\"Close\"\n        [ghost]=\"true\"\n        (activated)=\"close()\"\n        [id]=\"'drawer-close-button'\"\n      >\n        <Cross24 icon />\n      </moz-icon-button>\n    </div>\n\n    <div class=\"mc-drawer__body\">\n      <div class=\"mc-drawer__content\" tabindex=\"0\">\n        @if (contentTitle()) {\n        <h2 class=\"mc-drawer__content__title\">\n          {{ contentTitle() }}\n        </h2>\n        }\n\n        <ng-content />\n      </div>\n    </div>\n\n    @if (footerTpl()) {\n    <div class=\"mc-drawer__footer\">\n      <ng-container *ngTemplateOutlet=\"footerTpl()\" />\n    </div>\n    }\n  </div>\n  @if(isOpen()){\n  <div\n    class=\"mc-overlay is-visible\"\n    tabindex=\"-1\"\n    role=\"dialog\"\n    aria-labelledby=\"modalTitle\"\n    (click)=\"onBackdropClick($event)\"\n  ></div>\n  }\n</section>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  input,\n  output,\n  computed,\n  TemplateRef,\n  contentChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Cross20 } from '@mozaic-ds/icons-angular';\nimport { MozPopoverAppearance, MozPopoverPosition, MozPopoverSize } from './config/popover.config';\nimport { MozIconButtonComponent } from '../icon-button';\n\n@Component({\n  selector: 'moz-popover',\n  imports: [NgTemplateOutlet, Cross20, MozIconButtonComponent],\n  templateUrl: './popover.html',\n  styleUrls: ['./popover.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  exportAs: 'mozPopover',\n})\nexport class MozPopoverComponent {\n  readonly appearance = input<MozPopoverAppearance>('default');\n  readonly position = input<MozPopoverPosition>('bottom');\n  readonly size = input<MozPopoverSize>('s');\n  readonly pointer = input<boolean>(true);\n  readonly closable = input<boolean>(false);\n  readonly title = input<string>();\n  readonly description = input<string>();\n  readonly buttonLabel = input<string>();\n  readonly open = input<boolean>(false);\n\n  readonly closeClick = output<void>();\n\n  footerTpl = contentChild<TemplateRef<void>>('footer', { descendants: false });\n\n  readonly classMap = computed(() => {\n    const appearance = this.appearance();\n    const position = this.position();\n    const size = this.size();\n    const pointer = this.pointer();\n\n    return {\n      'mc-popover': true,\n      'mc-popover--inverse': appearance === 'inverse',\n      [`mc-popover--${position}`]: true,\n      [`mc-popover--${size}`]: true,\n      'mc-popover--no-pointer': !pointer,\n    };\n  });\n\n  onClose(): void {\n    this.closeClick.emit();\n  }\n}\n","<div [class]=\"classMap()\">\n  <div class=\"mc-popover__wrapper\">\n    <div class=\"mc-popover__content\">\n      @if (title() || description()) {\n      <div class=\"mc-popover__headings\">\n        @if (title()) {\n        <p class=\"mc-popover__title\">{{ title() }}</p>\n        } @if (description()) {\n        <p class=\"mc-popover__description\">{{ description() }}</p>\n        }\n      </div>\n      } @if (closable()) {\n      <moz-icon-button\n        id=\"popover-close\"\n        class=\"mc-popover__close\"\n        aria-label=\"Close\"\n        [size]=\"'s'\"\n        [ghost]=\"true\"\n        (activated)=\"onClose()\"\n      >\n        <Cross20 icon />\n      </moz-icon-button>\n      }\n\n      <ng-content />\n\n      @if (footerTpl()) {\n      <div class=\"mc-popover__footer\">\n        <ng-container *ngTemplateOutlet=\"footerTpl()\" />\n      </div>\n      }\n    </div>\n  </div>\n</div>\n","import { InjectionToken } from '@angular/core';\n\nexport type MozPopoverAppearance = 'default' | 'inverse';\nexport type MozPopoverPosition = 'top' | 'bottom' | 'left' | 'right';\nexport type MozPopoverSize = 's' | 'm';\n\nexport interface PopoverConfig<D = unknown> {\n  title?: string;\n  description?: string;\n  appearance?: MozPopoverAppearance;\n  position?: MozPopoverPosition;\n  size?: MozPopoverSize;\n  pointer?: boolean;\n  closable?: boolean;\n  buttonLabel?: string;\n  data?: D;\n}\n\nexport const POPOVER_CONFIG = new InjectionToken<PopoverConfig>('POPOVER_CONFIG');\nexport const POPOVER_DATA = new InjectionToken<unknown>('POPOVER_DATA');\n\nexport const DEFAULT_POPOVER_CONFIG: Omit<Partial<PopoverConfig>, 'data'> = {\n  appearance: 'default',\n  position: 'bottom',\n  size: 's',\n  pointer: true,\n  closable: false,\n};\n","import { OverlayRef } from '@angular/cdk/overlay';\nimport { Subject, Observable } from 'rxjs';\n\nexport class PopoverRef<R = unknown> {\n  private readonly afterClosed$ = new Subject<R | undefined>();\n  private _closed = false;\n\n  constructor(private readonly overlayRef: OverlayRef) {\n    this.overlayRef.backdropClick().subscribe(() => this.close());\n    this.overlayRef.keydownEvents().subscribe((event) => {\n      if (event.key === 'Escape') {\n        this.close();\n      }\n    });\n\n    // Fermeture par scrollStrategy ou autre détachement externe\n    this.overlayRef.detachments().subscribe(() => {\n      if (!this._closed) {\n        this._closed = true;\n        this.afterClosed$.next(undefined);\n        this.afterClosed$.complete();\n      }\n    });\n  }\n\n  close(result?: R): void {\n    if (this._closed) return;\n    this._closed = true;\n    this.afterClosed$.next(result);\n    this.afterClosed$.complete();\n    this.overlayRef.dispose();\n  }\n\n  afterClosed(): Observable<R | undefined> {\n    return this.afterClosed$.asObservable();\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  TemplateRef,\n  inject,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\nimport { PopoverRef } from '../ref/popover-ref';\nimport { PopoverConfig, POPOVER_CONFIG } from '../config/popover.config';\nimport { MozPopoverComponent } from '../popover';\n\n@Component({\n  selector: 'moz-popover-container',\n  imports: [MozPopoverComponent, CdkPortalOutlet, NgTemplateOutlet],\n  template: `\n    <moz-popover\n      [appearance]=\"config.appearance ?? 'default'\"\n      [position]=\"config.position ?? 'bottom'\"\n      [size]=\"config.size ?? 's'\"\n      [pointer]=\"config.pointer ?? true\"\n      [closable]=\"config.closable ?? false\"\n      [title]=\"config.title\"\n      [description]=\"config.description\"\n      [buttonLabel]=\"config.buttonLabel\"\n      [open]=\"true\"\n      (closeClick)=\"popoverRef.close()\"\n    >\n      <ng-template cdkPortalOutlet />\n\n      @if (footerTpl()) {\n      <ng-template #footer>\n        <ng-container *ngTemplateOutlet=\"footerTpl()\" />\n      </ng-template>\n      }\n    </moz-popover>\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PopoverContainerComponent {\n  readonly popoverRef = inject(PopoverRef);\n  readonly config = inject<PopoverConfig>(POPOVER_CONFIG);\n  private readonly cdr = inject(ChangeDetectorRef);\n\n  readonly portalOutlet = viewChild(CdkPortalOutlet);\n\n  readonly footerTpl = signal<TemplateRef<void> | null>(null);\n\n  registerFooter(tpl: TemplateRef<void>): void {\n    this.footerTpl.set(tpl);\n    this.cdr.detectChanges();\n  }\n}\n","import {\n  Directive,\n  ElementRef,\n  Injector,\n  NgZone,\n  inject,\n  input,\n  output,\n  OnInit,\n  OnDestroy,\n  Type,\n} from '@angular/core';\nimport { Overlay, OverlayConfig, OverlayRef, ConnectedPosition } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { PopoverRef } from '../ref/popover-ref';\nimport {\n  PopoverConfig,\n  MozPopoverPosition,\n  POPOVER_CONFIG,\n  POPOVER_DATA,\n  DEFAULT_POPOVER_CONFIG,\n} from '../config/popover.config';\nimport { PopoverContainerComponent } from '../container/popover-container';\n\nexport type PopoverTriggerMode = 'click' | 'hover';\n\n@Directive({\n  selector: '[mozPopoverTrigger]',\n  exportAs: 'mozPopoverTrigger',\n  host: {\n    '(click)': 'onHostClick()',\n    '(mouseenter)': 'onHostMouseEnter()',\n    '(mouseleave)': 'onHostMouseLeave()',\n  },\n})\nexport class MozPopoverTriggerDirective implements OnInit, OnDestroy {\n  private readonly overlay = inject(Overlay);\n  private readonly elementRef = inject(ElementRef);\n  private readonly injector = inject(Injector);\n  private readonly ngZone = inject(NgZone);\n\n  /** The component to inject inside the popover, or null for config-only popover */\n  readonly mozPopoverTrigger = input<Type<unknown> | null>(null);\n\n  /** Trigger mode: 'click' (default) or 'hover' */\n  readonly popoverTriggerMode = input<PopoverTriggerMode>('click');\n\n  /** Popover config */\n  readonly popoverTitle = input<string>();\n  readonly popoverDescription = input<string>();\n  readonly popoverAppearance = input<PopoverConfig['appearance']>('default');\n  readonly popoverPosition = input<MozPopoverPosition>('bottom');\n  readonly popoverSize = input<PopoverConfig['size']>('s');\n  readonly popoverPointer = input<boolean>(true);\n  readonly popoverClosable = input<boolean>(false);\n  readonly popoverButtonLabel = input<string>();\n  readonly popoverData = input<unknown>();\n\n  /** Delay in ms before opening/closing on hover (prevents flicker) */\n  readonly popoverHoverDelay = input<number>(100);\n\n  /** Emits when popover closes */\n  readonly popoverClosed = output<unknown>();\n\n  private popoverRef: PopoverRef | null = null;\n  private overlayRef: OverlayRef | null = null;\n\n  // Hover-mode timers & listeners\n  private hoverOpenTimer: ReturnType<typeof setTimeout> | null = null;\n  private hoverCloseTimer: ReturnType<typeof setTimeout> | null = null;\n  private overlayMouseEnterHandler: (() => void) | null = null;\n  private overlayMouseLeaveHandler: (() => void) | null = null;\n\n  ngOnInit(): void {\n    // Nothing special — listeners are host-bound\n  }\n\n  // -----------------------------------------------------------------------\n  // Host event handlers\n  // -----------------------------------------------------------------------\n\n  onHostClick(): void {\n    if (this.popoverTriggerMode() !== 'click') return;\n    if (this.popoverRef) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n\n  onHostMouseEnter(): void {\n    if (this.popoverTriggerMode() !== 'hover') return;\n    this.cancelHoverClose();\n    if (this.popoverRef) return;\n    this.hoverOpenTimer = setTimeout(() => {\n      this.hoverOpenTimer = null;\n      this.open();\n    }, this.popoverHoverDelay());\n  }\n\n  onHostMouseLeave(): void {\n    if (this.popoverTriggerMode() !== 'hover') return;\n    this.cancelHoverOpen();\n    this.scheduleHoverClose();\n  }\n\n  // -----------------------------------------------------------------------\n  // Public API\n  // -----------------------------------------------------------------------\n\n  toggle(): void {\n    if (this.popoverRef) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n\n  open(): void {\n    if (this.popoverRef) {\n      return;\n    }\n\n    const isHover = this.popoverTriggerMode() === 'hover';\n\n    const config: PopoverConfig = {\n      ...DEFAULT_POPOVER_CONFIG,\n      title: this.popoverTitle(),\n      description: this.popoverDescription(),\n      appearance: this.popoverAppearance(),\n      position: this.popoverPosition(),\n      size: this.popoverSize(),\n      pointer: this.popoverPointer(),\n      closable: this.popoverClosable(),\n      buttonLabel: this.popoverButtonLabel(),\n      data: this.popoverData(),\n    };\n\n    const overlayRef = this.createOverlay(config.position ?? 'bottom', isHover);\n    this.overlayRef = overlayRef;\n    const popoverRef = new PopoverRef(overlayRef);\n    this.popoverRef = popoverRef;\n\n    const injector = Injector.create({\n      parent: this.injector,\n      providers: [\n        { provide: PopoverRef, useValue: popoverRef },\n        { provide: POPOVER_CONFIG, useValue: config },\n        { provide: POPOVER_DATA, useValue: config.data ?? null },\n      ],\n    });\n\n    const containerPortal = new ComponentPortal(PopoverContainerComponent, null, injector);\n\n    const containerRef = overlayRef.attach(containerPortal);\n    const containerInstance = containerRef.instance;\n\n    // If a component is provided, inject it inside the container\n    const component = this.mozPopoverTrigger();\n    if (component) {\n      requestAnimationFrame(() => {\n        const childInjector = Injector.create({\n          parent: injector,\n          providers: [{ provide: PopoverContainerComponent, useValue: containerInstance }],\n        });\n\n        const portal = new ComponentPortal(component, null, childInjector);\n        containerInstance.portalOutlet()?.attach(portal);\n      });\n    }\n\n    // Attach hover listeners on the overlay pane itself\n    if (isHover) {\n      this.attachOverlayHoverListeners(overlayRef);\n    }\n\n    popoverRef.afterClosed().subscribe((result) => {\n      this.popoverClosed.emit(result);\n      this.detachOverlayHoverListeners();\n      this.popoverRef = null;\n      this.overlayRef = null;\n    });\n  }\n\n  close(): void {\n    this.cancelHoverOpen();\n    this.cancelHoverClose();\n    this.popoverRef?.close();\n    this.popoverRef = null;\n    this.overlayRef = null;\n  }\n\n  ngOnDestroy(): void {\n    this.cancelHoverOpen();\n    this.cancelHoverClose();\n    this.detachOverlayHoverListeners();\n    this.close();\n  }\n\n  // -----------------------------------------------------------------------\n  // Hover helpers\n  // -----------------------------------------------------------------------\n\n  private scheduleHoverClose(): void {\n    this.cancelHoverClose();\n    this.hoverCloseTimer = setTimeout(() => {\n      this.hoverCloseTimer = null;\n      this.close();\n    }, this.popoverHoverDelay());\n  }\n\n  private cancelHoverClose(): void {\n    if (this.hoverCloseTimer !== null) {\n      clearTimeout(this.hoverCloseTimer);\n      this.hoverCloseTimer = null;\n    }\n  }\n\n  private cancelHoverOpen(): void {\n    if (this.hoverOpenTimer !== null) {\n      clearTimeout(this.hoverOpenTimer);\n      this.hoverOpenTimer = null;\n    }\n  }\n\n  private attachOverlayHoverListeners(overlayRef: OverlayRef): void {\n    const pane = overlayRef.overlayElement;\n    this.ngZone.runOutsideAngular(() => {\n      this.overlayMouseEnterHandler = () => {\n        this.cancelHoverClose();\n      };\n      this.overlayMouseLeaveHandler = () => {\n        this.ngZone.run(() => this.scheduleHoverClose());\n      };\n      pane.addEventListener('mouseenter', this.overlayMouseEnterHandler);\n      pane.addEventListener('mouseleave', this.overlayMouseLeaveHandler);\n    });\n  }\n\n  private detachOverlayHoverListeners(): void {\n    if (this.overlayRef && this.overlayRef.overlayElement) {\n      const pane = this.overlayRef.overlayElement;\n      if (this.overlayMouseEnterHandler) {\n        pane.removeEventListener('mouseenter', this.overlayMouseEnterHandler);\n      }\n      if (this.overlayMouseLeaveHandler) {\n        pane.removeEventListener('mouseleave', this.overlayMouseLeaveHandler);\n      }\n    }\n    this.overlayMouseEnterHandler = null;\n    this.overlayMouseLeaveHandler = null;\n  }\n\n  // -----------------------------------------------------------------------\n  // Overlay creation\n  // -----------------------------------------------------------------------\n\n  private createOverlay(position: MozPopoverPosition, hoverMode: boolean): OverlayRef {\n    const positions = this.getPositions(position);\n\n    const config = new OverlayConfig({\n      hasBackdrop: !hoverMode,\n      backdropClass: hoverMode ? '' : 'cdk-overlay-transparent-backdrop',\n      positionStrategy: this.overlay\n        .position()\n        .flexibleConnectedTo(this.elementRef)\n        .withPositions(positions)\n        .withPush(true)\n        .withViewportMargin(8),\n      scrollStrategy: this.overlay.scrollStrategies.close(),\n    });\n\n    return this.overlay.create(config);\n  }\n\n  private getPositions(position: MozPopoverPosition): ConnectedPosition[] {\n    const positionMap: Record<MozPopoverPosition, ConnectedPosition[]> = {\n      bottom: [\n        { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 8 },\n        { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -8 },\n      ],\n      top: [\n        { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -8 },\n        { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 8 },\n      ],\n      left: [\n        { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -8 },\n        { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 8 },\n      ],\n      right: [\n        { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 8 },\n        { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -8 },\n      ],\n    };\n\n    return positionMap[position];\n  }\n}\n","import { Injectable, Injector, ElementRef, Type, inject } from '@angular/core';\nimport { Overlay, OverlayConfig, OverlayRef, ConnectedPosition } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { PopoverRef } from '../ref/popover-ref';\nimport {\n  PopoverConfig,\n  MozPopoverPosition,\n  POPOVER_CONFIG,\n  POPOVER_DATA,\n  DEFAULT_POPOVER_CONFIG,\n} from '../config/popover.config';\nimport { PopoverContainerComponent } from '../container/popover-container';\n\n@Injectable({ providedIn: 'root' })\nexport class PopoverService {\n  private readonly overlay = inject(Overlay);\n  private readonly injector = inject(Injector);\n\n  /**\n   * Open a popover attached to an element.\n   */\n  open<C, D = unknown, R = unknown>(\n    component: Type<C>,\n    origin: ElementRef | HTMLElement,\n    config: PopoverConfig<D>\n  ): PopoverRef<R> {\n    const mergedConfig = {\n      ...DEFAULT_POPOVER_CONFIG,\n      ...config,\n    } as PopoverConfig<D>;\n\n    const overlayRef = this.createOverlay(origin, mergedConfig.position ?? 'bottom');\n    const popoverRef = new PopoverRef<R>(overlayRef);\n\n    const injector = Injector.create({\n      parent: this.injector,\n      providers: [\n        { provide: PopoverRef, useValue: popoverRef },\n        { provide: POPOVER_CONFIG, useValue: mergedConfig },\n        { provide: POPOVER_DATA, useValue: mergedConfig.data ?? null },\n      ],\n    });\n\n    const containerPortal = new ComponentPortal(PopoverContainerComponent, null, injector);\n\n    const containerRef = overlayRef.attach(containerPortal);\n    const containerInstance = containerRef.instance;\n\n    requestAnimationFrame(() => {\n      const childInjector = Injector.create({\n        parent: injector,\n        providers: [{ provide: PopoverContainerComponent, useValue: containerInstance }],\n      });\n\n      const portal = new ComponentPortal(component, null, childInjector);\n      containerInstance.portalOutlet()?.attach(portal);\n    });\n\n    return popoverRef;\n  }\n\n  private createOverlay(\n    origin: ElementRef | HTMLElement,\n    position: MozPopoverPosition\n  ): OverlayRef {\n    const positions = this.getPositions(position);\n\n    const config = new OverlayConfig({\n      hasBackdrop: true,\n      backdropClass: 'cdk-overlay-transparent-backdrop',\n      positionStrategy: this.overlay\n        .position()\n        .flexibleConnectedTo(origin)\n        .withPositions(positions)\n        .withPush(true)\n        .withViewportMargin(8),\n      scrollStrategy: this.overlay.scrollStrategies.reposition(),\n    });\n\n    return this.overlay.create(config);\n  }\n\n  private getPositions(position: MozPopoverPosition): ConnectedPosition[] {\n    const positionMap: Record<MozPopoverPosition, ConnectedPosition[]> = {\n      bottom: [\n        { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 8 },\n        { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -8 },\n      ],\n      top: [\n        { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -8 },\n        { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: 8 },\n      ],\n      left: [\n        { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -8 },\n        { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 8 },\n      ],\n      right: [\n        { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 8 },\n        { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -8 },\n      ],\n    };\n\n    return positionMap[position];\n  }\n}\n","import { Directive, TemplateRef, inject, afterNextRender } from '@angular/core';\nimport { PopoverContainerComponent } from '../container/popover-container';\n\n@Directive({\n  selector: '[mozPopoverFooter]',\n  standalone: true,\n})\nexport class MozPopoverFooterDirective {\n  private readonly tpl = inject(TemplateRef<void>);\n  private readonly container = inject(PopoverContainerComponent);\n\n  constructor() {\n    afterNextRender(() => {\n      this.container.registerFooter(this.tpl);\n    });\n  }\n}\n","// Component (standalone static usage)\nexport { MozPopoverComponent } from './popover';\n\n// Config & tokens\nexport type {\n  PopoverConfig,\n  MozPopoverAppearance,\n  MozPopoverPosition,\n  MozPopoverSize,\n} from './config/popover.config';\nexport { POPOVER_CONFIG, POPOVER_DATA } from './config/popover.config';\n\n// Ref\nexport { PopoverRef } from './ref/popover-ref';\n\n// Directive trigger\nexport { MozPopoverTriggerDirective } from './directives/popover-trigger.directive';\nexport type { PopoverTriggerMode } from './directives/popover-trigger.directive';\n\n// Dynamic\nexport { PopoverService } from './service/popover.service';\nexport { PopoverContainerComponent } from './container/popover-container';\nexport { MozPopoverFooterDirective } from './directives/popover-footer.directive';\n","import { ChangeDetectionStrategy, Component, input, output, computed, model } from '@angular/core';\nimport { MozButtonComponent } from '../button/button';\nimport { PauseCircle24, PlayCircle24 } from '@mozaic-ds/icons-angular';\nimport { MozNavigationIndicatorAction } from './model/navigation-indicator.model';\n\n@Component({\n  selector: 'moz-navigation-indicator',\n  templateUrl: './navigation-indicator.html',\n  styleUrls: ['./navigation-indicator.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [MozButtonComponent, PauseCircle24, PlayCircle24],\n})\nexport class MozNavigationIndicatorComponent {\n  /** Total number of steps */\n  readonly steps = input.required<number>();\n\n  /** Currently active step index (0-based) */\n  readonly active = model<number>(0);\n\n  /** Action button type: 'pause' or 'resume' */\n  readonly action = input<MozNavigationIndicatorAction>('pause');\n\n  /** Use light (icon-only) variant for the action button */\n  readonly light = input<boolean>(false);\n\n  /** Hide the action button entirely */\n  readonly hideAction = input<boolean>(false);\n\n  /** Label for the pause button */\n  readonly pauseLabel = input<string>('Pause');\n\n  /** Label for the resume button */\n  readonly resumeLabel = input<string>('Resume');\n\n  /** Emits when a step indicator is clicked */\n  readonly stepClick = output<number>();\n\n  /** Emits when the action button (pause/resume) is clicked */\n  readonly actionClick = output<MozNavigationIndicatorAction>();\n\n  /** Array of step indices for iteration */\n  readonly stepsArray = computed(() => Array.from({ length: this.steps() }, (_, i) => i));\n\n  /** Current action label */\n  readonly actionLabel = computed(() =>\n    this.action() === 'pause' ? this.pauseLabel() : this.resumeLabel()\n  );\n\n  onStepClick(index: number): void {\n    this.active.set(index);\n    this.stepClick.emit(index);\n  }\n\n  onActionClick(): void {\n    this.actionClick.emit(this.action());\n  }\n}\n","<div class=\"mc-navigation-indicator\" role=\"navigation\" aria-label=\"Progress steps\">\n  <ul class=\"mc-navigation-indicator__list\">\n    @for (step of stepsArray(); track step) {\n    <li class=\"mc-navigation-indicator__item\">\n      <button\n        class=\"mc-navigation-indicator__button\"\n        [class.mc-navigation-indicator__button--active]=\"step === active()\"\n        [attr.aria-current]=\"step === active() ? 'step' : null\"\n        (click)=\"onStepClick(step)\"\n      ></button>\n    </li>\n    }\n  </ul>\n\n  @if (!hideAction()) { @if (light()) {\n  <button\n    moz-button\n    appearance=\"standard\"\n    size=\"s\"\n    [ariaLabel]=\"actionLabel()\"\n    (click)=\"onActionClick()\"\n    [iconPosition]=\"'only'\"\n  >\n    @if(this.action() === 'pause'){\n    <PauseCircle24 icon></PauseCircle24>\n    }@else {\n    <PlayCircle24 icon></PlayCircle24>\n    }\n  </button>\n  } @else {\n  <button\n    moz-button\n    appearance=\"standard\"\n    size=\"s\"\n    [ghost]=\"true\"\n    [ariaLabel]=\"actionLabel()\"\n    [iconPosition]=\"'left'\"\n    (click)=\"onActionClick()\"\n  >\n    @if(this.action() === 'pause'){\n    <PauseCircle24 icon></PauseCircle24>\n    }@else {\n    <PlayCircle24 icon></PlayCircle24>\n    }\n    <span>{{ actionLabel() }}</span>\n  </button>\n  } }\n</div>\n","import { Injectable, computed, signal } from '@angular/core';\nimport { ColumnDef, ColumnStateEntry, SortDirection } from '../models/column.model';\nimport { SortDef } from '../models/sort.model';\nimport { CellCoord, CellEditState } from '../models/cell.model';\nimport { GridDensity, GroupEntry } from '../models/grid-events.model';\nimport { FilterModel, FilterMode } from '../models/filter.model';\nimport { LoadingStrategy } from '../models/pagination.model';\n\nconst DEFAULT_COLUMN_WIDTH = 150;\n\n@Injectable()\nexport class GridStateManager<T = unknown> {\n  // --- Source Data ---\n  readonly sourceData = signal<T[]>([]);\n  readonly totalItems = signal<number>(0);\n\n  // --- Mode ---\n  readonly mode = signal<'client' | 'server'>('client');\n\n  // --- Filter Mode (independent of mode — allows server pagination + client filtering) ---\n  readonly filterMode = signal<FilterMode>('client');\n\n  // --- Loading Strategy ---\n  readonly loadingStrategy = signal<LoadingStrategy>('pagination');\n\n  // --- Columns ---\n  readonly columnDefs = signal<ColumnDef<T>[]>([]);\n  readonly columnStates = signal<ColumnStateEntry[]>([]);\n\n  // --- Sort ---\n  readonly activeSorts = signal<SortDef[]>([]);\n\n  // --- Group ---\n  readonly groupColumns = signal<GroupEntry[]>([]);\n  readonly expandedGroups = signal<Set<string>>(new Set());\n\n  // --- Filter ---\n  /**\n   * Unified filter state: single source of truth for the multi-condition\n   * builder. The tag-bar displays a derived view via `FilterEngine.toLabel()`.\n   */\n  readonly filterModel = signal<FilterModel>({ conditions: [] });\n\n  // --- Pagination ---\n  /** `false` disables paging entirely — `paginatedData` returns the full\n   * filtered set instead of slicing by `pageSize`. */\n  readonly paginationEnabled = signal<boolean>(true);\n  readonly pageIndex = signal<number>(0);\n  readonly pageSize = signal<number>(20);\n  readonly visibleRowCount = signal<number>(0);\n\n  // --- Scroll ---\n  readonly scrollLeft = signal<number>(0);\n  readonly scrollTop = signal<number>(0);\n  readonly scrollViewportWidth = signal<number>(0);\n  readonly scrollViewportHeight = signal<number>(0);\n  readonly scrollContentTotalWidth = signal<number>(0);\n\n  // --- Horizontal virtual scroll ---\n  readonly horizontalVirtualScrollEnabled = signal<boolean>(false);\n  readonly visibleColumnRange = signal<{ start: number; end: number }>({ start: 0, end: 0 });\n\n  // --- Vertical virtual scroll (custom, replaces cdk-virtual-scroll-viewport) ---\n  /** Range of display-row indices currently mounted in the DOM. */\n  readonly visibleRowRange = signal<{ start: number; end: number }>({ start: 0, end: 0 });\n  /** Pixel offset of the first rendered row from the top of the body content. */\n  readonly topSpacerHeight = signal<number>(0);\n  /** Pixel offset between the last rendered row and the bottom of the body content. */\n  readonly bottomSpacerHeight = signal<number>(0);\n  /** Total height of all display rows (data + group, includes expanded detail). */\n  readonly totalRowsHeight = signal<number>(0);\n\n  // --- UI ---\n  readonly isLoading = signal<boolean>(false);\n  readonly rowHeight = signal<number>(48);\n  readonly density = signal<GridDensity>('default');\n\n  // --- Row Selection ---\n  readonly selectedRowIds = signal<Set<unknown>>(new Set());\n  readonly excludedRowIds = signal<Set<unknown>>(new Set());\n  readonly selectAllMode = signal<'none' | 'page' | 'all'>('none');\n\n  // --- Cell Selection ---\n  readonly focusedCell = signal<CellCoord | null>(null);\n  readonly selectedCell = signal<CellCoord | null>(null);\n  readonly cellRange = signal<{ start: CellCoord; end: CellCoord } | null>(null);\n  readonly isDragging = signal<boolean>(false);\n  readonly focusSource = signal<'click' | 'keyboard' | null>(null);\n\n  // --- Fill Down ---\n  readonly isFilling = signal<boolean>(false);\n  readonly fillAnchor = signal<CellCoord | null>(null);\n  readonly fillTarget = signal<CellCoord | null>(null);\n\n  // --- Cut (Ctrl+X) source — drives the marching-ants outline in view ---\n  readonly cutSource = signal<{ start: CellCoord; end: CellCoord } | null>(null);\n\n  // --- Expandable Rows ---\n  readonly expandedRowIds = signal<Set<unknown>>(new Set());\n  readonly rowIdField = signal<string>('id');\n\n  // --- Cell selection toggle ---\n  readonly multiCellSelectionEnabled = signal<boolean>(true);\n\n  // --- Selection Mode (mutual exclusion between row and cell selection) ---\n  readonly activeSelectionMode = signal<'rows' | 'cells' | 'none'>('none');\n\n  // --- Column Drag ---\n  readonly draggingColumn = signal<string | null>(null);\n  readonly dropIndicatorIndex = signal<number | null>(null);\n\n  // --- Cell Edit ---\n  readonly cellEditState = signal<CellEditState>({\n    editingCell: null,\n    originalValue: undefined,\n    draftValue: undefined,\n    validationError: null,\n  });\n\n  /** `true` while the user is editing a formula inside the top formula bar\n   *  (outside any cell). Consumed by `FormulaEngine.isFormulaEditActive`\n   *  so headers show column-letter badges during bar-driven edits too. */\n  readonly formulaBarEditingActive = signal<boolean>(false);\n\n  // --- Computed: visible columns (pinned-start first, unpinned middle, pinned-end last) ---\n  readonly visibleColumns = computed(() => {\n    const cols = this.columnStates()\n      .filter((col) => col.visible)\n      .sort((a, b) => a.order - b.order);\n    const pinnedLeft = cols.filter((c) => c.pinned === 'start');\n    const unpinned = cols.filter((c) => !c.pinned);\n    const pinnedRight = cols.filter((c) => c.pinned === 'end');\n    return [...pinnedLeft, ...unpinned, ...pinnedRight];\n  });\n\n  // --- Computed: column subsets for 3-panel layout ---\n  readonly pinnedLeftColumns = computed(() =>\n    this.visibleColumns().filter((c) => c.pinned === 'start')\n  );\n\n  readonly unpinnedColumns = computed(() => this.visibleColumns().filter((c) => !c.pinned));\n\n  readonly pinnedRightColumns = computed(() =>\n    this.visibleColumns().filter((c) => c.pinned === 'end')\n  );\n\n  readonly pinnedLeftWidth = computed(() =>\n    this.pinnedLeftColumns().reduce((sum, c) => sum + c.currentWidth, 0)\n  );\n\n  readonly pinnedRightWidth = computed(() =>\n    this.pinnedRightColumns().reduce((sum, c) => sum + c.currentWidth, 0)\n  );\n\n  /**\n   * Cumulative `left` offset (px) for each pinned-left column, in render\n   * order. Consumers add their own utility-cell prefix (checkbox/expand) and\n   * pass the result to `position: sticky; left: <offset>px`.\n   * Returns an array of length `pinnedLeftColumns().length`.\n   */\n  readonly pinnedLeftCumulativeOffsets = computed(() => {\n    const cols = this.pinnedLeftColumns();\n    const out = new Array<number>(cols.length);\n    let off = 0;\n    for (let i = 0; i < cols.length; i++) {\n      out[i] = off;\n      off += cols[i].currentWidth;\n    }\n    return out;\n  });\n\n  /**\n   * Cumulative `right` offset (px) for each pinned-right column, in render\n   * order. The first column from the right (visually leftmost in the\n   * pinned-right group) has the largest `right` offset.\n   */\n  readonly pinnedRightCumulativeOffsets = computed(() => {\n    const cols = this.pinnedRightColumns();\n    const out = new Array<number>(cols.length);\n    let off = 0;\n    for (let i = cols.length - 1; i >= 0; i--) {\n      out[i] = off;\n      off += cols[i].currentWidth;\n    }\n    return out;\n  });\n\n  readonly unpinnedWidth = computed(() =>\n    this.unpinnedColumns().reduce((sum, c) => sum + c.currentWidth, 0)\n  );\n\n  /**\n   * Unpinned columns actually rendered in data rows. When horizontal virtual scroll\n   * is disabled, this is the full set; when enabled, it's the slice inside the\n   * current visibleColumnRange. Header and filter row keep rendering the full set —\n   * only row cells are virtualized.\n   */\n  /**\n   * Effective column range with edit-mode widening: keeps the column being edited\n   * inside the rendered window so the editor never gets torn down mid-edit.\n   */\n  readonly effectiveColumnRange = computed(() => {\n    const raw = this.visibleColumnRange();\n    const editing = this.cellEditState().editingCell;\n    if (!editing) return raw;\n    const pinnedLeftCount = this.pinnedLeftColumns().length;\n    const unpinnedIdx = editing.col - pinnedLeftCount;\n    const total = this.unpinnedColumns().length;\n    if (unpinnedIdx < 0 || unpinnedIdx >= total) return raw;\n    return {\n      start: Math.min(raw.start, unpinnedIdx),\n      end: Math.max(raw.end, unpinnedIdx + 1),\n    };\n  });\n\n  readonly renderedUnpinnedColumns = computed(() => {\n    const all = this.unpinnedColumns();\n    if (!this.horizontalVirtualScrollEnabled()) return all;\n    const { start, end } = this.effectiveColumnRange();\n    if (end <= start || end > all.length) return all;\n    return all.slice(start, end);\n  });\n\n  readonly leadingColumnSpacer = computed(() => {\n    if (!this.horizontalVirtualScrollEnabled()) return 0;\n    const start = this.effectiveColumnRange().start;\n    const cols = this.unpinnedColumns();\n    let w = 0;\n    for (let i = 0; i < start && i < cols.length; i++) w += cols[i].currentWidth;\n    return w;\n  });\n\n  readonly trailingColumnSpacer = computed(() => {\n    if (!this.horizontalVirtualScrollEnabled()) return 0;\n    const end = this.effectiveColumnRange().end;\n    const cols = this.unpinnedColumns();\n    let w = 0;\n    for (let i = end; i < cols.length; i++) w += cols[i].currentWidth;\n    return w;\n  });\n\n  // --- Computed: column defs map (for fast lookup) ---\n  readonly columnDefMap = computed(() => {\n    const map = new Map<string, ColumnDef<T>>();\n    for (const def of this.columnDefs()) {\n      map.set(def.field, def);\n    }\n    return map;\n  });\n\n  /** `true` when at least one column declares `allowFormula: true`. */\n  readonly hasFormulaColumns = computed(() =>\n    this.columnDefs().some((d) => d.allowFormula === true),\n  );\n\n  // --- Computed: grid-template-columns CSS ---\n  readonly gridTemplateColumns = computed(() => {\n    return this.visibleColumns()\n      .map((col) => `${col.currentWidth}px`)\n      .join(' ');\n  });\n\n  // --- Computed: total content width ---\n  readonly totalContentWidth = computed(() => {\n    return this.visibleColumns().reduce((sum, col) => sum + col.currentWidth, 0);\n  });\n\n  // --- Computed: total pages ---\n  readonly totalPages = computed(() => {\n    const total = this.mode() === 'server' ? this.totalItems() : this.sourceData().length;\n    return Math.max(1, Math.ceil(total / this.pageSize()));\n  });\n\n  // --- Computed: has more data to load (infinite scroll) ---\n  readonly hasMore = computed(() => this.sourceData().length < this.totalItems());\n\n  // --- Initialize columns from ColumnDefs ---\n  initColumns(defs: ColumnDef<T>[]): void {\n    this.columnDefs.set(defs);\n    this.columnStates.set(\n      defs.map((def, index) => ({\n        field: def.field,\n        currentWidth: this.resolveWidth(def),\n        order: index,\n        visible: def.visible !== false,\n        sort: null as SortDirection,\n        sortIndex: null,\n        pinned: def.pinned ?? null,\n        searchVisible: def.searchVisible ?? false,\n      }))\n    );\n  }\n\n  // --- Update a single column state ---\n  updateColumnState(field: string, updates: Partial<ColumnStateEntry>): void {\n    this.columnStates.update((states) =>\n      states.map((state) => (state.field === field ? { ...state, ...updates } : state))\n    );\n  }\n\n  private resolveWidth(def: ColumnDef<T>): number {\n    if (def.width) {\n      return parseInt(def.width, 10) || DEFAULT_COLUMN_WIDTH;\n    }\n    return DEFAULT_COLUMN_WIDTH;\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\nimport { SortDef } from '../models/sort.model';\nimport { SortDirection } from '../models/column.model';\n\n@Injectable()\nexport class SortEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n\n  toggleSort(field: string, isMultiSort: boolean): void {\n    const currentSorts = this.state.activeSorts();\n    const existing = currentSorts.find((s) => s.field === field);\n\n    let nextDirection: SortDirection;\n    if (!existing) {\n      nextDirection = 'asc';\n    } else if (existing.direction === 'asc') {\n      nextDirection = 'desc';\n    } else {\n      nextDirection = null;\n    }\n\n    let newSorts: SortDef[];\n    if (isMultiSort) {\n      if (nextDirection === null) {\n        newSorts = currentSorts.filter((s) => s.field !== field);\n      } else if (existing) {\n        newSorts = currentSorts.map((s) =>\n          s.field === field ? { ...s, direction: nextDirection! } : s\n        );\n      } else {\n        newSorts = [...currentSorts, { field, direction: nextDirection, priority: currentSorts.length }];\n      }\n    } else {\n      newSorts = nextDirection ? [{ field, direction: nextDirection, priority: 0 }] : [];\n    }\n\n    this.state.activeSorts.set(newSorts);\n    this.syncColumnSortState(newSorts);\n  }\n\n  setSort(field: string, direction: SortDirection): void {\n    const newSorts: SortDef[] = direction\n      ? [{ field, direction, priority: 0 }]\n      : [];\n    this.state.activeSorts.set(newSorts);\n    this.syncColumnSortState(newSorts);\n  }\n\n  clearSort(): void {\n    this.state.activeSorts.set([]);\n    this.syncColumnSortState([]);\n  }\n\n  sortData(data: T[]): T[] {\n    const sorts = this.state.activeSorts();\n    if (sorts.length === 0) return data;\n\n    const defMap = this.state.columnDefMap();\n\n    return [...data].sort((a, b) => {\n      for (const sort of sorts) {\n        const def = defMap.get(sort.field);\n        if (def?.sortComparator) {\n          const result = def.sortComparator(a, b);\n          if (result !== 0) return sort.direction === 'asc' ? result : -result;\n          continue;\n        }\n\n        const valA = this.getValue(a, sort.field, def);\n        const valB = this.getValue(b, sort.field, def);\n        const result = this.defaultCompare(valA, valB);\n        if (result !== 0) return sort.direction === 'asc' ? result : -result;\n      }\n      return 0;\n    });\n  }\n\n  private syncColumnSortState(sorts: SortDef[]): void {\n    this.state.columnStates.update((states) =>\n      states.map((state) => {\n        const sortDef = sorts.find((s) => s.field === state.field);\n        return {\n          ...state,\n          sort: sortDef?.direction ?? null,\n          sortIndex: sortDef ? sorts.indexOf(sortDef) : null,\n        };\n      })\n    );\n  }\n\n  private getValue(row: T, field: string, def?: { valueGetter?: (row: T) => unknown }): unknown {\n    if (def?.valueGetter) return def.valueGetter(row);\n    return (row as Record<string, unknown>)[field];\n  }\n\n  private defaultCompare(a: unknown, b: unknown): number {\n    if (a == null && b == null) return 0;\n    if (a == null) return -1;\n    if (b == null) return 1;\n    if (typeof a === 'string' && typeof b === 'string') {\n      return a.localeCompare(b);\n    }\n    if (typeof a === 'number' && typeof b === 'number') {\n      return a - b;\n    }\n    return String(a).localeCompare(String(b));\n  }\n}\n","/**\n * Filter model — multi-condition filter builder with AND/OR combinators.\n *\n * Evaluation is left-associative (no operator precedence). Grouped / parenthesised\n * conditions (`(a AND b) OR c`) are out of scope for the MVP; see docs.\n */\n\nimport { InputSignal, OutputEmitterRef, Type } from '@angular/core';\n\n/** Controls where filter evaluation happens. */\nexport type FilterMode = 'client' | 'server';\n\nexport type FilterDataType = 'text' | 'number' | 'date' | 'set' | 'boolean' | 'custom';\n\nexport type TextOperator =\n  | 'contains'\n  | 'notContains'\n  | 'equals'\n  | 'notEquals'\n  | 'startsWith'\n  | 'endsWith'\n  | 'blank'\n  | 'notBlank';\n\nexport type NumberOperator =\n  | 'equals'\n  | 'notEquals'\n  | 'gt'\n  | 'gte'\n  | 'lt'\n  | 'lte'\n  | 'between'\n  | 'blank'\n  | 'notBlank';\n\nexport type DateOperator = NumberOperator;\nexport type SetOperator = 'in' | 'notIn' | 'blank' | 'notBlank';\nexport type BooleanOperator = 'equals' | 'blank' | 'notBlank';\n\nexport type FilterOperator =\n  | TextOperator\n  | NumberOperator\n  | DateOperator\n  | SetOperator\n  | BooleanOperator;\n\nexport type FilterCombinator = 'and' | 'or';\n\nexport interface FilterValue {\n  /** Primary value. Absent / ignored for `blank` / `notBlank`. */\n  value?: unknown;\n  /** Upper bound for `between`. */\n  valueTo?: unknown;\n}\n\nexport interface FilterCondition {\n  /** Stable identifier — used for trackBy and drag-drop reordering. */\n  id: string;\n  /** Ignored for the first condition. Rendered as \"Where\" in the UI. */\n  combinator: FilterCombinator;\n  field: string;\n  operator: FilterOperator;\n  value: FilterValue;\n}\n\nexport interface FilterModel {\n  conditions: FilterCondition[];\n}\n\nexport type FilterChangeReason =\n  | 'add'\n  | 'update'\n  | 'remove'\n  | 'reorder'\n  | 'clear'\n  | 'replace';\n\n/**\n * Payload emitted whenever the filter model changes. Replaces the legacy\n * `{ filters: ActiveFilter[] }` shape.\n */\nexport interface FilterEvent {\n  /** Full model after mutation. */\n  model: FilterModel;\n  /** Condition concerned by the mutation. null for `clear` / `replace`. */\n  condition: FilterCondition | null;\n  /** Mutation kind. */\n  reason: FilterChangeReason;\n}\n\n/** Drawer data / result for the Filters drawer (toolbar). */\nexport interface FilterDrawerData {\n  model: FilterModel;\n  availableColumns: FilterColumnDescriptor[];\n  applyMode: FilterApplyMode;\n}\n\nexport interface FilterDrawerResult {\n  model: FilterModel;\n  applied: boolean;\n}\n\nexport type FilterApplyMode = 'auto' | 'manual';\n\n/**\n * Base class for custom filter components. Extend this class and declare:\n *   readonly condition = input.required<FilterCondition>();\n *   readonly conditionChange = output<FilterValue>();\n *\n * The filter builder instantiates the component via ViewContainerRef and wires\n * the inputs/outputs automatically — the component has no dependency on the grid.\n */\nexport abstract class MozGridCustomFilter {\n  abstract readonly condition: InputSignal<FilterCondition>;\n  abstract readonly conditionChange: OutputEmitterRef<FilterValue>;\n}\n\n/** Minimal column info the builder needs to render labels, operators and value editors. */\nexport interface FilterColumnDescriptor {\n  field: string;\n  headerName: string;\n  filterType: FilterDataType;\n  operators: FilterOperator[];\n  options?: { value: unknown; label: string }[];\n  defaultOperator: FilterOperator;\n  /** Custom component rendered in the builder for filterType === 'custom'. */\n  filterComponent?: Type<MozGridCustomFilter>;\n  /** Override for completion check. Defaults to value.value != null && !== ''. */\n  filterIsComplete?: (value: FilterValue) => boolean;\n}\n\n/**\n * Default operator sets per data type. Consumers can restrict the set via\n * `ColumnDef.filterOperators`.\n */\nexport const DEFAULT_OPERATORS: Record<FilterDataType, FilterOperator[]> = {\n  text: [\n    'contains',\n    'notContains',\n    'equals',\n    'notEquals',\n    'startsWith',\n    'endsWith',\n    'blank',\n    'notBlank',\n  ],\n  number: ['equals', 'notEquals', 'gt', 'gte', 'lt', 'lte', 'between', 'blank', 'notBlank'],\n  date: ['equals', 'notEquals', 'gt', 'gte', 'lt', 'lte', 'between', 'blank', 'notBlank'],\n  set: ['in', 'notIn', 'blank', 'notBlank'],\n  boolean: ['equals', 'blank', 'notBlank'],\n  custom: [],\n};\n\nexport const DEFAULT_OPERATOR_PER_TYPE: Record<FilterDataType, FilterOperator> = {\n  text: 'contains',\n  number: 'equals',\n  date: 'equals',\n  set: 'in',\n  boolean: 'equals',\n  custom: 'equals',\n};\n\n/** Human-readable operator labels (used by `toLabel`). */\nexport const OPERATOR_LABELS: Record<FilterOperator, string> = {\n  contains: 'contains',\n  notContains: 'does not contain',\n  equals: 'equals',\n  notEquals: 'does not equal',\n  startsWith: 'starts with',\n  endsWith: 'ends with',\n  gt: '>',\n  gte: '≥',\n  lt: '<',\n  lte: '≤',\n  between: 'between',\n  in: 'in',\n  notIn: 'not in',\n  blank: 'is blank',\n  notBlank: 'is not blank',\n};\n\n/** Operators that do not require a user-entered value. */\nexport const VALUELESS_OPERATORS: ReadonlySet<FilterOperator> = new Set<FilterOperator>([\n  'blank',\n  'notBlank',\n]);\n\n/** Operators that need a secondary value (`between`). */\nexport const RANGE_OPERATORS: ReadonlySet<FilterOperator> = new Set<FilterOperator>(['between']);\n\n/** Small helper for generating condition ids without pulling in a uuid dep. */\nexport function generateConditionId(): string {\n  return `cond-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/** True when a condition has enough information to participate in evaluation. */\nexport function isConditionComplete(condition: FilterCondition): boolean {\n  if (!condition.field) return false;\n  if (VALUELESS_OPERATORS.has(condition.operator)) return true;\n  const { value, valueTo } = condition.value;\n  if (value == null || value === '') return false;\n  if (RANGE_OPERATORS.has(condition.operator)) {\n    if (valueTo == null || valueTo === '') return false;\n  }\n  return true;\n}\n","import { Injectable, Signal, computed, inject, signal } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\nimport { ColumnDef } from '../models/column.model';\nimport {\n  DEFAULT_OPERATORS,\n  DEFAULT_OPERATOR_PER_TYPE,\n  FilterChangeReason,\n  FilterColumnDescriptor,\n  FilterCondition,\n  FilterDataType,\n  FilterEvent,\n  FilterModel,\n  FilterOperator,\n  FilterValue,\n  OPERATOR_LABELS,\n  RANGE_OPERATORS,\n  VALUELESS_OPERATORS,\n  generateConditionId,\n  isConditionComplete,\n} from '../models/filter.model';\n\ntype PreparedCondition<T> = { cond: FilterCondition; col: ColumnDef<T> | undefined; type: FilterDataType };\n\ntype Predicate = (cell: unknown, value: FilterValue) => boolean;\n\n@Injectable()\nexport class FilterEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n\n  /** Latest mutation, used by the grid shell to emit `filterChange` once. */\n  private readonly lastChange = signal<FilterEvent | null>(null);\n\n  readonly conditions: Signal<FilterCondition[]> = computed(\n    () => this.state.filterModel().conditions\n  );\n\n  readonly hasActiveFilters = computed(() => this.conditions().length > 0);\n\n  readonly lastEvent = this.lastChange.asReadonly();\n\n  // ------------------------------------------------------------------\n  // Mutations\n  // ------------------------------------------------------------------\n\n  /** Replaces the whole model in one go. Used by the drawer's Apply button. */\n  setModel(model: FilterModel, reason: FilterChangeReason = 'replace'): void {\n    this.state.filterModel.set({ conditions: [...model.conditions] });\n    this.state.pageIndex.set(0);\n    this.notify(reason, null);\n  }\n\n  addCondition(condition: FilterCondition): void {\n    this.state.filterModel.update((m) => ({\n      conditions: [...m.conditions, condition],\n    }));\n    this.state.pageIndex.set(0);\n    this.notify('add', condition);\n  }\n\n  updateCondition(id: string, patch: Partial<FilterCondition>): void {\n    let updated: FilterCondition | null = null;\n    this.state.filterModel.update((m) => ({\n      conditions: m.conditions.map((c) => {\n        if (c.id !== id) return c;\n        const next = { ...c, ...patch, value: { ...c.value, ...(patch.value ?? {}) } };\n        updated = next;\n        return next;\n      }),\n    }));\n    this.state.pageIndex.set(0);\n    if (updated) this.notify('update', updated);\n  }\n\n  removeCondition(id: string): void {\n    const removed = this.state.filterModel().conditions.find((c) => c.id === id) ?? null;\n    this.state.filterModel.update((m) => ({\n      conditions: m.conditions.filter((c) => c.id !== id),\n    }));\n    this.state.pageIndex.set(0);\n    this.notify('remove', removed);\n  }\n\n  reorderConditions(fromIndex: number, toIndex: number): void {\n    this.state.filterModel.update((m) => {\n      if (fromIndex === toIndex) return m;\n      const next = [...m.conditions];\n      const [item] = next.splice(fromIndex, 1);\n      if (!item) return m;\n      next.splice(toIndex, 0, item);\n      return { conditions: next };\n    });\n    this.state.pageIndex.set(0);\n    this.notify('reorder', null);\n  }\n\n  clearAll(): void {\n    if (this.state.filterModel().conditions.length === 0) return;\n    this.state.filterModel.set({ conditions: [] });\n    this.state.pageIndex.set(0);\n    this.notify('clear', null);\n  }\n\n  /** Convenience: drop all conditions that target a given field. */\n  removeByField(field: string): void {\n    const before = this.state.filterModel().conditions;\n    const after = before.filter((c) => c.field !== field);\n    if (after.length === before.length) return;\n    this.state.filterModel.set({ conditions: after });\n    this.state.pageIndex.set(0);\n    this.notify('replace', null);\n  }\n\n  /**\n   * Drops conditions whose value is not yet complete. Called when a filter\n   * builder is dismissed: a row the user added but never filled in must not\n   * linger in the model as a phantom active filter.\n   */\n  dropIncompleteConditions(): void {\n    const defMap = this.state.columnDefMap();\n    const before = this.state.filterModel().conditions;\n    const after = before.filter((c) => this.isComplete(c, defMap.get(c.field)));\n    if (after.length === before.length) return;\n    this.state.filterModel.set({ conditions: after });\n    this.state.pageIndex.set(0);\n    this.notify('replace', null);\n  }\n\n  // ------------------------------------------------------------------\n  // Evaluation\n  // ------------------------------------------------------------------\n\n  /**\n   * Evaluates the current model against the provided data.\n   * In `server` filterMode the grid delegates filtering to the consumer — returns input as-is.\n   */\n  filterData(data: T[]): T[] {\n    if (this.state.filterMode() === 'server') return data;\n\n    const defMap = this.state.columnDefMap();\n    const conditions = this.state.filterModel().conditions.filter((c) =>\n      this.isComplete(c, defMap.get(c.field))\n    );\n    if (conditions.length === 0) return data;\n\n    const prepared: PreparedCondition<T>[] = conditions.map((c) => ({\n      cond: c,\n      col: defMap.get(c.field),\n      type: resolveFilterType(defMap.get(c.field)),\n    }));\n\n    return data.filter((row) => {\n      let pass = this.matchRow(row, prepared[0]);\n      for (let i = 1; i < prepared.length; i++) {\n        const result = this.matchRow(row, prepared[i]);\n        pass = prepared[i].cond.combinator === 'and' ? pass && result : pass || result;\n      }\n      return pass;\n    });\n  }\n\n  private isComplete(condition: FilterCondition, col: ColumnDef<T> | undefined): boolean {\n    if (resolveFilterType(col) === 'custom') {\n      const fn = col?.filterIsComplete;\n      return fn\n        ? fn(condition.value)\n        : condition.value.value != null && condition.value.value !== '';\n    }\n    return isConditionComplete(condition);\n  }\n\n  private matchRow(row: T, item: PreparedCondition<T>): boolean {\n    if (item.type === 'custom') {\n      const fn = item.col?.filterPredicate;\n      return fn ? fn(row, item.cond.value) : true;\n    }\n    return matchOne(row, item.cond, item.col, item.type);\n  }\n\n  // ------------------------------------------------------------------\n  // Helpers\n  // ------------------------------------------------------------------\n\n  /** Returns a human-readable label for a condition (\"Status equals En stock\"). */\n  toLabel(condition: FilterCondition): string {\n    const def = this.state.columnDefMap().get(condition.field);\n    const col = def?.headerName ?? condition.field;\n    const op = OPERATOR_LABELS[condition.operator] ?? condition.operator;\n\n    if (VALUELESS_OPERATORS.has(condition.operator)) {\n      return `${col} ${op}`;\n    }\n    const value = formatValue(condition.value.value, def);\n    if (RANGE_OPERATORS.has(condition.operator)) {\n      const to = formatValue(condition.value.valueTo, def);\n      return `${col} ${op} ${value} – ${to}`;\n    }\n    return `${col} ${op} ${value}`;\n  }\n\n  /** Returns the filter data type inferred for a column. */\n  getFilterType(field: string): FilterDataType {\n    return resolveFilterType(this.state.columnDefMap().get(field));\n  }\n\n  /**\n   * Builds the column descriptors consumed by the filter builder UI.\n   *\n   * All `filterable` columns are included, even those that ship a custom\n   * `filterTemplate`. The custom template drives the inline header filter\n   * row (quick per-column UI), while the builder — rendered in the toolbar\n   * drawer and in the column-menu overlay — always uses the generic editors.\n   * The two mechanisms are complementary and can coexist on the same column.\n   */\n  describeFilterableColumns(): FilterColumnDescriptor[] {\n    const defs = this.state.columnDefs();\n    return defs.filter((d) => d.filterable).map((d) => this.describeColumn(d));\n  }\n\n  describeColumn(def: ColumnDef<T>): FilterColumnDescriptor {\n    if (def.filterComponent) {\n      return {\n        field: def.field,\n        headerName: def.headerName ?? def.field,\n        filterType: 'custom',\n        operators: [],\n        defaultOperator: 'equals',\n        filterComponent: def.filterComponent,\n        filterIsComplete: def.filterIsComplete,\n      };\n    }\n    const type = resolveFilterType(def);\n    const operators =\n      def.filterOperators && def.filterOperators.length > 0\n        ? def.filterOperators\n        : DEFAULT_OPERATORS[type];\n    const defaultOp = def.defaultFilterOperator ?? DEFAULT_OPERATOR_PER_TYPE[type];\n    return {\n      field: def.field,\n      headerName: def.headerName ?? def.field,\n      filterType: type,\n      operators,\n      defaultOperator: operators.includes(defaultOp) ? defaultOp : operators[0],\n      options: def.filterOptions ?? inferOptionsFromData(this.state.sourceData(), def, type),\n    };\n  }\n\n  /** Factory for new conditions created by the UI. */\n  makeCondition(\n    field: string,\n    isFirst: boolean,\n    overrides: Partial<FilterCondition> = {}\n  ): FilterCondition {\n    const def = this.state.columnDefMap().get(field);\n    const descriptor = def ? this.describeColumn(def) : null;\n    return {\n      id: generateConditionId(),\n      combinator: isFirst ? 'and' : 'and',\n      field,\n      operator: descriptor?.defaultOperator ?? 'contains',\n      value: {},\n      ...overrides,\n    };\n  }\n\n  // ------------------------------------------------------------------\n  // Internal\n  // ------------------------------------------------------------------\n\n  private notify(reason: FilterChangeReason, condition: FilterCondition | null): void {\n    this.lastChange.set({\n      model: { conditions: this.state.filterModel().conditions.slice() },\n      condition,\n      reason,\n    });\n  }\n}\n\n// --------------------------------------------------------------------\n// Pure helpers\n// --------------------------------------------------------------------\n\nfunction resolveFilterType<T>(def: ColumnDef<T> | undefined): FilterDataType {\n  if (!def) return 'text';\n  if (def.filterType) return def.filterType;\n  switch (def.cellEditor) {\n    case 'number':\n      return 'number';\n    case 'date':\n      return 'date';\n    case 'select':\n      return 'set';\n    case 'checkbox':\n    case 'toggle':\n      return 'boolean';\n    default:\n      return 'text';\n  }\n}\n\nfunction matchOne<T>(\n  row: T,\n  condition: FilterCondition,\n  col: ColumnDef<T> | undefined,\n  type: FilterDataType\n): boolean {\n  const raw = col?.valueGetter\n    ? col.valueGetter(row)\n    : (row as Record<string, unknown>)[condition.field];\n\n  const predicate = PREDICATES[type]?.[condition.operator];\n  if (!predicate) return true;\n  return predicate(raw, condition.value);\n}\n\nfunction formatValue<T>(value: unknown, def: ColumnDef<T> | undefined): string {\n  if (value == null || value === '') return '';\n  if (Array.isArray(value)) {\n    return value.map((v) => formatSingleOption(v, def)).join(', ');\n  }\n  return formatSingleOption(value, def);\n}\n\nfunction formatSingleOption<T>(value: unknown, def: ColumnDef<T> | undefined): string {\n  if (def?.filterOptions) {\n    const opt = def.filterOptions.find((o) => String(o.value) === String(value));\n    if (opt) return String(opt.label);\n  }\n  return String(value);\n}\n\nfunction inferOptionsFromData<T>(\n  data: T[],\n  def: ColumnDef<T>,\n  type: FilterDataType\n): { value: unknown; label: string }[] | undefined {\n  if (type !== 'set') return undefined;\n  const seen = new Set<string>();\n  const out: { value: unknown; label: string }[] = [];\n  for (const row of data) {\n    const v = def.valueGetter ? def.valueGetter(row) : (row as Record<string, unknown>)[def.field];\n    if (v == null) continue;\n    const key = String(v);\n    if (seen.has(key)) continue;\n    seen.add(key);\n    out.push({ value: v, label: key });\n    if (out.length >= 200) break;\n  }\n  return out;\n}\n\n// --------------------------------------------------------------------\n// Predicate table — dispatched by (filterType, operator)\n// --------------------------------------------------------------------\n\nconst textContains: Predicate = (cell, { value }) =>\n  String(cell ?? '')\n    .toLowerCase()\n    .includes(String(value ?? '').toLowerCase());\n\nconst textNotContains: Predicate = (cell, v) => !textContains(cell, v);\n\nconst textEquals: Predicate = (cell, { value }) =>\n  String(cell ?? '').toLowerCase() === String(value ?? '').toLowerCase();\n\nconst textNotEquals: Predicate = (cell, v) => !textEquals(cell, v);\n\nconst textStartsWith: Predicate = (cell, { value }) =>\n  String(cell ?? '')\n    .toLowerCase()\n    .startsWith(String(value ?? '').toLowerCase());\n\nconst textEndsWith: Predicate = (cell, { value }) =>\n  String(cell ?? '')\n    .toLowerCase()\n    .endsWith(String(value ?? '').toLowerCase());\n\nconst blank: Predicate = (cell) => cell == null || cell === '';\nconst notBlank: Predicate = (cell) => !blank(cell, { value: undefined });\n\nconst numEquals: Predicate = (cell, { value }) => toNum(cell) === toNum(value);\nconst numNotEquals: Predicate = (cell, v) => !numEquals(cell, v);\nconst numGt: Predicate = (cell, { value }) => toNum(cell) > toNum(value);\nconst numGte: Predicate = (cell, { value }) => toNum(cell) >= toNum(value);\nconst numLt: Predicate = (cell, { value }) => toNum(cell) < toNum(value);\nconst numLte: Predicate = (cell, { value }) => toNum(cell) <= toNum(value);\nconst numBetween: Predicate = (cell, { value, valueTo }) => {\n  const n = toNum(cell);\n  return n >= toNum(value) && n <= toNum(valueTo);\n};\n\nconst dateEquals: Predicate = (cell, { value }) => toTime(cell) === toTime(value);\nconst dateNotEquals: Predicate = (cell, v) => !dateEquals(cell, v);\nconst dateGt: Predicate = (cell, { value }) => toTime(cell) > toTime(value);\nconst dateGte: Predicate = (cell, { value }) => toTime(cell) >= toTime(value);\nconst dateLt: Predicate = (cell, { value }) => toTime(cell) < toTime(value);\nconst dateLte: Predicate = (cell, { value }) => toTime(cell) <= toTime(value);\nconst dateBetween: Predicate = (cell, { value, valueTo }) => {\n  const t = toTime(cell);\n  return t >= toTime(value) && t <= toTime(valueTo);\n};\n\nconst setIn: Predicate = (cell, { value }) => {\n  const arr = Array.isArray(value) ? value : [value];\n  if (arr.length === 0) return true;\n  return arr.some((v) => String(v) === String(cell));\n};\nconst setNotIn: Predicate = (cell, v) => !setIn(cell, v);\n\nconst boolEquals: Predicate = (cell, { value }) => {\n  const expected = value === true || value === 'true' || value === 1;\n  const actual = cell === true || cell === 'true' || cell === 1;\n  return expected === actual;\n};\n\nfunction toNum(v: unknown): number {\n  const n = typeof v === 'number' ? v : Number(v);\n  return Number.isFinite(n) ? n : NaN;\n}\n\nfunction toTime(v: unknown): number {\n  if (v instanceof Date) return v.getTime();\n  if (typeof v === 'number') return v;\n  if (typeof v === 'string') {\n    const parsed = Date.parse(v);\n    return Number.isFinite(parsed) ? parsed : NaN;\n  }\n  return NaN;\n}\n\nconst PREDICATES: Record<FilterDataType, Partial<Record<FilterOperator, Predicate>>> = {\n  text: {\n    contains: textContains,\n    notContains: textNotContains,\n    equals: textEquals,\n    notEquals: textNotEquals,\n    startsWith: textStartsWith,\n    endsWith: textEndsWith,\n    blank,\n    notBlank,\n  },\n  number: {\n    equals: numEquals,\n    notEquals: numNotEquals,\n    gt: numGt,\n    gte: numGte,\n    lt: numLt,\n    lte: numLte,\n    between: numBetween,\n    blank,\n    notBlank,\n  },\n  date: {\n    equals: dateEquals,\n    notEquals: dateNotEquals,\n    gt: dateGt,\n    gte: dateGte,\n    lt: dateLt,\n    lte: dateLte,\n    between: dateBetween,\n    blank,\n    notBlank,\n  },\n  set: {\n    in: setIn,\n    notIn: setNotIn,\n    blank,\n    notBlank,\n  },\n  boolean: {\n    equals: boolEquals,\n    blank,\n    notBlank,\n  },\n  // custom filters are evaluated via ColumnDef.filterPredicate — no predicates here.\n  custom: {},\n};\n","import { Injectable, inject } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\nimport { GroupRow, DisplayRow } from '../models/display-row.model';\nimport { GroupEntry } from '../models/grid-events.model';\n\n@Injectable()\nexport class GroupEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n\n  addGroup(field: string): void {\n    const current = this.state.groupColumns();\n    if (current.some((g) => g.field === field)) return;\n    this.state.groupColumns.set([...current, { field, sortDirection: 'asc' }]);\n    this.state.pageIndex.set(0);\n  }\n\n  removeGroup(field: string): void {\n    this.state.groupColumns.update((cols) => cols.filter((g) => g.field !== field));\n    this.state.pageIndex.set(0);\n  }\n\n  applyGroups(groups: GroupEntry[]): void {\n    this.state.groupColumns.set(groups);\n  }\n\n  clearGroups(): void {\n    this.state.groupColumns.set([]);\n    this.state.expandedGroups.update((s) => { s.clear(); return new Set(s); });\n  }\n\n  toggleGroupExpand(groupKey: string): void {\n    this.state.expandedGroups.update((set) => {\n      const next = new Set(set);\n      if (next.has(groupKey)) {\n        next.delete(groupKey);\n      } else {\n        next.add(groupKey);\n      }\n      return next;\n    });\n  }\n\n  isGroupExpanded(groupKey: string): boolean {\n    return this.state.expandedGroups().has(groupKey);\n  }\n\n  groupData(data: T[]): DisplayRow<T>[] {\n    const groupEntries = this.state.groupColumns();\n    if (groupEntries.length === 0) return [];\n\n    const rootGroups = this.buildGroups(data, groupEntries, 0, null, '');\n    return this.flattenGroups(rootGroups);\n  }\n\n  private buildGroups(\n    data: T[],\n    entries: GroupEntry[],\n    depth: number,\n    parent: GroupRow<T> | null,\n    parentKey: string,\n  ): GroupRow<T>[] {\n    if (depth >= entries.length) return [];\n\n    const entry = entries[depth];\n    const field = entry.field;\n    const defMap = this.state.columnDefMap();\n    const def = defMap.get(field);\n\n    const groups = new Map<string, T[]>();\n    for (const row of data) {\n      const rawValue = def?.valueGetter\n        ? def.valueGetter(row)\n        : (row as Record<string, unknown>)[field];\n      const key = String(rawValue ?? '');\n      if (!groups.has(key)) groups.set(key, []);\n      groups.get(key)!.push(row);\n    }\n\n    const result: GroupRow<T>[] = [];\n    for (const [value, rows] of groups) {\n      const groupKey = parentKey ? `${parentKey}|${field}:${value}` : `${field}:${value}`;\n      const displayValue = def?.valueFormatter\n        ? def.valueFormatter(value, rows[0])\n        : value;\n\n      const groupRow: GroupRow<T> = {\n        type: 'group',\n        field,\n        value,\n        displayValue: `${def?.headerName ?? field}: ${displayValue}`,\n        depth,\n        count: rows.length,\n        expanded: this.state.expandedGroups().has(groupKey),\n        groupKey,\n        children: [],\n        parent,\n      };\n\n      if (depth + 1 < entries.length) {\n        groupRow.children = this.buildGroups(rows, entries, depth + 1, groupRow, groupKey);\n      } else {\n        groupRow.children = rows;\n      }\n\n      result.push(groupRow);\n    }\n\n    // Sort groups by their sort direction\n    const sortDir = entry.sortDirection === 'desc' ? -1 : 1;\n    result.sort((a, b) => {\n      const aVal = String(a.value);\n      const bVal = String(b.value);\n      const numA = Number(aVal);\n      const numB = Number(bVal);\n      if (!isNaN(numA) && !isNaN(numB)) {\n        return (numA - numB) * sortDir;\n      }\n      return aVal.localeCompare(bVal) * sortDir;\n    });\n\n    return result;\n  }\n\n  private flattenGroups(groups: GroupRow<T>[]): DisplayRow<T>[] {\n    const result: DisplayRow<T>[] = [];\n    let dataIndex = 0;\n\n    const flatten = (groupList: GroupRow<T>[]): void => {\n      for (const group of groupList) {\n        result.push({ type: 'group', group });\n\n        if (group.expanded) {\n          const childGroups = group.children.filter(\n            (c): c is GroupRow<T> => typeof c === 'object' && c !== null && 'type' in c && (c as GroupRow<T>).type === 'group'\n          );\n          const childData = group.children.filter(\n            (c): c is T => !(typeof c === 'object' && c !== null && 'type' in c && (c as GroupRow<T>).type === 'group')\n          );\n\n          if (childGroups.length > 0) {\n            flatten(childGroups);\n          }\n\n          for (const data of childData) {\n            result.push({\n              type: 'data',\n              data,\n              index: dataIndex++,\n              depth: group.depth + 1,\n            });\n          }\n        }\n      }\n    };\n\n    flatten(groups);\n    return result;\n  }\n}\n","import { Injectable, inject, computed } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\nimport { SortEngine } from '../features/sort.engine';\nimport { FilterEngine } from '../features/filter.engine';\nimport { GroupEngine } from '../features/group.engine';\nimport { DisplayRow } from '../models/display-row.model';\n\n@Injectable()\nexport class GridEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n  private readonly sortEngine = inject<SortEngine<T>>(SortEngine);\n  private readonly filterEngine = inject<FilterEngine<T>>(FilterEngine);\n  private readonly groupEngine = inject<GroupEngine<T>>(GroupEngine);\n\n  /**\n   * Pipeline step 1: sorted data.\n   * In server mode, returns source data unchanged.\n   */\n  readonly sortedData = computed<T[]>(() => {\n    const data = this.state.sourceData();\n    if (this.state.mode() === 'server') return data;\n    return this.sortEngine.sortData(data);\n  });\n\n  /**\n   * Pipeline step 2: filtered data.\n   * In server mode, returns sorted data unchanged.\n   */\n  readonly filteredData = computed<T[]>(() => {\n    const data = this.sortedData();\n    if (this.state.mode() === 'server') return data;\n    return this.filterEngine.filterData(data);\n  });\n\n  /**\n   * Pipeline step 3: paginated data.\n   * In server mode, the data is already paginated by the server.\n   * In infinite-scroll mode, all accumulated data is displayed (no slice).\n   * Pagination applies before grouping so groups are per-page.\n   */\n  readonly paginatedData = computed<T[]>(() => {\n    const data = this.filteredData();\n    if (this.state.mode() === 'server') return data;\n    if (this.state.loadingStrategy() === 'infinite-scroll') return data;\n    // Pagination disabled: render the full filtered set so vertical\n    // virtualization can window across every row.\n    if (!this.state.paginationEnabled()) return data;\n\n    const pageIndex = this.state.pageIndex();\n    const pageSize = this.state.pageSize();\n    const start = pageIndex * pageSize;\n    return data.slice(start, start + pageSize);\n  });\n\n  /**\n   * Pipeline final: display rows (flat array for virtual scroll).\n   * If grouped, produces group header + data rows.\n   * If not grouped, wraps paginated data rows.\n   */\n  readonly displayRows = computed<DisplayRow<T>[]>(() => {\n    const groupCols = this.state.groupColumns();\n\n    if (groupCols.length > 0) {\n      return this.groupEngine.groupData(this.paginatedData());\n    }\n\n    const rows: DisplayRow<T>[] = [];\n    const isInfiniteScroll = this.state.loadingStrategy() === 'infinite-scroll';\n\n    for (let i = 0; i < this.paginatedData().length; i++) {\n      const data = this.paginatedData()[i];\n      const globalIndex = isInfiniteScroll ? i : this.state.pageIndex() * this.state.pageSize() + i;\n      rows.push({ type: 'data' as const, data, index: globalIndex, depth: 0 });\n    }\n\n    return rows;\n  });\n\n  /**\n   * Total items count for pagination.\n   */\n  readonly computedTotalItems = computed<number>(() => {\n    if (this.state.mode() === 'server') return this.state.totalItems();\n    return this.filteredData().length;\n  });\n\n  /**\n   * Resolves a display row index (as emitted via `DisplayRow.index`) to the\n   * actual index in `sourceData()`. When sort/filter/group is active these do\n   * not match, so we look up the display row's data object and search for it\n   * in sourceData. Returns -1 when the display index is unknown.\n   */\n  displayIndexToSourceIndex(displayIndex: number): number {\n    const rows = this.displayRows();\n    const row = rows.find((r) => r.type === 'data' && r.index === displayIndex);\n    if (!row || row.type !== 'data') return -1;\n    return this.state.sourceData().indexOf(row.data);\n  }\n}\n","import { Injectable, inject, NgZone } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\nimport { ColumnResizeEvent } from '../models/column.model';\n\nconst MIN_COLUMN_WIDTH = 50;\n\n@Injectable()\nexport class ColumnResizeEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n  private readonly ngZone = inject(NgZone);\n\n  private resizing = false;\n  private resizeField: string | null = null;\n  private startX = 0;\n  private startWidth = 0;\n  private invertDelta = false;\n\n  private readonly onMouseMove = (event: MouseEvent): void => {\n    if (!this.resizing || !this.resizeField) return;\n    const rawDelta = event.clientX - this.startX;\n    const delta = this.invertDelta ? -rawDelta : rawDelta;\n    const def = this.state.columnDefMap().get(this.resizeField);\n    const min = def?.minWidth ? parseInt(def.minWidth, 10) : MIN_COLUMN_WIDTH;\n    const max = def?.maxWidth ? parseInt(def.maxWidth, 10) : Infinity;\n    const newWidth = Math.max(min, Math.min(max, this.startWidth + delta));\n    this.state.updateColumnState(this.resizeField, { currentWidth: newWidth });\n  };\n\n  private readonly onMouseUp = (): void => {\n    if (!this.resizing) return;\n    this.resizing = false;\n    document.removeEventListener('mousemove', this.onMouseMove);\n    document.removeEventListener('mouseup', this.onMouseUp);\n    document.body.style.cursor = '';\n    document.body.style.userSelect = '';\n  };\n\n  startResize(field: string, event: MouseEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const colState = this.state.columnStates().find((c) => c.field === field);\n    if (!colState) return;\n\n    this.resizing = true;\n    this.resizeField = field;\n    this.startX = event.clientX;\n    this.startWidth = colState.currentWidth;\n    this.invertDelta = colState.pinned === 'end';\n\n    document.body.style.cursor = 'col-resize';\n    document.body.style.userSelect = 'none';\n\n    this.ngZone.runOutsideAngular(() => {\n      document.addEventListener('mousemove', this.onMouseMove);\n      document.addEventListener('mouseup', this.onMouseUp);\n    });\n  }\n\n  getResizeEvent(field: string, previousWidth: number): ColumnResizeEvent {\n    const colState = this.state.columnStates().find((c) => c.field === field);\n    return {\n      field,\n      previousWidth,\n      newWidth: colState?.currentWidth ?? previousWidth,\n    };\n  }\n}\n","/**\n * Internal AST produced by the formula parser and consumed by the evaluator.\n *\n * The formula feature uses a **two-layer model**, modelled after AG-Grid:\n *\n *   1. **Edit surface** — what the user sees and types. Column letters + row\n *      numbers, A1-style: `=A1*B1`, `=SUM(A1:A5)`, `=$A$1` (absolute).\n *   2. **Storage** — long-form, field-stable: `=REF(COLUMN(\"price\"),ROW(8))`.\n *      Survives column reorder / rename.\n *\n * The parser accepts both forms. The AST is the same in either case: a\n * `CellRefNode` carries a `StructuredRef` keyed by the column's stable\n * `field` name (never by its current visible position).\n *\n *   A1              → { field: \"price\",  row: 1, absRow: false, absField: false }\n *   $A$1            → { field: \"price\",  row: 1, absRow: true,  absField: true  }\n *   REF(COLUMN(\"price\"), ROW(1))\n *                   → { field: \"price\",  row: 1, absRow: true,  absField: true  }\n *\n * Ranges use the same shape for each endpoint:\n *\n *   A1:A5 — vertical\n *   A1:B1 — horizontal\n *   A1:B5 — rectangular\n */\n\nimport type { CellAddress } from '../../models/formula.model';\n\n/** Literal numeric constant — e.g. `3.14`. */\nexport interface NumberLiteralNode {\n  readonly kind: 'number';\n  readonly value: number;\n}\n\n/** Literal quoted string — e.g. `\"hello\"`. */\nexport interface StringLiteralNode {\n  readonly kind: 'string';\n  readonly value: string;\n}\n\n/** Literal boolean constant — `TRUE` / `FALSE`. */\nexport interface BooleanLiteralNode {\n  readonly kind: 'boolean';\n  readonly value: boolean;\n}\n\n/**\n * Structured cell reference — A1-compatible. The `field` is always the\n * column's stable name (never its letter) so the ref survives reorder.\n *   - `row`      — 1-indexed display position. Ignored when `sameRow`.\n *   - `absRow`   — row locked (matches `$1` / `$A$1`; won't shift under fill).\n *   - `absField` — column locked (matches `$A` / `$A$1`; won't shift under fill).\n *   - `sameRow`  — implicit current-row ref. Surface `[field]`, storage\n *                  `REF(COLUMN(\"field\"))` (no ROW arg). Resolves against\n *                  the host cell's row at evaluation time, so the same\n *                  formula can be placed on every row without per-row\n *                  rewriting. Mutually exclusive with `absRow`.\n */\nexport interface StructuredRef {\n  readonly field: string;\n  readonly row: number;\n  readonly absRow: boolean;\n  readonly absField: boolean;\n  readonly sameRow?: boolean;\n}\n\nexport interface CellRefNode {\n  readonly kind: 'ref';\n  readonly ref: StructuredRef;\n  /** Resolved long-form address, attached post-parse. Optional during tests. */\n  readonly resolved?: CellAddress;\n}\n\nexport interface RangeRefNode {\n  readonly kind: 'range';\n  readonly start: StructuredRef;\n  readonly end: StructuredRef;\n  /**\n   * Resolved cells in row-major order, attached post-parse by the mapper.\n   * An undefined entry means the specific coordinate pointed to a missing\n   * column — the evaluator will surface `#REF!` on access.\n   */\n  readonly resolved?: ReadonlyArray<CellAddress | undefined>;\n}\n\n/** Unary prefix operator (`+x`, `-x`). */\nexport type UnaryOp = '+' | '-';\n\nexport interface UnaryOpNode {\n  readonly kind: 'unary';\n  readonly op: UnaryOp;\n  readonly operand: FormulaAst;\n}\n\nexport type BinaryOp =\n  | '+'\n  | '-'\n  | '*'\n  | '/'\n  | '^'\n  | '&'\n  | '='\n  | '<>'\n  | '<'\n  | '>'\n  | '<='\n  | '>=';\n\nexport interface BinaryOpNode {\n  readonly kind: 'binary';\n  readonly op: BinaryOp;\n  readonly left: FormulaAst;\n  readonly right: FormulaAst;\n}\n\nexport interface FunctionCallNode {\n  readonly kind: 'call';\n  /** Uppercased name for case-insensitive lookup. */\n  readonly name: string;\n  readonly args: readonly FormulaAst[];\n}\n\nexport type FormulaAst =\n  | NumberLiteralNode\n  | StringLiteralNode\n  | BooleanLiteralNode\n  | CellRefNode\n  | RangeRefNode\n  | UnaryOpNode\n  | BinaryOpNode\n  | FunctionCallNode;\n\n// ─── Column-letter helpers ──────────────────────────────────────────────────\n\n/**\n * Convert a 0-based column index to its A1 letter sequence.\n *   0 → A, 25 → Z, 26 → AA, 27 → AB, 701 → ZZ, 702 → AAA, …\n */\nexport function columnIndexToLetters(index: number): string {\n  if (!Number.isInteger(index) || index < 0) return '';\n  let out = '';\n  let n = index;\n  while (true) {\n    const rem = n % 26;\n    out = String.fromCharCode(65 + rem) + out;\n    n = Math.floor(n / 26) - 1;\n    if (n < 0) break;\n  }\n  return out;\n}\n\n/**\n * Convert an A1 column-letter sequence to its 0-based index. Returns `-1`\n * for invalid input (empty string, non-letters).\n */\nexport function columnLettersToIndex(letters: string): number {\n  if (letters.length === 0) return -1;\n  let n = 0;\n  for (let i = 0; i < letters.length; i++) {\n    const code = letters.charCodeAt(i);\n    const upper = code >= 97 && code <= 122 ? code - 32 : code;\n    if (upper < 65 || upper > 90) return -1;\n    n = n * 26 + (upper - 64);\n  }\n  return n - 1;\n}\n\n// ─── Field-name helpers ─────────────────────────────────────────────────────\n\n/** Fields that don't need quoting inside `COLUMN(\"…\")` storage form. */\nconst BARE_FIELD_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/** Quote a field name when it contains characters outside the bare set. */\nexport function formatField(field: string): string {\n  if (BARE_FIELD_RE.test(field)) return field;\n  return `\"${field.replace(/\"/g, '\"\"')}\"`;\n}\n\n// ─── Ref formatters (A1 + long-form) ────────────────────────────────────────\n\n/**\n * Render a structured ref as A1 notation using the column order from the\n * current grid context. Returns `#REF!` when the field is not visible.\n * Same-row refs render as `[field]` surface shorthand.\n */\nexport function cellRefToA1(ref: StructuredRef, fieldOrder: readonly string[]): string {\n  const idx = fieldOrder.indexOf(ref.field);\n  if (idx < 0) return '#REF!';\n  if (ref.sameRow) return `[${ref.field}]`;\n  const col = columnIndexToLetters(idx);\n  return `${ref.absField ? '$' : ''}${col}${ref.absRow ? '$' : ''}${ref.row}`;\n}\n\n/**\n * Render a structured ref as the long-form storage string. Same-row refs\n * omit the ROW argument entirely (`REF(COLUMN(\"field\"))`), which is the\n * signal consumed by the parser and the ref-mapper to resolve against the\n * host cell's row at evaluation time.\n */\nexport function cellRefToLongForm(ref: StructuredRef): string {\n  const field = ref.field.replace(/\"/g, '\"\"');\n  if (ref.sameRow) return `REF(COLUMN(\"${field}\"))`;\n  return `REF(COLUMN(\"${field}\"),ROW(${ref.row}))`;\n}\n","/**\n * Shifts every *relative* reference inside a stored REF long-form formula\n * by a given row / column offset. Used by the clipboard engine when a\n * formula is dragged across a fill range: the relative row part slides\n * with the target row, and the column (named by `field`) slides across\n * the visible column order.\n *\n * Absolute markers (`$C` / `$R` / `$CR`) are preserved untouched — they\n * match Excel's `$A$1` semantics. Shifts that push a row below 1 or a\n * column outside the visible range emit `#REF!` in place of the ref, so\n * the evaluator can surface the broken reference.\n *\n * The function operates on the long-form storage string directly (no\n * parse / re-print round-trip) because shifting preserves the surrounding\n * tokens verbatim — safest and cheapest.\n */\n\nimport { cellRefToLongForm, formatField, StructuredRef } from './formula-ast';\n\nexport interface ShiftOptions {\n  readonly rowDelta: number;\n  readonly colDelta: number;\n  /**\n   * Ordered list of visible column fields. Required when `colDelta !== 0`;\n   * when column shifts are not needed, an empty array is fine.\n   */\n  readonly fieldOrder: readonly string[];\n}\n\n/**\n * Matches a REF long-form call including its optional lock marker. The\n * regex is conservative — it requires the exact `REF(COLUMN(\"…\"),ROW(N))`\n * shape — so any non-ref content (numbers, function calls, strings) is\n * left alone.\n */\nconst LONG_FORM_RE =\n  /REF\\(COLUMN\\(\"((?:[^\"]|\"\")*)\"\\),ROW\\((\\d+)\\)(?:,\"(\\$C|\\$R|\\$CR)\")?\\)/g;\n\nexport function shiftFormulaRefs(source: string, options: ShiftOptions): string {\n  const { rowDelta, colDelta, fieldOrder } = options;\n  if (rowDelta === 0 && colDelta === 0) return source;\n\n  return source.replace(LONG_FORM_RE, (_match, rawField: string, digits: string, lock: string | undefined) => {\n    const field = rawField.replace(/\"\"/g, '\"');\n    const row = Number(digits);\n    const absField = lock === '$C' || lock === '$CR';\n    const absRow = lock === '$R' || lock === '$CR';\n\n    let nextField = field;\n    if (!absField && colDelta !== 0) {\n      const idx = fieldOrder.indexOf(field);\n      if (idx < 0) return '#REF!';\n      const nextIdx = idx + colDelta;\n      const candidate = fieldOrder[nextIdx];\n      if (candidate === undefined) return '#REF!';\n      nextField = candidate;\n    }\n\n    let nextRow = row;\n    if (!absRow && rowDelta !== 0) {\n      nextRow = row + rowDelta;\n      if (nextRow < 1) return '#REF!';\n    }\n\n    const nextRef: StructuredRef = { field: nextField, row: nextRow, absField, absRow };\n    // Use the field-only helper to get a clean `REF(COLUMN(\"…\"),ROW(N))`,\n    // then re-append the lock marker when at least one dim is absolute.\n    const base = cellRefToLongForm(nextRef);\n    if (!absField && !absRow) return base;\n    const nextLock = absField && absRow ? '$CR' : absField ? '$C' : '$R';\n    return `${base.slice(0, -1)},\"${nextLock}\")`;\n  });\n\n  // `formatField` is not used directly because field-name quoting inside\n  // COLUMN(\"…\") uses the same \"double any embedded quote\" rule as\n  // `cellRefToLongForm` — which `cellRefToLongForm` already applies.\n  void formatField;\n}\n","import { Injectable, computed, inject } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\nimport { CellRange } from '../models/cell.model';\nimport { GridEngine } from '../engine/grid-engine';\nimport { shiftFormulaRefs } from './formula/formula-shift';\n\nexport const PASTE_SKIP = Symbol('PASTE_SKIP');\n\nexport interface HistoryCellChange {\n  rowIndex: number;\n  field: string;\n  before: unknown;\n  after: unknown;\n}\n\n/**\n * Applies a set of cell-level mutations to sourceData and returns the list of\n * actual changes that occurred, so the caller (usually the history engine) can\n * record them. `PASTE_SKIP` return values are filtered out transparently.\n */\n@Injectable()\nexport class ClipboardEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n  private readonly gridEngine = inject<GridEngine<T>>(GridEngine);\n\n  /** Derived by components (marching-ants outline). */\n  readonly cutRange = computed(() => this.state.cutSource());\n\n  /**\n   * Maps every display row index inside `range` to its actual sourceData\n   * index. Unknown indices (e.g. outside the current page) are skipped so\n   * callers can safely iterate only over rows that exist in sourceData.\n   */\n  private resolveRangeSourceIndices(range: CellRange): number[] {\n    const out: number[] = [];\n    for (let r = range.start.row; r <= range.end.row; r++) {\n      const srcIdx = this.gridEngine.displayIndexToSourceIndex(r);\n      if (srcIdx >= 0) out.push(srcIdx);\n    }\n    return out;\n  }\n\n  /**\n   * Like {@link resolveRangeSourceIndices} but also keeps each row's display\n   * position. Needed by formula-aware fills, where the shift applied to\n   * relative refs is driven by the *display* row delta (column axis is named,\n   * so field references never rewrite on horizontal fill).\n   */\n  private resolveRangeWithDisplay(range: CellRange): { display: number; source: number }[] {\n    const out: { display: number; source: number }[] = [];\n    for (let r = range.start.row; r <= range.end.row; r++) {\n      const srcIdx = this.gridEngine.displayIndexToSourceIndex(r);\n      if (srcIdx >= 0) out.push({ display: r, source: srcIdx });\n    }\n    return out;\n  }\n\n  /**\n   * Shifts the relative refs of a spreadsheet-style formula when the value\n   * is being dropped on a different row/column during a fill operation.\n   * Non-formula values (anything that doesn't start with `=`) are returned\n   * as-is, so downstream coercion still runs over the raw string.\n   */\n  private shiftIfFormula(value: unknown, allowFormula: boolean, rowDelta: number, colDelta: number): unknown {\n    if (!allowFormula) return value;\n    if (typeof value !== 'string') return value;\n    if (!value.trimStart().startsWith('=')) return value;\n    if (rowDelta === 0 && colDelta === 0) return value;\n    const fieldOrder = this.state.visibleColumns().map((c) => c.field);\n    return shiftFormulaRefs(value, { rowDelta, colDelta, fieldOrder });\n  }\n\n  markCut(range: CellRange): void {\n    this.state.cutSource.set(range);\n  }\n\n  clearCut(): void {\n    this.state.cutSource.set(null);\n  }\n\n  /** Vertical fill: row 0 of the range is the source, subsequent rows are targets. */\n  fillDown(range: CellRange): HistoryCellChange[] {\n    if (range.start.row === range.end.row) return [];\n    const cols = this.state.visibleColumns();\n    const defMap = this.state.columnDefMap();\n    const changes: HistoryCellChange[] = [];\n    const rows = this.resolveRangeWithDisplay(range);\n    if (rows.length < 2) return [];\n    const [source, ...targets] = rows;\n\n    this.state.sourceData.update((data) => {\n      const updated = [...data];\n      const sourceRow = updated[source.source];\n      if (!sourceRow) return updated;\n\n      for (const target of targets) {\n        if (!updated[target.source]) continue;\n        const rowCopy = { ...updated[target.source] } as Record<string, unknown>;\n        let changed = false;\n        const rowDelta = target.display - source.display;\n        for (let c = range.start.col; c <= range.end.col; c++) {\n          const field = cols[c]?.field;\n          if (!field) continue;\n          const def = defMap.get(field);\n          if (!def?.editable) continue;\n          const sourceValue = def.valueGetter\n            ? def.valueGetter(sourceRow)\n            : (sourceRow as Record<string, unknown>)[field];\n          const shifted = this.shiftIfFormula(sourceValue, def.allowFormula === true, rowDelta, 0);\n          const coerced = this.coerceAndValidate(field, shifted, updated[target.source]);\n          if (coerced === PASTE_SKIP) continue;\n          const before = (updated[target.source] as Record<string, unknown>)[field];\n          if (before === coerced) continue;\n          rowCopy[field] = coerced;\n          changes.push({ rowIndex: target.source, field, before, after: coerced });\n          changed = true;\n        }\n        if (changed) updated[target.source] = rowCopy as T;\n      }\n      return updated;\n    });\n\n    return changes;\n  }\n\n  /** Horizontal fill: col 0 of the range is the source, subsequent cols are targets. */\n  fillRight(range: CellRange): HistoryCellChange[] {\n    if (range.start.col === range.end.col) return [];\n    const cols = this.state.visibleColumns();\n    const defMap = this.state.columnDefMap();\n    const sourceField = cols[range.start.col]?.field;\n    if (!sourceField) return [];\n    const sourceDef = defMap.get(sourceField);\n    if (!sourceDef) return [];\n    const changes: HistoryCellChange[] = [];\n\n    const sourceIndices = this.resolveRangeSourceIndices(range);\n    this.state.sourceData.update((data) => {\n      const updated = [...data];\n      for (const sourceIdx of sourceIndices) {\n        const row = updated[sourceIdx];\n        if (!row) continue;\n        const sourceValue = sourceDef.valueGetter\n          ? sourceDef.valueGetter(row)\n          : (row as Record<string, unknown>)[sourceField];\n        const rowCopy = { ...row } as Record<string, unknown>;\n        let changed = false;\n        for (let c = range.start.col + 1; c <= range.end.col; c++) {\n          const field = cols[c]?.field;\n          if (!field) continue;\n          const def = defMap.get(field);\n          if (!def?.editable) continue;\n          const colDelta = c - range.start.col;\n          const shifted = this.shiftIfFormula(sourceValue, def.allowFormula === true, 0, colDelta);\n          const coerced = this.coerceAndValidate(field, shifted, row);\n          if (coerced === PASTE_SKIP) continue;\n          const before = (row as Record<string, unknown>)[field];\n          if (before === coerced) continue;\n          rowCopy[field] = coerced;\n          changes.push({ rowIndex: sourceIdx, field, before, after: coerced });\n          changed = true;\n        }\n        if (changed) updated[sourceIdx] = rowCopy as T;\n      }\n      return updated;\n    });\n\n    return changes;\n  }\n\n  /** Ctrl+Enter: write `value` into every editable cell of `range`. */\n  fillSelection(range: CellRange, value: unknown): HistoryCellChange[] {\n    const cols = this.state.visibleColumns();\n    const defMap = this.state.columnDefMap();\n    const changes: HistoryCellChange[] = [];\n    const sourceIndices = this.resolveRangeSourceIndices(range);\n\n    this.state.sourceData.update((data) => {\n      const updated = [...data];\n      for (const sourceIdx of sourceIndices) {\n        const row = updated[sourceIdx];\n        if (!row) continue;\n        const rowCopy = { ...row } as Record<string, unknown>;\n        let changed = false;\n        for (let c = range.start.col; c <= range.end.col; c++) {\n          const field = cols[c]?.field;\n          if (!field) continue;\n          const def = defMap.get(field);\n          if (!def?.editable) continue;\n          const coerced = this.coerceAndValidate(field, value, row);\n          if (coerced === PASTE_SKIP) continue;\n          const before = (row as Record<string, unknown>)[field];\n          if (before === coerced) continue;\n          rowCopy[field] = coerced;\n          changes.push({ rowIndex: sourceIdx, field, before, after: coerced });\n          changed = true;\n        }\n        if (changed) updated[sourceIdx] = rowCopy as T;\n      }\n      return updated;\n    });\n\n    return changes;\n  }\n\n  /** Clears every editable cell in `range` and returns the undo payload. */\n  clearRange(range: CellRange): HistoryCellChange[] {\n    const cols = this.state.visibleColumns();\n    const defMap = this.state.columnDefMap();\n    const changes: HistoryCellChange[] = [];\n    const sourceIndices = this.resolveRangeSourceIndices(range);\n\n    this.state.sourceData.update((data) => {\n      const updated = [...data];\n      for (const sourceIdx of sourceIndices) {\n        const row = updated[sourceIdx];\n        if (!row) continue;\n        const rowCopy = { ...row } as Record<string, unknown>;\n        let changed = false;\n        for (let c = range.start.col; c <= range.end.col; c++) {\n          const field = cols[c]?.field;\n          if (!field) continue;\n          const def = defMap.get(field);\n          if (!def?.editable) continue;\n          const coerced = this.coerceAndValidate(field, null, row);\n          if (coerced === PASTE_SKIP) continue;\n          const before = (row as Record<string, unknown>)[field];\n          if (before === coerced) continue;\n          rowCopy[field] = coerced;\n          changes.push({ rowIndex: sourceIdx, field, before, after: coerced });\n          changed = true;\n        }\n        if (changed) updated[sourceIdx] = rowCopy as T;\n      }\n      return updated;\n    });\n\n    return changes;\n  }\n\n  /** Applies TSV `pasteRows` starting at `range.start`, returning actual changes. */\n  applyPaste(range: CellRange, pasteRows: string[][]): HistoryCellChange[] {\n    const cols = this.state.visibleColumns();\n    const changes: HistoryCellChange[] = [];\n\n    this.state.sourceData.update((data) => {\n      const updated = [...data];\n      for (let ri = 0; ri < pasteRows.length; ri++) {\n        const targetDisplayRow = range.start.row + ri;\n        const sourceIdx = this.gridEngine.displayIndexToSourceIndex(targetDisplayRow);\n        if (sourceIdx < 0) continue;\n        const row = updated[sourceIdx];\n        if (!row) continue;\n        const rowCopy = { ...row } as Record<string, unknown>;\n        let changed = false;\n        for (let ci = 0; ci < pasteRows[ri].length; ci++) {\n          const targetCol = range.start.col + ci;\n          if (targetCol >= cols.length) break;\n          const field = cols[targetCol]?.field;\n          if (!field) continue;\n          const coerced = this.coerceAndValidate(field, pasteRows[ri][ci], row);\n          if (coerced === PASTE_SKIP) continue;\n          const before = (row as Record<string, unknown>)[field];\n          if (before === coerced) continue;\n          rowCopy[field] = coerced;\n          changes.push({ rowIndex: sourceIdx, field, before, after: coerced });\n          changed = true;\n        }\n        if (changed) updated[sourceIdx] = rowCopy as T;\n      }\n      return updated;\n    });\n\n    return changes;\n  }\n\n  /**\n   * Reverses a previously-recorded list of changes by writing `before` back into\n   * the cells. Used by the history engine for both undo and redo.\n   */\n  applyChanges(changes: HistoryCellChange[], direction: 'before' | 'after'): void {\n    if (changes.length === 0) return;\n    this.state.sourceData.update((data) => {\n      const updated = [...data];\n      // Group changes by rowIndex so each row is cloned once.\n      const byRow = new Map<number, HistoryCellChange[]>();\n      for (const change of changes) {\n        const list = byRow.get(change.rowIndex) ?? [];\n        list.push(change);\n        byRow.set(change.rowIndex, list);\n      }\n      for (const [rowIndex, rowChanges] of byRow) {\n        const row = updated[rowIndex];\n        if (!row) continue;\n        const rowCopy = { ...row } as Record<string, unknown>;\n        for (const change of rowChanges) {\n          rowCopy[change.field] = direction === 'before' ? change.before : change.after;\n        }\n        updated[rowIndex] = rowCopy as T;\n      }\n      return updated;\n    });\n  }\n\n  /**\n   * Coerces a raw value (string from TSV, unknown from fill, null for clears)\n   * into the editor's expected type, running the field's validator when present.\n   * Returns PASTE_SKIP when the column isn't editable or the value is rejected.\n   */\n  coerceAndValidate(field: string, rawValue: unknown, row: T): unknown {\n    const def = this.state.columnDefMap().get(field);\n    if (!def?.editable) return PASTE_SKIP;\n\n    const editorType = def.cellEditor;\n\n    if (rawValue === null) {\n      let clearValue: unknown;\n      switch (editorType) {\n        case 'number':\n          clearValue = null;\n          break;\n        case 'checkbox':\n          clearValue = false;\n          break;\n        default:\n          clearValue = '';\n      }\n      if (def.cellEditorValidator) {\n        const result = def.cellEditorValidator(clearValue, row);\n        if (result === false || typeof result === 'string') return PASTE_SKIP;\n      }\n      return clearValue;\n    }\n\n    let value: unknown = rawValue;\n\n    if (editorType === 'number') {\n      const num = Number(rawValue);\n      if (isNaN(num)) return PASTE_SKIP;\n      value = num;\n    } else if (editorType === 'checkbox') {\n      if (rawValue === 'true' || rawValue === true) {\n        value = true;\n      } else if (rawValue === 'false' || rawValue === false) {\n        value = false;\n      } else {\n        return PASTE_SKIP;\n      }\n    } else if (\n      (editorType === 'select' || editorType === 'custom') &&\n      def.cellEditorOptions?.length\n    ) {\n      // Whitelist clipboard values against the declared allowed set. Applies\n      // to both the built-in `select` editor and `custom` editors that expose\n      // a constrained option list (combobox, pill-picker, …).\n      const allowed = def.cellEditorOptions.map((o) => String(o.value));\n      if (!allowed.includes(String(rawValue))) return PASTE_SKIP;\n      value = rawValue;\n    }\n\n    if (def.cellEditorValidator) {\n      const result = def.cellEditorValidator(value, row);\n      if (result === false || typeof result === 'string') return PASTE_SKIP;\n    }\n\n    return value;\n  }\n\n  /** TSV string for a range — used by copy / cut. */\n  extractTsv(range: CellRange): string[][] {\n    const cols = this.state.visibleColumns();\n    const data = this.state.sourceData();\n    const defMap = this.state.columnDefMap();\n    const values: string[][] = [];\n\n    for (let r = range.start.row; r <= range.end.row; r++) {\n      const row = data[r];\n      if (!row) continue;\n      const rowValues: string[] = [];\n      for (let c = range.start.col; c <= range.end.col; c++) {\n        const field = cols[c]?.field;\n        if (!field) {\n          rowValues.push('');\n          continue;\n        }\n        const def = defMap.get(field);\n        const val = def?.valueGetter\n          ? def.valueGetter(row)\n          : (row as Record<string, unknown>)[field];\n        rowValues.push(val != null ? String(val) : '');\n      }\n      values.push(rowValues);\n    }\n    return values;\n  }\n\n  /**\n   * Checks whether a cell sits on any edge of the current cut outline. Four\n   * booleans rather than a single \"isCut\" so the view can paint only the edges\n   * that face outward — which is what produces the Excel-like marching ants.\n   */\n  cutEdges(\n    row: number,\n    col: number\n  ): { top: boolean; right: boolean; bottom: boolean; left: boolean; any: boolean } {\n    const cut = this.state.cutSource();\n    if (!cut) return { top: false, right: false, bottom: false, left: false, any: false };\n    const minRow = Math.min(cut.start.row, cut.end.row);\n    const maxRow = Math.max(cut.start.row, cut.end.row);\n    const minCol = Math.min(cut.start.col, cut.end.col);\n    const maxCol = Math.max(cut.start.col, cut.end.col);\n    if (row < minRow || row > maxRow || col < minCol || col > maxCol) {\n      return { top: false, right: false, bottom: false, left: false, any: false };\n    }\n    return {\n      top: row === minRow,\n      right: col === maxCol,\n      bottom: row === maxRow,\n      left: col === minCol,\n      any: true,\n    };\n  }\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { ClipboardEngine, HistoryCellChange } from './clipboard.engine';\n\nexport type HistoryOpType = 'edit' | 'paste' | 'cut' | 'fill' | 'delete' | 'fill-down' | 'fill-right' | 'fill-selection';\n\nexport interface HistoryOp {\n  type: HistoryOpType;\n  changes: HistoryCellChange[];\n  timestamp: number;\n}\n\nconst MAX_HISTORY = 50;\nconst STORAGE_PREFIX = 'moz-grid-history:';\n\n@Injectable()\nexport class HistoryEngine<T = unknown> {\n  private readonly clipboard = inject<ClipboardEngine<T>>(ClipboardEngine);\n\n  private readonly past = signal<HistoryOp[]>([]);\n  private readonly future = signal<HistoryOp[]>([]);\n  private storageKey: string | null = null;\n\n  readonly canUndo = computed(() => this.past().length > 0);\n  readonly canRedo = computed(() => this.future().length > 0);\n\n  /**\n   * Binds a persistence key: all record/undo/redo calls will mirror the stacks\n   * to localStorage, and past state is restored on bind. Pass null to detach.\n   */\n  attach(gridId: string | null): void {\n    this.storageKey = gridId ? `${STORAGE_PREFIX}${gridId}` : null;\n    if (!this.storageKey) {\n      this.past.set([]);\n      this.future.set([]);\n      return;\n    }\n    this.restore();\n  }\n\n  /** Records a new mutation. Clears the redo stack (standard undo semantics). */\n  record(type: HistoryOpType, changes: HistoryCellChange[]): void {\n    if (changes.length === 0) return;\n    const op: HistoryOp = { type, changes, timestamp: Date.now() };\n    this.past.update((stack) => {\n      const next = [...stack, op];\n      return next.length > MAX_HISTORY ? next.slice(next.length - MAX_HISTORY) : next;\n    });\n    this.future.set([]);\n    this.persist();\n  }\n\n  undo(): HistoryOp | null {\n    const stack = this.past();\n    if (stack.length === 0) return null;\n    const op = stack[stack.length - 1];\n    this.clipboard.applyChanges(op.changes, 'before');\n    this.past.set(stack.slice(0, -1));\n    this.future.update((f) => [...f, op]);\n    this.persist();\n    return op;\n  }\n\n  redo(): HistoryOp | null {\n    const stack = this.future();\n    if (stack.length === 0) return null;\n    const op = stack[stack.length - 1];\n    this.clipboard.applyChanges(op.changes, 'after');\n    this.future.set(stack.slice(0, -1));\n    this.past.update((p) => [...p, op]);\n    this.persist();\n    return op;\n  }\n\n  clear(): void {\n    this.past.set([]);\n    this.future.set([]);\n    if (this.storageKey) {\n      try {\n        localStorage.removeItem(this.storageKey);\n      } catch {\n        // Storage unavailable (private mode, quota) — non-fatal.\n      }\n    }\n  }\n\n  private persist(): void {\n    if (!this.storageKey) return;\n    try {\n      const payload = JSON.stringify({\n        past: this.past(),\n        future: this.future(),\n      });\n      localStorage.setItem(this.storageKey, payload);\n    } catch {\n      // Quota exceeded or storage disabled — we silently drop persistence.\n    }\n  }\n\n  private restore(): void {\n    if (!this.storageKey) return;\n    try {\n      const raw = localStorage.getItem(this.storageKey);\n      if (!raw) {\n        this.past.set([]);\n        this.future.set([]);\n        return;\n      }\n      const parsed = JSON.parse(raw) as { past?: HistoryOp[]; future?: HistoryOp[] };\n      this.past.set(Array.isArray(parsed.past) ? parsed.past : []);\n      this.future.set(Array.isArray(parsed.future) ? parsed.future : []);\n    } catch {\n      this.past.set([]);\n      this.future.set([]);\n    }\n  }\n}\n","/**\n * Public types for the formula engine. These are the only symbols consumers\n * of the grid need to interact with. The parser / evaluator / DAG live in\n * `features/formula/` and expose the public surface through `FormulaEngine`.\n *\n * Shape overview:\n *   - `CellAddress`      — stable (rowId, field) tuple.\n *   - `FormulaValue`     — tagged union of numbers, strings, booleans, empty\n *                          and errors. Errors propagate through operators.\n *   - `FormulaError`     — Excel-compatible error codes + `#PARSE!`.\n *   - `FormulaFunction*` — registration shape for built-in + custom funcs.\n *   - `FormulaChange*` / `FormulaError*` — events emitted by the grid.\n */\n\n/** Stable cell identifier, resistant to sort/filter/pagination. */\nexport interface CellAddress {\n  rowId: string | number;\n  field: string;\n}\n\n/** Excel-compatible error codes, plus mozaic-specific `#PARSE!`. */\nexport type FormulaError =\n  | '#DIV/0!'\n  | '#VALUE!'\n  | '#REF!'\n  | '#NAME?'\n  | '#NUM!'\n  | '#N/A'\n  | '#CYCLE!'\n  | '#PARSE!';\n\n/**\n * Tagged union for any value that can appear as a formula operand or result.\n * `empty` represents a cell with no source value (distinct from the empty\n * string) and coerces to 0 in arithmetic contexts, `\"\"` in textual ones.\n */\nexport type FormulaValue =\n  | { kind: 'number'; value: number }\n  | { kind: 'string'; value: string }\n  | { kind: 'boolean'; value: boolean }\n  | { kind: 'empty' }\n  | { kind: 'error'; error: FormulaError };\n\n/**\n * Context passed to every function implementation. Keeps evaluation\n * side-effect free: the engine owns the cell store and only exposes a\n * `resolveRef` primitive. Range expansion is handled by the engine before\n * the function is invoked, so implementations receive a flat value array.\n */\nexport interface FormulaEvalContext {\n  /** Current cell being evaluated (used for diagnostics only). */\n  readonly addr?: CellAddress;\n  /**\n   * Resolve a long-form reference. Returns `#REF!` when the target is\n   * missing (column removed, row deleted). The engine is responsible for\n   * cycle protection — functions must not worry about recursion.\n   */\n  resolveRef(target: CellAddress): FormulaValue;\n  /** Active locale, used by date/text helpers that are locale-aware. */\n  readonly locale: 'en' | 'fr';\n}\n\n/** Arity constraint for a function registration. */\nexport type FormulaArity =\n  | number\n  | 'variadic'\n  | readonly [min: number, max: number];\n\n/**\n * Human-readable metadata shown in the autocomplete panel. When absent, the\n * suggestion listing falls back to the function name only.\n */\nexport interface FormulaFunctionDocs {\n  /** Canonical signature string, e.g. `SUM(number1, [number2, ...])`. */\n  readonly signature: string;\n  /** One-line summary — displayed next to the signature in FR by default. */\n  readonly summary: string;\n}\n\nexport interface FormulaFunctionImpl {\n  /** Number of arguments accepted. */\n  readonly arity: FormulaArity;\n  /**\n   * Whether the function accepts a range argument (e.g. `SUM(A1:B3)`).\n   * When `true`, each range is flattened into the `args` array in\n   * row-major order. When `false`, passing a range yields `#VALUE!`.\n   *\n   * Defaults to `false`.\n   */\n  readonly acceptsRange?: boolean;\n  /** Optional documentation — consumed by the editor's autocomplete panel. */\n  readonly docs?: FormulaFunctionDocs;\n  /** Evaluate the function. Must be pure (no I/O, no mutation). */\n  evaluate(args: FormulaValue[], ctx: FormulaEvalContext): FormulaValue;\n}\n\n/** Lookup table of function name (uppercase) → implementation. */\nexport type FormulaFunctionRegistry = Readonly<Record<string, FormulaFunctionImpl>>;\n\n/**\n * Source for storing formulas externally (instead of serialising the raw\n * formula into the row's field). Mirror of AG-Grid's `formulaDataSource`.\n */\nexport interface FormulaDataSource {\n  getFormula(addr: CellAddress): string | undefined;\n  setFormula(addr: CellAddress, formula: string | undefined): void;\n  /** Optional bulk hydration — useful for persistence layers. */\n  hydrate?(entries: Iterable<{ addr: CellAddress; formula: string }>): void;\n}\n\nexport interface FormulaChangeEvent {\n  addr: CellAddress;\n  /** Canonical long-form formula (references keyed by rowId/field). */\n  formula: string;\n  /** Last evaluated value after the change. */\n  evaluated: FormulaValue;\n}\n\nexport interface FormulaErrorEvent {\n  addr: CellAddress;\n  formula: string;\n  error: FormulaError;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Factory helpers for callers that prefer not to build literals by hand. */\nexport const FormulaValues = {\n  number(value: number): FormulaValue {\n    return Number.isFinite(value) ? { kind: 'number', value } : { kind: 'error', error: '#NUM!' };\n  },\n  string(value: string): FormulaValue {\n    return { kind: 'string', value };\n  },\n  boolean(value: boolean): FormulaValue {\n    return { kind: 'boolean', value };\n  },\n  empty(): FormulaValue {\n    return { kind: 'empty' };\n  },\n  error(error: FormulaError): FormulaValue {\n    return { kind: 'error', error };\n  },\n} as const;\n\n/** Narrow a value to a number, following Excel coercion rules. */\nexport function toNumber(v: FormulaValue): number | FormulaError {\n  switch (v.kind) {\n    case 'number':\n      return v.value;\n    case 'boolean':\n      return v.value ? 1 : 0;\n    case 'empty':\n      return 0;\n    case 'string': {\n      const trimmed = v.value.trim();\n      if (trimmed === '') return 0;\n      const n = Number(trimmed);\n      return Number.isFinite(n) ? n : '#VALUE!';\n    }\n    case 'error':\n      return v.error;\n  }\n}\n\n/** Narrow a value to a string, following Excel coercion rules. */\nexport function toStringValue(v: FormulaValue): string | FormulaError {\n  switch (v.kind) {\n    case 'string':\n      return v.value;\n    case 'number':\n      return String(v.value);\n    case 'boolean':\n      return v.value ? 'TRUE' : 'FALSE';\n    case 'empty':\n      return '';\n    case 'error':\n      return v.error;\n  }\n}\n\n/** Narrow a value to a boolean, following Excel coercion rules. */\nexport function toBoolean(v: FormulaValue): boolean | FormulaError {\n  switch (v.kind) {\n    case 'boolean':\n      return v.value;\n    case 'number':\n      return v.value !== 0;\n    case 'empty':\n      return false;\n    case 'string': {\n      const u = v.value.toUpperCase();\n      if (u === 'TRUE') return true;\n      if (u === 'FALSE') return false;\n      return '#VALUE!';\n    }\n    case 'error':\n      return v.error;\n  }\n}\n\n/** Returns the first error found in the given values, or `null`. */\nexport function firstError(values: readonly FormulaValue[]): FormulaError | null {\n  for (const v of values) {\n    if (v.kind === 'error') return v.error;\n  }\n  return null;\n}\n","/**\n * Dependency graph for formula cells.\n *\n * Each node is identified by a stable string key (the engine uses\n * `rowId|field`). Edges go **from** a formula cell **to** every cell it\n * references — so reading the graph \"forward\" yields dependencies\n * (\"what do I need?\"), and \"reverse\" yields dependents (\"who needs me?\").\n *\n *   A = B + C           ▶ forward(A) = {B, C}, reverse(B) ⊇ {A}\n *\n * The DAG also exposes:\n *   - `detectCycle(from)` — returns the cycle membership if the node\n *     participates in one, to be marked as `#CYCLE!` by the engine.\n *   - `topoFrom(roots)`  — topological order of descendants of `roots`,\n *     used to re-evaluate only the impacted slice after a mutation.\n *\n * The implementation is deliberately pure (no Angular DI) so it can be\n * unit-tested and reused outside the grid context.\n */\n\nexport type NodeKey = string;\n\nexport class FormulaDag {\n  /** Forward edges: node → set of nodes it depends on. */\n  private readonly forward = new Map<NodeKey, Set<NodeKey>>();\n  /** Reverse edges: node → set of nodes that depend on it. */\n  private readonly reverse = new Map<NodeKey, Set<NodeKey>>();\n\n  /** Replaces every outgoing edge of `node` with the given `deps`. */\n  setDependencies(node: NodeKey, deps: Iterable<NodeKey>): void {\n    this.clearForward(node);\n    const next = new Set<NodeKey>();\n    for (const d of deps) {\n      if (d === node) continue; // self-loop is handled via cycle detection\n      next.add(d);\n      let back = this.reverse.get(d);\n      if (!back) {\n        back = new Set();\n        this.reverse.set(d, back);\n      }\n      back.add(node);\n    }\n    if (next.size > 0) this.forward.set(node, next);\n  }\n\n  /** Removes every edge touching `node` (both directions). */\n  remove(node: NodeKey): void {\n    this.clearForward(node);\n    const dependents = this.reverse.get(node);\n    if (dependents) {\n      for (const dep of dependents) {\n        this.forward.get(dep)?.delete(node);\n        if (this.forward.get(dep)?.size === 0) this.forward.delete(dep);\n      }\n      this.reverse.delete(node);\n    }\n  }\n\n  /** Direct dependencies of `node` (what `node` needs). */\n  dependenciesOf(node: NodeKey): ReadonlySet<NodeKey> {\n    return this.forward.get(node) ?? EMPTY_SET;\n  }\n\n  /** Direct dependents of `node` (who needs `node`). */\n  dependentsOf(node: NodeKey): ReadonlySet<NodeKey> {\n    return this.reverse.get(node) ?? EMPTY_SET;\n  }\n\n  /**\n   * Returns the **membership** of the cycle containing `start`, or `null`\n   * when no cycle is reachable. Uses an iterative DFS with a path stack to\n   * stay linear and avoid recursion blow-ups for long chains.\n   */\n  detectCycle(start: NodeKey): ReadonlySet<NodeKey> | null {\n    // Self-loop special case\n    if (this.forward.get(start)?.has(start)) {\n      return new Set([start]);\n    }\n\n    const colour = new Map<NodeKey, 'grey' | 'black'>();\n    const parent = new Map<NodeKey, NodeKey>();\n    const stack: Array<{ node: NodeKey; iter: Iterator<NodeKey> }> = [];\n\n    const pushNode = (node: NodeKey): void => {\n      colour.set(node, 'grey');\n      stack.push({ node, iter: (this.forward.get(node) ?? EMPTY_SET).values() });\n    };\n\n    pushNode(start);\n\n    while (stack.length > 0) {\n      const top = stack[stack.length - 1];\n      const { value: dep, done } = top.iter.next();\n      if (done) {\n        colour.set(top.node, 'black');\n        stack.pop();\n        continue;\n      }\n      if (colour.get(dep) === 'grey') {\n        // Found a back-edge. Walk the parent chain from `top.node` back to\n        // `dep` to reconstruct the cycle members.\n        const members = new Set<NodeKey>([dep]);\n        let cursor: NodeKey | undefined = top.node;\n        while (cursor && cursor !== dep) {\n          members.add(cursor);\n          cursor = parent.get(cursor);\n        }\n        return members;\n      }\n      if (!colour.has(dep)) {\n        parent.set(dep, top.node);\n        pushNode(dep);\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Kahn-style topological order over the descendants of `roots` (inclusive).\n   * Guaranteed to be deterministic for a given insertion order. If the sub-\n   * graph contains a cycle, nodes inside the cycle are returned **after** the\n   * acyclic prefix in arbitrary order — the engine is expected to mark them\n   * as `#CYCLE!` via `detectCycle` beforehand, so ordering does not matter.\n   */\n  topoFrom(roots: Iterable<NodeKey>): NodeKey[] {\n    // 1. Collect every descendant reachable via reverse edges.\n    const reachable = new Set<NodeKey>();\n    const stack: NodeKey[] = [];\n    for (const r of roots) {\n      if (!reachable.has(r)) {\n        reachable.add(r);\n        stack.push(r);\n      }\n    }\n    while (stack.length > 0) {\n      const node = stack.pop()!;\n      for (const dep of this.reverse.get(node) ?? EMPTY_SET) {\n        if (!reachable.has(dep)) {\n          reachable.add(dep);\n          stack.push(dep);\n        }\n      }\n    }\n\n    // 2. Kahn: compute in-degrees restricted to `reachable`, then drain.\n    const inDegree = new Map<NodeKey, number>();\n    for (const node of reachable) inDegree.set(node, 0);\n    for (const node of reachable) {\n      for (const dep of this.forward.get(node) ?? EMPTY_SET) {\n        if (reachable.has(dep)) {\n          inDegree.set(node, (inDegree.get(node) ?? 0) + 1);\n        }\n      }\n    }\n    const queue: NodeKey[] = [];\n    for (const [node, deg] of inDegree) {\n      if (deg === 0) queue.push(node);\n    }\n    const ordered: NodeKey[] = [];\n    while (queue.length > 0) {\n      const node = queue.shift()!;\n      ordered.push(node);\n      for (const dependent of this.reverse.get(node) ?? EMPTY_SET) {\n        if (!reachable.has(dependent)) continue;\n        const nextDeg = (inDegree.get(dependent) ?? 0) - 1;\n        inDegree.set(dependent, nextDeg);\n        if (nextDeg === 0) queue.push(dependent);\n      }\n    }\n\n    // Any remaining reachable nodes belong to cycles — append them so\n    // callers that rely on \"every descendant appears once\" still work.\n    if (ordered.length < reachable.size) {\n      for (const node of reachable) {\n        if (!ordered.includes(node)) ordered.push(node);\n      }\n    }\n    return ordered;\n  }\n\n  /** Empties every edge — used when the grid is reset. */\n  clear(): void {\n    this.forward.clear();\n    this.reverse.clear();\n  }\n\n  private clearForward(node: NodeKey): void {\n    const prev = this.forward.get(node);\n    if (!prev) return;\n    for (const dep of prev) {\n      const back = this.reverse.get(dep);\n      back?.delete(node);\n      if (back && back.size === 0) this.reverse.delete(dep);\n    }\n    this.forward.delete(node);\n  }\n}\n\nconst EMPTY_SET: ReadonlySet<NodeKey> = new Set();\n","/**\n * Formula evaluator — walks a `FormulaAst` and produces a `FormulaValue`.\n *\n * Scope of Phase 0:\n *   - Arithmetic, comparison, concatenation, unary operators with Excel\n *     coercion rules (via `toNumber` / `toStringValue` / `toBoolean`).\n *   - Function calls dispatched through a pluggable registry.\n *   - Reference resolution delegated to the caller via `FormulaEvalContext`.\n *   - Range expansion: when a function declares `acceptsRange: true`, range\n *     operands are flattened row-major into the argument array before the\n *     function sees them; otherwise a range passed to an arithmetic op or\n *     a scalar-only function yields `#VALUE!`.\n *\n * Out of scope (handled by the engine in later phases):\n *   - Cycle detection, topological evaluation.\n *   - Ref resolution mapping (structured ref → resolved address).\n */\n\nimport {\n  CellAddress,\n  FormulaError,\n  FormulaEvalContext,\n  FormulaFunctionRegistry,\n  FormulaValue,\n  firstError,\n  toNumber,\n  toStringValue,\n} from '../../models/formula.model';\nimport { BinaryOp, FormulaAst } from './formula-ast';\n\n/**\n * Evaluate a parsed formula. Never throws: every internal exception is\n * converted to a `#VALUE!` / `#REF!` / `#NAME?` value so the caller can\n * safely store the result without wrapping in try/catch.\n */\nexport function evaluate(\n  ast: FormulaAst,\n  functions: FormulaFunctionRegistry,\n  ctx: FormulaEvalContext\n): FormulaValue {\n  try {\n    const v = evalNode(ast, functions, ctx);\n    // Range values escaping to the top are not renderable — surface as #VALUE!.\n    if (Array.isArray(v)) return { kind: 'error', error: '#VALUE!' };\n    return v;\n  } catch (err) {\n    if (err instanceof EvalError) {\n      return { kind: 'error', error: err.code };\n    }\n    return { kind: 'error', error: '#VALUE!' };\n  }\n}\n\n// A \"range result\" is a flat row-major list of values; it is never a top-level\n// result, only an intermediate value that `call` may expand. Represented as an\n// array to keep the hot path allocation-free when ranges are not used.\ntype EvalResult = FormulaValue | FormulaValue[];\n\nclass EvalError extends Error {\n  constructor(readonly code: FormulaError) {\n    super(code);\n  }\n}\n\nfunction fail(code: FormulaError): never {\n  throw new EvalError(code);\n}\n\nfunction evalNode(\n  node: FormulaAst,\n  functions: FormulaFunctionRegistry,\n  ctx: FormulaEvalContext\n): EvalResult {\n  switch (node.kind) {\n    case 'number':\n      return { kind: 'number', value: node.value };\n    case 'string':\n      return { kind: 'string', value: node.value };\n    case 'boolean':\n      return { kind: 'boolean', value: node.value };\n    case 'ref':\n      return resolveRef(node.resolved, ctx);\n    case 'range':\n      return resolveRange(node.resolved, ctx);\n    case 'unary':\n      return evalUnary(node.op, evalNode(node.operand, functions, ctx));\n    case 'binary':\n      return evalBinary(\n        node.op,\n        evalNode(node.left, functions, ctx),\n        evalNode(node.right, functions, ctx)\n      );\n    case 'call':\n      return evalCall(node.name, node.args, functions, ctx);\n  }\n}\n\nfunction resolveRef(resolved: CellAddress | undefined, ctx: FormulaEvalContext): FormulaValue {\n  if (!resolved) {\n    // Un-resolved references surface #REF!. The ref-mapper (Phase 1) is\n    // responsible for attaching `resolved` after parsing; Phase 0 tests\n    // rely on direct evaluator invocations with synthetic inputs.\n    return { kind: 'error', error: '#REF!' };\n  }\n  return ctx.resolveRef(resolved) ?? { kind: 'empty' };\n}\n\nfunction resolveRange(\n  resolved: ReadonlyArray<CellAddress | undefined> | undefined,\n  ctx: FormulaEvalContext\n): EvalResult {\n  if (!resolved) return fail('#REF!');\n  const out: FormulaValue[] = new Array(resolved.length);\n  for (let i = 0; i < resolved.length; i++) {\n    const target = resolved[i];\n    out[i] = target ? ctx.resolveRef(target) : { kind: 'error', error: '#REF!' };\n  }\n  return out;\n}\n\n// ─── Unary ──────────────────────────────────────────────────────────────────\n\nfunction evalUnary(op: '+' | '-', operand: EvalResult): FormulaValue {\n  if (Array.isArray(operand)) return { kind: 'error', error: '#VALUE!' };\n  if (operand.kind === 'error') return operand;\n  const n = toNumber(operand);\n  if (typeof n === 'string') return { kind: 'error', error: n };\n  return { kind: 'number', value: op === '+' ? n : -n };\n}\n\n// ─── Binary ─────────────────────────────────────────────────────────────────\n\nfunction evalBinary(op: BinaryOp, left: EvalResult, right: EvalResult): FormulaValue {\n  if (Array.isArray(left) || Array.isArray(right)) {\n    return { kind: 'error', error: '#VALUE!' };\n  }\n  const err = firstError([left, right]);\n  if (err) return { kind: 'error', error: err };\n\n  switch (op) {\n    case '+':\n    case '-':\n    case '*':\n    case '/':\n    case '^':\n      return arith(op, left, right);\n    case '&':\n      return concat(left, right);\n    case '=':\n    case '<>':\n    case '<':\n    case '>':\n    case '<=':\n    case '>=':\n      return compare(op, left, right);\n  }\n}\n\nfunction arith(op: '+' | '-' | '*' | '/' | '^', a: FormulaValue, b: FormulaValue): FormulaValue {\n  const l = toNumber(a);\n  if (typeof l === 'string') return { kind: 'error', error: l };\n  const r = toNumber(b);\n  if (typeof r === 'string') return { kind: 'error', error: r };\n\n  let result: number;\n  switch (op) {\n    case '+':\n      result = l + r;\n      break;\n    case '-':\n      result = l - r;\n      break;\n    case '*':\n      result = l * r;\n      break;\n    case '/':\n      if (r === 0) return { kind: 'error', error: '#DIV/0!' };\n      result = l / r;\n      break;\n    case '^':\n      result = Math.pow(l, r);\n      break;\n  }\n  if (!Number.isFinite(result)) return { kind: 'error', error: '#NUM!' };\n  return { kind: 'number', value: result };\n}\n\nfunction concat(a: FormulaValue, b: FormulaValue): FormulaValue {\n  const l = toStringValue(a);\n  if (typeof l !== 'string') return { kind: 'error', error: l };\n  const r = toStringValue(b);\n  if (typeof r !== 'string') return { kind: 'error', error: r };\n  return { kind: 'string', value: l + r };\n}\n\nfunction compare(\n  op: '=' | '<>' | '<' | '>' | '<=' | '>=',\n  a: FormulaValue,\n  b: FormulaValue\n): FormulaValue {\n  const ord = compareValues(a, b);\n  if (ord === null) return { kind: 'error', error: '#VALUE!' };\n  let result: boolean;\n  switch (op) {\n    case '=':\n      result = ord === 0;\n      break;\n    case '<>':\n      result = ord !== 0;\n      break;\n    case '<':\n      result = ord < 0;\n      break;\n    case '>':\n      result = ord > 0;\n      break;\n    case '<=':\n      result = ord <= 0;\n      break;\n    case '>=':\n      result = ord >= 0;\n      break;\n  }\n  return { kind: 'boolean', value: result };\n}\n\n/**\n * Excel comparison rules (simplified):\n *   - Numbers compare numerically, ties broken as equal.\n *   - Strings compare case-insensitively, lexicographically.\n *   - Booleans: FALSE < TRUE.\n *   - Cross-type comparison orders are: number < string < boolean.\n *   - `empty` coerces to 0 / \"\" / FALSE depending on the other side.\n *\n * Returns null when comparison is meaningless (e.g. against an error, though\n * we already filter those out beforehand).\n */\nfunction compareValues(a: FormulaValue, b: FormulaValue): number | null {\n  if (a.kind === 'error' || b.kind === 'error') return null;\n\n  const aRank = typeRank(a);\n  const bRank = typeRank(b);\n  if (aRank !== bRank) return aRank - bRank;\n\n  switch (a.kind) {\n    case 'number': {\n      const bn = b as Extract<FormulaValue, { kind: 'number' }>;\n      return a.value === bn.value ? 0 : a.value < bn.value ? -1 : 1;\n    }\n    case 'string': {\n      const bs = b as Extract<FormulaValue, { kind: 'string' }>;\n      const la = a.value.toLowerCase();\n      const lb = bs.value.toLowerCase();\n      return la === lb ? 0 : la < lb ? -1 : 1;\n    }\n    case 'boolean': {\n      const bb = b as Extract<FormulaValue, { kind: 'boolean' }>;\n      const na = a.value ? 1 : 0;\n      const nb = bb.value ? 1 : 0;\n      return na - nb;\n    }\n    case 'empty':\n      return 0;\n  }\n  // Unreachable: errors are filtered at the top of the function.\n  return null;\n}\n\nfunction typeRank(v: FormulaValue): number {\n  switch (v.kind) {\n    case 'empty':\n    case 'number':\n      return 0;\n    case 'string':\n      return 1;\n    case 'boolean':\n      return 2;\n    case 'error':\n      return 3;\n  }\n}\n\n// ─── Function call ──────────────────────────────────────────────────────────\n\nfunction evalCall(\n  name: string,\n  astArgs: readonly FormulaAst[],\n  functions: FormulaFunctionRegistry,\n  ctx: FormulaEvalContext\n): FormulaValue {\n  const impl = functions[name];\n  if (!impl) return { kind: 'error', error: '#NAME?' };\n\n  const rawArgs = astArgs.map((arg) => evalNode(arg, functions, ctx));\n\n  // Range handling: flatten or reject depending on declaration.\n  const args: FormulaValue[] = [];\n  for (const r of rawArgs) {\n    if (Array.isArray(r)) {\n      if (!impl.acceptsRange) return { kind: 'error', error: '#VALUE!' };\n      args.push(...r);\n    } else {\n      args.push(r);\n    }\n  }\n\n  // Arity check\n  if (!arityMatches(impl.arity, args.length)) {\n    return { kind: 'error', error: '#N/A' };\n  }\n\n  // Propagate first error in arguments for functions that don't opt into\n  // handling them (IFERROR is the only built-in that opts in).\n  if (!arityAllowsErrorShortCircuit(name)) {\n    const err = firstError(args);\n    if (err) return { kind: 'error', error: err };\n  }\n\n  try {\n    return impl.evaluate(args, ctx);\n  } catch (err) {\n    if (err instanceof EvalError) return { kind: 'error', error: err.code };\n    return { kind: 'error', error: '#VALUE!' };\n  }\n}\n\nfunction arityMatches(arity: FormulaArityLike, actual: number): boolean {\n  if (typeof arity === 'number') return arity === actual;\n  if (arity === 'variadic') return true;\n  const [min, max] = arity;\n  return actual >= min && actual <= max;\n}\n\ntype FormulaArityLike = number | 'variadic' | readonly [number, number];\n\n/**\n * Built-in functions that expect to see error values as arguments (so they\n * can react to them instead of short-circuiting). `IFERROR` is the canonical\n * case. Everything else follows Excel's \"first error wins\" rule.\n */\nfunction arityAllowsErrorShortCircuit(name: string): boolean {\n  return name === 'IFERROR' || name === 'IFS' || name === 'IF';\n}\n\n","/**\n * Default registry of formula functions (Phase 1 scope).\n *\n * Implementations are intentionally compact and reuse the coercion helpers\n * in `models/formula.model.ts`. Each entry is pure, side-effect free and\n * returns a `FormulaValue` — errors are data, never exceptions.\n *\n * Naming: keys are uppercase; the parser uppercases every identifier before\n * dispatch so consumers can write `sum(a, b)` or `SUM(a,b)` interchangeably.\n */\n\nimport {\n  FormulaError,\n  FormulaFunctionImpl,\n  FormulaFunctionRegistry,\n  FormulaValue,\n  FormulaValues,\n  firstError,\n  toBoolean,\n  toNumber,\n  toStringValue,\n} from '../../models/formula.model';\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction requireNumbers(args: FormulaValue[]): number[] | FormulaError {\n  const out: number[] = [];\n  for (const a of args) {\n    // Skip empties — SUM({1, empty, 2}) = 3, matches Excel.\n    if (a.kind === 'empty') continue;\n    const n = toNumber(a);\n    if (typeof n === 'string') return n;\n    out.push(n);\n  }\n  return out;\n}\n\nfunction numberResult(fn: () => number): FormulaValue {\n  const v = fn();\n  return Number.isFinite(v)\n    ? { kind: 'number', value: v }\n    : { kind: 'error', error: '#NUM!' };\n}\n\n// ─── Math / stats ───────────────────────────────────────────────────────────\n\nconst SUM: FormulaFunctionImpl = {\n  arity: 'variadic',\n  acceptsRange: true,\n  docs: {\n    signature: 'SUM(valeur1, [valeur2, ...])',\n    summary: 'Additionne les nombres fournis ou contenus dans les plages.',\n  },\n  evaluate(args) {\n    const nums = requireNumbers(args);\n    if (typeof nums === 'string') return FormulaValues.error(nums);\n    return numberResult(() => nums.reduce((acc, n) => acc + n, 0));\n  },\n};\n\nconst PRODUCT: FormulaFunctionImpl = {\n  arity: 'variadic',\n  acceptsRange: true,\n  docs: {\n    signature: 'PRODUCT(valeur1, [valeur2, ...])',\n    summary: 'Multiplie les nombres fournis ou contenus dans les plages.',\n  },\n  evaluate(args) {\n    const nums = requireNumbers(args);\n    if (typeof nums === 'string') return FormulaValues.error(nums);\n    if (nums.length === 0) return FormulaValues.number(0);\n    return numberResult(() => nums.reduce((acc, n) => acc * n, 1));\n  },\n};\n\nconst AVERAGE: FormulaFunctionImpl = {\n  arity: 'variadic',\n  acceptsRange: true,\n  docs: {\n    signature: 'AVERAGE(valeur1, [valeur2, ...])',\n    summary: 'Moyenne arithmétique des nombres fournis.',\n  },\n  evaluate(args) {\n    const nums = requireNumbers(args);\n    if (typeof nums === 'string') return FormulaValues.error(nums);\n    if (nums.length === 0) return FormulaValues.error('#DIV/0!');\n    return numberResult(() => nums.reduce((a, b) => a + b, 0) / nums.length);\n  },\n};\n\nconst MIN: FormulaFunctionImpl = {\n  arity: 'variadic',\n  acceptsRange: true,\n  docs: {\n    signature: 'MIN(valeur1, [valeur2, ...])',\n    summary: 'Renvoie la plus petite valeur numérique.',\n  },\n  evaluate(args) {\n    const nums = requireNumbers(args);\n    if (typeof nums === 'string') return FormulaValues.error(nums);\n    if (nums.length === 0) return FormulaValues.number(0);\n    return numberResult(() => Math.min(...nums));\n  },\n};\n\nconst MAX: FormulaFunctionImpl = {\n  arity: 'variadic',\n  acceptsRange: true,\n  docs: {\n    signature: 'MAX(valeur1, [valeur2, ...])',\n    summary: 'Renvoie la plus grande valeur numérique.',\n  },\n  evaluate(args) {\n    const nums = requireNumbers(args);\n    if (typeof nums === 'string') return FormulaValues.error(nums);\n    if (nums.length === 0) return FormulaValues.number(0);\n    return numberResult(() => Math.max(...nums));\n  },\n};\n\n/** Counts numeric values only — ignores text, booleans and empties. */\nconst COUNT: FormulaFunctionImpl = {\n  arity: 'variadic',\n  acceptsRange: true,\n  docs: {\n    signature: 'COUNT(valeur1, [valeur2, ...])',\n    summary: 'Compte les valeurs numériques (ignore le texte et les cases vides).',\n  },\n  evaluate(args) {\n    let n = 0;\n    for (const a of args) {\n      if (a.kind === 'number') n++;\n      else if (a.kind === 'string') {\n        const parsed = Number(a.value);\n        if (Number.isFinite(parsed)) n++;\n      }\n    }\n    return FormulaValues.number(n);\n  },\n};\n\n/** Counts every non-empty value. */\nconst COUNTA: FormulaFunctionImpl = {\n  arity: 'variadic',\n  acceptsRange: true,\n  docs: {\n    signature: 'COUNTA(valeur1, [valeur2, ...])',\n    summary: 'Compte toutes les valeurs non vides.',\n  },\n  evaluate(args) {\n    let n = 0;\n    for (const a of args) if (a.kind !== 'empty') n++;\n    return FormulaValues.number(n);\n  },\n};\n\nconst ROUND: FormulaFunctionImpl = {\n  arity: [1, 2],\n  docs: {\n    signature: 'ROUND(nombre, [décimales])',\n    summary: 'Arrondit un nombre au nombre de décimales indiqué (0 par défaut).',\n  },\n  evaluate([value, digits]) {\n    const v = toNumber(value);\n    if (typeof v === 'string') return FormulaValues.error(v);\n    const d = digits ? toNumber(digits) : 0;\n    if (typeof d === 'string') return FormulaValues.error(d);\n    const factor = Math.pow(10, d);\n    return numberResult(() => Math.round(v * factor) / factor);\n  },\n};\n\nconst ABS: FormulaFunctionImpl = {\n  arity: 1,\n  docs: {\n    signature: 'ABS(nombre)',\n    summary: 'Valeur absolue d’un nombre.',\n  },\n  evaluate([value]) {\n    const v = toNumber(value);\n    if (typeof v === 'string') return FormulaValues.error(v);\n    return numberResult(() => Math.abs(v));\n  },\n};\n\nconst MOD: FormulaFunctionImpl = {\n  arity: 2,\n  docs: {\n    signature: 'MOD(dividende, diviseur)',\n    summary: 'Reste de la division euclidienne (signe du diviseur).',\n  },\n  evaluate([dividend, divisor]) {\n    const a = toNumber(dividend);\n    if (typeof a === 'string') return FormulaValues.error(a);\n    const b = toNumber(divisor);\n    if (typeof b === 'string') return FormulaValues.error(b);\n    if (b === 0) return FormulaValues.error('#DIV/0!');\n    // Excel's MOD preserves the sign of the divisor.\n    return numberResult(() => ((a % b) + b) % b);\n  },\n};\n\nconst POWER: FormulaFunctionImpl = {\n  arity: 2,\n  docs: {\n    signature: 'POWER(base, exposant)',\n    summary: 'Élève la base à la puissance donnée.',\n  },\n  evaluate([base, exponent]) {\n    const b = toNumber(base);\n    if (typeof b === 'string') return FormulaValues.error(b);\n    const e = toNumber(exponent);\n    if (typeof e === 'string') return FormulaValues.error(e);\n    return numberResult(() => Math.pow(b, e));\n  },\n};\n\n// ─── Logical ────────────────────────────────────────────────────────────────\n\nconst IF: FormulaFunctionImpl = {\n  arity: [2, 3],\n  docs: {\n    signature: 'IF(condition, si_vrai, [si_faux])',\n    summary: 'Renvoie une valeur selon le résultat d’une condition booléenne.',\n  },\n  evaluate([cond, whenTrue, whenFalse]) {\n    if (cond.kind === 'error') return cond;\n    const b = toBoolean(cond);\n    if (typeof b !== 'boolean') return FormulaValues.error(b);\n    if (b) return whenTrue;\n    return whenFalse ?? FormulaValues.boolean(false);\n  },\n};\n\nconst AND: FormulaFunctionImpl = {\n  arity: 'variadic',\n  acceptsRange: true,\n  docs: {\n    signature: 'AND(valeur1, [valeur2, ...])',\n    summary: 'Renvoie VRAI si toutes les conditions sont vraies.',\n  },\n  evaluate(args) {\n    if (args.length === 0) return FormulaValues.error('#VALUE!');\n    for (const a of args) {\n      if (a.kind === 'error') return a;\n      const b = toBoolean(a);\n      if (typeof b !== 'boolean') return FormulaValues.error(b);\n      if (!b) return FormulaValues.boolean(false);\n    }\n    return FormulaValues.boolean(true);\n  },\n};\n\nconst OR: FormulaFunctionImpl = {\n  arity: 'variadic',\n  acceptsRange: true,\n  docs: {\n    signature: 'OR(valeur1, [valeur2, ...])',\n    summary: 'Renvoie VRAI si au moins une condition est vraie.',\n  },\n  evaluate(args) {\n    if (args.length === 0) return FormulaValues.error('#VALUE!');\n    for (const a of args) {\n      if (a.kind === 'error') return a;\n      const b = toBoolean(a);\n      if (typeof b !== 'boolean') return FormulaValues.error(b);\n      if (b) return FormulaValues.boolean(true);\n    }\n    return FormulaValues.boolean(false);\n  },\n};\n\nconst NOT: FormulaFunctionImpl = {\n  arity: 1,\n  docs: {\n    signature: 'NOT(valeur)',\n    summary: 'Inverse un booléen.',\n  },\n  evaluate([a]) {\n    if (a.kind === 'error') return a;\n    const b = toBoolean(a);\n    if (typeof b !== 'boolean') return FormulaValues.error(b);\n    return FormulaValues.boolean(!b);\n  },\n};\n\n/** Returns the fallback iff the tested value is an error. */\nconst IFERROR: FormulaFunctionImpl = {\n  arity: 2,\n  docs: {\n    signature: 'IFERROR(valeur, valeur_si_erreur)',\n    summary: 'Renvoie la valeur de secours si le premier argument est une erreur.',\n  },\n  evaluate([tested, fallback]) {\n    return tested.kind === 'error' ? fallback : tested;\n  },\n};\n\n/** `IFS(cond1, then1, cond2, then2, ...)` — returns the first truthy branch. */\nconst IFS: FormulaFunctionImpl = {\n  arity: [2, 254],\n  docs: {\n    signature: 'IFS(cond1, valeur1, [cond2, valeur2, ...])',\n    summary: 'Renvoie la valeur associée à la première condition vraie.',\n  },\n  evaluate(args) {\n    if (args.length % 2 !== 0) return FormulaValues.error('#N/A');\n    for (let i = 0; i < args.length; i += 2) {\n      const cond = args[i];\n      if (cond.kind === 'error') return cond;\n      const b = toBoolean(cond);\n      if (typeof b !== 'boolean') return FormulaValues.error(b);\n      if (b) return args[i + 1];\n    }\n    return FormulaValues.error('#N/A');\n  },\n};\n\n// ─── Text ───────────────────────────────────────────────────────────────────\n\nconst CONCAT: FormulaFunctionImpl = {\n  arity: 'variadic',\n  acceptsRange: true,\n  docs: {\n    signature: 'CONCAT(texte1, [texte2, ...])',\n    summary: 'Concatène toutes les valeurs en une seule chaîne.',\n  },\n  evaluate(args) {\n    const err = firstError(args);\n    if (err) return FormulaValues.error(err);\n    let out = '';\n    for (const a of args) {\n      const s = toStringValue(a);\n      if (typeof s !== 'string') return FormulaValues.error(s);\n      out += s;\n    }\n    return FormulaValues.string(out);\n  },\n};\n\nconst LEN: FormulaFunctionImpl = {\n  arity: 1,\n  docs: {\n    signature: 'LEN(texte)',\n    summary: 'Renvoie le nombre de caractères.',\n  },\n  evaluate([a]) {\n    const s = toStringValue(a);\n    if (typeof s !== 'string') return FormulaValues.error(s);\n    return FormulaValues.number(s.length);\n  },\n};\n\nconst LOWER: FormulaFunctionImpl = {\n  arity: 1,\n  docs: {\n    signature: 'LOWER(texte)',\n    summary: 'Convertit la chaîne en minuscules.',\n  },\n  evaluate([a]) {\n    const s = toStringValue(a);\n    if (typeof s !== 'string') return FormulaValues.error(s);\n    return FormulaValues.string(s.toLowerCase());\n  },\n};\n\nconst UPPER: FormulaFunctionImpl = {\n  arity: 1,\n  docs: {\n    signature: 'UPPER(texte)',\n    summary: 'Convertit la chaîne en majuscules.',\n  },\n  evaluate([a]) {\n    const s = toStringValue(a);\n    if (typeof s !== 'string') return FormulaValues.error(s);\n    return FormulaValues.string(s.toUpperCase());\n  },\n};\n\nconst TRIM: FormulaFunctionImpl = {\n  arity: 1,\n  docs: {\n    signature: 'TRIM(texte)',\n    summary: 'Retire les espaces superflus (début, fin, doublons internes).',\n  },\n  evaluate([a]) {\n    const s = toStringValue(a);\n    if (typeof s !== 'string') return FormulaValues.error(s);\n    return FormulaValues.string(s.trim().replace(/\\s+/g, ' '));\n  },\n};\n\nconst LEFT: FormulaFunctionImpl = {\n  arity: [1, 2],\n  docs: {\n    signature: 'LEFT(texte, [nombre])',\n    summary: 'Renvoie les n premiers caractères (1 par défaut).',\n  },\n  evaluate([a, count]) {\n    const s = toStringValue(a);\n    if (typeof s !== 'string') return FormulaValues.error(s);\n    const n = count ? toNumber(count) : 1;\n    if (typeof n === 'string') return FormulaValues.error(n);\n    if (n < 0) return FormulaValues.error('#VALUE!');\n    return FormulaValues.string(s.slice(0, Math.floor(n)));\n  },\n};\n\nconst RIGHT: FormulaFunctionImpl = {\n  arity: [1, 2],\n  docs: {\n    signature: 'RIGHT(texte, [nombre])',\n    summary: 'Renvoie les n derniers caractères (1 par défaut).',\n  },\n  evaluate([a, count]) {\n    const s = toStringValue(a);\n    if (typeof s !== 'string') return FormulaValues.error(s);\n    const n = count ? toNumber(count) : 1;\n    if (typeof n === 'string') return FormulaValues.error(n);\n    if (n < 0) return FormulaValues.error('#VALUE!');\n    const take = Math.floor(n);\n    return FormulaValues.string(take === 0 ? '' : s.slice(-take));\n  },\n};\n\nconst MID: FormulaFunctionImpl = {\n  arity: 3,\n  docs: {\n    signature: 'MID(texte, début, longueur)',\n    summary: 'Extrait un sous-texte à partir de la position indiquée (1-based).',\n  },\n  evaluate([a, startRaw, lengthRaw]) {\n    const s = toStringValue(a);\n    if (typeof s !== 'string') return FormulaValues.error(s);\n    const start = toNumber(startRaw);\n    if (typeof start === 'string') return FormulaValues.error(start);\n    const length = toNumber(lengthRaw);\n    if (typeof length === 'string') return FormulaValues.error(length);\n    if (start < 1 || length < 0) return FormulaValues.error('#VALUE!');\n    const zeroBased = Math.floor(start) - 1;\n    return FormulaValues.string(s.slice(zeroBased, zeroBased + Math.floor(length)));\n  },\n};\n\nconst SUBSTITUTE: FormulaFunctionImpl = {\n  arity: [3, 4],\n  docs: {\n    signature: 'SUBSTITUTE(texte, cherché, remplacement, [occurrence])',\n    summary: 'Remplace toutes les occurrences (ou la n‑ième) d’un motif par un autre.',\n  },\n  evaluate([textRaw, findRaw, replaceRaw, occurrenceRaw]) {\n    const text = toStringValue(textRaw);\n    if (typeof text !== 'string') return FormulaValues.error(text);\n    const find = toStringValue(findRaw);\n    if (typeof find !== 'string') return FormulaValues.error(find);\n    const replace = toStringValue(replaceRaw);\n    if (typeof replace !== 'string') return FormulaValues.error(replace);\n    if (!find) return FormulaValues.string(text);\n    if (!occurrenceRaw) {\n      return FormulaValues.string(text.split(find).join(replace));\n    }\n    const occurrence = toNumber(occurrenceRaw);\n    if (typeof occurrence === 'string') return FormulaValues.error(occurrence);\n    if (occurrence < 1) return FormulaValues.error('#VALUE!');\n    let idx = -1;\n    for (let k = 0; k < occurrence; k++) {\n      idx = text.indexOf(find, idx + 1);\n      if (idx === -1) return FormulaValues.string(text);\n    }\n    return FormulaValues.string(text.slice(0, idx) + replace + text.slice(idx + find.length));\n  },\n};\n\n// ─── Export ─────────────────────────────────────────────────────────────────\n\n/**\n * Default function registry. Consumers can spread this into their own\n * registry to extend it:\n *\n * ```\n * const registry = { ...DEFAULT_FORMULA_FUNCTIONS, TVA: myTvaFn };\n * ```\n */\nexport const DEFAULT_FORMULA_FUNCTIONS: FormulaFunctionRegistry = Object.freeze({\n  // Math\n  SUM,\n  PRODUCT,\n  AVERAGE,\n  MIN,\n  MAX,\n  COUNT,\n  COUNTA,\n  ROUND,\n  ABS,\n  MOD,\n  POWER,\n  // Logical\n  IF,\n  AND,\n  OR,\n  NOT,\n  IFERROR,\n  IFS,\n  // Text\n  CONCAT,\n  LEN,\n  LOWER,\n  UPPER,\n  TRIM,\n  LEFT,\n  RIGHT,\n  MID,\n  SUBSTITUTE,\n});\n","/**\n * Formula parser — turns a raw source string (with or without the leading\n * `=`) into a `FormulaAst`. Implementation is a hand-written tokeniser\n * feeding a recursive-descent parser with explicit precedence climbing:\n * no dependency on `Function` or `eval`, and no third-party runtime.\n *\n * The parser operates on the **storage form** of formulas:\n *\n *   =REF(COLUMN(\"price\"),ROW(8))*REF(COLUMN(\"qty\"),ROW(8))\n *\n * A1 notation (`=A1*B1`) is a purely editor-side surface — conversion to /\n * from storage is handled by `a1ToLongForm` / `longFormToA1` in the\n * ref-mapper. Consumers of the parser therefore never see A1 tokens here.\n *\n * Absolute markers are encoded as an optional third argument to `REF`:\n *\n *   REF(COLUMN(\"price\"),ROW(8))        — relative col, relative row ($A1 → A1)\n *   REF(COLUMN(\"price\"),ROW(8),\"$C\")   — absolute col, relative row ($A1)\n *   REF(COLUMN(\"price\"),ROW(8),\"$R\")   — relative col, absolute row (A$1)\n *   REF(COLUMN(\"price\"),ROW(8),\"$CR\")  — absolute both ($A$1)\n *   REF(COLUMN(\"price\"))               — same-row ref ([price] surface), no\n *                                         ROW arg. Row resolves to the host\n *                                         cell's row at evaluation time.\n *\n * Ranges use the same shape for each endpoint, joined with `:`.\n *\n * Grammar (abbreviated):\n *\n *   expression   := comparison\n *   comparison   := concat (('=' | '<>' | '<' | '<=' | '>' | '>=') concat)*\n *   concat       := additive ('&' additive)*\n *   additive     := multiplicative (('+' | '-') multiplicative)*\n *   multiplicative := power (('*' | '/') power)*\n *   power        := unary ('^' unary)*\n *   unary        := ('+' | '-') unary | primary\n *   primary      := NUMBER | STRING | BOOL | ref | call | '(' expression ')'\n *   ref          := REF_PRIMITIVE (':' REF_PRIMITIVE)?\n *   REF_PRIMITIVE := 'REF' '(' 'COLUMN' '(' STRING ')' ',' 'ROW' '(' NUMBER ')' (',' STRING)? ')'\n *   call         := IDENT '(' arglist? ')'\n *   arglist      := expression (SEP expression)*\n */\n\nimport {\n  BinaryOp,\n  FormulaAst,\n  StructuredRef,\n  UnaryOp,\n} from './formula-ast';\n\nexport type ParserLocale = 'en' | 'fr';\n\nexport interface ParseOptions {\n  readonly locale?: ParserLocale;\n  /** Maximum parse depth, guarding against pathological nesting. */\n  readonly maxDepth?: number;\n}\n\nexport class FormulaParseError extends Error {\n  constructor(\n    message: string,\n    /** 0-based column in the source string. */\n    readonly position: number,\n  ) {\n    super(message);\n    this.name = 'FormulaParseError';\n  }\n}\n\n// ─── Token types ────────────────────────────────────────────────────────────\n\ntype TokenType =\n  | 'number'\n  | 'string'\n  | 'bool'\n  | 'ident'\n  | 'lparen'\n  | 'rparen'\n  | 'comma'\n  | 'colon'\n  | 'op'\n  | 'eof';\n\ninterface Token {\n  readonly type: TokenType;\n  readonly value: string;\n  readonly position: number;\n}\n\n// ─── Public entry point ─────────────────────────────────────────────────────\n\n/**\n * Parse a formula source string into an AST. Accepts either form with or\n * without a leading `=`. Throws `FormulaParseError` on malformed input —\n * callers should translate that into a `#PARSE!` error value.\n */\nexport function parseFormula(source: string, options: ParseOptions = {}): FormulaAst {\n  const locale = options.locale ?? 'en';\n  const maxDepth = options.maxDepth ?? 256;\n  const body = source.startsWith('=') ? source.slice(1) : source;\n  const tokens = tokenize(body, locale);\n  const parser = new RecursiveDescent(tokens, maxDepth);\n  const ast = parser.parseExpression();\n  parser.expect('eof');\n  return ast;\n}\n\n// ─── Tokenizer ──────────────────────────────────────────────────────────────\n\nfunction tokenize(source: string, locale: ParserLocale): Token[] {\n  const tokens: Token[] = [];\n  const argSeparator = locale === 'fr' ? ';' : ',';\n  let i = 0;\n  const len = source.length;\n\n  while (i < len) {\n    const ch = source[i];\n\n    if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\n      i++;\n      continue;\n    }\n\n    if (ch === '(') {\n      tokens.push({ type: 'lparen', value: '(', position: i });\n      i++;\n      continue;\n    }\n    if (ch === ')') {\n      tokens.push({ type: 'rparen', value: ')', position: i });\n      i++;\n      continue;\n    }\n    if (ch === argSeparator) {\n      tokens.push({ type: 'comma', value: argSeparator, position: i });\n      i++;\n      continue;\n    }\n    if (ch === ':') {\n      tokens.push({ type: 'colon', value: ':', position: i });\n      i++;\n      continue;\n    }\n\n    const twoChar = source.slice(i, i + 2);\n    if (twoChar === '<=' || twoChar === '>=' || twoChar === '<>') {\n      tokens.push({ type: 'op', value: twoChar, position: i });\n      i += 2;\n      continue;\n    }\n    if ('+-*/^&=<>'.includes(ch)) {\n      tokens.push({ type: 'op', value: ch, position: i });\n      i++;\n      continue;\n    }\n\n    if (ch === '\"') {\n      const parsed = scanQuotedString(source, i);\n      tokens.push({ type: 'string', value: parsed.value, position: i });\n      i = parsed.end;\n      continue;\n    }\n\n    if (isDigit(ch) || (ch === '.' && isDigit(source[i + 1] ?? ''))) {\n      const start = i;\n      let seenDot = ch === '.';\n      let seenExp = false;\n      i++;\n      while (i < len) {\n        const c = source[i];\n        if (isDigit(c)) {\n          i++;\n          continue;\n        }\n        if (c === '.' && !seenDot && !seenExp) {\n          seenDot = true;\n          i++;\n          continue;\n        }\n        if ((c === 'e' || c === 'E') && !seenExp) {\n          seenExp = true;\n          i++;\n          if (source[i] === '+' || source[i] === '-') i++;\n          continue;\n        }\n        break;\n      }\n      tokens.push({ type: 'number', value: source.slice(start, i), position: start });\n      continue;\n    }\n\n    if (isAlpha(ch) || ch === '_') {\n      const start = i;\n      while (i < len && (isAlpha(source[i]) || isDigit(source[i]) || source[i] === '_' || source[i] === '.')) {\n        i++;\n      }\n      const value = source.slice(start, i);\n      const upper = value.toUpperCase();\n      if (upper === 'TRUE' || upper === 'FALSE') {\n        tokens.push({ type: 'bool', value: upper, position: start });\n      } else {\n        tokens.push({ type: 'ident', value, position: start });\n      }\n      continue;\n    }\n\n    throw new FormulaParseError(`Unexpected character \"${ch}\"`, i);\n  }\n\n  tokens.push({ type: 'eof', value: '', position: len });\n  return tokens;\n}\n\n/** Consume a `\"…\"` literal, treating `\"\"` as an escaped quote. */\nfunction scanQuotedString(source: string, start: number): { value: string; end: number } {\n  let i = start + 1;\n  let value = '';\n  const len = source.length;\n  while (i < len) {\n    if (source[i] === '\"') {\n      if (source[i + 1] === '\"') {\n        value += '\"';\n        i += 2;\n        continue;\n      }\n      return { value, end: i + 1 };\n    }\n    value += source[i];\n    i++;\n  }\n  throw new FormulaParseError('Unterminated string literal', start);\n}\n\nfunction isDigit(ch: string): boolean {\n  return ch >= '0' && ch <= '9';\n}\n\nfunction isAlpha(ch: string): boolean {\n  return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');\n}\n\n// ─── Parser ─────────────────────────────────────────────────────────────────\n\nclass RecursiveDescent {\n  private cursor = 0;\n  private depth = 0;\n\n  constructor(\n    private readonly tokens: Token[],\n    private readonly maxDepth: number,\n  ) {}\n\n  parseExpression(): FormulaAst {\n    return this.guarded(() => this.parseComparison());\n  }\n\n  expect(type: TokenType): Token {\n    const tok = this.peek();\n    if (tok.type !== type) {\n      throw new FormulaParseError(`Expected ${type}, got ${tok.type} \"${tok.value}\"`, tok.position);\n    }\n    this.cursor++;\n    return tok;\n  }\n\n  private parseComparison(): FormulaAst {\n    let left = this.parseConcat();\n    while (true) {\n      const op = this.peekOp();\n      if (op !== '=' && op !== '<>' && op !== '<' && op !== '<=' && op !== '>' && op !== '>=') break;\n      this.cursor++;\n      const right = this.parseConcat();\n      left = { kind: 'binary', op, left, right };\n    }\n    return left;\n  }\n\n  private parseConcat(): FormulaAst {\n    let left = this.parseAdditive();\n    while (this.peekOp() === '&') {\n      this.cursor++;\n      const right = this.parseAdditive();\n      left = { kind: 'binary', op: '&', left, right };\n    }\n    return left;\n  }\n\n  private parseAdditive(): FormulaAst {\n    let left = this.parseMultiplicative();\n    while (true) {\n      const op = this.peekOp();\n      if (op !== '+' && op !== '-') break;\n      this.cursor++;\n      const right = this.parseMultiplicative();\n      left = { kind: 'binary', op, left, right };\n    }\n    return left;\n  }\n\n  private parseMultiplicative(): FormulaAst {\n    let left = this.parsePower();\n    while (true) {\n      const op = this.peekOp();\n      if (op !== '*' && op !== '/') break;\n      this.cursor++;\n      const right = this.parsePower();\n      left = { kind: 'binary', op, left, right };\n    }\n    return left;\n  }\n\n  /** `^` is right-associative in Excel. */\n  private parsePower(): FormulaAst {\n    const left = this.parseUnary();\n    if (this.peekOp() === '^') {\n      this.cursor++;\n      const right = this.parsePower();\n      return { kind: 'binary', op: '^', left, right };\n    }\n    return left;\n  }\n\n  private parseUnary(): FormulaAst {\n    const op = this.peekOp();\n    if (op === '+' || op === '-') {\n      this.cursor++;\n      return { kind: 'unary', op: op as UnaryOp, operand: this.parseUnary() };\n    }\n    return this.parsePrimary();\n  }\n\n  private parsePrimary(): FormulaAst {\n    const tok = this.peek();\n    switch (tok.type) {\n      case 'number':\n        this.cursor++;\n        return { kind: 'number', value: Number(tok.value) };\n      case 'string':\n        this.cursor++;\n        return { kind: 'string', value: tok.value };\n      case 'bool':\n        this.cursor++;\n        return { kind: 'boolean', value: tok.value === 'TRUE' };\n      case 'ident':\n        return this.parseIdentExpression();\n      case 'lparen': {\n        this.cursor++;\n        const inner = this.parseExpression();\n        this.expect('rparen');\n        return inner;\n      }\n      default:\n        throw new FormulaParseError(`Unexpected token \"${tok.value}\"`, tok.position);\n    }\n  }\n\n  /**\n   * An ident followed by `(` is either the `REF(COLUMN(...),ROW(...))`\n   * ref primitive (possibly chained as a range), or a regular function call.\n   */\n  private parseIdentExpression(): FormulaAst {\n    const ident = this.expect('ident');\n    const upper = ident.value.toUpperCase();\n    if (upper === 'REF' && this.peek().type === 'lparen') {\n      const ref = this.parseRefPrimitive(ident.position);\n      if (this.peek().type === 'colon') {\n        this.cursor++;\n        const endIdent = this.expect('ident');\n        if (endIdent.value.toUpperCase() !== 'REF' || this.peek().type !== 'lparen') {\n          throw new FormulaParseError('Expected `REF(` after `:` in range', endIdent.position);\n        }\n        const endRef = this.parseRefPrimitive(endIdent.position);\n        return { kind: 'range', start: ref, end: endRef };\n      }\n      return { kind: 'ref', ref };\n    }\n    // Regular function call.\n    this.expect('lparen');\n    const args: FormulaAst[] = [];\n    if (this.peek().type !== 'rparen') {\n      args.push(this.parseExpression());\n      while (this.peek().type === 'comma') {\n        this.cursor++;\n        args.push(this.parseExpression());\n      }\n    }\n    this.expect('rparen');\n    return { kind: 'call', name: upper, args };\n  }\n\n  /**\n   * Parse `REF(COLUMN(\"field\")[,ROW(N) [,\"$C\"|\"$R\"|\"$CR\"]])` starting from\n   * just after the `REF` ident. Returns the `StructuredRef`. A missing\n   * `ROW(...)` arg marks the ref as same-row (resolves against the host\n   * cell's row at evaluation time).\n   */\n  private parseRefPrimitive(position: number): StructuredRef {\n    this.expect('lparen');\n\n    const colIdent = this.expect('ident');\n    if (colIdent.value.toUpperCase() !== 'COLUMN') {\n      throw new FormulaParseError('Expected `COLUMN(` inside REF', colIdent.position);\n    }\n    this.expect('lparen');\n    const fieldTok = this.expect('string');\n    this.expect('rparen');\n\n    // Same-row form: `REF(COLUMN(\"field\"))` — no ROW arg.\n    if (this.peek().type === 'rparen') {\n      this.cursor++;\n      void position;\n      return {\n        field: fieldTok.value,\n        row: 0,\n        absField: false,\n        absRow: false,\n        sameRow: true,\n      };\n    }\n\n    this.expect('comma');\n\n    const rowIdent = this.expect('ident');\n    if (rowIdent.value.toUpperCase() !== 'ROW') {\n      throw new FormulaParseError('Expected `ROW(` inside REF', rowIdent.position);\n    }\n    this.expect('lparen');\n    const rowTok = this.expect('number');\n    this.expect('rparen');\n\n    const row = Number(rowTok.value);\n    if (!Number.isFinite(row) || row < 1 || !Number.isInteger(row)) {\n      throw new FormulaParseError('ROW must be a positive integer', rowTok.position);\n    }\n\n    let absField = false;\n    let absRow = false;\n    if (this.peek().type === 'comma') {\n      this.cursor++;\n      const lockTok = this.expect('string');\n      const lock = lockTok.value;\n      if (lock !== '$C' && lock !== '$R' && lock !== '$CR' && lock !== '') {\n        throw new FormulaParseError(\n          `Invalid REF lock marker: \"${lock}\" (expected \"$C\", \"$R\", or \"$CR\")`,\n          lockTok.position,\n        );\n      }\n      absField = lock === '$C' || lock === '$CR';\n      absRow = lock === '$R' || lock === '$CR';\n    }\n\n    this.expect('rparen');\n\n    void position;\n    return { field: fieldTok.value, row, absField, absRow };\n  }\n\n  private peek(): Token {\n    return this.tokens[this.cursor];\n  }\n\n  private peekOp(): BinaryOp | null {\n    const tok = this.tokens[this.cursor];\n    if (tok?.type !== 'op') return null;\n    return tok.value as BinaryOp;\n  }\n\n  private guarded<T>(fn: () => T): T {\n    if (++this.depth > this.maxDepth) {\n      throw new FormulaParseError(`Formula exceeds max depth (${this.maxDepth})`, this.peek().position);\n    }\n    try {\n      return fn();\n    } finally {\n      this.depth--;\n    }\n  }\n}\n","/**\n * Maps structured refs (A1-backed, field-keyed) to / from long-form\n * `CellAddress` tuples, and converts formula *source strings* between the\n * A1 edit surface and the `REF(COLUMN(\"…\"),ROW(N))` storage form.\n *\n * The mapper is the only component aware of the grid's current column\n * order — every other layer works exclusively with addresses, so reordering\n * columns or renaming a field's display label never breaks a stored formula.\n *\n * Surface round-trip:\n *\n *   Editor types          →  a1ToLongForm(ctx)   →  REF(COLUMN(…),ROW(…))  (stored)\n *   Stored REF long-form  →  longFormToA1(ctx)   →  A1                    (displayed)\n *\n * The mapper is intentionally stateless and receives its dependencies\n * (fields list + row id list) through the method parameters. This keeps\n * it unit-testable without instantiating the whole grid.\n */\n\nimport { CellAddress } from '../../models/formula.model';\nimport {\n  FormulaAst,\n  StructuredRef,\n  cellRefToA1,\n  cellRefToLongForm,\n  columnIndexToLetters,\n  columnLettersToIndex,\n  formatField,\n} from './formula-ast';\n\nexport interface RefMapperContext {\n  /**\n   * Ordered list of column fields that can participate in formulas. Used\n   * for A1 letter ↔ field conversion and for existence checks (an unknown\n   * field yields `#REF!`).\n   */\n  readonly fields: readonly string[];\n  /**\n   * Row identifiers in display order. Index 0 = row `1` in the user-facing\n   * surface syntax. For grids in server mode, callers typically provide the\n   * *currently loaded* subset — unresolved references surface as `#REF!`\n   * which is the expected behaviour for page-scoped formulas.\n   */\n  readonly rowIds: readonly (string | number)[];\n  /**\n   * Row id of the formula being resolved. The editor-side A1 helpers use\n   * this to detect same-row refs (so the display can be relative by\n   * default).\n   */\n  readonly currentRowId?: string | number;\n}\n\n// ─── AST ↔ CellAddress ──────────────────────────────────────────────────────\n\n/** Convert a structured ref to a stable `CellAddress`. */\nexport function structuredRefToAddress(\n  ref: StructuredRef,\n  ctx: RefMapperContext,\n): CellAddress | undefined {\n  if (!ctx.fields.includes(ref.field)) return undefined;\n  if (ref.sameRow) {\n    if (ctx.currentRowId === undefined) return undefined;\n    return { rowId: ctx.currentRowId, field: ref.field };\n  }\n  const rowId = ctx.rowIds[ref.row - 1];\n  if (rowId === undefined) return undefined;\n  return { rowId, field: ref.field };\n}\n\n/**\n * Expand a range ref into a flat, row-major list of addresses. Out-of-range\n * coordinates yield `undefined` entries so the evaluator can precisely\n * propagate `#REF!` per cell rather than blanket-failing the whole range.\n */\nexport function rangeToAddresses(\n  start: StructuredRef,\n  end: StructuredRef,\n  ctx: RefMapperContext,\n): ReadonlyArray<CellAddress | undefined> {\n  const startIdx = ctx.fields.indexOf(start.field);\n  const endIdx = ctx.fields.indexOf(end.field);\n\n  // Same-row range `[a]:[c]` — one row (host), columns from a to c. Mixed\n  // same-row + explicit-row is nonsensical (the \"a\" endpoint has no row\n  // and \"c\" has a specific one) so we fail the whole range.\n  if (start.sameRow && end.sameRow) {\n    const rowId = ctx.currentRowId;\n    if (startIdx < 0 || endIdx < 0 || rowId === undefined) return [undefined];\n    const colLo = Math.min(startIdx, endIdx);\n    const colHi = Math.max(startIdx, endIdx);\n    const out: (CellAddress | undefined)[] = [];\n    for (let c = colLo; c <= colHi; c++) {\n      const field = ctx.fields[c];\n      out.push(field ? { rowId, field } : undefined);\n    }\n    return out;\n  }\n  if (start.sameRow !== end.sameRow) return [undefined];\n\n  const rowLo = Math.min(start.row, end.row);\n  const rowHi = Math.max(start.row, end.row);\n  if (startIdx < 0 || endIdx < 0) {\n    const cells = rowHi - rowLo + 1;\n    return Array.from({ length: cells }, () => undefined);\n  }\n  const colLo = Math.min(startIdx, endIdx);\n  const colHi = Math.max(startIdx, endIdx);\n\n  const out: (CellAddress | undefined)[] = [];\n  for (let r = rowLo; r <= rowHi; r++) {\n    const rowId = ctx.rowIds[r - 1];\n    for (let c = colLo; c <= colHi; c++) {\n      const field = ctx.fields[c];\n      out.push(rowId !== undefined && field ? { rowId, field } : undefined);\n    }\n  }\n  return out;\n}\n\n/**\n * Walk a parsed AST and attach `resolved` addresses to every `ref` and\n * `range` node. The returned tree is a **new** structure — input nodes\n * are not mutated, which keeps the parser's output cache safe to reuse.\n */\nexport function resolveAst(ast: FormulaAst, ctx: RefMapperContext): FormulaAst {\n  switch (ast.kind) {\n    case 'ref':\n      return { kind: 'ref', ref: ast.ref, resolved: structuredRefToAddress(ast.ref, ctx) };\n    case 'range':\n      return {\n        kind: 'range',\n        start: ast.start,\n        end: ast.end,\n        resolved: rangeToAddresses(ast.start, ast.end, ctx),\n      };\n    case 'unary':\n      return { kind: 'unary', op: ast.op, operand: resolveAst(ast.operand, ctx) };\n    case 'binary':\n      return {\n        kind: 'binary',\n        op: ast.op,\n        left: resolveAst(ast.left, ctx),\n        right: resolveAst(ast.right, ctx),\n      };\n    case 'call':\n      return {\n        kind: 'call',\n        name: ast.name,\n        args: ast.args.map((a) => resolveAst(a, ctx)),\n      };\n    default:\n      return ast;\n  }\n}\n\n/** `(addr) → \"A1\"` using the current column order. */\nexport function addressToA1(\n  addr: CellAddress,\n  ctx: RefMapperContext,\n): string | undefined {\n  const idx = ctx.fields.indexOf(addr.field);\n  if (idx < 0) return undefined;\n  const rowIndex = ctx.rowIds.indexOf(addr.rowId);\n  if (rowIndex < 0) return undefined;\n  return `${columnIndexToLetters(idx)}${rowIndex + 1}`;\n}\n\n// ─── Source-string transformers (A1 ↔ REF long-form) ────────────────────────\n\n/**\n * Regex that matches A1-style cell refs: `$?LETTERS$?DIGITS`. Only uppercase\n * letters are considered — lowercase letters+digits are identifiers\n * (`foo1` is not a ref).\n */\nconst A1_REF_RE = /(\\$?)([A-Z]+)(\\$?)(\\d+)/g;\n\n/**\n * Matches the `[field]` same-row surface shorthand. Field names may contain\n * any chars except `]`; callers that need `]` in a field must fall back to\n * the full `REF(COLUMN(\"…\"))` form.\n */\nconst SAME_ROW_SURFACE_RE = /\\[([^\\]]+)\\]/g;\n\n/**\n * Convert an A1-form source string to REF long-form storage. Refs that\n * point to unknown columns are replaced with a literal `#REF!` to match\n * Excel's convention for broken refs.\n *\n * When `ctx.currentRowId` is known, relative refs pointing at the current\n * row (`=B5` on row 5, neither `$` lock set) collapse to same-row storage\n * (`REF(COLUMN(\"field\"))` with no ROW arg). This preserves the \"one\n * formula covers every row\" property across an edit → commit round-trip\n * when the user only views / tweaks the formula without changing rows.\n *\n *   a1ToLongForm('=A1+B2', ctx)                        // no currentRowId\n *     → '=REF(COLUMN(\"price\"),ROW(1))+REF(COLUMN(\"qty\"),ROW(2))'\n *   a1ToLongForm('=A1*B1', { ...ctx, currentRowId: 'r_1' })\n *     → '=REF(COLUMN(\"price\"))*REF(COLUMN(\"qty\"))'   // collapsed to same-row\n *   a1ToLongForm('=[price]*[qty]', ctx)\n *     → '=REF(COLUMN(\"price\"))*REF(COLUMN(\"qty\"))'\n */\nexport function a1ToLongForm(source: string, ctx: RefMapperContext): string {\n  // Index of the host row in the display order. Used below to detect refs\n  // that point at the current row and can therefore collapse to same-row\n  // storage. `-1` when unknown or unresolved — the collapse is skipped in\n  // that case and refs remain explicit-row.\n  const currentRowIndex =\n    ctx.currentRowId !== undefined ? ctx.rowIds.indexOf(ctx.currentRowId) : -1;\n\n  // Pass 1: `[field]` → `REF(COLUMN(\"field\"))`. Runs first so the A1 scan in\n  // pass 2 never sees letters+digits *inside* a user-authored `[A1]`.\n  const afterSameRow = replaceOutsideStrings(source, (body) =>\n    body.replace(SAME_ROW_SURFACE_RE, (_match, rawField: string) => {\n      if (!ctx.fields.includes(rawField)) return '#REF!';\n      return `REF(COLUMN(\"${rawField.replace(/\"/g, '\"\"')}\"))`;\n    }),\n  );\n\n  // Pass 2: A1 refs. A separate `replaceOutsideStrings` run so the freshly\n  // introduced `\"…\"` quoting from pass 1 is honoured — otherwise the `A1`\n  // in `REF(COLUMN(\"A1\"))` would be rewritten a second time.\n  return replaceOutsideStrings(afterSameRow, (body) =>\n    body.replace(A1_REF_RE, (match, absCol: string, letters: string, absRow: string, digits: string, offset: number, full: string) => {\n      if (isIdentLikeContext(full, offset, match.length)) return match;\n      // `ATAN2(…)` — letters+digits followed by `(` is a function call.\n      if (full[offset + match.length] === '(') return match;\n      const idx = columnLettersToIndex(letters);\n      const field = ctx.fields[idx];\n      const row = Number(digits);\n      if (!field || !Number.isFinite(row) || row < 1) return '#REF!';\n      const isAbsField = absCol === '$';\n      const isAbsRow = absRow === '$';\n      // Collapse to same-row storage when: we know the host row, the ref\n      // targets exactly that row, and neither axis is locked. Locked refs\n      // (`$…`) convey \"always this row / column\" and must stay explicit.\n      if (\n        currentRowIndex >= 0 &&\n        row === currentRowIndex + 1 &&\n        !isAbsRow &&\n        !isAbsField\n      ) {\n        return formatRefLongFormWithLocks({\n          field,\n          row: 0,\n          absField: false,\n          absRow: false,\n          sameRow: true,\n        });\n      }\n      const ref: StructuredRef = {\n        field,\n        row,\n        absField: isAbsField,\n        absRow: isAbsRow,\n      };\n      return formatRefLongFormWithLocks(ref);\n    }),\n  );\n}\n\n/**\n * Convert REF long-form storage to A1 surface for display. Tolerant —\n * unknown fields and out-of-range rows become `#REF!` in the output.\n *\n * Same-row storage (`REF(COLUMN(\"field\"))`, no ROW) renders as a concrete\n * A1 ref tied to the **host row** when `ctx.currentRowId` is provided —\n * this matches spreadsheet intuition (a cell on row 5 shows `=C5*D5`, a\n * cell on row 6 shows `=C6*D6`). Without a host row (tests, offline tools),\n * it falls back to the `[field]` bracket shorthand that round-trips losslessly.\n *\n *   longFormToA1('=REF(COLUMN(\"price\"),ROW(1))+1', ctx)\n *     → '=A1+1'\n *   longFormToA1('=REF(COLUMN(\"price\"))*REF(COLUMN(\"qty\"))', ctxRow1)\n *     → '=A1*B1'                            // with currentRowId → row 1\n *   longFormToA1('=REF(COLUMN(\"price\"))*REF(COLUMN(\"qty\"))', ctx)\n *     → '=[price]*[qty]'                    // no currentRowId → fallback\n */\nexport function longFormToA1(source: string, ctx: RefMapperContext): string {\n  let out = source;\n  // Resolve the host row once — undefined when the caller didn't provide\n  // one or the id is not in the current window. When undefined, same-row\n  // refs render in bracket form so they still round-trip through a1ToLongForm.\n  const hostRow =\n    ctx.currentRowId !== undefined ? ctx.rowIds.indexOf(ctx.currentRowId) + 1 : 0;\n\n  // Same-row form first: `REF(COLUMN(\"field\"))` → `B5` (host row) or `[field]`\n  // (no host row). Must run before the row-form regex because they share the\n  // `REF(COLUMN(\"…\")` prefix; the row-form regex does not match the no-ROW\n  // shape, so order is about clarity rather than correctness.\n  const SAME_ROW_RE = /REF\\(COLUMN\\(\"((?:[^\"]|\"\")*)\"\\)\\)/g;\n  out = out.replace(SAME_ROW_RE, (_match, rawField: string) => {\n    const field = rawField.replace(/\"\"/g, '\"');\n    if (hostRow >= 1) {\n      return cellRefToA1(\n        { field, row: hostRow, absField: false, absRow: false },\n        ctx.fields,\n      );\n    }\n    return cellRefToA1(\n      { field, row: 0, absField: false, absRow: false, sameRow: true },\n      ctx.fields,\n    );\n  });\n  // Naive scan: find every `REF(COLUMN(\"…\"),ROW(N)[,\"…\"])` call.\n  // The ref grammar is simple enough that a regex is sufficient here.\n  const RE = /REF\\(COLUMN\\(\"((?:[^\"]|\"\")*)\"\\),ROW\\((\\d+)\\)(?:,\"(\\$C|\\$R|\\$CR)\")?\\)/g;\n  out = out.replace(RE, (_match, rawField: string, digits: string, lock: string | undefined) => {\n    const field = rawField.replace(/\"\"/g, '\"');\n    const row = Number(digits);\n    const absField = lock === '$C' || lock === '$CR';\n    const absRow = lock === '$R' || lock === '$CR';\n    return cellRefToA1({ field, row, absField, absRow }, ctx.fields);\n  });\n  return out;\n}\n\n/**\n * Serialize a single ref to its long-form storage representation. Emits\n * the optional lock marker only when at least one dimension is absolute.\n */\nexport function formatRefLongFormWithLocks(ref: StructuredRef): string {\n  const base = cellRefToLongForm(ref);\n  // Same-row refs use the `REF(COLUMN(\"…\"))` shape — no ROW to lock. Locks\n  // aren't meaningful there, so we leave the base string untouched.\n  if (ref.sameRow) return base;\n  if (!ref.absField && !ref.absRow) return base;\n  const lock = ref.absField && ref.absRow ? '$CR' : ref.absField ? '$C' : '$R';\n  // base ends with `))`; inject `,\"lock\"` before the final `)`.\n  return `${base.slice(0, -1)},\"${lock}\")`;\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Walk `source` and only apply `fn` to stretches that are *not* inside a\n * `\"…\"` string literal (which may appear in function args like\n * `CONCAT(\"A1 literal\", …)`). Preserves `\"\"` as an escaped quote.\n */\nfunction replaceOutsideStrings(source: string, fn: (chunk: string) => string): string {\n  const out: string[] = [];\n  let i = 0;\n  let plainStart = 0;\n  const len = source.length;\n  while (i < len) {\n    if (source[i] === '\"') {\n      out.push(fn(source.slice(plainStart, i)));\n      const strStart = i;\n      i++;\n      while (i < len) {\n        if (source[i] === '\"') {\n          if (source[i + 1] === '\"') {\n            i += 2;\n            continue;\n          }\n          i++;\n          break;\n        }\n        i++;\n      }\n      out.push(source.slice(strStart, i));\n      plainStart = i;\n      continue;\n    }\n    i++;\n  }\n  out.push(fn(source.slice(plainStart)));\n  return out.join('');\n}\n\n/**\n * An A1 match `A1` inside `foo1` or `A1bar` or after `_` must NOT be\n * rewritten — it belongs to a larger identifier. Returns true when the\n * preceding or following character would make the match part of an ident.\n */\nfunction isIdentLikeContext(source: string, offset: number, length: number): boolean {\n  const before = source[offset - 1];\n  const after = source[offset + length];\n  if (before && (isAlphaNum(before) || before === '_' || before === '.')) return true;\n  if (after && (isAlphaNum(after) || after === '_' || after === '.')) return true;\n  return false;\n}\n\nfunction isAlphaNum(ch: string): boolean {\n  return (\n    (ch >= 'A' && ch <= 'Z') ||\n    (ch >= 'a' && ch <= 'z') ||\n    (ch >= '0' && ch <= '9')\n  );\n}\n\n/**\n * Produce the field-quoting used inside COLUMN(\"…\") — exposed so the editor\n * can build REF strings when inserting click-to-pick refs.\n */\nexport function quoteFieldForColumn(field: string): string {\n  return formatField(field);\n}\n","/**\n * `FormulaEngine` — grid-scoped service that owns every formula cell, the\n * dependency DAG linking them, and the evaluator that turns stored\n * formulas into `FormulaValue`s.\n *\n * Responsibilities (Phase 1):\n *   - Parse + resolve a raw formula when the user commits an edit.\n *   - Update the dependency graph and detect cycles (`#CYCLE!`).\n *   - Re-evaluate the mutated cell and every descendant in topological order.\n *   - Expose a `values` signal the grid renders against.\n *   - Provide an explicit `invalidate(addr)` so inline-edit can refresh\n *     dependents after a *non-formula* source cell changes — avoiding a\n *     blanket re-eval of the whole dataset.\n *\n * Out of scope (Phase ≥ 2):\n *   - Editor component + autocomplete (uses `longFormToA1` under the hood).\n *   - Clipboard / fill-handle rebasing of relative refs.\n *   - History integration (undo/redo of formula mutations).\n */\n\nimport { Injectable, Signal, computed, inject, signal } from '@angular/core';\nimport { GridStateManager } from '../../state/grid-state';\nimport {\n  CellAddress,\n  FormulaError,\n  FormulaEvalContext,\n  FormulaFunctionRegistry,\n  FormulaValue,\n  FormulaValues,\n} from '../../models/formula.model';\nimport { FormulaAst } from './formula-ast';\nimport { FormulaDag } from './formula-dag';\nimport { evaluate } from './formula-evaluator';\nimport { DEFAULT_FORMULA_FUNCTIONS } from './formula-functions.default';\nimport { FormulaParseError, parseFormula } from './formula-parser';\nimport {\n  RefMapperContext,\n  a1ToLongForm,\n  addressToA1,\n  longFormToA1,\n  resolveAst,\n} from './formula-ref-mapper';\n\ninterface CellEntry {\n  /** Raw formula string as entered by the user (after normalisation). */\n  readonly formula: string;\n  /** Parsed AST with resolved addresses — rebuilt on column/row changes. */\n  readonly ast: FormulaAst;\n  /** Last computed value. `empty` before the first evaluation. */\n  value: FormulaValue;\n}\n\nfunction makeKey(addr: CellAddress): string {\n  return `${addr.rowId}|${addr.field}`;\n}\n\nfunction keyToAddress(key: string): CellAddress {\n  const sep = key.indexOf('|');\n  const rowId = key.slice(0, sep);\n  const field = key.slice(sep + 1);\n  return { rowId, field };\n}\n\n@Injectable()\nexport class FormulaEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n\n  private readonly cells = new Map<string, CellEntry>();\n  private readonly dag = new FormulaDag();\n\n  /** Last-evaluated values keyed by `rowId|field`. */\n  private readonly valuesSignal = signal<ReadonlyMap<string, FormulaValue>>(new Map());\n\n  /** Function registry — consumers can replace via `setFunctions`. */\n  private functions: FormulaFunctionRegistry = DEFAULT_FORMULA_FUNCTIONS;\n\n  /** Active locale for the parser/evaluator. */\n  private locale: 'en' | 'fr' = 'en';\n\n  // ─── Public reactive surface ─────────────────────────────────────────────\n\n  /** Snapshot of all evaluated formula values. Consumers read by key. */\n  readonly values: Signal<ReadonlyMap<string, FormulaValue>> = this.valuesSignal.asReadonly();\n\n  /** Whether any formula is currently tracked. */\n  readonly hasAnyFormula = computed(() => this.values().size > 0);\n\n  /**\n   * `true` when the user is currently editing a cell whose column has\n   * `allowFormula: true`. The grid's header uses this to surface the\n   * structured-ref column badges (`[price]`, `[qty]`, …) above each\n   * header, matching what the user types in their formula.\n   */\n  readonly isFormulaEditActive = computed(() => {\n    // The formula bar edits aren't bound to any cell's cellEditState, so we\n    // treat it as a first-class source of \"formula is being typed\".\n    if (this.state.formulaBarEditingActive()) return true;\n    const editing = this.state.cellEditState().editingCell;\n    if (!editing) return false;\n    const field = this.state.visibleColumns()[editing.col]?.field;\n    if (!field) return false;\n    return this.state.columnDefMap().get(field)?.allowFormula === true;\n  });\n\n  // ─── Configuration ───────────────────────────────────────────────────────\n\n  /** Merge / replace the function registry (called once at grid init). */\n  setFunctions(functions: FormulaFunctionRegistry): void {\n    this.functions = functions;\n  }\n\n  /** Read-only view of the current function registry — used by the editor's\n   *  autocomplete panel to enumerate available names + their docs. */\n  getFunctions(): FormulaFunctionRegistry {\n    return this.functions;\n  }\n\n  setLocale(locale: 'en' | 'fr'): void {\n    this.locale = locale;\n  }\n\n  // ─── Queries ─────────────────────────────────────────────────────────────\n\n  hasFormula(addr: CellAddress): boolean {\n    return this.cells.has(makeKey(addr));\n  }\n\n  /** Raw formula string, or `undefined` when none is stored. */\n  getFormula(addr: CellAddress): string | undefined {\n    return this.cells.get(makeKey(addr))?.formula;\n  }\n\n  /** Last-evaluated value, or `undefined` when no formula is stored. */\n  valueAt(addr: CellAddress): FormulaValue | undefined {\n    return this.values().get(makeKey(addr));\n  }\n\n  /**\n   * Formula re-presented as A1 surface syntax for the current column /\n   * row order. Returns `undefined` when the cell has no formula. Used by\n   * the editor when opening a cell for edit.\n   */\n  displayFormula(addr: CellAddress): string | undefined {\n    const entry = this.cells.get(makeKey(addr));\n    if (!entry) return undefined;\n    return longFormToA1(entry.formula, this.refMapperContext(addr.rowId));\n  }\n\n  // ─── Mutations ───────────────────────────────────────────────────────────\n\n  /**\n   * Registers or updates a formula at `addr`. Returns the freshly-computed\n   * value. Invalid formulas are stored with their error as value so the\n   * grid can render `#PARSE!` / `#REF!` etc. instead of silently dropping.\n   */\n  set(addr: CellAddress, rawFormula: string): FormulaValue {\n    const key = makeKey(addr);\n    const trimmed = rawFormula.trim();\n    const prefixed = trimmed.startsWith('=') ? trimmed : `=${trimmed}`;\n    // Normalize A1 surface → REF long-form storage. If the input is already\n    // REF long-form (persisted data, paste), the transformer leaves it\n    // untouched, so round-trips are stable.\n    const ctx = this.refMapperContext(addr.rowId);\n    const source = a1ToLongForm(prefixed, ctx);\n\n    let ast: FormulaAst;\n    try {\n      ast = parseFormula(source, { locale: this.locale });\n    } catch (err) {\n      return this.storeError(key, source, err instanceof FormulaParseError ? '#PARSE!' : '#VALUE!');\n    }\n\n    ast = resolveAst(ast, ctx);\n\n    // Update DAG (must happen before cycle detection).\n    const deps = collectDeps(ast);\n    this.dag.setDependencies(key, deps);\n\n    // Store entry with a placeholder value; evaluation picks up cycle\n    // detection lazily, so setting a new formula that breaks a previous\n    // cycle (e.g. `=[b]1 / =[a]1` → `=[b]1 / =42`) naturally clears the error\n    // on every former cycle member when they are re-evaluated.\n    const entry: CellEntry = { formula: source, ast, value: FormulaValues.empty() };\n    this.cells.set(key, entry);\n\n    // Evaluate self + every descendant. When the node itself still\n    // participates in a cycle, `revalidateFrom` marks it as `#CYCLE!`.\n    this.revalidateFrom([key]);\n    return entry.value;\n  }\n\n  /** Removes the formula at `addr`. Descendants are re-evaluated. */\n  remove(addr: CellAddress): void {\n    const key = makeKey(addr);\n    if (!this.cells.has(key)) return;\n    this.cells.delete(key);\n    // Snapshot dependents before we disconnect `key` from the DAG so we\n    // can re-evaluate them (they will most likely flip to `#REF!`).\n    const dependents = [...this.dag.dependentsOf(key)];\n    this.dag.remove(key);\n    this.revalidateFrom(dependents);\n    this.commitValues();\n  }\n\n  /**\n   * Notifies the engine that a non-formula cell changed. Only dependents\n   * are re-evaluated — this is the hook used by `InlineEditEngine` after\n   * committing a plain value edit.\n   */\n  invalidate(addr: CellAddress): void {\n    const key = makeKey(addr);\n    const dependents = [...this.dag.dependentsOf(key)];\n    if (dependents.length === 0) return;\n    this.revalidateFrom(dependents);\n  }\n\n  /** Wipes every formula / value. */\n  clear(): void {\n    this.cells.clear();\n    this.dag.clear();\n    this.commitValues();\n  }\n\n  /**\n   * Reconciles the engine against `sourceData()`: any cell whose column\n   * declares `allowFormula: true` and whose value is a `=…` string is\n   * registered (or updated). Cells previously registered but no longer\n   * present (row removed, value changed to a literal) are dropped.\n   *\n   * Designed to be called from a grid-level effect tracking\n   * `(formulas, sourceData, columnDefMap)` so that formulas baked into\n   * the initial dataset are evaluated on first render — without it, the\n   * engine would only learn about a formula after the user committed an\n   * inline edit on it.\n   *\n   * The reconciliation is incremental: identical formula strings short-\n   * circuit (no re-parse, no re-eval) so the call is cheap on stable data.\n   */\n  syncFromSource(allowFormula: (field: string) => boolean): void {\n    const idField = this.state.rowIdField();\n    const data = this.state.sourceData();\n\n    const expected = new Set<string>();\n    for (const row of data) {\n      const r = row as Record<string, unknown>;\n      const rowId = r[idField] as string | number | undefined;\n      if (rowId === undefined || rowId === null) continue;\n      for (const field of Object.keys(r)) {\n        if (!allowFormula(field)) continue;\n        const raw = r[field];\n        if (typeof raw !== 'string' || !raw.trimStart().startsWith('=')) continue;\n        const key = `${rowId}|${field}`;\n        expected.add(key);\n        const existing = this.cells.get(key);\n        if (existing && existing.formula === raw) continue;\n        this.set({ rowId, field }, raw);\n      }\n    }\n\n    // Drop entries that no longer have a backing formula in the source.\n    for (const key of [...this.cells.keys()]) {\n      if (expected.has(key)) continue;\n      const sep = key.indexOf('|');\n      this.remove({ rowId: key.slice(0, sep), field: key.slice(sep + 1) });\n    }\n  }\n\n  /**\n   * Re-parses every stored formula so refs pick up the latest column\n   * order / row list. Called by the grid shell when visibility or row\n   * identity changes (reorder, filter flip, …).\n   */\n  rebuild(): void {\n    for (const [key, entry] of this.cells) {\n      const addr = keyToAddress(key);\n      const ctx = this.refMapperContext(addr.rowId);\n      // Mutate the entry to avoid rebuilding map keys. Cast away readonly.\n      (entry as { ast: FormulaAst }).ast = resolveAst(\n        parseFormulaOrEmpty(entry.formula, this.locale),\n        ctx,\n      );\n      this.dag.setDependencies(key, collectDeps(entry.ast));\n    }\n    this.revalidateFrom([...this.cells.keys()]);\n  }\n\n  // ─── Internals ───────────────────────────────────────────────────────────\n\n  private refMapperContext(currentRowId?: string | number): RefMapperContext {\n    // A1 letters map to fields in visible-column order, so we use the\n    // reactive `visibleColumns()` list rather than the full column def\n    // set. `allowFormula` only gates whether a cell may *host* a formula;\n    // any visible column can be referenced.\n    const visible = this.state.visibleColumns();\n    const fields = visible.map((c) => c.field);\n    const idField = this.state.rowIdField();\n    const rowIds = this.state.sourceData().map((row) => {\n      const r = row as Record<string, unknown>;\n      return (r[idField] as string | number | undefined) ?? '';\n    });\n    return { fields, rowIds, currentRowId };\n  }\n\n  private storeError(key: string, source: string, error: FormulaError): FormulaValue {\n    const value = FormulaValues.error(error);\n    // No deps — `#PARSE!` can't reach anyone.\n    this.dag.setDependencies(key, []);\n    this.cells.set(key, {\n      formula: source,\n      ast: { kind: 'string', value: error },\n      value,\n    });\n    this.commitValues();\n    return value;\n  }\n\n  /**\n   * Evaluate the given seeds and every descendant in topological order.\n   * Each node is first checked for cycle participation — any node inside\n   * a cycle reports `#CYCLE!` without attempting evaluation (which would\n   * recurse through the cached values and either spin or yield garbage).\n   */\n  private revalidateFrom(seeds: string[]): void {\n    if (seeds.length === 0) {\n      this.commitValues();\n      return;\n    }\n    const cycleError = FormulaValues.error('#CYCLE!');\n    const order = this.dag.topoFrom(seeds);\n    for (const key of order) {\n      const entry = this.cells.get(key);\n      if (!entry) continue;\n      const cycle = this.dag.detectCycle(key);\n      if (cycle) {\n        entry.value = cycleError;\n        continue;\n      }\n      entry.value = evaluate(entry.ast, this.functions, this.makeEvalContext(key));\n    }\n    this.commitValues();\n  }\n\n  private makeEvalContext(selfKey: string): FormulaEvalContext {\n    return {\n      addr: keyToAddress(selfKey),\n      locale: this.locale,\n      resolveRef: (target) => this.resolveRef(target),\n    };\n  }\n\n  /** Resolve a reference: formula cell → cached value, else source data. */\n  private resolveRef(addr: CellAddress): FormulaValue {\n    const key = makeKey(addr);\n    const formula = this.cells.get(key);\n    if (formula) return formula.value;\n    return this.readSourceValue(addr);\n  }\n\n  private readSourceValue(addr: CellAddress): FormulaValue {\n    const idField = this.state.rowIdField();\n    const row = this.state\n      .sourceData()\n      .find((r) => (r as Record<string, unknown>)[idField] === addr.rowId);\n    if (!row) return FormulaValues.empty();\n    const raw = (row as Record<string, unknown>)[addr.field];\n    return coerceJsValue(raw);\n  }\n\n  private commitValues(): void {\n    // Emit a *new* map instance so downstream `computed`s see a fresh\n    // reference and recompute. Map iteration order matches insertion order,\n    // which is fine for consumers since they only look up by key.\n    const next = new Map<string, FormulaValue>();\n    for (const [key, entry] of this.cells) {\n      next.set(key, entry.value);\n    }\n    this.valuesSignal.set(next);\n  }\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/** Collect every long-form dependency referenced by the AST. */\nfunction collectDeps(ast: FormulaAst): Set<string> {\n  const out = new Set<string>();\n  visit(ast, out);\n  return out;\n}\n\nfunction visit(node: FormulaAst, out: Set<string>): void {\n  switch (node.kind) {\n    case 'ref':\n      if (node.resolved) out.add(makeKey(node.resolved));\n      return;\n    case 'range':\n      if (node.resolved) {\n        for (const a of node.resolved) if (a) out.add(makeKey(a));\n      }\n      return;\n    case 'unary':\n      visit(node.operand, out);\n      return;\n    case 'binary':\n      visit(node.left, out);\n      visit(node.right, out);\n      return;\n    case 'call':\n      for (const a of node.args) visit(a, out);\n      return;\n    default:\n      return;\n  }\n}\n\n/** Coerce a plain JS value from a row object into a `FormulaValue`. */\nfunction coerceJsValue(raw: unknown): FormulaValue {\n  if (raw === null || raw === undefined) return FormulaValues.empty();\n  if (typeof raw === 'number') return FormulaValues.number(raw);\n  if (typeof raw === 'boolean') return FormulaValues.boolean(raw);\n  if (typeof raw === 'string') return FormulaValues.string(raw);\n  // Everything else (Date, Object…) — stringify conservatively.\n  return FormulaValues.string(String(raw));\n}\n\nfunction parseFormulaOrEmpty(source: string, locale: 'en' | 'fr'): FormulaAst {\n  try {\n    return parseFormula(source, { locale });\n  } catch {\n    return { kind: 'string', value: '#PARSE!' };\n  }\n}\n\n// Re-export used by the grid/cell to format addresses during edit.\nexport { addressToA1 };\n","import { Injectable, inject } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\nimport { CellEditEvent, CellEditCancelEvent } from '../models/cell.model';\nimport { CellEditorType } from '../models/column.model';\nimport { HistoryEngine } from './history.engine';\nimport { GridEngine } from '../engine/grid-engine';\nimport { FormulaEngine } from './formula/formula.engine';\nimport { a1ToLongForm } from './formula/formula-ref-mapper';\n\n@Injectable()\nexport class InlineEditEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n  private readonly history = inject<HistoryEngine<T>>(HistoryEngine);\n  private readonly gridEngine = inject<GridEngine<T>>(GridEngine);\n  // Optional — tests that do not set up the formula provider keep working.\n  private readonly formulaEngine = inject<FormulaEngine<T> | null>(FormulaEngine, {\n    optional: true,\n  });\n\n  startEdit(rowIndex: number, field: string): void {\n    const defMap = this.state.columnDefMap();\n    const def = defMap.get(field);\n    if (!def?.editable) return;\n\n    const colIndex = this.state.visibleColumns().findIndex((c) => c.field === field);\n    if (colIndex < 0) return;\n\n    const sourceIndex = this.gridEngine.displayIndexToSourceIndex(rowIndex);\n    const row = sourceIndex >= 0 ? this.state.sourceData()[sourceIndex] : undefined;\n    if (!row) return;\n\n    const value = def.valueGetter ? def.valueGetter(row) : (row as Record<string, unknown>)[field];\n    // Formula-enabled cells open with the A1 surface form so the user edits\n    // column letters, not the `REF(COLUMN(\"…\"),ROW(…))` storage.\n    let draftValue: unknown = value;\n    if (def.allowFormula && this.formulaEngine) {\n      const rowId = (row as Record<string, unknown>)[this.state.rowIdField()] as\n        | string\n        | number\n        | undefined;\n      if (rowId !== undefined && rowId !== null) {\n        const a1 = this.formulaEngine.displayFormula({ rowId, field });\n        if (a1 !== undefined) draftValue = a1;\n      }\n    }\n\n    this.state.cellEditState.set({\n      editingCell: { row: rowIndex, col: colIndex },\n      originalValue: value,\n      draftValue,\n      validationError: null,\n    });\n  }\n\n  /**\n   * Excel-style \"typing-to-edit\": starts the editor with the cell value replaced\n   * by the character the user just typed. For non-text editors (select / date /\n   * checkbox / number) we coerce: the character is kept if it's compatible with\n   * the editor, otherwise the editor opens on a cleared value.\n   */\n  startEditWithChar(rowIndex: number, field: string, char: string): void {\n    const defMap = this.state.columnDefMap();\n    const def = defMap.get(field);\n    if (!def?.editable) return;\n\n    const colIndex = this.state.visibleColumns().findIndex((c) => c.field === field);\n    if (colIndex < 0) return;\n\n    const sourceIndex = this.gridEngine.displayIndexToSourceIndex(rowIndex);\n    const row = sourceIndex >= 0 ? this.state.sourceData()[sourceIndex] : undefined;\n    if (!row) return;\n\n    const currentValue = def.valueGetter\n      ? def.valueGetter(row)\n      : (row as Record<string, unknown>)[field];\n    const editorType = def.cellEditor ?? this.resolveEditorType(field, currentValue);\n\n    let draftValue: unknown = char;\n    switch (editorType) {\n      case 'number': {\n        const n = Number(char);\n        draftValue = Number.isNaN(n) ? '' : n;\n        break;\n      }\n      case 'checkbox':\n        // A character press toggles the checkbox to true — closest Excel-equivalent\n        // (Excel doesn't have checkbox cells but booleans flip on typing).\n        draftValue = true;\n        break;\n      case 'select':\n      case 'date':\n        // These editors have picker UIs; typing just opens them with an empty draft.\n        draftValue = '';\n        break;\n      default:\n        draftValue = char;\n    }\n\n    this.state.cellEditState.set({\n      editingCell: { row: rowIndex, col: colIndex },\n      originalValue: currentValue,\n      draftValue,\n      validationError: null,\n    });\n  }\n\n  updateDraft(value: unknown): void {\n    this.state.cellEditState.update((s) => ({ ...s, draftValue: value }));\n  }\n\n  commitEdit(): CellEditEvent<T> | null {\n    const editState = this.state.cellEditState();\n    if (!editState.editingCell) return null;\n\n    const { row: rowIndex, col: colIndex } = editState.editingCell;\n    const visibleCols = this.state.visibleColumns();\n    const field = visibleCols[colIndex]?.field;\n    if (!field) return null;\n\n    const def = this.state.columnDefMap().get(field);\n    const sourceIndex = this.gridEngine.displayIndexToSourceIndex(rowIndex);\n    if (sourceIndex < 0) return null;\n    let row = this.state.sourceData()[sourceIndex];\n    if (!row) return null;\n\n    // Validation\n    if (def?.cellEditorValidator) {\n      const result = def.cellEditorValidator(editState.draftValue, row);\n      if (result === false) {\n        this.state.cellEditState.update((s) => ({\n          ...s,\n          validationError: 'Invalid value',\n        }));\n        return null;\n      }\n      if (typeof result === 'string') {\n        this.state.cellEditState.update((s) => ({\n          ...s,\n          validationError: result,\n        }));\n        return null;\n      }\n    }\n\n    // Formula drafts are authored in A1 — normalise to REF long-form before\n    // persisting, so sourceData always holds storage form (shift, paste and\n    // syncFromSource all rely on it).\n    const storedDraftValue =\n      def?.allowFormula === true &&\n      typeof editState.draftValue === 'string' &&\n      editState.draftValue.trimStart().startsWith('=')\n        ? this.a1DraftToStorage(editState.draftValue)\n        : editState.draftValue;\n\n    // Always update data immutably so signals detect the change, regardless\n    // of client/server mode. Consumers can still re-fetch/override via output.\n    this.state.sourceData.update((data) => {\n      const updated = [...data];\n      updated[sourceIndex] = { ...updated[sourceIndex], [field]: storedDraftValue } as T;\n      return updated;\n    });\n    // Re-read the updated row for the event\n    row = this.state.sourceData()[sourceIndex];\n\n    // Route formula-capable cells through the formula engine. The raw\n    // formula string is kept in the source data (inline storage mode) and\n    // the rendering layer reads the evaluated value via `valueAt(addr)`.\n    // Non-formula cells still trigger `invalidate` so dependents recompute.\n    this.updateFormulaEngine(\n      def?.allowFormula === true,\n      row,\n      field,\n      storedDraftValue,\n      editState.originalValue\n    );\n\n    const event: CellEditEvent<T> = {\n      row,\n      rowIndex: sourceIndex,\n      field,\n      oldValue: editState.originalValue,\n      newValue: storedDraftValue,\n    };\n\n    if (event.oldValue !== event.newValue) {\n      this.history.record('edit', [\n        { rowIndex: sourceIndex, field, before: event.oldValue, after: event.newValue },\n      ]);\n    }\n\n    this.state.cellEditState.set({\n      editingCell: null,\n      originalValue: undefined,\n      draftValue: undefined,\n      validationError: null,\n    });\n\n    return event;\n  }\n\n  cancelEdit(): CellEditCancelEvent | null {\n    const editState = this.state.cellEditState();\n    if (!editState.editingCell) return null;\n\n    const { row: rowIndex, col: colIndex } = editState.editingCell;\n    const field = this.state.visibleColumns()[colIndex]?.field;\n\n    this.state.cellEditState.set({\n      editingCell: null,\n      originalValue: undefined,\n      draftValue: undefined,\n      validationError: null,\n    });\n\n    return field ? { rowIndex, field, originalValue: editState.originalValue } : null;\n  }\n\n  isEditing(rowIndex: number, colIndex: number): boolean {\n    const editState = this.state.cellEditState();\n    return editState.editingCell?.row === rowIndex && editState.editingCell?.col === colIndex;\n  }\n\n  /**\n   * Convert an A1-surface formula draft to REF long-form storage. Strings\n   * that do not start with `=` are returned untouched — callers should\n   * only invoke this on values they already know to be formulas.\n   */\n  private a1DraftToStorage(draft: string): string {\n    const rowIds = this.state.sourceData().map((row) => {\n      const r = row as Record<string, unknown>;\n      return (r[this.state.rowIdField()] as string | number | undefined) ?? '';\n    });\n    const fields = this.state.visibleColumns().map((c) => c.field);\n    return a1ToLongForm(draft, { fields, rowIds });\n  }\n\n  resolveEditorType(field: string, value: unknown): CellEditorType {\n    const def = this.state.columnDefMap().get(field);\n    if (def?.cellEditor) return def.cellEditor;\n\n    // Auto-detect\n    if (def?.cellEditorOptions?.length) return 'select';\n    if (typeof value === 'boolean') return 'checkbox';\n    if (typeof value === 'number') return 'number';\n    if (value instanceof Date) return 'date';\n    return 'text';\n  }\n\n  /**\n   * Route a cell-edit commit through the formula engine when appropriate:\n   *  - `allowFormula` column + new value starts with `=` → register formula.\n   *  - `allowFormula` column + old value was a formula but new one isn't\n   *    → remove the stored formula (reverts to a plain literal).\n   *  - Any cell change → invalidate dependents so their cached value\n   *    refreshes (no-op when the engine has zero dependents on this cell).\n   */\n  private updateFormulaEngine(\n    allowFormula: boolean,\n    row: T,\n    field: string,\n    newValue: unknown,\n    oldValue: unknown\n  ): void {\n    const engine = this.formulaEngine;\n    if (!engine) return;\n\n    const rowId = (row as Record<string, unknown>)[this.state.rowIdField()] as\n      | string\n      | number\n      | undefined;\n    if (rowId === undefined) return;\n    const addr = { rowId, field };\n\n    const isFormula = (v: unknown): v is string =>\n      typeof v === 'string' && v.trimStart().startsWith('=');\n\n    if (allowFormula && isFormula(newValue)) {\n      engine.set(addr, newValue);\n    } else if (allowFormula && isFormula(oldValue) && !isFormula(newValue)) {\n      engine.remove(addr);\n    }\n\n    engine.invalidate(addr);\n  }\n}\n","import { Injectable, inject, computed, signal } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\nimport { GridEngine } from '../engine/grid-engine';\nimport { RowSelectionEvent } from '../models/grid-events.model';\n\n@Injectable()\nexport class RowSelectionEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n  private readonly engine = inject<GridEngine<T>>(GridEngine);\n\n  readonly selectedIds = computed(() => this.state.selectedRowIds());\n  readonly excludedIds = computed(() => this.state.excludedRowIds());\n  /**\n   * Anchor row for shift-click range selection. We track the row object\n   * (not its index) so the anchor stays valid across grouping, sorting and\n   * filtering — where display indices shift without the underlying row\n   * changing.\n   */\n  readonly lastToggledRow = signal<T | null>(null);\n\n  readonly count = computed(() => {\n    const mode = this.state.selectAllMode();\n    if (mode === 'all') {\n      const total = this.state.totalItems() || this.state.sourceData().length;\n      return total - this.state.excludedRowIds().size;\n    }\n    return this.state.selectedRowIds().size;\n  });\n\n  readonly pageSelectedCount = computed(() => {\n    const pageData = this.engine.paginatedData();\n    return pageData.filter((row) => this.isRowSelected(row)).length;\n  });\n\n  readonly isAllSelected = computed(() => {\n    const pageData = this.engine.paginatedData();\n    if (pageData.length === 0) return false;\n    return pageData.every((row) => this.isRowSelected(row));\n  });\n\n  readonly isIndeterminate = computed(() => {\n    const pageData = this.engine.paginatedData();\n    if (pageData.length === 0) return false;\n    const pageSelected = pageData.filter((row) => this.isRowSelected(row)).length;\n    return pageSelected > 0 && pageSelected < pageData.length;\n  });\n\n  /**\n   * Extends the selection from the last-toggled row (the anchor) to `endRow`,\n   * resolving positions by object identity against the currently paginated\n   * data. This is robust to grouping / sorting / filtering because we don't\n   * rely on numeric indices, and works across any visible page slice.\n   */\n  selectRowRangeToRow(endRow: T): void {\n    const anchor = this.lastToggledRow();\n    if (!anchor) {\n      this.toggleRow(endRow);\n      this.lastToggledRow.set(endRow);\n      return;\n    }\n    const pageData = this.engine.paginatedData();\n    const anchorIdx = pageData.indexOf(anchor);\n    const endIdx = pageData.indexOf(endRow);\n    if (anchorIdx < 0 || endIdx < 0) {\n      // Anchor left the visible page — fall back to a plain toggle\n      this.toggleRow(endRow);\n      this.lastToggledRow.set(endRow);\n      return;\n    }\n    const start = Math.min(anchorIdx, endIdx);\n    const end = Math.max(anchorIdx, endIdx);\n    this.state.selectedRowIds.update((ids) => {\n      const next = new Set(ids);\n      for (let i = start; i <= end; i++) {\n        next.add(this.getRowId(pageData[i]));\n      }\n      return next;\n    });\n    if (this.state.selectAllMode() === 'none') {\n      this.state.selectAllMode.set('page');\n    }\n    this.lastToggledRow.set(endRow);\n  }\n\n  toggleRow(row: T): void {\n    const id = this.getRowId(row);\n    const mode = this.state.selectAllMode();\n\n    if (mode === 'all') {\n      this.state.excludedRowIds.update((excluded) => {\n        const next = new Set(excluded);\n        if (next.has(id)) {\n          next.delete(id);\n        } else {\n          next.add(id);\n        }\n        return next;\n      });\n    } else {\n      this.state.selectedRowIds.update((ids) => {\n        const next = new Set(ids);\n        if (next.has(id)) {\n          next.delete(id);\n        } else {\n          next.add(id);\n        }\n        return next;\n      });\n      this.state.selectAllMode.set(this.state.selectedRowIds().size === 0 ? 'none' : mode);\n    }\n  }\n\n  isRowSelected(row: T): boolean {\n    const id = this.getRowId(row);\n    const mode = this.state.selectAllMode();\n    if (mode === 'all') {\n      return !this.state.excludedRowIds().has(id);\n    }\n    return this.state.selectedRowIds().has(id);\n  }\n\n  selectAllPage(): void {\n    const pageData = this.engine.paginatedData();\n    const mode = this.state.selectAllMode();\n\n    if (mode === 'all') {\n      // In 'all' mode, re-selecting a page means removing those rows from exclusions\n      this.state.excludedRowIds.update((excluded) => {\n        const next = new Set(excluded);\n        for (const row of pageData) {\n          next.delete(this.getRowId(row));\n        }\n        return next;\n      });\n    } else {\n      this.state.selectedRowIds.update((ids) => {\n        const next = new Set(ids);\n        for (const row of pageData) {\n          next.add(this.getRowId(row));\n        }\n        return next;\n      });\n      this.state.selectAllMode.set('page');\n    }\n  }\n\n  selectAll(): void {\n    this.state.selectedRowIds.set(new Set());\n    this.state.excludedRowIds.set(new Set());\n    this.state.selectAllMode.set('all');\n  }\n\n  deselectAll(): void {\n    this.state.selectedRowIds.set(new Set());\n    this.state.excludedRowIds.set(new Set());\n    this.state.selectAllMode.set('none');\n  }\n\n  deselectPage(): void {\n    const pageData = this.engine.paginatedData();\n    const mode = this.state.selectAllMode();\n\n    if (mode === 'all') {\n      this.state.excludedRowIds.update((excluded) => {\n        const next = new Set(excluded);\n        for (const row of pageData) {\n          next.add(this.getRowId(row));\n        }\n        return next;\n      });\n    } else {\n      this.state.selectedRowIds.update((ids) => {\n        const next = new Set(ids);\n        for (const row of pageData) {\n          next.delete(this.getRowId(row));\n        }\n        return next;\n      });\n      if (this.state.selectedRowIds().size === 0) {\n        this.state.selectAllMode.set('none');\n      }\n    }\n  }\n\n  toggleSelectAllPage(): void {\n    if (this.isAllSelected()) {\n      this.deselectPage();\n    } else {\n      this.selectAllPage();\n    }\n  }\n\n  getSelectionEvent(): RowSelectionEvent<T> {\n    const mode = this.state.selectAllMode();\n\n    if (mode === 'all') {\n      // In 'all' mode, scope to current page data only\n      const pageData = this.engine.paginatedData();\n      const excluded = this.state.excludedRowIds();\n      const selectedRows = pageData.filter((row) => !excluded.has(this.getRowId(row)));\n      return {\n        selectedIds: selectedRows.map((row) => this.getRowId(row)),\n        excludedIds: Array.from(excluded),\n        selectedRows,\n        mode,\n        count: selectedRows.length,\n      };\n    }\n\n    // In 'page' / 'none' mode, only return rows from the current page\n    const pageData = this.engine.paginatedData();\n    const ids = this.state.selectedRowIds();\n    const selectedRows = pageData.filter((row) => ids.has(this.getRowId(row)));\n    return {\n      selectedIds: selectedRows.map((row) => this.getRowId(row)),\n      excludedIds: [],\n      selectedRows,\n      mode,\n      count: selectedRows.length,\n    };\n  }\n\n  getRowId(row: T): unknown {\n    const field = this.state.rowIdField?.() ?? 'id';\n    const r = row as Record<string, unknown>;\n    return r[field] ?? r['id'] ?? r['_id'] ?? row;\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\nimport { CellRange } from '../models/cell.model';\n\n@Injectable()\nexport class CellSelectionEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n\n  focusCell(row: number, col: number, source: 'click' | 'keyboard' = 'click'): void {\n    this.state.focusSource.set(source);\n    this.state.focusedCell.set({ row, col });\n    this.state.selectedCell.set({ row, col });\n    this.state.cellRange.set(null);\n    this.state.isDragging.set(false);\n  }\n\n  clearFocus(): void {\n    this.state.focusSource.set(null);\n    this.state.focusedCell.set(null);\n    this.state.selectedCell.set(null);\n    this.state.cellRange.set(null);\n    this.state.isDragging.set(false);\n  }\n\n  isCellFocused(row: number, col: number): boolean {\n    const focused = this.state.focusedCell();\n    return focused?.row === row && focused?.col === col;\n  }\n\n  isCellInRange(row: number, col: number): boolean {\n    const range = this.state.cellRange();\n    if (!range) {\n      return this.isCellFocused(row, col);\n    }\n    const minRow = Math.min(range.start.row, range.end.row);\n    const maxRow = Math.max(range.start.row, range.end.row);\n    const minCol = Math.min(range.start.col, range.end.col);\n    const maxCol = Math.max(range.start.col, range.end.col);\n    return row >= minRow && row <= maxRow && col >= minCol && col <= maxCol;\n  }\n\n  selectRange(start: { row: number; col: number }, end: { row: number; col: number }): void {\n    this.state.cellRange.set({ start, end });\n    this.state.isDragging.set(false);\n  }\n\n  startRangeSelection(row: number, col: number): void {\n    this.state.focusedCell.set({ row, col });\n    this.state.cellRange.set({ start: { row, col }, end: { row, col } });\n    this.state.isDragging.set(true);\n  }\n\n  extendRange(row: number, col: number): void {\n    if (!this.state.isDragging()) return;\n    const range = this.state.cellRange();\n    if (!range) return;\n    this.state.cellRange.set({ start: range.start, end: { row, col } });\n  }\n\n  endRangeSelection(): void {\n    this.state.isDragging.set(false);\n  }\n\n  moveUp(): void {\n    this.moveBy(-1, 0);\n  }\n\n  moveDown(): void {\n    this.moveBy(1, 0);\n  }\n\n  moveLeft(): void {\n    this.moveBy(0, -1);\n  }\n\n  moveRight(): void {\n    this.moveBy(0, 1);\n  }\n\n  // --- Home / End / Grid bounds -------------------------------------------------\n\n  moveToRowStart(): void {\n    const focused = this.state.focusedCell();\n    if (!focused) return;\n    this.focusCell(focused.row, 0, 'keyboard');\n  }\n\n  moveToRowEnd(): void {\n    const focused = this.state.focusedCell();\n    if (!focused) return;\n    const maxCol = this.state.visibleColumns().length - 1;\n    if (maxCol < 0) return;\n    this.focusCell(focused.row, this.findLastNonEmptyCol(focused.row, maxCol), 'keyboard');\n  }\n\n  moveToGridStart(): void {\n    const pageStart = this.state.pageIndex() * this.state.pageSize();\n    this.focusCell(pageStart, 0, 'keyboard');\n  }\n\n  moveToGridEnd(): void {\n    const pageStart = this.state.pageIndex() * this.state.pageSize();\n    const pageEnd = pageStart + Math.max(0, this.state.visibleRowCount() - 1);\n    const maxCol = this.state.visibleColumns().length - 1;\n    if (maxCol < 0) return;\n    this.focusCell(pageEnd, this.findLastNonEmptyCol(pageEnd, maxCol), 'keyboard');\n  }\n\n  /**\n   * Excel-style Ctrl+Arrow: jump to the edge of the current data block.\n   * If on an empty cell, jumps to the next non-empty cell. If on a filled\n   * cell, jumps to the last filled cell before the next empty transition\n   * (or to the grid edge if no empty cell is encountered).\n   */\n  jumpToEdge(direction: 'up' | 'down' | 'left' | 'right'): void {\n    const focused = this.state.focusedCell();\n    if (!focused) return;\n    const { dRow, dCol } = this.directionVector(direction);\n    const bounds = this.pageBounds();\n    const maxCol = this.state.visibleColumns().length - 1;\n    if (maxCol < 0) return;\n\n    const startFilled = this.isCellFilled(focused.row, focused.col);\n    let row = focused.row;\n    let col = focused.col;\n\n    // Step once to start looking at the neighbour\n    let nextRow = row + dRow;\n    let nextCol = col + dCol;\n    while (this.inBounds(nextRow, nextCol, bounds, maxCol)) {\n      const filled = this.isCellFilled(nextRow, nextCol);\n      if (startFilled) {\n        // Moving through filled cells — stop right before the next empty gap.\n        if (!filled) break;\n        row = nextRow;\n        col = nextCol;\n      } else {\n        // Moving through empty cells — stop on the first filled cell we meet.\n        if (filled) {\n          row = nextRow;\n          col = nextCol;\n          break;\n        }\n        row = nextRow;\n        col = nextCol;\n      }\n      nextRow += dRow;\n      nextCol += dCol;\n    }\n\n    this.focusCell(row, col, 'keyboard');\n  }\n\n  movePage(direction: 'up' | 'down'): void {\n    const focused = this.state.focusedCell();\n    if (!focused) return;\n    const step = this.pageRowStep() * (direction === 'down' ? 1 : -1);\n    this.moveBy(step, 0);\n  }\n\n  // --- Shift + navigation : extend current range --------------------------------\n\n  extendRangeBy(dRow: number, dCol: number): void {\n    const focused = this.state.focusedCell();\n    if (!focused) return;\n    const range = this.state.cellRange();\n    const bounds = this.pageBounds();\n    const maxCol = this.state.visibleColumns().length - 1;\n    if (maxCol < 0) return;\n\n    const currentEnd = range ? range.end : focused;\n    const newEnd = {\n      row: Math.max(bounds.start, Math.min(bounds.end, currentEnd.row + dRow)),\n      col: Math.max(0, Math.min(maxCol, currentEnd.col + dCol)),\n    };\n    const start = range ? range.start : focused;\n    this.state.cellRange.set({ start, end: newEnd });\n  }\n\n  extendRangeToRowStart(): void {\n    const focused = this.state.focusedCell();\n    if (!focused) return;\n    const range = this.state.cellRange();\n    const start = range?.start ?? focused;\n    this.state.cellRange.set({ start, end: { row: (range?.end ?? focused).row, col: 0 } });\n  }\n\n  extendRangeToRowEnd(): void {\n    const focused = this.state.focusedCell();\n    if (!focused) return;\n    const maxCol = this.state.visibleColumns().length - 1;\n    if (maxCol < 0) return;\n    const range = this.state.cellRange();\n    const start = range?.start ?? focused;\n    this.state.cellRange.set({ start, end: { row: (range?.end ?? focused).row, col: maxCol } });\n  }\n\n  extendRangeToGridStart(): void {\n    const focused = this.state.focusedCell();\n    if (!focused) return;\n    const bounds = this.pageBounds();\n    const range = this.state.cellRange();\n    const start = range?.start ?? focused;\n    this.state.cellRange.set({ start, end: { row: bounds.start, col: 0 } });\n  }\n\n  extendRangeToGridEnd(): void {\n    const focused = this.state.focusedCell();\n    if (!focused) return;\n    const bounds = this.pageBounds();\n    const maxCol = this.state.visibleColumns().length - 1;\n    if (maxCol < 0) return;\n    const range = this.state.cellRange();\n    const start = range?.start ?? focused;\n    this.state.cellRange.set({ start, end: { row: bounds.end, col: maxCol } });\n  }\n\n  extendRangeJumpToEdge(direction: 'up' | 'down' | 'left' | 'right'): void {\n    const focused = this.state.focusedCell();\n    if (!focused) return;\n    const range = this.state.cellRange();\n    const anchor = range?.start ?? focused;\n    const end = range?.end ?? focused;\n    const target = this.edgeFromCell(end, direction);\n    this.state.cellRange.set({ start: anchor, end: target });\n  }\n\n  extendRangeByPage(direction: 'up' | 'down'): void {\n    const step = this.pageRowStep() * (direction === 'down' ? 1 : -1);\n    this.extendRangeBy(step, 0);\n  }\n\n  // --- Whole row / column / grid selection --------------------------------------\n\n  selectRow(row: number): void {\n    const maxCol = this.state.visibleColumns().length - 1;\n    if (maxCol < 0) return;\n    this.state.focusedCell.set({ row, col: 0 });\n    this.state.focusSource.set('keyboard');\n    this.state.cellRange.set({\n      start: { row, col: 0 },\n      end: { row, col: maxCol },\n    });\n  }\n\n  selectColumn(col: number): void {\n    const bounds = this.pageBounds();\n    this.state.focusedCell.set({ row: bounds.start, col });\n    this.state.focusSource.set('keyboard');\n    this.state.cellRange.set({\n      start: { row: bounds.start, col },\n      end: { row: bounds.end, col },\n    });\n  }\n\n  selectAll(): void {\n    const bounds = this.pageBounds();\n    const maxCol = this.state.visibleColumns().length - 1;\n    if (maxCol < 0) return;\n    this.state.focusedCell.set({ row: bounds.start, col: 0 });\n    this.state.focusSource.set('keyboard');\n    this.state.cellRange.set({\n      start: { row: bounds.start, col: 0 },\n      end: { row: bounds.end, col: maxCol },\n    });\n  }\n\n  // --- Private helpers ----------------------------------------------------------\n\n  private pageBounds(): { start: number; end: number } {\n    const start = this.state.pageIndex() * this.state.pageSize();\n    const end = start + Math.max(0, this.state.visibleRowCount() - 1);\n    return { start, end };\n  }\n\n  private pageRowStep(): number {\n    const rowHeight = this.state.rowHeight() || 48;\n    const viewportHeight = this.state.scrollViewportHeight();\n    if (viewportHeight > 0) {\n      return Math.max(1, Math.floor(viewportHeight / rowHeight));\n    }\n    // Fallback: a sensible default when the viewport hasn't been measured yet.\n    return Math.max(1, Math.floor(this.state.visibleRowCount() / 2) || 10);\n  }\n\n  private directionVector(dir: 'up' | 'down' | 'left' | 'right'): { dRow: number; dCol: number } {\n    switch (dir) {\n      case 'up':\n        return { dRow: -1, dCol: 0 };\n      case 'down':\n        return { dRow: 1, dCol: 0 };\n      case 'left':\n        return { dRow: 0, dCol: -1 };\n      case 'right':\n        return { dRow: 0, dCol: 1 };\n    }\n  }\n\n  private inBounds(\n    row: number,\n    col: number,\n    bounds: { start: number; end: number },\n    maxCol: number,\n  ): boolean {\n    return row >= bounds.start && row <= bounds.end && col >= 0 && col <= maxCol;\n  }\n\n  private isCellFilled(row: number, col: number): boolean {\n    const cols = this.state.visibleColumns();\n    const field = cols[col]?.field;\n    if (!field) return false;\n    const data = this.state.sourceData();\n    const rowData = data[row];\n    if (!rowData) return false;\n    const def = this.state.columnDefMap().get(field);\n    const value = def?.valueGetter\n      ? def.valueGetter(rowData)\n      : (rowData as Record<string, unknown>)[field];\n    return value !== null && value !== undefined && value !== '';\n  }\n\n  private findLastNonEmptyCol(row: number, maxCol: number): number {\n    for (let c = maxCol; c >= 0; c--) {\n      if (this.isCellFilled(row, c)) return c;\n    }\n    return maxCol;\n  }\n\n  private edgeFromCell(\n    from: { row: number; col: number },\n    direction: 'up' | 'down' | 'left' | 'right',\n  ): { row: number; col: number } {\n    const { dRow, dCol } = this.directionVector(direction);\n    const bounds = this.pageBounds();\n    const maxCol = this.state.visibleColumns().length - 1;\n    if (maxCol < 0) return from;\n\n    const startFilled = this.isCellFilled(from.row, from.col);\n    let row = from.row;\n    let col = from.col;\n    let nextRow = row + dRow;\n    let nextCol = col + dCol;\n    while (this.inBounds(nextRow, nextCol, bounds, maxCol)) {\n      const filled = this.isCellFilled(nextRow, nextCol);\n      if (startFilled) {\n        if (!filled) break;\n      } else if (filled) {\n        row = nextRow;\n        col = nextCol;\n        break;\n      }\n      row = nextRow;\n      col = nextCol;\n      nextRow += dRow;\n      nextCol += dCol;\n    }\n    return { row, col };\n  }\n\n  moveToNextEditableCell(): void {\n    const focused = this.state.focusedCell();\n    if (!focused) return;\n    const cols = this.state.visibleColumns();\n    let col = focused.col + 1;\n    let row = focused.row;\n\n    while (row < this.state.sourceData().length) {\n      if (col >= cols.length) {\n        col = 0;\n        row++;\n      }\n      if (row >= this.state.sourceData().length) break;\n\n      const def = this.state.columnDefMap().get(cols[col]?.field ?? '');\n      if (def?.editable) {\n        this.focusCell(row, col);\n        return;\n      }\n      col++;\n    }\n  }\n\n  // --- Fill Handle (Google Sheets style) — supports vertical and horizontal fills ---\n\n  startFill(row: number, col: number): void {\n    this.state.fillAnchor.set({ row, col });\n    this.state.fillTarget.set({ row, col });\n    this.state.isFilling.set(true);\n  }\n\n  /**\n   * Extends the fill range. The dominant axis (the one with the largest delta\n   * from the anchor) wins: vertical if |dRow| >= |dCol|, otherwise horizontal.\n   * The fill is 1D — it's always locked to a single row or a single column.\n   */\n  extendFill(row: number, col: number): void {\n    if (!this.state.isFilling()) return;\n    const anchor = this.state.fillAnchor();\n    if (!anchor) return;\n    const dRow = Math.abs(row - anchor.row);\n    const dCol = Math.abs(col - anchor.col);\n    if (dRow >= dCol) {\n      this.state.fillTarget.set({ row, col: anchor.col });\n    } else {\n      this.state.fillTarget.set({ row: anchor.row, col });\n    }\n  }\n\n  endFill(): { anchor: { row: number; col: number }; target: { row: number; col: number } } | null {\n    if (!this.state.isFilling()) return null;\n    const anchor = this.state.fillAnchor();\n    const target = this.state.fillTarget();\n    this.state.isFilling.set(false);\n    this.state.fillAnchor.set(null);\n    this.state.fillTarget.set(null);\n    if (!anchor || !target) return null;\n    if (anchor.row === target.row && anchor.col === target.col) return null;\n    return { anchor, target };\n  }\n\n  cancelFill(): void {\n    this.state.isFilling.set(false);\n    this.state.fillAnchor.set(null);\n    this.state.fillTarget.set(null);\n  }\n\n  isCellInFillRange(row: number, col: number): boolean {\n    const anchor = this.state.fillAnchor();\n    const target = this.state.fillTarget();\n    if (!anchor || !target) return false;\n    if (row === anchor.row && col === anchor.col) return false; // skip anchor\n\n    const vertical = target.col === anchor.col;\n    if (vertical) {\n      if (col !== anchor.col) return false;\n      const minRow = Math.min(anchor.row, target.row);\n      const maxRow = Math.max(anchor.row, target.row);\n      return row >= minRow && row <= maxRow;\n    }\n\n    // Horizontal fill: single row, col range — skip non-editable columns and\n    // type-incompatible columns so the highlight mirrors exactly which cells\n    // will actually be written.\n    if (row !== anchor.row) return false;\n    const minCol = Math.min(anchor.col, target.col);\n    const maxCol = Math.max(anchor.col, target.col);\n    if (col < minCol || col > maxCol) return false;\n    return this.isColEditable(col) && this.isColTypeCompatible(anchor.col, col);\n  }\n\n  /**\n   * During a horizontal fill, cells that sit inside the drag bounding box but\n   * belong to a non-editable column cannot receive the filled value. We expose\n   * them here so the view can paint a red dashed outline — a visual cue that\n   * the fill is skipping that column.\n   */\n  isCellInFillRejectRange(row: number, col: number): boolean {\n    const anchor = this.state.fillAnchor();\n    const target = this.state.fillTarget();\n    if (!anchor || !target) return false;\n    if (anchor.row === target.row && anchor.col === target.col) return false;\n\n    const vertical = target.col === anchor.col;\n    if (vertical) return false; // vertical fills stay on the anchor column\n\n    if (row !== anchor.row) return false;\n    const minCol = Math.min(anchor.col, target.col);\n    const maxCol = Math.max(anchor.col, target.col);\n    if (col < minCol || col > maxCol) return false;\n    // Reject if non-editable OR editable but type-incompatible with anchor\n    return !this.isColEditable(col) || !this.isColTypeCompatible(anchor.col, col);\n  }\n\n  private isColEditable(colIndex: number): boolean {\n    const cols = this.state.visibleColumns();\n    const colEntry = cols[colIndex];\n    if (!colEntry) return false;\n    const def = this.state.columnDefMap().get(colEntry.field);\n    return def?.editable === true;\n  }\n\n  /**\n   * Returns the effective editor type for a column index.\n   * Falls back to 'text' when no explicit cellEditor is defined.\n   */\n  private getColEditorType(colIndex: number): string {\n    const cols = this.state.visibleColumns();\n    const colEntry = cols[colIndex];\n    if (!colEntry) return 'text';\n    const def = this.state.columnDefMap().get(colEntry.field);\n    return def?.cellEditor ?? 'text';\n  }\n\n  /**\n   * Checks whether the source column's editor type is compatible with the\n   * target column's editor type for a horizontal fill operation.\n   * text↔text, number↔number, select↔select, etc. — only same-type is allowed.\n   */\n  private isColTypeCompatible(sourceCol: number, targetCol: number): boolean {\n    return this.getColEditorType(sourceCol) === this.getColEditorType(targetCol);\n  }\n\n  private moveBy(dRow: number, dCol: number): void {\n    const focused = this.state.focusedCell();\n    if (!focused) return;\n\n    // Clamp to the global row range of the current page\n    const pageStart = this.state.pageIndex() * this.state.pageSize();\n    const pageEnd = pageStart + Math.max(0, this.state.visibleRowCount() - 1);\n    const maxCol = this.state.visibleColumns().length - 1;\n    const newRow = Math.max(pageStart, Math.min(pageEnd, focused.row + dRow));\n    const newCol = Math.max(0, Math.min(maxCol, focused.col + dCol));\n\n    this.focusCell(newRow, newCol, 'keyboard');\n  }\n\n  getNormalizedRange(): CellRange | null {\n    const range = this.state.cellRange();\n    if (!range) {\n      const focused = this.state.focusedCell();\n      if (!focused) return null;\n      return { start: focused, end: focused };\n    }\n    return {\n      start: {\n        row: Math.min(range.start.row, range.end.row),\n        col: Math.min(range.start.col, range.end.col),\n      },\n      end: {\n        row: Math.max(range.start.row, range.end.row),\n        col: Math.max(range.start.col, range.end.col),\n      },\n    };\n  }\n}\n","import { Injectable, inject, signal, computed } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\nimport { CellError } from '../models/cell.model';\n\n@Injectable()\nexport class CellValidationEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n\n  /** Map<\"rowIndex:field\", CellError> */\n  readonly cellErrors = signal<Map<string, CellError>>(new Map());\n\n  /** Number of cells currently in error */\n  readonly errorCount = computed(() => this.cellErrors().size);\n\n  /** Revalidate all cells for the given data slice */\n  validateAll(data: T[]): void {\n    const defMap = this.state.columnDefMap();\n    const errors = new Map<string, CellError>();\n\n    for (let rowIndex = 0; rowIndex < data.length; rowIndex++) {\n      const row = data[rowIndex];\n      for (const [field, def] of defMap) {\n        if (!def.cellValidator) continue;\n        const value = (row as Record<string, unknown>)[field];\n        const error = def.cellValidator(value, row);\n        if (error) {\n          errors.set(`${rowIndex}:${field}`, error);\n        }\n      }\n    }\n\n    this.cellErrors.set(errors);\n  }\n\n  /** Revalidate a single cell */\n  validateCell(rowIndex: number, field: string, value: unknown, row: T): void {\n    const defMap = this.state.columnDefMap();\n    const def = defMap.get(field);\n    if (!def?.cellValidator) {\n      // Remove any previous error if validator was removed\n      this.removeCellError(rowIndex, field);\n      return;\n    }\n\n    const error = def.cellValidator(value, row);\n    const key = `${rowIndex}:${field}`;\n\n    this.cellErrors.update((map) => {\n      const next = new Map(map);\n      if (error) {\n        next.set(key, error);\n      } else {\n        next.delete(key);\n      }\n      return next;\n    });\n  }\n\n  /** Get the error for a specific cell, or null */\n  getCellError(rowIndex: number, field: string): CellError | null {\n    return this.cellErrors().get(`${rowIndex}:${field}`) ?? null;\n  }\n\n  /** Check if a specific cell has an error */\n  hasCellError(rowIndex: number, field: string): boolean {\n    return this.cellErrors().has(`${rowIndex}:${field}`);\n  }\n\n  /** Clear all errors */\n  clearAll(): void {\n    this.cellErrors.set(new Map());\n  }\n\n  private removeCellError(rowIndex: number, field: string): void {\n    const key = `${rowIndex}:${field}`;\n    if (this.cellErrors().has(key)) {\n      this.cellErrors.update((map) => {\n        const next = new Map(map);\n        next.delete(key);\n        return next;\n      });\n    }\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { CellSelectionEngine } from './cell-selection.engine';\nimport { InlineEditEngine } from './inline-edit.engine';\nimport { GridStateManager } from '../state/grid-state';\n\n/**\n * Actions that require grid-level orchestration (event emission, clipboard\n * system access, async, UI refocus). The keyboard engine can run pure\n * navigation locally, but bounces these back to the host component.\n */\nexport interface KeyboardActions {\n  copy: () => void;\n  paste: () => void;\n  cut: () => void;\n  deleteRange: () => void;\n  undo: () => void;\n  redo: () => void;\n  fillDown: () => void;\n  fillRight: () => void;\n  startEdit: (row: number, col: number, initialChar?: string) => void;\n}\n\n@Injectable()\nexport class KeyboardEngine<T = unknown> {\n  private readonly cellSelection = inject<CellSelectionEngine<T>>(CellSelectionEngine);\n  private readonly inlineEdit = inject<InlineEditEngine<T>>(InlineEditEngine);\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n\n  private actions: KeyboardActions | null = null;\n\n  registerActions(actions: KeyboardActions): void {\n    this.actions = actions;\n  }\n\n  handleKeydown(event: KeyboardEvent): void {\n    // Edit-mode keys are handled by MozGridComponent.handleEditModeKeydown;\n    // this engine only owns navigation + shortcuts in non-editing state.\n    if (this.state.cellEditState().editingCell !== null) return;\n\n    const focused = this.state.focusedCell();\n    if (!focused) return;\n\n    if (this.dispatch(event, focused)) {\n      event.preventDefault();\n    }\n  }\n\n  /** Returns true when the event was handled (so the caller should preventDefault). */\n  private dispatch(event: KeyboardEvent, focused: { row: number; col: number }): boolean {\n    const mod = event.ctrlKey || event.metaKey;\n    const shift = event.shiftKey;\n    const alt = event.altKey;\n    const key = event.key;\n\n    // ---- Clipboard / history shortcuts --------------------------------------\n    if (mod && !shift && !alt) {\n      switch (key.toLowerCase()) {\n        case 'c':\n          this.actions?.copy();\n          return true;\n        case 'v':\n          this.actions?.paste();\n          return true;\n        case 'x':\n          this.actions?.cut();\n          return true;\n        case 'z':\n          this.actions?.undo();\n          return true;\n        case 'y':\n          this.actions?.redo();\n          return true;\n        case 'a':\n          this.cellSelection.selectAll();\n          return true;\n        case 'd':\n          this.actions?.fillDown();\n          return true;\n        case 'r':\n          this.actions?.fillRight();\n          return true;\n      }\n    }\n    if (mod && shift && !alt && key.toLowerCase() === 'z') {\n      this.actions?.redo();\n      return true;\n    }\n\n    // ---- Whole row / column selection ---------------------------------------\n    if (key === ' ') {\n      if (mod && shift) {\n        this.cellSelection.selectAll();\n        return true;\n      }\n      if (mod) {\n        this.cellSelection.selectColumn(focused.col);\n        return true;\n      }\n      if (shift) {\n        this.cellSelection.selectRow(focused.row);\n        return true;\n      }\n    }\n\n    // ---- Delete / Backspace: clear cells ------------------------------------\n    if (key === 'Delete' || key === 'Backspace') {\n      this.actions?.deleteRange();\n      return true;\n    }\n\n    // ---- Arrow keys ---------------------------------------------------------\n    if (key === 'ArrowUp' || key === 'ArrowDown' || key === 'ArrowLeft' || key === 'ArrowRight') {\n      return this.handleArrow(key, { mod, shift });\n    }\n\n    // ---- Home / End / PageUp / PageDown -------------------------------------\n    if (key === 'Home') {\n      if (mod && shift) this.cellSelection.extendRangeToGridStart();\n      else if (mod) this.cellSelection.moveToGridStart();\n      else if (shift) this.cellSelection.extendRangeToRowStart();\n      else this.cellSelection.moveToRowStart();\n      return true;\n    }\n    if (key === 'End') {\n      if (mod && shift) this.cellSelection.extendRangeToGridEnd();\n      else if (mod) this.cellSelection.moveToGridEnd();\n      else if (shift) this.cellSelection.extendRangeToRowEnd();\n      else this.cellSelection.moveToRowEnd();\n      return true;\n    }\n    if (key === 'PageUp') {\n      if (shift) this.cellSelection.extendRangeByPage('up');\n      else this.cellSelection.movePage('up');\n      return true;\n    }\n    if (key === 'PageDown') {\n      if (shift) this.cellSelection.extendRangeByPage('down');\n      else this.cellSelection.movePage('down');\n      return true;\n    }\n\n    // ---- Tab / Enter / F2 / Escape ------------------------------------------\n    if (key === 'Tab') {\n      if (shift) this.cellSelection.moveLeft();\n      else this.cellSelection.moveRight();\n      return true;\n    }\n    if (key === 'Enter') {\n      const col = this.state.visibleColumns()[focused.col];\n      const def = col ? this.state.columnDefMap().get(col.field) : undefined;\n      if (def?.editable) {\n        this.actions?.startEdit(focused.row, focused.col);\n        return true;\n      }\n      if (shift) this.cellSelection.moveUp();\n      else this.cellSelection.moveDown();\n      return true;\n    }\n    if (key === 'F2') {\n      this.actions?.startEdit(focused.row, focused.col);\n      return true;\n    }\n    if (key === 'Escape') {\n      this.cellSelection.clearFocus();\n      return true;\n    }\n\n    // ---- Typing-to-edit -----------------------------------------------------\n    if (!mod && !alt && this.isPrintableKey(event)) {\n      this.actions?.startEdit(focused.row, focused.col, key);\n      return true;\n    }\n\n    return false;\n  }\n\n  private handleArrow(\n    key: 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight',\n    mods: { mod: boolean; shift: boolean },\n  ): boolean {\n    const dir = key === 'ArrowUp' ? 'up' : key === 'ArrowDown' ? 'down' : key === 'ArrowLeft' ? 'left' : 'right';\n\n    if (mods.mod && mods.shift) {\n      this.cellSelection.extendRangeJumpToEdge(dir);\n      return true;\n    }\n    if (mods.mod) {\n      this.cellSelection.jumpToEdge(dir);\n      return true;\n    }\n    if (mods.shift) {\n      const dRow = dir === 'up' ? -1 : dir === 'down' ? 1 : 0;\n      const dCol = dir === 'left' ? -1 : dir === 'right' ? 1 : 0;\n      this.cellSelection.extendRangeBy(dRow, dCol);\n      return true;\n    }\n\n    switch (dir) {\n      case 'up':\n        this.cellSelection.moveUp();\n        break;\n      case 'down':\n        this.cellSelection.moveDown();\n        break;\n      case 'left':\n        this.cellSelection.moveLeft();\n        break;\n      case 'right':\n        this.cellSelection.moveRight();\n        break;\n    }\n    return true;\n  }\n\n  /**\n   * A key press is \"printable\" when it represents exactly one character that\n   * the user intends as input — excluding named keys like F1, Home, Arrow*,\n   * etc. Also excludes IME composition events (event.isComposing).\n   */\n  private isPrintableKey(event: KeyboardEvent): boolean {\n    if (event.isComposing) return false;\n    if (event.key.length !== 1) return false;\n    // Guard against NUL / control characters slipping through on some layouts.\n    const code = event.key.charCodeAt(0);\n    return code >= 32 && code !== 127;\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\n\n@Injectable()\nexport class ColumnReorderEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n\n  reorder(previousIndex: number, newIndex: number): void {\n    if (previousIndex === newIndex) return;\n\n    this.state.columnStates.update((states) => {\n      const reordered = [...states];\n      const [moved] = reordered.splice(previousIndex, 1);\n      reordered.splice(newIndex, 0, moved);\n      return reordered.map((s, i) => ({ ...s, order: i }));\n    });\n  }\n\n  /**\n   * Reorder using indices relative to unpinned columns only.\n   * Translates to global columnStates indices before applying.\n   */\n  reorderUnpinned(unpinnedPrevIndex: number, unpinnedNewIndex: number): void {\n    if (unpinnedPrevIndex === unpinnedNewIndex) return;\n\n    const states = this.state.columnStates();\n    const sorted = [...states].sort((a, b) => a.order - b.order);\n    const visible = sorted.filter((s) => s.visible);\n    const unpinned = visible.filter((s) => !s.pinned);\n\n    const prevField = unpinned[unpinnedPrevIndex]?.field;\n    const nextField = unpinned[unpinnedNewIndex]?.field;\n    if (!prevField || !nextField) return;\n\n    const globalPrev = sorted.findIndex((s) => s.field === prevField);\n    const globalNext = sorted.findIndex((s) => s.field === nextField);\n    if (globalPrev === -1 || globalNext === -1) return;\n\n    this.reorder(globalPrev, globalNext);\n  }\n}\n","import { Injectable, effect, inject } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\n\nconst H_BUFFER_PX = 300;\nconst MIN_COLUMNS_FOR_VIRTUALIZATION = 20;\n\n@Injectable()\nexport class HorizontalVirtualScrollEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n\n  /** Cumulative left offsets of unpinned columns. Length = unpinnedColumns.length + 1. */\n  private offsets: number[] = [0];\n\n  constructor() {\n    effect(\n      () => {\n        // React to column width/order/visibility changes and flag toggling.\n        this.state.unpinnedColumns();\n        const enabled = this.state.horizontalVirtualScrollEnabled();\n        this.rebuildOffsets();\n\n        if (!enabled) {\n          this.fullRange();\n          return;\n        }\n\n        // Column drag temporarily needs every unpinned cell in the DOM so the\n        // drag engine can measure drop targets. We must return BEFORE reading\n        // scrollLeft / scrollViewportWidth — otherwise auto-scroll would feed\n        // scroll events back into this effect on every frame and thrash the\n        // DOM (mount/unmount cycle at 60 fps → browser freeze).\n        if (this.state.draggingColumn() !== null) {\n          this.fullRange();\n          return;\n        }\n\n        this.recompute(this.state.scrollLeft(), this.state.scrollViewportWidth());\n      },\n      { allowSignalWrites: true }\n    );\n  }\n\n  /** Called by grid.ts when the body viewport scrolls or resizes. */\n  onScroll(scrollLeft: number, viewportWidth: number): void {\n    // Skip all signal writes while a column is being dragged — auto-scroll\n    // pushes a scroll event every frame and any write that flows into the\n    // virtualization effect would tear the DOM down and re-render during the\n    // drag.\n    if (this.state.draggingColumn() !== null) return;\n\n    this.state.scrollLeft.set(scrollLeft);\n    this.state.scrollViewportWidth.set(viewportWidth);\n    if (!this.state.horizontalVirtualScrollEnabled()) return;\n    this.recompute(scrollLeft, viewportWidth);\n  }\n\n  rebuildOffsets(): void {\n    const cols = this.state.unpinnedColumns();\n    const next = new Array<number>(cols.length + 1);\n    next[0] = 0;\n    for (let i = 0; i < cols.length; i++) {\n      next[i + 1] = next[i] + cols[i].currentWidth;\n    }\n    this.offsets = next;\n    this.state.scrollContentTotalWidth.set(next[next.length - 1] ?? 0);\n  }\n\n  private recompute(scrollLeft: number, viewportWidth: number): void {\n    const total = this.state.unpinnedColumns().length;\n    if (total === 0) {\n      this.setRange(0, 0);\n      return;\n    }\n    if (total < MIN_COLUMNS_FOR_VIRTUALIZATION || viewportWidth <= 0) {\n      this.setRange(0, total);\n      return;\n    }\n\n    const viewStart = Math.max(0, scrollLeft - H_BUFFER_PX);\n    const viewEnd = scrollLeft + viewportWidth + H_BUFFER_PX;\n\n    const start = this.findIndexAt(viewStart);\n    const end = Math.min(total, this.findIndexAt(viewEnd) + 1);\n    this.setRange(Math.max(0, start), Math.max(start + 1, end));\n  }\n\n  /** Binary search: returns the largest index i such that offsets[i] <= x. */\n  private findIndexAt(x: number): number {\n    const offsets = this.offsets;\n    let lo = 0;\n    let hi = offsets.length - 1;\n    while (lo < hi) {\n      const mid = (lo + hi + 1) >>> 1;\n      if (offsets[mid] <= x) lo = mid;\n      else hi = mid - 1;\n    }\n    return lo;\n  }\n\n  private fullRange(): void {\n    const total = this.state.unpinnedColumns().length;\n    this.setRange(0, total);\n  }\n\n  private setRange(start: number, end: number): void {\n    const current = this.state.visibleColumnRange();\n    if (current.start === start && current.end === end) return;\n    this.state.visibleColumnRange.set({ start, end });\n  }\n}\n","import { Injectable, inject, NgZone } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\nimport { ColumnReorderEngine } from './column-reorder.engine';\nimport { HorizontalVirtualScrollEngine } from './horizontal-virtual-scroll.engine';\n\n/** Minimum pixels of mouse movement before a drag is initiated */\nconst DRAG_THRESHOLD = 5;\n\n/** Distance from edge in px at which auto-scroll activates */\nconst AUTO_SCROLL_ZONE = 60;\n\n/** Max scroll speed in px/frame */\nconst AUTO_SCROLL_SPEED = 12;\n\n@Injectable()\nexport class ColumnDragEngine {\n  private readonly ngZone = inject(NgZone);\n  private readonly state = inject(GridStateManager);\n  private readonly reorderEngine = inject(ColumnReorderEngine);\n  private readonly hvScrollEngine = inject(HorizontalVirtualScrollEngine);\n\n  // --- Pending state (before threshold is met) ---\n  private pending = false;\n  private startX = 0;\n  private startY = 0;\n  private pendingSourceIndex = -1;\n  private pendingHeaderRow: HTMLElement | null = null;\n\n  // --- Active drag state (after threshold is met) ---\n  private active = false;\n  private originalIndex = -1;\n  private headerRow: HTMLElement | null = null;\n  private ghostEl: HTMLElement | null = null;\n  private ghostOffsetX = 0;\n  private ghostOffsetY = 0;\n\n  // Full-height drop indicator\n  private dropLineEl: HTMLElement | null = null;\n\n  // Auto-scroll state\n  private scrollEl: HTMLElement | null = null;\n  private autoScrollRafId: number | null = null;\n  private autoScrollDirection = 0; // -1 left, 0 none, 1 right\n\n  private onMoveHandler = (e: MouseEvent) => this.onMouseMove(e);\n  private onUpHandler = () => this.onMouseUp();\n\n  /** Callback set by the header component to emit the reorder event */\n  onReorder: ((previousIndex: number, currentIndex: number) => void) | null = null;\n\n  /**\n   * Called on mousedown on a header cell.\n   * Does NOT preventDefault — this allows normal click/sort to work.\n   * Only registers mousemove/mouseup listeners to detect drag.\n   */\n  startDrag(event: MouseEvent, sourceIndex: number, headerRow: HTMLElement): void {\n    this.pending = true;\n    this.startX = event.clientX;\n    this.startY = event.clientY;\n    this.pendingSourceIndex = sourceIndex;\n    this.pendingHeaderRow = headerRow;\n\n    this.ngZone.runOutsideAngular(() => {\n      document.addEventListener('mousemove', this.onMoveHandler);\n      document.addEventListener('mouseup', this.onUpHandler);\n    });\n  }\n\n  private activateDrag(): void {\n    this.pending = false;\n    this.active = true;\n    this.originalIndex = this.pendingSourceIndex;\n    this.headerRow = this.pendingHeaderRow;\n\n    document.body.style.cursor = 'grabbing';\n    document.body.style.userSelect = 'none';\n\n    const cols = this.state.unpinnedColumns();\n    if (cols[this.originalIndex]) {\n      this.ngZone.run(() => {\n        this.state.draggingColumn.set(cols[this.originalIndex].field);\n      });\n    }\n\n    this.createGhost();\n  }\n\n  private createGhost(): void {\n    if (!this.headerRow) return;\n    const headerCells = this.queryUnpinnedHeaderCells();\n    // `originalIndex` is the absolute index in state.unpinnedColumns(); the\n    // DOM only renders the virtualized window, so subtract its start offset.\n    const localIndex = this.originalIndex - this.state.effectiveColumnRange().start;\n    const sourceCell = headerCells[localIndex];\n    if (!sourceCell) return;\n\n    const rect = sourceCell.getBoundingClientRect();\n\n    // Read the canonical width from state instead of the rect: when the\n    // source cell happens to be the last rendered cell with `isLast=true`\n    // (flex: 1 0 auto, no fixed width), the rect reflects flex stretching\n    // and the ghost would span the entire scrollable width.\n    const sourceCol = this.state.unpinnedColumns()[this.originalIndex];\n    const width = sourceCol?.currentWidth ?? rect.width;\n\n    // Clamp the click offset to the ghost's actual width so the cursor stays\n    // over the ghost when the source was rendered wider than `currentWidth`.\n    this.ghostOffsetX = Math.min(this.startX - rect.left, width);\n    this.ghostOffsetY = this.startY - rect.top;\n\n    const ghost = sourceCell.cloneNode(true) as HTMLElement;\n    ghost.style.cssText = `\n      position: fixed;\n      top: ${rect.top}px;\n      left: ${rect.left}px;\n      width: ${width}px;\n      height: ${rect.height}px;\n      opacity: 0.92;\n      z-index: 10000;\n      pointer-events: none;\n      box-shadow: 0 8px 24px rgba(0,0,0,0.22), 0 2px 8px rgba(0,0,0,0.12);\n      border-radius: 6px;\n      background: var(--color-background-primary, #fff);\n      border: 2px solid var(--color-background-accent-inverse);\n      transition: none;\n    `;\n    document.body.appendChild(ghost);\n    this.ghostEl = ghost;\n\n    sourceCell.style.opacity = '0.2';\n  }\n\n  private moveGhost(clientX: number, clientY: number): void {\n    if (!this.ghostEl) return;\n    this.ghostEl.style.left = `${clientX - this.ghostOffsetX}px`;\n    this.ghostEl.style.top = `${clientY - this.ghostOffsetY}px`;\n  }\n\n  private removeGhost(): void {\n    if (this.ghostEl) {\n      this.ghostEl.remove();\n      this.ghostEl = null;\n    }\n    if (this.headerRow) {\n      const cells = this.queryUnpinnedHeaderCells();\n      for (const cell of cells) {\n        cell.style.opacity = '';\n      }\n    }\n  }\n\n  /** Returns the unpinned (i.e. reorderable) header cells in render order.\n   * Filters out pinned-left/right cells which use `position: sticky` and\n   * carry the `grid-header-cell-host--pinned` host class. */\n  private queryUnpinnedHeaderCells(): HTMLElement[] {\n    if (!this.headerRow) return [];\n    return Array.from(\n      this.headerRow.querySelectorAll<HTMLElement>(\n        'moz-grid-header-cell:not(.grid-header-cell-host--pinned)',\n      ),\n    );\n  }\n\n  private onMouseMove(event: MouseEvent): void {\n    if (this.pending && !this.active) {\n      const dx = event.clientX - this.startX;\n      const dy = event.clientY - this.startY;\n      if (Math.abs(dx) + Math.abs(dy) < DRAG_THRESHOLD) return;\n      this.activateDrag();\n    }\n\n    if (!this.active || !this.headerRow) return;\n\n    this.moveGhost(event.clientX, event.clientY);\n    this.updateAutoScroll(event.clientX);\n\n    const headerCells = this.queryUnpinnedHeaderCells();\n    const rangeStart = this.state.effectiveColumnRange().start;\n    const cursorX = event.clientX;\n\n    // Drop indices are absolute (relative to state.unpinnedColumns()), so\n    // translate the local DOM index back to the absolute frame. While a\n    // drag is active the virtualization engine forces `fullRange()`, so the\n    // DOM holds every unpinned cell and start offset is 0 in practice — but\n    // we keep the translation explicit in case the effect hasn't flushed.\n    let dropIndex: number | null = null;\n    for (let i = 0; i < headerCells.length; i++) {\n      const rect = headerCells[i].getBoundingClientRect();\n      const midX = rect.left + rect.width / 2;\n\n      if (cursorX < midX) {\n        dropIndex = rangeStart + i;\n        break;\n      }\n    }\n\n    // If cursor is past the last rendered cell, drop at the very end.\n    if (dropIndex === null) {\n      dropIndex = rangeStart + headerCells.length;\n    }\n\n    // Don't show indicator at the source column's own position or immediately after it\n    if (dropIndex === this.originalIndex || dropIndex === this.originalIndex + 1) {\n      dropIndex = null;\n    }\n\n    const current = this.state.dropIndicatorIndex();\n    if (current !== dropIndex) {\n      this.ngZone.run(() => {\n        this.state.dropIndicatorIndex.set(dropIndex);\n      });\n    }\n\n    // Position the full-height drop indicator line\n    this.updateDropLine(dropIndex, headerCells);\n  }\n\n  private onMouseUp(): void {\n    document.removeEventListener('mousemove', this.onMoveHandler);\n    document.removeEventListener('mouseup', this.onUpHandler);\n\n    if (!this.active) {\n      this.cleanup();\n      return;\n    }\n\n    document.body.style.cursor = '';\n    document.body.style.userSelect = '';\n    this.removeGhost();\n\n    const prevIdx = this.originalIndex;\n    const dropIdx = this.state.dropIndicatorIndex();\n\n    // Auto-scroll moved the viewport while state.scrollLeft was frozen (see\n    // HorizontalVirtualScrollEngine.onScroll). Push the real DOM scroll\n    // position into state in the same tick as we clear draggingColumn —\n    // otherwise the virtualization effect reruns with a stale scrollLeft and\n    // renders a column range that doesn't match what the user is looking at.\n    const scrollEl = this.scrollEl;\n    this.ngZone.run(() => {\n      if (scrollEl) {\n        this.state.scrollLeft.set(scrollEl.scrollLeft);\n        this.state.scrollViewportWidth.set(scrollEl.clientWidth);\n      }\n      this.state.draggingColumn.set(null);\n      this.state.dropIndicatorIndex.set(null);\n    });\n\n    this.cleanup();\n\n    if (dropIdx !== null && dropIdx !== prevIdx && dropIdx !== prevIdx + 1) {\n      // Adjust target index: if dropping after the source, subtract 1\n      // because the source will be removed first\n      const targetIndex = dropIdx > prevIdx ? dropIdx - 1 : dropIdx;\n      this.ngZone.run(() => {\n        this.reorderEngine.reorderUnpinned(prevIdx, targetIndex);\n        this.onReorder?.(prevIdx, targetIndex);\n      });\n    }\n  }\n\n  // ── Drop line (full-height indicator) ─────────────────────\n\n  private updateDropLine(dropIndex: number | null, headerCells: HTMLElement[]): void {\n    if (dropIndex === null) {\n      this.removeDropLine();\n      return;\n    }\n\n    // Translate the absolute drop index back to the local DOM index.\n    const rangeStart = this.state.effectiveColumnRange().start;\n    const localDropIndex = dropIndex - rangeStart;\n\n    // Get the x position of the drop boundary\n    let lineX: number;\n    if (localDropIndex >= 0 && localDropIndex < headerCells.length) {\n      const rect = headerCells[localDropIndex].getBoundingClientRect();\n      lineX = rect.left;\n    } else if (headerCells.length > 0) {\n      const rect = headerCells[headerCells.length - 1].getBoundingClientRect();\n      lineX = rect.right;\n    } else {\n      this.removeDropLine();\n      return;\n    }\n\n    // The grid container itself is now the scroll viewport (no more nested\n    // cdk-virtual-scroll-viewport). Use it as the reference rectangle.\n    const grid = this.headerRow?.closest('.moz-grid');\n    if (!grid) return;\n    const gridRect = grid.getBoundingClientRect();\n\n    if (!this.dropLineEl) {\n      this.dropLineEl = document.createElement('div');\n      this.dropLineEl.style.cssText = `\n        position: fixed;\n        width: 3px;\n        background: var(--color-background-accent-inverse);\n        z-index: 10001;\n        pointer-events: none;\n        border-radius: 2px;\n      `;\n      document.body.appendChild(this.dropLineEl);\n    }\n\n    this.dropLineEl.style.left = `${lineX - 1}px`;\n    this.dropLineEl.style.top = `${gridRect.top}px`;\n    this.dropLineEl.style.height = `${gridRect.height}px`;\n  }\n\n  private removeDropLine(): void {\n    if (this.dropLineEl) {\n      this.dropLineEl.remove();\n      this.dropLineEl = null;\n    }\n  }\n\n  // ── Auto-scroll helpers ──────────────────────────────────\n\n  private findScrollElement(): HTMLElement | null {\n    if (!this.headerRow) return null;\n    // The actual scroll viewport is `.moz-grid__scroll` — the outer\n    // `.moz-grid` is non-scrollable layout chrome. Reading scrollLeft on\n    // the wrong element would always return 0 and feed a stale value into\n    // the virtualization recompute on mouseup.\n    return (this.headerRow.closest('.moz-grid__scroll') as HTMLElement | null) ?? null;\n  }\n\n  private updateAutoScroll(clientX: number): void {\n    if (!this.scrollEl) {\n      this.scrollEl = this.findScrollElement();\n    }\n    if (!this.scrollEl) return;\n\n    const rect = this.scrollEl.getBoundingClientRect();\n    const distFromLeft = clientX - rect.left;\n    const distFromRight = rect.right - clientX;\n\n    if (distFromLeft < AUTO_SCROLL_ZONE) {\n      this.autoScrollDirection = -1;\n    } else if (distFromRight < AUTO_SCROLL_ZONE) {\n      this.autoScrollDirection = 1;\n    } else {\n      this.autoScrollDirection = 0;\n    }\n\n    if (this.autoScrollDirection !== 0 && this.autoScrollRafId === null) {\n      this.startAutoScroll();\n    } else if (this.autoScrollDirection === 0) {\n      this.stopAutoScroll();\n    }\n  }\n\n  private startAutoScroll(): void {\n    const tick = () => {\n      if (!this.scrollEl || this.autoScrollDirection === 0) {\n        this.stopAutoScroll();\n        return;\n      }\n      this.scrollEl.scrollLeft += this.autoScrollDirection * AUTO_SCROLL_SPEED;\n      this.autoScrollRafId = requestAnimationFrame(tick);\n    };\n    this.autoScrollRafId = requestAnimationFrame(tick);\n  }\n\n  private stopAutoScroll(): void {\n    if (this.autoScrollRafId !== null) {\n      cancelAnimationFrame(this.autoScrollRafId);\n      this.autoScrollRafId = null;\n    }\n    this.autoScrollDirection = 0;\n  }\n\n  private cleanup(): void {\n    this.stopAutoScroll();\n    this.removeDropLine();\n    this.pending = false;\n    this.active = false;\n    this.originalIndex = -1;\n    this.headerRow = null;\n    this.pendingHeaderRow = null;\n    this.ghostEl = null;\n    this.scrollEl = null;\n  }\n}\n","import { computed, inject, Injectable } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\n\n@Injectable()\nexport class ExpandableRowEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n\n  readonly hasExpandedRows = computed(() => this.state.expandedRowIds().size > 0);\n\n  toggleRow(rowId: unknown): void {\n    this.state.expandedRowIds.update((ids) => {\n      const next = new Set(ids);\n      if (next.has(rowId)) {\n        next.delete(rowId);\n      } else {\n        next.add(rowId);\n      }\n      return next;\n    });\n  }\n\n  expandRow(rowId: unknown): void {\n    this.state.expandedRowIds.update((ids) => {\n      const next = new Set(ids);\n      next.add(rowId);\n      return next;\n    });\n  }\n\n  collapseRow(rowId: unknown): void {\n    this.state.expandedRowIds.update((ids) => {\n      const next = new Set(ids);\n      next.delete(rowId);\n      return next;\n    });\n  }\n\n  collapseAll(): void {\n    this.state.expandedRowIds.set(new Set());\n  }\n\n  isRowExpanded(rowId: unknown): boolean {\n    return this.state.expandedRowIds().has(rowId);\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\nimport { SortDirection } from '../models/column.model';\nimport { SortDef } from '../models/sort.model';\nimport { FilterCondition, generateConditionId } from '../models/filter.model';\n\nexport interface PersistedGridState {\n  columns: Array<{\n    field: string;\n    currentWidth: number;\n    order: number;\n    visible: boolean;\n    pinned: 'start' | 'end' | null;\n  }>;\n  sorts: SortDef[];\n  /** Serialised filter conditions. `id` is regenerated on restore. */\n  filters?: Array<Omit<FilterCondition, 'id'>>;\n}\n\n@Injectable()\nexport class StatePersistenceEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n\n  save(storageKey: string): void {\n    const persisted: PersistedGridState = {\n      columns: this.state.columnStates().map((col) => ({\n        field: col.field,\n        currentWidth: col.currentWidth,\n        order: col.order,\n        visible: col.visible,\n        pinned: col.pinned,\n      })),\n      sorts: this.state.activeSorts(),\n      filters: this.state.filterModel().conditions.map((condition) => {\n        const { id, ...rest } = condition;\n        void id;\n        return rest;\n      }),\n    };\n\n    try {\n      localStorage.setItem(storageKey, JSON.stringify(persisted));\n    } catch {\n      // localStorage may be unavailable or full\n    }\n  }\n\n  restore(storageKey: string): boolean {\n    try {\n      const raw = localStorage.getItem(storageKey);\n      if (!raw) return false;\n\n      const persisted: PersistedGridState = JSON.parse(raw);\n      if (!persisted.columns?.length) return false;\n\n      this.state.columnStates.update((currentStates) => {\n        return currentStates.map((col) => {\n          const saved = persisted.columns.find((s) => s.field === col.field);\n          if (!saved) return col;\n          return {\n            ...col,\n            currentWidth: saved.currentWidth,\n            order: saved.order,\n            visible: saved.visible,\n            pinned: saved.pinned,\n          };\n        });\n      });\n\n      if (persisted.sorts?.length) {\n        this.state.activeSorts.set(persisted.sorts);\n        this.state.columnStates.update((states) =>\n          states.map((s) => {\n            const sortDef = persisted.sorts.find((sd) => sd.field === s.field);\n            return sortDef\n              ? {\n                  ...s,\n                  sort: sortDef.direction as SortDirection,\n                  sortIndex: persisted.sorts.indexOf(sortDef),\n                }\n              : { ...s, sort: null as SortDirection, sortIndex: null };\n          })\n        );\n      }\n\n      if (persisted.filters?.length) {\n        this.state.filterModel.set({\n          conditions: persisted.filters.map((f) => ({ ...f, id: generateConditionId() })),\n        });\n      }\n\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  clear(storageKey: string): void {\n    try {\n      localStorage.removeItem(storageKey);\n    } catch {\n      // localStorage may be unavailable\n    }\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\n\nexport interface ExportOptions {\n  filename?: string;\n  separator?: string;\n  includeHeaders?: boolean;\n  columns?: string[];\n}\n\n@Injectable()\nexport class ExportEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n\n  exportCsv(data: T[], options: ExportOptions = {}): void {\n    const {\n      filename = 'export',\n      separator = ',',\n      includeHeaders = true,\n      columns,\n    } = options;\n\n    const visibleColumns = columns\n      ? this.state.visibleColumns().filter((c) => columns.includes(c.field))\n      : this.state.visibleColumns();\n\n    const defMap = this.state.columnDefMap();\n    const lines: string[] = [];\n\n    if (includeHeaders) {\n      const headerRow = visibleColumns\n        .map((col) => this.escapeCsvValue(defMap.get(col.field)?.headerName ?? col.field, separator))\n        .join(separator);\n      lines.push(headerRow);\n    }\n\n    for (const row of data) {\n      const values = visibleColumns.map((col) => {\n        const def = defMap.get(col.field);\n        let value: unknown;\n        if (def?.valueGetter) {\n          value = def.valueGetter(row);\n        } else {\n          value = (row as Record<string, unknown>)[col.field];\n        }\n        if (def?.valueFormatter) {\n          return this.escapeCsvValue(def.valueFormatter(value, row), separator);\n        }\n        return this.escapeCsvValue(String(value ?? ''), separator);\n      });\n      lines.push(values.join(separator));\n    }\n\n    const csvContent = lines.join('\\n');\n    this.downloadFile(`${filename}.csv`, csvContent, 'text/csv;charset=utf-8;');\n  }\n\n  exportJson(data: T[], options: { filename?: string; columns?: string[] } = {}): void {\n    const { filename = 'export', columns } = options;\n\n    const visibleColumns = columns\n      ? this.state.visibleColumns().filter((c) => columns.includes(c.field))\n      : this.state.visibleColumns();\n\n    const fields = visibleColumns.map((c) => c.field);\n    const defMap = this.state.columnDefMap();\n\n    const exportData = data.map((row) => {\n      const obj: Record<string, unknown> = {};\n      for (const field of fields) {\n        const def = defMap.get(field);\n        if (def?.valueGetter) {\n          obj[field] = def.valueGetter(row);\n        } else {\n          obj[field] = (row as Record<string, unknown>)[field];\n        }\n      }\n      return obj;\n    });\n\n    const jsonContent = JSON.stringify(exportData, null, 2);\n    this.downloadFile(`${filename}.json`, jsonContent, 'application/json;charset=utf-8;');\n  }\n\n  private escapeCsvValue(value: string, separator: string): string {\n    if (value.includes(separator) || value.includes('\"') || value.includes('\\n')) {\n      return `\"${value.replace(/\"/g, '\"\"')}\"`;\n    }\n    return value;\n  }\n\n  private downloadFile(filename: string, content: string, mimeType: string): void {\n    const blob = new Blob([content], { type: mimeType });\n    const url = URL.createObjectURL(blob);\n    const link = document.createElement('a');\n    link.href = url;\n    link.download = filename;\n    link.style.display = 'none';\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n    URL.revokeObjectURL(url);\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\n\nexport interface TreeNodeConfig {\n  childrenField: string;\n  hasChildrenField?: string;\n  expandedByDefault?: boolean;\n}\n\nexport interface TreeDisplayRow<T = unknown> {\n  type: 'data';\n  data: T;\n  index: number;\n  depth: number;\n  hasChildren: boolean;\n  expanded: boolean;\n  nodeKey: string;\n}\n\n@Injectable()\nexport class TreeEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n\n  flatten(\n    data: T[],\n    config: TreeNodeConfig,\n    expandedNodes: Set<string>,\n    idField: string\n  ): TreeDisplayRow<T>[] {\n    const rows: TreeDisplayRow<T>[] = [];\n    let index = 0;\n\n    const walk = (items: T[], depth: number, parentKey: string): void => {\n      for (const item of items) {\n        const record = item as Record<string, unknown>;\n        const id = String(record[idField] ?? index);\n        const nodeKey = parentKey ? `${parentKey}/${id}` : id;\n        const children = (record[config.childrenField] as T[] | undefined) ?? [];\n        const hasChildren = config.hasChildrenField\n          ? Boolean(record[config.hasChildrenField])\n          : children.length > 0;\n        const expanded = expandedNodes.has(nodeKey);\n\n        rows.push({\n          type: 'data',\n          data: item,\n          index: index++,\n          depth,\n          hasChildren,\n          expanded,\n          nodeKey,\n        });\n\n        if (hasChildren && expanded) {\n          walk(children, depth + 1, nodeKey);\n        }\n      }\n    };\n\n    walk(data, 0, '');\n    return rows;\n  }\n\n  toggleNode(nodeKey: string): void {\n    this.state.expandedRowIds.update((set) => {\n      const next = new Set(set);\n      if (next.has(nodeKey)) {\n        next.delete(nodeKey);\n      } else {\n        next.add(nodeKey);\n      }\n      return next;\n    });\n  }\n\n  expandAll(data: T[], config: TreeNodeConfig, idField: string): void {\n    const keys = new Set<string>();\n\n    const walk = (items: T[], parentKey: string): void => {\n      for (const item of items) {\n        const record = item as Record<string, unknown>;\n        const id = String(record[idField] ?? '');\n        const nodeKey = parentKey ? `${parentKey}/${id}` : id;\n        const children = (record[config.childrenField] as T[] | undefined) ?? [];\n        if (children.length > 0) {\n          keys.add(nodeKey);\n          walk(children, nodeKey);\n        }\n      }\n    };\n\n    walk(data, '');\n    this.state.expandedRowIds.set(keys as Set<unknown>);\n  }\n\n  collapseAll(): void {\n    this.state.expandedRowIds.set(new Set());\n  }\n}\n","import { Injectable, effect, inject } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\nimport { GridEngine } from '../engine/grid-engine';\n\nconst V_BUFFER_PX = 200;\nconst DEFAULT_EXPANDED_EXTRA_PX = 200;\nconst FALLBACK_VIEWPORT_PX = 600;\n\n/**\n * Custom vertical virtualization that replaces `cdk-virtual-scroll-viewport`.\n *\n * Why custom: CDK's strategy positions visible rows via `transform: translateY`\n * on the content wrapper. `transform` creates a containing block that traps\n * any `position: sticky` descendant, which breaks sticky pinned cells inside\n * data rows. We replace the transform with a height-based top-spacer so the\n * scroll container stays the sticky containing block.\n *\n * The engine is fully signal-driven — two reactive effects run independently:\n * - **Layout effect**: rebuilds the cumulative offset cache whenever the row\n *   layout (count, density, expanded set) changes. Cheap O(n) write.\n * - **Range effect**: re-computes the visible window whenever scrollTop /\n *   viewportHeight / totalRowsHeight changes. O(log n) binary search.\n *\n * Expanded detail rows are measured via a `ResizeObserver` registered by the\n * body component (see `observeRow`).\n */\n@Injectable()\nexport class VerticalVirtualScrollEngine {\n  private readonly state = inject(GridStateManager);\n  private readonly engine = inject(GridEngine);\n\n  /** Cumulative top offsets — length = displayRows.length + 1. */\n  private offsets: number[] = [0];\n  /** Measured extra height for each *expanded* display-row index. */\n  private readonly extraHeight = new Map<number, number>();\n\n  constructor() {\n    // Layout: rebuild offsets when row composition changes.\n    effect(\n      () => {\n        this.engine.displayRows();\n        this.state.rowHeight();\n        this.state.expandedRowIds();\n        this.rebuildOffsets();\n      },\n      { allowSignalWrites: true },\n    );\n\n    // Range: react to scroll/viewport changes and offset rebuilds.\n    effect(\n      () => {\n        this.state.scrollTop();\n        this.state.scrollViewportHeight();\n        this.state.totalRowsHeight();\n        this.recompute();\n      },\n      { allowSignalWrites: true },\n    );\n  }\n\n  /** Called by the grid container's scroll handler. Setters drive the range\n   * effect; we don't recompute synchronously so a scroll burst collapses to\n   * a single recompute per change-detection tick. */\n  onScroll(scrollTop: number, viewportHeight: number): void {\n    if (this.state.scrollTop() !== scrollTop) this.state.scrollTop.set(scrollTop);\n    if (this.state.scrollViewportHeight() !== viewportHeight) {\n      this.state.scrollViewportHeight.set(viewportHeight);\n    }\n  }\n\n  /** Sync read for templates that need the physical height (detail rows). */\n  getRowHeight(index: number): number {\n    return this.state.rowHeight() + (this.extraHeight.get(index) ?? 0);\n  }\n\n  observeRow(absoluteIndex: number, el: HTMLElement, ro: ResizeObserver): void {\n    ro.observe(el);\n    (el as HTMLElement & { __mozRowIndex?: number }).__mozRowIndex = absoluteIndex;\n  }\n\n  onRowsResized(entries: ResizeObserverEntry[]): void {\n    const base = this.state.rowHeight();\n    let changed = false;\n    let scrollAdjust = 0;\n    const firstVisible = this.findIndexAt(this.state.scrollTop());\n\n    for (const entry of entries) {\n      const el = entry.target as HTMLElement & { __mozRowIndex?: number };\n      const idx = el.__mozRowIndex;\n      if (idx === undefined) continue;\n      const measured = entry.borderBoxSize?.[0]?.blockSize ?? el.offsetHeight;\n      const extra = Math.max(0, measured - base);\n      const prev = this.extraHeight.get(idx) ?? 0;\n      if (Math.abs(extra - prev) <= 0.5) continue;\n      const delta = extra - prev;\n      if (extra === 0) this.extraHeight.delete(idx);\n      else this.extraHeight.set(idx, extra);\n      changed = true;\n      if (idx < firstVisible) scrollAdjust += delta;\n    }\n\n    if (!changed) return;\n    this.rebuildOffsets();\n    if (scrollAdjust !== 0) {\n      const next = Math.max(0, this.state.scrollTop() + scrollAdjust);\n      this.state.scrollTop.set(next);\n    }\n  }\n\n  primeExpanded(absoluteIndex: number): void {\n    if (this.extraHeight.has(absoluteIndex)) return;\n    this.extraHeight.set(absoluteIndex, DEFAULT_EXPANDED_EXTRA_PX);\n  }\n\n  private rebuildOffsets(): void {\n    const rows = this.engine.displayRows();\n    const base = this.state.rowHeight();\n    const next = new Array<number>(rows.length + 1);\n    next[0] = 0;\n    for (let i = 0; i < rows.length; i++) {\n      next[i + 1] = next[i] + base + (this.extraHeight.get(i) ?? 0);\n    }\n    this.offsets = next;\n    const total = next[next.length - 1] ?? 0;\n    if (this.state.totalRowsHeight() !== total) this.state.totalRowsHeight.set(total);\n  }\n\n  private recompute(): void {\n    const total = this.engine.displayRows().length;\n    if (total === 0) {\n      this.applyRange(0, 0, 0, 0);\n      return;\n    }\n\n    const scrollTop = this.state.scrollTop();\n    // Use a reasonable fallback when the layout hasn't measured the viewport\n    // yet (initial render). The range will refine itself once the real\n    // viewport height comes in via the scroll handler / ResizeObserver.\n    let viewportHeight = this.state.scrollViewportHeight();\n    if (viewportHeight <= 0) viewportHeight = FALLBACK_VIEWPORT_PX;\n\n    const viewStart = Math.max(0, scrollTop - V_BUFFER_PX);\n    const viewEnd = scrollTop + viewportHeight + V_BUFFER_PX;\n    const start = Math.max(0, this.findIndexAt(viewStart));\n    const end = Math.min(total, this.findIndexAt(viewEnd) + 1);\n    const top = this.offsets[start] ?? 0;\n    const bottom = (this.offsets[total] ?? 0) - (this.offsets[end] ?? 0);\n    this.applyRange(start, Math.max(start + 1, end), top, Math.max(0, bottom));\n  }\n\n  /** Largest index i such that offsets[i] <= x. */\n  private findIndexAt(x: number): number {\n    const offsets = this.offsets;\n    let lo = 0;\n    let hi = offsets.length - 1;\n    while (lo < hi) {\n      const mid = (lo + hi + 1) >>> 1;\n      if (offsets[mid] <= x) lo = mid;\n      else hi = mid - 1;\n    }\n    return lo;\n  }\n\n  private applyRange(start: number, end: number, top: number, bottom: number): void {\n    const cur = this.state.visibleRowRange();\n    if (cur.start !== start || cur.end !== end) {\n      this.state.visibleRowRange.set({ start, end });\n    }\n    if (this.state.topSpacerHeight() !== top) this.state.topSpacerHeight.set(top);\n    if (this.state.bottomSpacerHeight() !== bottom) this.state.bottomSpacerHeight.set(bottom);\n  }\n\n  scrollOffsetForIndex(index: number): number {\n    const i = Math.max(0, Math.min(index, this.offsets.length - 1));\n    return this.offsets[i] ?? 0;\n  }\n}\n","import { Injectable, inject, computed } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\n\n@Injectable()\nexport class PaginationEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n\n  readonly totalPages = computed(() => this.state.totalPages());\n\n  readonly currentPage = computed(() => this.state.pageIndex());\n\n  readonly startItem = computed(() => {\n    return this.state.pageIndex() * this.state.pageSize() + 1;\n  });\n\n  readonly endItem = computed(() => {\n    const total = this.computedTotal();\n    return Math.min((this.state.pageIndex() + 1) * this.state.pageSize(), total);\n  });\n\n  readonly isFirstPage = computed(() => this.state.pageIndex() === 0);\n\n  readonly isLastPage = computed(() => this.state.pageIndex() >= this.totalPages() - 1);\n\n  private readonly computedTotal = computed(() => {\n    return this.state.mode() === 'server'\n      ? this.state.totalItems()\n      : this.state.sourceData().length;\n  });\n\n  goToPage(pageIndex: number): void {\n    if (pageIndex < 0 || pageIndex >= this.totalPages()) return;\n    this.state.pageIndex.set(pageIndex);\n  }\n\n  nextPage(): void {\n    if (!this.isLastPage()) {\n      this.state.pageIndex.update((i) => i + 1);\n    }\n  }\n\n  previousPage(): void {\n    if (!this.isFirstPage()) {\n      this.state.pageIndex.update((i) => i - 1);\n    }\n  }\n\n  setPageSize(size: number): void {\n    this.state.pageSize.set(size);\n    this.state.pageIndex.set(0);\n  }\n}\n","import { Injectable, inject, computed, signal, DestroyRef, NgZone } from '@angular/core';\nimport { GridStateManager } from '../state/grid-state';\nimport { LoadMoreEvent } from '../models/pagination.model';\n\nconst DEFAULT_SCROLL_THRESHOLD = 200;\n\n@Injectable()\nexport class InfiniteScrollEngine<T = unknown> {\n  private readonly state = inject<GridStateManager<T>>(GridStateManager);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly ngZone = inject(NgZone);\n\n  private scrollListener: (() => void) | null = null;\n  private scrollElement: HTMLElement | null = null;\n  private loadMoreCallback: ((event: LoadMoreEvent) => void) | null = null;\n\n  readonly scrollThreshold = signal<number>(DEFAULT_SCROLL_THRESHOLD);\n\n  readonly hasMore = computed(() => this.state.hasMore());\n\n  readonly isActive = computed(() => this.state.loadingStrategy() === 'infinite-scroll');\n\n  attach(\n    scrollElement: HTMLElement,\n    onLoadMore: (event: LoadMoreEvent) => void\n  ): void {\n    this.detach();\n    this.scrollElement = scrollElement;\n    this.loadMoreCallback = onLoadMore;\n\n    const listener = (): void => {\n      this.checkScrollPosition();\n    };\n\n    this.ngZone.runOutsideAngular(() => {\n      scrollElement.addEventListener('scroll', listener, { passive: true });\n    });\n\n    this.scrollListener = (): void => {\n      scrollElement.removeEventListener('scroll', listener);\n    };\n\n    this.destroyRef.onDestroy(() => this.detach());\n  }\n\n  detach(): void {\n    if (this.scrollListener) {\n      this.scrollListener();\n      this.scrollListener = null;\n    }\n    this.scrollElement = null;\n    this.loadMoreCallback = null;\n  }\n\n  private checkScrollPosition(): void {\n    if (!this.scrollElement || !this.loadMoreCallback) return;\n    if (!this.isActive()) return;\n    if (this.state.isLoading()) return;\n    if (!this.hasMore()) return;\n\n    const el = this.scrollElement;\n    const distanceFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight;\n\n    if (distanceFromBottom <= this.scrollThreshold()) {\n      this.ngZone.run(() => {\n        this.loadMoreCallback!({\n          offset: this.state.sourceData().length,\n          limit: this.state.pageSize(),\n        });\n      });\n    }\n  }\n\n  /**\n   * Reset scroll state — called when sort/filter changes require\n   * reloading from offset 0.\n   */\n  reset(onLoadMore: (event: LoadMoreEvent) => void): void {\n    if (this.scrollElement) {\n      this.scrollElement.scrollTop = 0;\n    }\n    onLoadMore({ offset: 0, limit: this.state.pageSize() });\n  }\n}\n","/**\n * Cyclic color palette used to highlight formula references inside the\n * editor + the grid. Colors are *not* hard-coded — the implementation\n * returns a CSS custom-property reference (`var(--moz-grid-ref-color-N)`),\n * letting consumers rebrand the palette from their own stylesheet without\n * a public component input.\n *\n * Assignment is *stable for the lifetime of an edit session*: the same\n * normalised ref text (e.g. `\"A1\"`, `\"A1:B3\"`) always receives the same\n * palette slot, so a cell keeps its colour while the user edits the\n * formula around it. The assignment resets when the editor closes.\n */\n\nexport const FORMULA_REF_PALETTE_SIZE = 8;\n\nexport class FormulaRefPalette {\n  private readonly slots = new Map<string, number>();\n  private nextSlot = 0;\n\n  /** Returns a stable palette index (0..N-1) for the given ref key. */\n  indexFor(key: string): number {\n    let slot = this.slots.get(key);\n    if (slot !== undefined) return slot;\n    slot = this.nextSlot % FORMULA_REF_PALETTE_SIZE;\n    this.slots.set(key, slot);\n    this.nextSlot++;\n    return slot;\n  }\n\n  clear(): void {\n    this.slots.clear();\n    this.nextSlot = 0;\n  }\n}\n\n/** CSS custom-property reference for a given palette index. */\nexport function paletteColorVar(index: number): string {\n  return `var(--moz-grid-ref-color-${index % FORMULA_REF_PALETTE_SIZE})`;\n}\n","/**\n * Grid-scoped service that bridges the formula editor and the cells.\n *\n * Responsibilities:\n *   - Owns the list of `RefHighlight`s describing which cells are\n *     referenced by the formula currently being edited.\n *   - Exposes a per-cell lookup (`colorByCell`) consumed by\n *     `MozGridCellComponent` to render coloured borders.\n *   - Acts as a message bus for click-to-pick: cells emit `pickCell` /\n *     `pickRange` events, the active editor receives them through a\n *     registered `PickHandler`.\n *\n * The service has *no* behaviour when no editor is active — `isActive`\n * stays `false`, the signal maps stay empty, and no CPU is spent in cell\n * templates. This keeps the grid zero-cost for consumers that never use\n * formulas.\n */\n\nimport { Injectable, Signal, computed, signal } from '@angular/core';\nimport type { CellAddress } from '../../models/formula.model';\nimport { FormulaRefPalette, paletteColorVar } from './formula-ref-palette';\n\nexport interface RefHighlight {\n  /** Normalised key (e.g. `\"A1\"`, `\"A1:B3\"`). Drives the colour slot. */\n  readonly key: string;\n  /** Source-relative character range of the token in the edit buffer. */\n  readonly tokenStart: number;\n  readonly tokenEnd: number;\n  /** Resolved cells covered by the ref (1 entry for a simple ref). */\n  readonly cells: readonly CellAddress[];\n  readonly colorIndex: number;\n  /** `var(--moz-grid-ref-color-N)` — ready to use in `[style]` bindings. */\n  readonly cssVar: string;\n}\n\nexport interface PickHandler {\n  pickCell(addr: CellAddress, opts: { absolute: boolean }): void;\n  pickRangeStart(addr: CellAddress, opts: { absolute: boolean }): void;\n  pickRangeExtend(end: CellAddress): void;\n  pickRangeCommit(): void;\n}\n\nfunction cellKey(addr: CellAddress): string {\n  return `${addr.rowId}|${addr.field}`;\n}\n\n@Injectable()\nexport class FormulaRefHighlightService {\n  private readonly palette = new FormulaRefPalette();\n\n  private readonly highlightsSignal = signal<readonly RefHighlight[]>([]);\n  private readonly isActiveSignal = signal(false);\n  private readonly isPickModeSignal = signal(false);\n  private readonly isPickDraggingSignal = signal(false);\n\n  readonly highlights: Signal<readonly RefHighlight[]> = this.highlightsSignal.asReadonly();\n  /** `true` while any formula editor is active — used by cells/headers to\n   *  render ref-color borders and column-letter badges. Orthogonal to\n   *  pick mode: a text-only editor (e.g. the formula bar) still marks itself\n   *  active so highlights appear, but never flips pick mode on. */\n  readonly isActive: Signal<boolean> = this.isActiveSignal.asReadonly();\n  /** `true` when cell clicks should be intercepted to insert refs into the\n   *  active editor. The formula bar deliberately disables this to keep its\n   *  input purely text-driven. */\n  readonly isPickMode: Signal<boolean> = this.isPickModeSignal.asReadonly();\n  /** `true` between `pickRangeStart` and `pickRangeCommit` — used by cells\n   *  to know that a mouseenter should extend the range being built. */\n  readonly isPickDragging: Signal<boolean> = this.isPickDraggingSignal.asReadonly();\n\n  /** `rowId|field` → CSS var — used by grid cells to paint ref borders. */\n  readonly colorByCell: Signal<ReadonlyMap<string, string>> = computed(() => {\n    const map = new Map<string, string>();\n    for (const h of this.highlightsSignal()) {\n      for (const cell of h.cells) {\n        map.set(cellKey(cell), h.cssVar);\n      }\n    }\n    return map;\n  });\n\n  private pickHandler: PickHandler | null = null;\n\n  /**\n   * Called by the editor on mount. Registers the handler used by cells\n   * to dispatch pick events.\n   *\n   * `isActive` flips on unconditionally so cells paint ref-color borders\n   * and headers show column-letter badges — the *visual* feedback is\n   * useful in both inline and formula-bar editors.\n   *\n   * `pickMode` (default `true`) controls whether cell clicks are\n   * intercepted to insert refs. The formula bar passes `false` so typing\n   * stays keyboard-only and normal cell selection keeps working.\n   */\n  activate(handler: PickHandler, options?: { pickMode?: boolean }): void {\n    this.pickHandler = handler;\n    this.isActiveSignal.set(true);\n    this.isPickModeSignal.set(options?.pickMode ?? true);\n  }\n\n  /** Called on editor teardown. Resets state + palette. */\n  deactivate(): void {\n    this.pickHandler = null;\n    this.isActiveSignal.set(false);\n    this.isPickModeSignal.set(false);\n    this.isPickDraggingSignal.set(false);\n    this.highlightsSignal.set([]);\n    this.palette.clear();\n  }\n\n  /** Produce a {index, cssVar} pair for a normalised ref key. */\n  colorFor(key: string): { index: number; cssVar: string } {\n    const index = this.palette.indexFor(key);\n    return { index, cssVar: paletteColorVar(index) };\n  }\n\n  /** Replaces the highlight list — typically from an editor effect. */\n  setHighlights(next: readonly RefHighlight[]): void {\n    this.highlightsSignal.set(next);\n  }\n\n  // ─── Pick API — called by cells ──────────────────────────────────────────\n\n  pickCell(addr: CellAddress, opts: { absolute: boolean }): void {\n    this.pickHandler?.pickCell(addr, opts);\n  }\n  pickRangeStart(addr: CellAddress, opts: { absolute: boolean }): void {\n    this.isPickDraggingSignal.set(true);\n    this.pickHandler?.pickRangeStart(addr, opts);\n  }\n  pickRangeExtend(end: CellAddress): void {\n    if (!this.isPickDraggingSignal()) return;\n    this.pickHandler?.pickRangeExtend(end);\n  }\n  pickRangeCommit(): void {\n    if (!this.isPickDraggingSignal()) return;\n    this.isPickDraggingSignal.set(false);\n    this.pickHandler?.pickRangeCommit();\n  }\n}\n","import { Directive, TemplateRef, Type, contentChild, input } from '@angular/core';\nimport { CellEditorType, ColumnDef } from '../models/column.model';\nimport { MozSelectOption } from '../../select';\nimport { CellError } from '../models/cell.model';\nimport {\n  FilterDataType,\n  FilterOperator,\n  FilterValue,\n  MozGridCustomFilter,\n} from '../models/filter.model';\n\n@Directive({\n  selector: 'moz-grid-column-def',\n})\nexport class MozGridColumnDef<T = unknown> {\n  readonly field = input.required<string>();\n  readonly headerName = input<string>();\n  readonly width = input<string>();\n  readonly minWidth = input<string>();\n  readonly maxWidth = input<string>();\n  readonly flex = input<number>();\n\n  readonly sortable = input<boolean>(true);\n  readonly resizable = input<boolean>(true);\n  readonly reorderable = input<boolean>(true);\n  readonly groupable = input<boolean>(false);\n  readonly filterable = input<boolean>(false);\n  readonly filterType = input<FilterDataType | undefined>(undefined);\n  readonly filterOperators = input<FilterOperator[] | undefined>(undefined);\n  readonly defaultFilterOperator = input<FilterOperator | undefined>(undefined);\n  readonly filterOptions = input<{ value: unknown; label: string }[] | undefined>(undefined);\n  readonly filterComponent = input<Type<MozGridCustomFilter> | undefined>(undefined);\n  readonly filterIsComplete = input<((value: FilterValue) => boolean) | undefined>(undefined);\n  readonly filterPredicate = input<((row: unknown, value: FilterValue) => boolean) | undefined>(undefined);\n  readonly editable = input<boolean>(false);\n  readonly visible = input<boolean>(true);\n  readonly hideable = input<boolean>(true);\n  readonly freezable = input<boolean>(true);\n  readonly headerMenuDisabled = input<boolean>(false);\n  /**\n   * Mirrors `ColumnDef.allowFormula`. Required so the template binding\n   * `[allowFormula]=\"true\"` is forwarded into the generated column def —\n   * without it, `FormulaEngine.syncFromSource` cannot detect this column\n   * and any baked-in `=…` value is rendered as a raw string.\n   */\n  readonly allowFormula = input<boolean>(false);\n\n  readonly pinned = input<'start' | 'end' | null>(null);\n  readonly cellEditor = input<CellEditorType>();\n  readonly cellEditorOptions = input<MozSelectOption[]>();\n  readonly cellValidator = input<\n    ((value: unknown, row: unknown) => CellError | null) | undefined\n  >();\n\n  readonly cellTemplateInput = input<TemplateRef<unknown> | null>(null, { alias: 'cellTemplate' });\n  readonly editTemplateInput = input<TemplateRef<unknown> | null>(null, { alias: 'editTemplate' });\n  readonly filterTemplateInput = input<TemplateRef<unknown> | null>(null, {\n    alias: 'filterTemplate',\n  });\n  readonly cellTemplateContent = contentChild<TemplateRef<unknown>>('cell');\n  readonly editTemplateContent = contentChild<TemplateRef<unknown>>('edit');\n  readonly filterTemplateContent = contentChild<TemplateRef<unknown>>('filter');\n\n  toColumnDef(): ColumnDef<T> {\n    return {\n      field: this.field(),\n      headerName: this.headerName(),\n      width: this.width(),\n      minWidth: this.minWidth(),\n      maxWidth: this.maxWidth(),\n      flex: this.flex(),\n      sortable: this.sortable(),\n      resizable: this.resizable(),\n      reorderable: this.reorderable(),\n      groupable: this.groupable(),\n      filterable: this.filterable(),\n      editable: this.editable(),\n      visible: this.visible(),\n      hideable: this.hideable(),\n      freezable: this.freezable(),\n      headerMenuDisabled: this.headerMenuDisabled(),\n      pinned: this.pinned(),\n      cellEditor: this.cellEditor(),\n      cellEditorOptions: this.cellEditorOptions(),\n      cellTemplate: this.cellTemplateInput() ?? this.cellTemplateContent(),\n      editTemplate: this.editTemplateInput() ?? this.editTemplateContent(),\n      filterTemplate: this.filterTemplateInput() ?? this.filterTemplateContent(),\n      filterType: this.filterType(),\n      filterOperators: this.filterOperators(),\n      defaultFilterOperator: this.defaultFilterOperator(),\n      filterOptions: this.filterOptions(),\n      filterComponent: this.filterComponent(),\n      filterIsComplete: this.filterIsComplete(),\n      filterPredicate: this.filterPredicate() as ColumnDef<T>['filterPredicate'],\n      cellValidator: this.cellValidator(),\n      allowFormula: this.allowFormula(),\n    };\n  }\n}\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\n\nexport type GridToolbarSlot = 'start' | 'end';\n\n@Directive({\n  selector: '[mozGridToolbarDef]',\n})\nexport class MozGridToolbarDef {\n  readonly slot = input<GridToolbarSlot>('end', { alias: 'mozGridToolbarDef' });\n  readonly template = inject(TemplateRef);\n}\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\n\n/**\n * Discriminator for the empty-state context.\n * - `no-data`     : the source dataset is empty (no rows ever loaded).\n * - `no-results`  : the dataset is non-empty but the active filter / search\n *                   produced zero rows.\n *\n * A template registered without an explicit kind defaults to `no-data` and\n * is also used as the fallback when `no-results` has no dedicated template.\n */\nexport type GridEmptyKind = 'no-data' | 'no-results';\n\n/**\n * Marks a `<ng-template>` projected into `<moz-grid>` as the renderer for\n * the empty state. Register one or two templates:\n *\n * ```html\n * <moz-grid [data]=\"rows\">\n *   <ng-template mozGridEmptyDef>\n *     <p>Aucune donnée pour le moment</p>\n *   </ng-template>\n *\n *   <ng-template mozGridEmptyDef=\"no-results\" let-ctx>\n *     <p>Aucun résultat pour vos filtres ({{ ctx.activeFilterCount }})</p>\n *     <button (click)=\"ctx.clearFilters()\">Réinitialiser</button>\n *   </ng-template>\n * </moz-grid>\n * ```\n *\n * The implicit context (`let-ctx`) exposes `{ activeFilterCount, clearFilters }`.\n */\n@Directive({\n  selector: '[mozGridEmptyDef]',\n})\nexport class MozGridEmptyDef {\n  readonly kind = input<GridEmptyKind>('no-data', { alias: 'mozGridEmptyDef' });\n  readonly template = inject<TemplateRef<GridEmptyContext>>(TemplateRef);\n}\n\n/** Context object passed to a `mozGridEmptyDef` template. */\nexport interface GridEmptyContext {\n  /** Number of active filter conditions; `0` when called with `no-data`. */\n  activeFilterCount: number;\n  /** Convenience callback to clear all filter conditions. */\n  clearFilters: () => void;\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { Folder48, Search48 } from '@mozaic-ds/icons-angular';\nimport { MozButtonComponent } from '../../../button/button';\nimport { GridEmptyKind } from '../../directives/grid-empty-def';\n\n/**\n * Default empty-state shown by `<moz-grid>` when the body has no rows.\n * Two visual variants are dispatched on the `kind` input:\n *  - `'no-data'`    : the dataset is empty (folder icon, neutral copy).\n *  - `'no-results'` : filters/search produced zero rows (search icon, CTA).\n *\n * Consumers can fully replace this component by projecting a\n * `<ng-template mozGridEmptyDef>` into the grid; see `MozGridEmptyDef`.\n */\n@Component({\n  selector: 'moz-grid-empty-state',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [Folder48, Search48, MozButtonComponent],\n  templateUrl: './grid-empty-state.html',\n  styleUrls: ['./grid-empty-state.scss'],\n})\nexport class MozGridEmptyStateComponent {\n  readonly kind = input.required<GridEmptyKind>();\n  readonly title = input<string>('');\n  readonly description = input<string>('');\n  /**\n   * Optional CTA label. When falsy the button is not rendered. The grid\n   * shell wires this to \"Clear filters\" for the `no-results` variant.\n   */\n  readonly actionLabel = input<string>('');\n\n  readonly action = output<void>();\n\n  protected readonly resolvedTitle = computed(() => {\n    if (this.title()) return this.title();\n    return this.kind() === 'no-results' ? 'No matching results' : 'No data to display';\n  });\n\n  protected readonly resolvedDescription = computed(() => {\n    if (this.description()) return this.description();\n    return this.kind() === 'no-results'\n      ? 'Try adjusting your filters or clearing them to see more rows.'\n      : 'There is nothing to show here yet.';\n  });\n}\n","<div\n  class=\"grid-empty-state\"\n  [class.grid-empty-state--no-results]=\"kind() === 'no-results'\"\n  role=\"status\"\n  aria-live=\"polite\"\n>\n  <div class=\"grid-empty-state__icon\" aria-hidden=\"true\">\n    @if (kind() === 'no-results') {\n    <Search48 />\n    } @else {\n    <Folder48 />\n    }\n  </div>\n\n  <p class=\"grid-empty-state__title\">{{ resolvedTitle() }}</p>\n\n  @if (resolvedDescription()) {\n  <p class=\"grid-empty-state__description\">{{ resolvedDescription() }}</p>\n  } @if (actionLabel()) {\n  <button moz-button [outlined]=\"true\" size=\"s\" (click)=\"action.emit()\">\n    {{ actionLabel() }}\n  </button>\n  }\n</div>\n","import {\n  ComponentRef,\n  Directive,\n  OnChanges,\n  OnDestroy,\n  OutputRefSubscription,\n  SimpleChanges,\n  Type,\n  ViewContainerRef,\n  inject,\n  input,\n  output,\n} from '@angular/core';\nimport { FilterCondition, FilterValue, MozGridCustomFilter } from '../../models/filter.model';\n\n/**\n * Structural host for custom filter components inside the filter builder.\n *\n * Usage in template:\n *   <ng-container mozCustomFilterHost\n *     [componentType]=\"descriptor.filterComponent\"\n *     [condition]=\"condition\"\n *     (conditionChange)=\"onValueChange(condition.id, $event)\"\n *   />\n */\n@Directive({ selector: '[mozCustomFilterHost]', standalone: true })\nexport class MozCustomFilterHostDirective implements OnChanges, OnDestroy {\n  readonly componentType = input.required<Type<MozGridCustomFilter>>();\n  readonly condition = input.required<FilterCondition>();\n  readonly conditionChange = output<FilterValue>();\n\n  private readonly vcr = inject(ViewContainerRef);\n  private ref: ComponentRef<MozGridCustomFilter> | undefined;\n  private sub: OutputRefSubscription | undefined;\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['componentType']) {\n      this.teardown();\n      this.ref = this.vcr.createComponent(this.componentType());\n      this.sub = this.ref.instance.conditionChange.subscribe((v: FilterValue) =>\n        this.conditionChange.emit(v)\n      );\n    }\n    if (this.ref) {\n      this.ref.setInput('condition', this.condition());\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.teardown();\n  }\n\n  private teardown(): void {\n    this.sub?.unsubscribe();\n    this.ref?.destroy();\n    this.ref = undefined;\n    this.sub = undefined;\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  effect,\n  input,\n  output,\n  signal,\n  untracked,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n  CdkDrag,\n  CdkDragDrop,\n  CdkDragHandle,\n  CdkDropList,\n  moveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport { Drag20, Cross20, ListAdd20 } from '@mozaic-ds/icons-angular';\nimport { MozButtonComponent } from '../../../button/button';\nimport {\n  FilterApplyMode,\n  FilterColumnDescriptor,\n  FilterCombinator,\n  FilterCondition,\n  FilterModel,\n  FilterOperator,\n  OPERATOR_LABELS,\n  RANGE_OPERATORS,\n  VALUELESS_OPERATORS,\n  generateConditionId,\n} from '../../models/filter.model';\nimport { MozCustomFilterHostDirective } from './moz-custom-filter-host.directive';\n\n@Component({\n  selector: 'moz-grid-filter-builder',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    FormsModule,\n    CdkDropList,\n    CdkDrag,\n    CdkDragHandle,\n    MozButtonComponent,\n    MozCustomFilterHostDirective,\n    Drag20,\n    Cross20,\n    ListAdd20,\n  ],\n  templateUrl: './grid-filter-builder.html',\n  styleUrls: ['./grid-filter-builder.scss'],\n})\nexport class MozGridFilterBuilderComponent {\n  readonly model = input.required<FilterModel>();\n  readonly availableColumns = input.required<FilterColumnDescriptor[]>();\n  readonly applyMode = input<FilterApplyMode>('auto');\n  /** Hint: when true, renders a \"Show rows\" sub-title (used inside the overlay). */\n  readonly showSubtitle = input<boolean>(true);\n  /**\n   * Column the builder was opened for (set by the column-menu overlay).\n   * When provided, \"Add condition\" seeds the new row on this column\n   * instead of defaulting to the first available column.\n   */\n  readonly defaultField = input<string | null>(null);\n\n  readonly modelChange = output<FilterModel>();\n\n  // Draft (what the user sees). Synced from `model` input on change.\n  readonly draft = signal<FilterCondition[]>([]);\n\n  constructor() {\n    effect(() => {\n      const incoming = this.model().conditions;\n      // Avoid clobbering local mutations: only sync when the incoming model\n      // differs by id-set or values from the current draft.\n      const current = untracked(() => this.draft());\n      if (!conditionsEqual(incoming, current)) {\n        this.draft.set(incoming.map((c) => ({ ...c, value: { ...c.value } })));\n      }\n    });\n  }\n\n  readonly columnsById = computed(() => {\n    const m = new Map<string, FilterColumnDescriptor>();\n    for (const c of this.availableColumns()) m.set(c.field, c);\n    return m;\n  });\n\n  readonly operatorLabels = OPERATOR_LABELS;\n\n  // ------------------------------------------------------------------\n  // Mutations\n  // ------------------------------------------------------------------\n\n  addCondition(): void {\n    const cols = this.availableColumns();\n    if (cols.length === 0) return;\n    // Prefer the column the builder was opened for; fall back to the first.\n    const preferred = this.defaultField();\n    const target = (preferred && cols.find((c) => c.field === preferred)) || cols[0];\n    const condition: FilterCondition = {\n      id: generateConditionId(),\n      combinator: 'and',\n      field: target.field,\n      operator: target.defaultOperator,\n      value: {},\n    };\n    this.draft.update((list) => [...list, condition]);\n    this.commit();\n  }\n\n  removeCondition(id: string): void {\n    this.draft.update((list) => list.filter((c) => c.id !== id));\n    this.commit();\n  }\n\n  onCombinatorChange(id: string, combinator: FilterCombinator): void {\n    this.draft.update((list) => list.map((c) => (c.id === id ? { ...c, combinator } : c)));\n    this.commit();\n  }\n\n  onFieldChange(id: string, field: string): void {\n    // Selecting the column that is already targeted must not wipe the\n    // condition's value — only a genuine column change resets it.\n    const current = this.draft().find((c) => c.id === id);\n    if (!current || current.field === field) return;\n    const col = this.columnsById().get(field);\n    this.draft.update((list) =>\n      list.map((c) =>\n        c.id === id\n          ? {\n              ...c,\n              field,\n              operator: col?.defaultOperator ?? c.operator,\n              value: {},\n            }\n          : c,\n      ),\n    );\n    this.commit();\n  }\n\n  onOperatorChange(id: string, operator: FilterOperator): void {\n    this.draft.update((list) =>\n      list.map((c) =>\n        c.id === id ? { ...c, operator, value: resetValueFor(operator, c.value) } : c,\n      ),\n    );\n    this.commit();\n  }\n\n  onValueChange(id: string, patch: { value?: unknown; valueTo?: unknown }): void {\n    this.draft.update((list) =>\n      list.map((c) =>\n        c.id === id\n          ? {\n              ...c,\n              value: { ...c.value, ...patch },\n            }\n          : c,\n      ),\n    );\n    this.commit();\n  }\n\n  onSetValueChange(id: string, event: Event): void {\n    const select = event.target as HTMLSelectElement;\n    const values = Array.from(select.selectedOptions).map((o) => o.value);\n    this.onValueChange(id, { value: values });\n  }\n\n  onDrop(event: CdkDragDrop<FilterCondition[]>): void {\n    this.draft.update((list) => {\n      const next = [...list];\n      moveItemInArray(next, event.previousIndex, event.currentIndex);\n      return next;\n    });\n    this.commit();\n  }\n\n  // ------------------------------------------------------------------\n  // Value editor helpers (for the template)\n  // ------------------------------------------------------------------\n\n  needsValue(op: FilterOperator): boolean {\n    return !VALUELESS_OPERATORS.has(op);\n  }\n\n  needsRange(op: FilterOperator): boolean {\n    return RANGE_OPERATORS.has(op);\n  }\n\n  getSelectedSetValues(condition: FilterCondition): string[] {\n    const v = condition.value.value;\n    if (Array.isArray(v)) return v.map((x) => String(x));\n    if (v == null || v === '') return [];\n    return [String(v)];\n  }\n\n  isSetValueSelected(condition: FilterCondition, value: unknown): boolean {\n    return this.getSelectedSetValues(condition).includes(String(value));\n  }\n\n  inputTypeFor(op: FilterOperator, type: string): string {\n    if (type === 'number') return 'number';\n    if (type === 'date') return 'date';\n    return 'text';\n  }\n\n  // ------------------------------------------------------------------\n  // Internals\n  // ------------------------------------------------------------------\n\n  private commit(): void {\n    this.modelChange.emit({\n      conditions: this.draft().map((c) => ({ ...c, value: { ...c.value } })),\n    });\n  }\n}\n\nfunction resetValueFor(\n  op: FilterOperator,\n  previous: FilterCondition['value'],\n): FilterCondition['value'] {\n  if (VALUELESS_OPERATORS.has(op)) return {};\n  if (RANGE_OPERATORS.has(op))\n    return { value: previous.value ?? '', valueTo: previous.valueTo ?? '' };\n  return { value: previous.value ?? '' };\n}\n\nfunction conditionsEqual(a: FilterCondition[], b: FilterCondition[]): boolean {\n  if (a.length !== b.length) return false;\n  for (let i = 0; i < a.length; i++) {\n    const ca = a[i];\n    const cb = b[i];\n    if (\n      ca.id !== cb.id ||\n      ca.combinator !== cb.combinator ||\n      ca.field !== cb.field ||\n      ca.operator !== cb.operator ||\n      ca.value.value !== cb.value.value ||\n      ca.value.valueTo !== cb.value.valueTo\n    ) {\n      return false;\n    }\n  }\n  return true;\n}\n","<div class=\"filter-builder\">\n  @if (showSubtitle()) {\n  <p class=\"filter-builder__subtitle\">Show rows</p>\n  }\n\n  <div class=\"filter-builder__rows\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\n    @for (cond of draft(); track cond.id; let idx = $index; let first = $first) {\n    <div class=\"filter-builder__row\" cdkDrag>\n      <!-- Combinator -->\n      <div class=\"filter-builder__combinator\">\n        @if (first) {\n        <span class=\"filter-builder__combinator-label\">Where</span>\n        } @else {\n        <select\n          class=\"filter-builder__select filter-builder__select--combinator\"\n          [value]=\"cond.combinator\"\n          [attr.aria-label]=\"'Combinator for condition ' + (idx + 1)\"\n          (change)=\"onCombinatorChange(cond.id, $any($event.target).value)\"\n        >\n          <option value=\"and\">And</option>\n          <option value=\"or\">Or</option>\n        </select>\n        }\n      </div>\n\n      <!-- Column -->\n      <select\n        class=\"filter-builder__select filter-builder__select--column\"\n        [value]=\"cond.field\"\n        [attr.aria-label]=\"'Column for condition ' + (idx + 1)\"\n        (change)=\"onFieldChange(cond.id, $any($event.target).value)\"\n      >\n        @for (col of availableColumns(); track col.field) {\n        <option [value]=\"col.field\" [selected]=\"col.field === cond.field\">\n          {{ col.headerName }}\n        </option>\n        }\n      </select>\n\n      <!-- Operator (hidden for custom filters — the component owns its own semantics) -->\n      @let col = columnsById().get(cond.field);\n      @if (col?.filterType !== 'custom') {\n      <select\n        class=\"filter-builder__select filter-builder__select--operator\"\n        [value]=\"cond.operator\"\n        [attr.aria-label]=\"'Operator for condition ' + (idx + 1)\"\n        (change)=\"onOperatorChange(cond.id, $any($event.target).value)\"\n      >\n        @for (op of col?.operators ?? []; track op) {\n        <option [value]=\"op\" [selected]=\"op === cond.operator\">{{ operatorLabels[op] }}</option>\n        }\n      </select>\n      }\n\n      <!-- Value -->\n      <div class=\"filter-builder__value\">\n        @if (col?.filterType === 'custom' && col?.filterComponent) {\n        @let filterCmp = col?.filterComponent ?? null;\n        @if (filterCmp) {\n        <ng-container\n          mozCustomFilterHost\n          [componentType]=\"filterCmp\"\n          [condition]=\"cond\"\n          (conditionChange)=\"onValueChange(cond.id, $event)\"\n        />\n        }\n        } @else if (needsValue(cond.operator)) {\n        @if (col?.filterType === 'set') {\n        <select\n          class=\"filter-builder__select filter-builder__select--set\"\n          multiple\n          size=\"4\"\n          [attr.aria-label]=\"'Values for condition ' + (idx + 1)\"\n          (change)=\"onSetValueChange(cond.id, $event)\"\n        >\n          @for (opt of col?.options ?? []; track $any(opt.value)) {\n          <option [value]=\"opt.value\" [selected]=\"isSetValueSelected(cond, opt.value)\">\n            {{ opt.label }}\n          </option>\n          }\n        </select>\n        } @else if (col?.filterType === 'boolean') {\n        <select\n          class=\"filter-builder__select\"\n          [value]=\"cond.value.value === true ? 'true' : 'false'\"\n          [attr.aria-label]=\"'Value for condition ' + (idx + 1)\"\n          (change)=\"onValueChange(cond.id, { value: $any($event.target).value === 'true' })\"\n        >\n          <option value=\"true\">True</option>\n          <option value=\"false\">False</option>\n        </select>\n        } @else {\n        <input\n          class=\"filter-builder__input\"\n          [type]=\"inputTypeFor(cond.operator, col?.filterType ?? 'text')\"\n          [value]=\"cond.value.value ?? ''\"\n          [attr.aria-label]=\"'Value for condition ' + (idx + 1)\"\n          (input)=\"onValueChange(cond.id, { value: $any($event.target).value })\"\n        />\n        @if (needsRange(cond.operator)) {\n        <span class=\"filter-builder__range-sep\">–</span>\n        <input\n          class=\"filter-builder__input\"\n          [type]=\"inputTypeFor(cond.operator, col?.filterType ?? 'text')\"\n          [value]=\"cond.value.valueTo ?? ''\"\n          [attr.aria-label]=\"'Upper bound for condition ' + (idx + 1)\"\n          (input)=\"onValueChange(cond.id, { valueTo: $any($event.target).value })\"\n        />\n        } } }\n      </div>\n\n      <!-- Delete -->\n      <button\n        type=\"button\"\n        moz-button\n        [ghost]=\"true\"\n        [size]=\"'s'\"\n        [iconPosition]=\"'only'\"\n        [attr.aria-label]=\"'Remove condition ' + (idx + 1)\"\n        (click)=\"removeCondition(cond.id)\"\n      >\n        <Cross20 icon />\n      </button>\n\n      <!-- Drag handle -->\n      <span\n        class=\"filter-builder__drag\"\n        cdkDragHandle\n        [attr.aria-label]=\"'Reorder condition ' + (idx + 1)\"\n      >\n        <Drag20 />\n      </span>\n    </div>\n    }\n  </div>\n\n  <button\n    moz-button\n    type=\"button\"\n    class=\"filter-builder__add\"\n    [appearance]=\"'accent'\"\n    [ghost]=\"true\"\n    [size]=\"'s'\"\n    [iconPosition]=\"'left'\"\n    [disabled]=\"availableColumns().length === 0\"\n    (click)=\"addCondition()\"\n  >\n    <ListAdd20 icon />\n    Add condition\n  </button>\n</div>\n","import { ComponentRef, Directive, ElementRef, Injector, OnDestroy, inject } from '@angular/core';\nimport { Overlay, OverlayConfig, OverlayRef, ConnectedPosition } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { FilterEngine } from '../features/filter.engine';\nimport { MozGridFilterBuilderComponent } from '../components/filter-builder/grid-filter-builder';\nimport { FilterColumnDescriptor, FilterModel } from '../models/filter.model';\n\n/**\n * Programmatically opens a CDK overlay anchored on the host element that\n * renders the filter builder. Unlike the action-listbox directive, the\n * overlay does not toggle on click — the host is simply the anchor. Open\n * the overlay by injecting this directive via a template ref (`#filter`)\n * and calling `filter.open(options)`.\n */\n@Directive({\n  selector: '[mozGridFilterOverlay]',\n  exportAs: 'mozGridFilterOverlay',\n})\nexport class MozGridFilterOverlayDirective implements OnDestroy {\n  private readonly overlay = inject(Overlay);\n  private readonly host = inject(ElementRef<HTMLElement>);\n  private readonly injector = inject(Injector);\n  private readonly engine = inject(FilterEngine, { optional: true }) as FilterEngine | null;\n\n  private overlayRef: OverlayRef | null = null;\n  private componentRef: ComponentRef<MozGridFilterBuilderComponent> | null = null;\n\n  /** Opens the overlay anchored on the host. No-op if already open. */\n  open(options: {\n    columns: FilterColumnDescriptor[];\n    model: FilterModel;\n    /** Optional pre-selected column to seed a new condition. */\n    seedField?: string;\n    onChange: (model: FilterModel) => void;\n  }): void {\n    if (this.overlayRef) return;\n    if (!this.engine) return;\n\n    const positions: ConnectedPosition[] = [\n      { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n      { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n      { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n    ];\n\n    const positionStrategy = this.overlay\n      .position()\n      .flexibleConnectedTo(this.host)\n      .withPositions(positions)\n      .withPush(true)\n      .withViewportMargin(8);\n\n    const config = new OverlayConfig({\n      hasBackdrop: true,\n      backdropClass: 'cdk-overlay-transparent-backdrop',\n      panelClass: 'moz-grid-filter-overlay',\n      positionStrategy,\n      scrollStrategy: this.overlay.scrollStrategies.reposition(),\n    });\n\n    const overlayRef = this.overlay.create(config);\n    this.overlayRef = overlayRef;\n\n    // Seed the draft with a new condition targeting the clicked column, if any\n    const seededModel =\n      options.seedField && options.model.conditions.length === 0\n        ? { conditions: [this.engine.makeCondition(options.seedField, true)] }\n        : options.model;\n\n    const portal = new ComponentPortal(MozGridFilterBuilderComponent, null, this.injector);\n    const compRef = overlayRef.attach(portal);\n\n    compRef.setInput('model', seededModel);\n    compRef.setInput('availableColumns', options.columns);\n    compRef.setInput('applyMode', 'auto');\n    compRef.setInput('showSubtitle', true);\n    compRef.setInput('defaultField', options.seedField ?? null);\n\n    compRef.instance.modelChange.subscribe((next: FilterModel) => {\n      compRef.setInput('model', next);\n      options.onChange(next);\n    });\n\n    this.componentRef = compRef;\n\n    overlayRef.backdropClick().subscribe(() => this.close());\n    overlayRef.keydownEvents().subscribe((event) => {\n      if (event.key === 'Escape') this.close();\n    });\n  }\n\n  close(): void {\n    if (!this.overlayRef) return;\n    this.overlayRef.dispose();\n    this.overlayRef = null;\n    this.componentRef = null;\n    // A condition the user added but never gave a value to must not survive\n    // once the builder is dismissed — drop it so it isn't a phantom filter.\n    this.engine?.dropIncompleteConditions();\n  }\n\n  ngOnDestroy(): void {\n    this.close();\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  inject,\n  input,\n  output,\n  viewChild,\n} from '@angular/core';\nimport { ColumnStateEntry, ColumnDef, HeaderMenuActionId } from '../../models/column.model';\nimport { ChevronDown20, ChevronUp20, Settings20, Filter20 } from '@mozaic-ds/icons-angular';\nimport { MozActionListboxTriggerDirective } from '../../../action-listbox/directive/action-listbox-trigger.directive';\nimport { MozActionListItem } from '../../../action-listbox/model/action-listbox.model';\nimport { GridStateManager } from '../../state/grid-state';\nimport { FilterEngine } from '../../features/filter.engine';\nimport { FormulaEngine } from '../../features/formula/formula.engine';\nimport { columnIndexToLetters } from '../../features/formula/formula-ast';\nimport { MozGridFilterOverlayDirective } from '../../directives/grid-filter-overlay.directive';\nimport { FilterModel } from '../../models/filter.model';\n\n@Component({\n  selector: 'moz-grid-header-cell',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    ChevronDown20,\n    ChevronUp20,\n    Settings20,\n    Filter20,\n    MozActionListboxTriggerDirective,\n    MozGridFilterOverlayDirective,\n  ],\n  host: {\n    '[style.flex]': 'isLast() ? \"1 0 auto\" : \"0 0 auto\"',\n    '[style.width.px]': 'isLast() ? undefined : columnState().currentWidth',\n    '[style.min-width.px]': 'isLast() ? columnState().currentWidth : resolvedMinWidth()',\n    '[style.position]': 'pinnedSticky() ? \"sticky\" : null',\n    '[style.left.px]': 'pinnedSticky() === \"left\" ? pinnedOffset() : null',\n    '[style.right.px]': 'pinnedSticky() === \"right\" ? pinnedOffset() : null',\n    '[style.zIndex]': 'pinnedSticky() ? 3 : null',\n    '[class.grid-header-cell-host--dragging]': 'isDragging()',\n    '[class.grid-header-cell-host--reorderable]': 'reorderable()',\n    '[class.grid-header-cell-host--pinned]': 'pinnedSticky() !== null',\n    '[class.grid-header-cell-host--pinned-left-edge]': 'pinnedEdge() === \"left\"',\n    '[class.grid-header-cell-host--pinned-right-edge]': 'pinnedEdge() === \"right\"',\n  },\n  templateUrl: './grid-header-cell.html',\n  styleUrls: ['./grid-header-cell.scss'],\n})\nexport class MozGridHeaderCellComponent<T = unknown> {\n  private readonly state = inject(GridStateManager);\n  private readonly filterEngine = inject<FilterEngine<T>>(FilterEngine);\n  /** Optional — only present when the grid provides `FormulaEngine`. */\n  private readonly formulaEngine = inject(FormulaEngine, { optional: true });\n\n  readonly columnState = input.required<ColumnStateEntry>();\n  readonly def = input.required<ColumnDef<T>>();\n  readonly isLast = input<boolean>(false);\n  readonly pinnedEnd = input<boolean>(false);\n  readonly reorderable = input<boolean>(false);\n  /** When set, applies `position: sticky` with the given side. */\n  readonly pinnedSticky = input<'left' | 'right' | null>(null);\n  /** Pixel offset for `left` (left-pinned) or `right` (right-pinned). */\n  readonly pinnedOffset = input<number>(0);\n  /** Visual edge of the pinned section — drives the separation shadow. */\n  readonly pinnedEdge = input<'left' | 'right' | null>(null);\n\n  protected readonly filterOverlay = viewChild(MozGridFilterOverlayDirective);\n\n  /** True when at least one active condition targets this column. */\n  readonly hasActiveFilter = computed(() =>\n    this.filterEngine.conditions().some((c) => c.field === this.columnState().field)\n  );\n\n  /** Tooltip for the gear / filter button (count + short summary). */\n  readonly filterTooltip = computed(() => {\n    const field = this.columnState().field;\n    const matching = this.filterEngine.conditions().filter((c) => c.field === field);\n    if (matching.length === 0) return 'Column settings';\n    const summary = matching.map((c) => this.filterEngine.toLabel(c)).join(', ');\n    return `${matching.length} filter${matching.length > 1 ? 's' : ''}: ${summary}`;\n  });\n\n  readonly resolvedMinWidth = computed(() => {\n    const def = this.def();\n    return def.minWidth ? parseInt(def.minWidth, 10) || 50 : 50;\n  });\n\n  readonly isDragging = computed(() => this.state.draggingColumn() === this.columnState().field);\n\n  readonly sortClick = output<{ field: string; isMultiSort: boolean }>();\n  readonly menuAction = output<{ field: string; actionId: HeaderMenuActionId }>();\n  readonly resizeStart = output<MouseEvent>();\n\n  readonly label = computed(() => {\n    return this.def().headerName ?? this.columnState().field;\n  });\n\n  /**\n   * Spreadsheet-style column letter (`A`, `B`, …, `AA`, `AB`, …) matching\n   * this column's position in the visible column order. Shown above each\n   * header while a formula is being edited so the user sees exactly what\n   * letter to type to reference a cell in this column.\n   */\n  readonly columnLetter = computed(() => {\n    const field = this.columnState().field;\n    const idx = this.state.visibleColumns().findIndex((c) => c.field === field);\n    if (idx < 0) return '';\n    return columnIndexToLetters(idx);\n  });\n\n  /**\n   * `true` when the user is editing a formula-capable cell. The header\n   * uses this to show the column-letter badge — a visual cue matching the\n   * A1 references the user types in the formula bar.\n   */\n  readonly showColumnLetter = computed(() => {\n    return this.formulaEngine?.isFormulaEditActive() ?? false;\n  });\n\n  readonly menuItems = computed<MozActionListItem[]>(() => {\n    const field = this.columnState().field;\n    const def = this.def();\n    const colState = this.state.columnStates().find((c) => c.field === field);\n    if (!colState) return [];\n\n    const items: MozActionListItem[] = [];\n\n    if (def.sortable !== false) {\n      items.push(\n        { id: 'sort-asc', icon: ChevronUp20, label: 'Sort A → Z' },\n        { id: 'sort-desc', icon: ChevronDown20, label: 'Sort Z → A' }\n      );\n    }\n\n    if (def.filterable) {\n      items.push({\n        id: 'filter-column',\n        label: 'Filter in this column',\n        icon: Filter20,\n        divider: items.length > 0,\n      });\n    }\n\n    if (def.groupable) {\n      items.push({\n        id: 'group-column',\n        label: 'Group by this column',\n        divider: !def.filterable && items.length > 0,\n      });\n    }\n\n    if (def.freezable !== false) {\n      if (colState.pinned) {\n        items.push({\n          id: 'unfreeze-column',\n          label: 'Unpin column',\n          divider: items.length > 0,\n        });\n      } else {\n        items.push({\n          id: 'freeze-column-left',\n          label: 'Pin left',\n          divider: items.length > 0,\n        });\n        items.push({\n          id: 'freeze-column-right',\n          label: 'Pin right',\n        });\n      }\n    }\n\n    if (def.hideable !== false) {\n      items.push({\n        id: 'hide-column',\n        label: 'Hide column',\n        divider: items.length > 0,\n      });\n    }\n\n    return items;\n  });\n\n  onHeaderClick(event: MouseEvent): void {\n    if (this.def().sortable !== false) {\n      this.sortClick.emit({\n        field: this.columnState().field,\n        isMultiSort: event.shiftKey,\n      });\n    }\n  }\n\n  onMenuItemClick(item: MozActionListItem): void {\n    const field = this.columnState().field;\n    const actionId = item.id as HeaderMenuActionId;\n\n    // \"Filter in this column\" always opens the conditions builder overlay\n    // anchored on the gear button, seeded on the current column. This stays\n    // true even when the column provides a `filterTemplate`: the inline\n    // header filter row (driven by the template) and the builder overlay\n    // are complementary — quick filter vs. advanced conditions — and must\n    // both be reachable from the column menu.\n    if (actionId === 'filter-column') {\n      this.openFilterOverlay(field);\n      return;\n    }\n\n    this.menuAction.emit({ field, actionId });\n  }\n\n  private openFilterOverlay(seedField: string): void {\n    // Defer so the action-listbox has time to tear down its overlay before\n    // we attach a new one at roughly the same location. Without this, the\n    // lingering mouseup from the menu-item click can land on the freshly\n    // mounted filter backdrop and close it instantly.\n    setTimeout(() => {\n      const overlay = this.filterOverlay();\n      if (!overlay) return;\n      overlay.open({\n        columns: this.filterEngine.describeFilterableColumns(),\n        model: { conditions: this.filterEngine.conditions().slice() },\n        seedField,\n        onChange: (next: FilterModel) => {\n          this.filterEngine.setModel(next, 'replace');\n        },\n      });\n    }, 0);\n  }\n}\n","<div\n  class=\"grid-header-cell\"\n  [class.grid-header-cell--sorted]=\"columnState().sort !== null\"\n  [class.grid-header-cell--last]=\"isLast()\"\n  [class.grid-header-cell--pinned-end]=\"pinnedEnd()\"\n  [class.grid-header-cell--formula-mode]=\"showColumnLetter()\"\n>\n  @if (showColumnLetter()) {\n  <span class=\"grid-header-cell__col-letter\" aria-hidden=\"true\">{{ columnLetter() }}</span>\n  }\n  <div class=\"grid-header-cell__content\" (click)=\"onHeaderClick($event)\">\n    <span class=\"grid-header-cell__label\">{{ label() }}</span>\n    @if (columnState().sort === 'asc') {\n    <ChevronUp20 class=\"grid-header-cell__sort-icon\" />\n    } @if (columnState().sort === 'desc') {\n    <ChevronDown20 class=\"grid-header-cell__sort-icon\" />\n    }\n  </div>\n\n  @if (!def().headerMenuDisabled) {\n  <button\n    type=\"button\"\n    class=\"grid-header-cell__menu-trigger\"\n    [class.grid-header-cell__menu-trigger--filtered]=\"hasActiveFilter()\"\n    [attr.aria-label]=\"'Column settings for ' + label()\"\n    [attr.title]=\"filterTooltip()\"\n    [mozActionListboxTrigger]=\"menuItems()\"\n    actionListboxPosition=\"below\"\n    mozGridFilterOverlay\n    (itemClick)=\"onMenuItemClick($event)\"\n    (click)=\"$event.stopPropagation()\"\n  >\n    @if (hasActiveFilter()) {\n    <Filter20 />\n    } @else {\n    <Settings20 />\n    }\n  </button>\n  } @if (def().resizable !== false && (!isLast() || pinnedEnd())) {\n  <div\n    class=\"grid-header-cell__resize-handle\"\n    [class.grid-header-cell__resize-handle--left]=\"pinnedEnd()\"\n    (mousedown)=\"resizeStart.emit($event)\"\n  ></div>\n  }\n</div>\n","import { DisplayRow } from '../models/display-row.model';\n\nexport function trackDisplayRow<T>(_index: number, row: DisplayRow<T>): string {\n  if (row.type === 'group') {\n    return `group:${row.group.groupKey}`;\n  }\n  return `data:${row.index}`;\n}\n\nexport function trackByField(_index: number, col: { field: string }): string {\n  return col.field;\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  ElementRef,\n  inject,\n  input,\n  output,\n  TemplateRef,\n  viewChild,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { GridStateManager } from '../../state/grid-state';\nimport { RowSelectionEngine } from '../../features/row-selection.engine';\nimport { ColumnDragEngine } from '../../features/column-drag.engine';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MozGridHeaderCellComponent } from './grid-header-cell';\nimport { MozCheckboxComponent } from '../../../checkbox/checkbox';\nimport { HeaderMenuActionId } from '../../models/column.model';\nimport { trackByField } from '../../utils/track-by';\n\n@Component({\n  selector: 'moz-grid-header',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [MozGridHeaderCellComponent, MozCheckboxComponent, FormsModule, NgTemplateOutlet],\n  host: {\n    '[style.min-width.px]': 'rowMinWidth()',\n  },\n  templateUrl: './grid-header.html',\n  styleUrls: ['./grid-header.scss'],\n})\nexport class MozGridHeaderComponent {\n  protected readonly state = inject(GridStateManager);\n  protected readonly rowSelection = inject(RowSelectionEngine);\n  private readonly dragEngine = inject(ColumnDragEngine);\n  protected readonly trackByField = trackByField;\n\n  readonly headerCenter = viewChild<ElementRef<HTMLElement>>('headerCenter');\n  readonly showCheckbox = input<boolean>(false);\n  readonly showExpand = input<boolean>(false);\n  readonly reorderable = input<boolean>(false);\n\n  readonly sortClick = output<{ field: string; isMultiSort: boolean }>();\n  readonly menuAction = output<{ field: string; actionId: HeaderMenuActionId }>();\n  readonly resizeStart = output<{ field: string; event: MouseEvent }>();\n  readonly selectAllToggle = output<void>();\n  readonly columnReorder = output<{ previousIndex: number; currentIndex: number }>();\n\n  constructor() {\n    this.dragEngine.onReorder = (prev, curr) => {\n      this.columnReorder.emit({ previousIndex: prev, currentIndex: curr });\n    };\n  }\n\n  protected readonly utilityLeftWidth = computed(() => {\n    let w = 0;\n    if (this.showExpand()) w += 36;\n    if (this.showCheckbox()) w += 48;\n    return w;\n  });\n\n  protected readonly rowMinWidth = computed(\n    () => this.utilityLeftWidth() + this.state.totalContentWidth(),\n  );\n\n  protected readonly hasFilterRow = computed(() => {\n    const defMap = this.state.columnDefMap();\n    return this.state.visibleColumns().some((col) => !!defMap.get(col.field)?.filterTemplate);\n  });\n\n  getFilterTemplate(field: string): TemplateRef<unknown> | null {\n    return this.state.columnDefMap().get(field)?.filterTemplate ?? null;\n  }\n\n  onSelectAllClick(event: Event): void {\n    event.stopPropagation();\n    this.selectAllToggle.emit();\n  }\n\n  onDragStart(event: MouseEvent, unpinnedIndex: number): void {\n    if (!this.reorderable()) return;\n    if (event.button !== 0) return;\n    const target = event.target as HTMLElement;\n    if (\n      target.closest('.grid-header-cell__resize-handle') ||\n      target.closest('.grid-header-cell__menu-trigger')\n    )\n      return;\n\n    const center = this.headerCenter();\n    if (!center) return;\n\n    this.dragEngine.startDrag(event, unpinnedIndex, center.nativeElement);\n  }\n}\n","<div\n  class=\"grid-header\"\n  [class.grid-header--no-bottom-border]=\"hasFilterRow()\"\n  role=\"row\"\n  #headerCenter\n>\n  <!-- Expand spacer (sticky, leftmost) -->\n  @if (showExpand()) {\n  <div class=\"grid-header__sticky-utility grid-header__expand-spacer\" [style.left.px]=\"0\"></div>\n  }\n\n  <!-- Checkbox utility (sticky) -->\n  @if (showCheckbox()) {\n  <div\n    class=\"grid-header__sticky-utility grid-header__checkbox\"\n    [style.left.px]=\"showExpand() ? 36 : 0\"\n  >\n    <moz-checkbox\n      id=\"grid-select-all\"\n      label=\"Select all rows\"\n      [indeterminate]=\"rowSelection.isIndeterminate()\"\n      [ngModel]=\"rowSelection.isAllSelected()\"\n      (change)=\"onSelectAllClick($event)\"\n    />\n  </div>\n  }\n\n  <!-- Pinned-left columns (sticky) -->\n  @for (col of state.pinnedLeftColumns(); track trackByField($index, col); let i = $index, last = $last) {\n  <moz-grid-header-cell\n    [columnState]=\"col\"\n    [def]=\"state.columnDefMap().get(col.field)!\"\n    [isLast]=\"false\"\n    [pinnedSticky]=\"'left'\"\n    [pinnedOffset]=\"utilityLeftWidth() + state.pinnedLeftCumulativeOffsets()[i]\"\n    [pinnedEdge]=\"last && state.pinnedLeftColumns().length > 0 ? 'left' : null\"\n    (sortClick)=\"sortClick.emit($event)\"\n    (menuAction)=\"menuAction.emit($event)\"\n    (resizeStart)=\"resizeStart.emit({ field: col.field, event: $event })\"\n  />\n  }\n\n  <!-- Leading column spacer -->\n  @if (state.leadingColumnSpacer() > 0) {\n  <div\n    class=\"grid-header__cell-spacer\"\n    aria-hidden=\"true\"\n    [style.width.px]=\"state.leadingColumnSpacer()\"\n    [style.min-width.px]=\"state.leadingColumnSpacer()\"\n  ></div>\n  }\n\n  <!-- Unpinned (rendered slice) -->\n  @for (col of state.renderedUnpinnedColumns(); track trackByField($index, col); let i = $index, last = $last) {\n  <moz-grid-header-cell\n    [columnState]=\"col\"\n    [def]=\"state.columnDefMap().get(col.field)!\"\n    [isLast]=\"last && state.trailingColumnSpacer() === 0 && state.pinnedRightColumns().length === 0\"\n    [reorderable]=\"reorderable()\"\n    (sortClick)=\"sortClick.emit($event)\"\n    (menuAction)=\"menuAction.emit($event)\"\n    (resizeStart)=\"resizeStart.emit({ field: col.field, event: $event })\"\n    (mousedown)=\"onDragStart($event, i + state.effectiveColumnRange().start)\"\n  />\n  }\n\n  <!-- Trailing column spacer -->\n  @if (state.trailingColumnSpacer() > 0) {\n  <div\n    class=\"grid-header__cell-spacer\"\n    aria-hidden=\"true\"\n    [style.width.px]=\"state.trailingColumnSpacer()\"\n    [style.min-width.px]=\"state.trailingColumnSpacer()\"\n  ></div>\n  }\n\n  <!-- Pinned-right columns (sticky) -->\n  @for (col of state.pinnedRightColumns(); track trackByField($index, col); let i = $index, first = $first, last = $last) {\n  <moz-grid-header-cell\n    [columnState]=\"col\"\n    [def]=\"state.columnDefMap().get(col.field)!\"\n    [pinnedEnd]=\"true\"\n    [isLast]=\"last\"\n    [pinnedSticky]=\"'right'\"\n    [pinnedOffset]=\"state.pinnedRightCumulativeOffsets()[i]\"\n    [pinnedEdge]=\"first ? 'right' : null\"\n    (sortClick)=\"sortClick.emit($event)\"\n    (menuAction)=\"menuAction.emit($event)\"\n    (resizeStart)=\"resizeStart.emit({ field: col.field, event: $event })\"\n  />\n  }\n</div>\n\n@if (hasFilterRow()) {\n<div class=\"grid-header__filter-row\">\n  @if (showExpand()) {\n  <div\n    class=\"grid-header__sticky-utility grid-header__filter-cell grid-header__filter-cell--spacer\"\n    [style.left.px]=\"0\"\n    [style.width.px]=\"36\"\n    [style.min-width.px]=\"36\"\n  ></div>\n  } @if (showCheckbox()) {\n  <div\n    class=\"grid-header__sticky-utility grid-header__filter-cell grid-header__filter-cell--spacer\"\n    [style.left.px]=\"showExpand() ? 36 : 0\"\n    [style.width.px]=\"48\"\n    [style.min-width.px]=\"48\"\n  ></div>\n  } @for (col of state.pinnedLeftColumns(); track trackByField($index, col); let i = $index, last = $last) {\n  <div\n    class=\"grid-header__sticky-utility grid-header__filter-cell\"\n    [class.grid-header__filter-cell--pinned-left-edge]=\"last && state.pinnedLeftColumns().length > 0\"\n    [style.left.px]=\"utilityLeftWidth() + state.pinnedLeftCumulativeOffsets()[i]\"\n    [style.width.px]=\"col.currentWidth\"\n    [style.min-width.px]=\"col.currentWidth\"\n  >\n    @if (getFilterTemplate(col.field); as tmpl) {\n    <ng-container [ngTemplateOutlet]=\"tmpl\" [ngTemplateOutletContext]=\"{ $implicit: col.field }\" />\n    }\n  </div>\n  } @if (state.leadingColumnSpacer() > 0) {\n  <div\n    class=\"grid-header__filter-cell grid-header__filter-cell--spacer\"\n    aria-hidden=\"true\"\n    [style.width.px]=\"state.leadingColumnSpacer()\"\n    [style.min-width.px]=\"state.leadingColumnSpacer()\"\n  ></div>\n  } @for (col of state.renderedUnpinnedColumns(); track trackByField($index, col); let last = $last) {\n  <div\n    class=\"grid-header__filter-cell\"\n    [class.grid-header__filter-cell--last]=\"\n      last && state.trailingColumnSpacer() === 0 && state.pinnedRightColumns().length === 0\n    \"\n    [style.width.px]=\"col.currentWidth\"\n  >\n    @if (getFilterTemplate(col.field); as tmpl) {\n    <ng-container [ngTemplateOutlet]=\"tmpl\" [ngTemplateOutletContext]=\"{ $implicit: col.field }\" />\n    }\n  </div>\n  } @if (state.trailingColumnSpacer() > 0) {\n  <div\n    class=\"grid-header__filter-cell grid-header__filter-cell--spacer\"\n    aria-hidden=\"true\"\n    [style.width.px]=\"state.trailingColumnSpacer()\"\n    [style.min-width.px]=\"state.trailingColumnSpacer()\"\n  ></div>\n  } @for (col of state.pinnedRightColumns(); track trackByField($index, col); let i = $index, first = $first) {\n  <div\n    class=\"grid-header__sticky-utility grid-header__filter-cell grid-header__filter-cell--pinned-end\"\n    [class.grid-header__filter-cell--pinned-right-edge]=\"first && state.pinnedRightColumns().length > 0\"\n    [style.right.px]=\"state.pinnedRightCumulativeOffsets()[i]\"\n    [style.width.px]=\"col.currentWidth\"\n    [style.min-width.px]=\"col.currentWidth\"\n  >\n    @if (getFilterTemplate(col.field); as tmpl) {\n    <ng-container [ngTemplateOutlet]=\"tmpl\" [ngTemplateOutletContext]=\"{ $implicit: col.field }\" />\n    }\n  </div>\n  }\n</div>\n}\n","/**\n * Tolerant tokenizer used by the live formula editor.\n *\n * Unlike the strict parser tokeniser in `formula-parser.ts` — which throws\n * on malformed input (appropriate at commit time) — this one is designed\n * to run on every keystroke. It never throws, and produces a best-effort\n * token stream even for partial or broken input (`=A`, `=SUM(`, `=\"hi`,\n * `=1 +`). Consumers rely on it for three things:\n *\n *   1. Syntax + ref highlighting in the editor overlay.\n *   2. Detecting the autocomplete trigger (caret at the end of a function\n *      ident).\n *   3. Finding the token under the caret for click-to-pick insertion.\n *\n * The editor surface is **A1 notation**: refs look like `A1`, `$A$1`,\n * `AA12`, and ranges use `:` (`A1:B5`). The tokenizer decodes the letter\n * part against a supplied `fieldOrder` list so each ref carries its\n * stable field name.\n */\n\nimport type { StructuredRef } from './formula-ast';\nimport { columnLettersToIndex } from './formula-ast';\n\nexport type FormulaEditorTokenKind =\n  | 'ws'\n  | 'eq'\n  | 'ref'\n  | 'number'\n  | 'string'\n  | 'bool'\n  | 'fn'\n  | 'ident'\n  | 'op'\n  | 'lparen'\n  | 'rparen'\n  | 'comma'\n  | 'colon'\n  | 'unknown';\n\nexport interface FormulaEditorToken {\n  readonly kind: FormulaEditorTokenKind;\n  readonly text: string;\n  /** 0-based inclusive position in the source string. */\n  readonly start: number;\n  /** 0-based exclusive end position. */\n  readonly end: number;\n  /** Parsed structured ref — present only when `kind === 'ref'`. */\n  readonly ref?: StructuredRef;\n}\n\nexport interface EditorTokenizeOptions {\n  readonly locale?: 'en' | 'fr';\n  /**\n   * Ordered list of visible column fields — used to map A1 letters to\n   * field names. When absent, A1 refs are emitted with `field: ''` so the\n   * highlight layer can still position them (pending resolution).\n   */\n  readonly fieldOrder?: readonly string[];\n}\n\nexport function tokenizeFormulaEditor(\n  source: string,\n  options: EditorTokenizeOptions = {},\n): FormulaEditorToken[] {\n  const locale = options.locale ?? 'en';\n  const fieldOrder = options.fieldOrder ?? [];\n  const argSeparator = locale === 'fr' ? ';' : ',';\n  const out: FormulaEditorToken[] = [];\n  const len = source.length;\n  let i = 0;\n\n  if (source[0] === '=') {\n    out.push({ kind: 'eq', text: '=', start: 0, end: 1 });\n    i = 1;\n  }\n\n  while (i < len) {\n    const ch = source[i];\n\n    if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\n      const start = i;\n      while (\n        i < len &&\n        (source[i] === ' ' || source[i] === '\\t' || source[i] === '\\n' || source[i] === '\\r')\n      ) {\n        i++;\n      }\n      out.push({ kind: 'ws', text: source.slice(start, i), start, end: i });\n      continue;\n    }\n\n    if (ch === '(') {\n      out.push({ kind: 'lparen', text: '(', start: i, end: i + 1 });\n      i++;\n      continue;\n    }\n    if (ch === ')') {\n      out.push({ kind: 'rparen', text: ')', start: i, end: i + 1 });\n      i++;\n      continue;\n    }\n    if (ch === ':') {\n      out.push({ kind: 'colon', text: ':', start: i, end: i + 1 });\n      i++;\n      continue;\n    }\n    if (ch === argSeparator) {\n      out.push({ kind: 'comma', text: argSeparator, start: i, end: i + 1 });\n      i++;\n      continue;\n    }\n\n    const two = source.slice(i, i + 2);\n    if (two === '<=' || two === '>=' || two === '<>') {\n      out.push({ kind: 'op', text: two, start: i, end: i + 2 });\n      i += 2;\n      continue;\n    }\n    if ('+-*/^&=<>'.includes(ch)) {\n      out.push({ kind: 'op', text: ch, start: i, end: i + 1 });\n      i++;\n      continue;\n    }\n\n    if (ch === '\"') {\n      const start = i;\n      i++;\n      while (i < len) {\n        if (source[i] === '\"') {\n          if (source[i + 1] === '\"') {\n            i += 2;\n            continue;\n          }\n          i++;\n          break;\n        }\n        i++;\n      }\n      out.push({ kind: 'string', text: source.slice(start, i), start, end: i });\n      continue;\n    }\n\n    // Same-row ref surface: `[field]`. Emitted as a ref token so the\n    // coloured overlay picks it up and the click-to-pick machinery can\n    // replace it in place. An unclosed `[…` is still emitted (field is the\n    // tail) so highlights update live while the user types.\n    if (ch === '[') {\n      const start = i;\n      i++;\n      while (i < len && source[i] !== ']') i++;\n      const hasClose = i < len;\n      if (hasClose) i++;\n      const text = source.slice(start, i);\n      const inner = hasClose ? text.slice(1, -1) : text.slice(1);\n      const field = fieldOrder.includes(inner) ? inner : '';\n      out.push({\n        kind: 'ref',\n        text,\n        start,\n        end: i,\n        ref: { field, row: 0, absField: false, absRow: false, sameRow: true },\n      });\n      continue;\n    }\n\n    // A1 cell ref: `$?LETTERS$?DIGITS`. Detected before identifier scan so\n    // `A1` is a ref, not an ident `A` + number `1`.\n    const refMatch = tryScanA1(source, i, fieldOrder);\n    if (refMatch) {\n      out.push({\n        kind: 'ref',\n        text: source.slice(i, refMatch.end),\n        start: i,\n        end: refMatch.end,\n        ref: refMatch.ref,\n      });\n      i = refMatch.end;\n      continue;\n    }\n\n    if (isDigit(ch) || (ch === '.' && isDigit(source[i + 1] ?? ''))) {\n      const start = i;\n      let seenDot = ch === '.';\n      let seenExp = false;\n      i++;\n      while (i < len) {\n        const c = source[i];\n        if (isDigit(c)) {\n          i++;\n          continue;\n        }\n        if (c === '.' && !seenDot && !seenExp) {\n          seenDot = true;\n          i++;\n          continue;\n        }\n        if ((c === 'e' || c === 'E') && !seenExp) {\n          seenExp = true;\n          i++;\n          if (source[i] === '+' || source[i] === '-') i++;\n          continue;\n        }\n        break;\n      }\n      out.push({ kind: 'number', text: source.slice(start, i), start, end: i });\n      continue;\n    }\n\n    if (isAlpha(ch) || ch === '_') {\n      const start = i;\n      while (\n        i < len &&\n        (isAlpha(source[i]) || isDigit(source[i]) || source[i] === '_' || source[i] === '.')\n      ) {\n        i++;\n      }\n      const text = source.slice(start, i);\n      const upper = text.toUpperCase();\n      if (upper === 'TRUE' || upper === 'FALSE') {\n        out.push({ kind: 'bool', text, start, end: i });\n        continue;\n      }\n      let k = i;\n      while (k < len && (source[k] === ' ' || source[k] === '\\t')) k++;\n      const isFn = source[k] === '(';\n      out.push({ kind: isFn ? 'fn' : 'ident', text, start, end: i });\n      continue;\n    }\n\n    out.push({ kind: 'unknown', text: ch, start: i, end: i + 1 });\n    i++;\n  }\n\n  return out;\n}\n\ninterface A1ScanResult {\n  readonly end: number;\n  readonly ref: StructuredRef;\n}\n\n/**\n * Try to scan an A1 cell reference starting at `source[pos]`. Returns null\n * when the position does not start a ref. The scan is strict: letters MUST\n * be followed by at least one digit (possibly after a `$`) — a bare `A`\n * is an ident, not a ref.\n */\nfunction tryScanA1(\n  source: string,\n  pos: number,\n  fieldOrder: readonly string[],\n): A1ScanResult | null {\n  const len = source.length;\n  let i = pos;\n  const absField = source[i] === '$';\n  if (absField) i++;\n\n  const lettersStart = i;\n  while (i < len && isAlpha(source[i])) i++;\n  if (i === lettersStart) return null;\n  const letters = source.slice(lettersStart, i);\n\n  const absRow = source[i] === '$';\n  const digitsCandidateStart = absRow ? i + 1 : i;\n  let j = digitsCandidateStart;\n  while (j < len && isDigit(source[j])) j++;\n  if (j === digitsCandidateStart) return null;\n\n  // `A1(` → function-call-like identifier (e.g. `ATAN2(`). Skip so the\n  // scanner falls back to the ident branch and emits `fn`.\n  if (source[j] === '(') return null;\n\n  const digits = source.slice(digitsCandidateStart, j);\n  const row = Number(digits);\n  if (!Number.isFinite(row) || row < 1) return null;\n  const colIdx = columnLettersToIndex(letters);\n  const field = fieldOrder[colIdx] ?? '';\n\n  return {\n    end: j,\n    ref: { field, row, absField, absRow },\n  };\n}\n\nfunction isDigit(ch: string): boolean {\n  return ch >= '0' && ch <= '9';\n}\nfunction isAlpha(ch: string): boolean {\n  return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');\n}\n\n// ─── Public helpers ─────────────────────────────────────────────────────────\n\n/**\n * Token whose `[start, end]` range contains `caret`. When the caret sits\n * exactly between two tokens, the one ending at the caret wins — this is\n * what the autocomplete needs to match an identifier the user just typed.\n */\nexport function tokenAtCaret(\n  tokens: readonly FormulaEditorToken[],\n  caret: number,\n): FormulaEditorToken | null {\n  for (let idx = tokens.length - 1; idx >= 0; idx--) {\n    const t = tokens[idx];\n    if (caret >= t.start && caret <= t.end) return t;\n  }\n  return null;\n}\n\n/**\n * Detect the function-name autocomplete trigger: the caret sits at the\n * end of an ident/fn/bool token whose text is non-empty.\n */\nexport function autocompletePrefixAtCaret(\n  tokens: readonly FormulaEditorToken[],\n  caret: number,\n): { token: FormulaEditorToken; prefix: string } | null {\n  const tok = tokenAtCaret(tokens, caret);\n  if (!tok) return null;\n  if (tok.kind !== 'fn' && tok.kind !== 'ident' && tok.kind !== 'bool') return null;\n  if (caret !== tok.end) return null;\n  return { token: tok, prefix: tok.text.slice(0, caret - tok.start) };\n}\n\nexport interface EditorRefToken {\n  readonly start: number;\n  readonly end: number;\n  readonly text: string;\n  /** `[ref]` for a simple ref, `[start, end]` for a range. */\n  readonly refs: readonly StructuredRef[];\n  readonly isRange: boolean;\n}\n\n/**\n * Group adjacent `ref colon ref` patterns into range tokens while keeping\n * simple refs as single-cell entries. Whitespace between the components\n * is not tolerated (Excel rule).\n */\nexport function extractEditorRefTokens(tokens: readonly FormulaEditorToken[]): EditorRefToken[] {\n  const out: EditorRefToken[] = [];\n  for (let i = 0; i < tokens.length; i++) {\n    const t = tokens[i];\n    if (t.kind !== 'ref' || !t.ref) continue;\n    const next = tokens[i + 1];\n    const after = tokens[i + 2];\n    if (next?.kind === 'colon' && after?.kind === 'ref' && after.ref) {\n      out.push({\n        start: t.start,\n        end: after.end,\n        text: t.text + next.text + after.text,\n        refs: [t.ref, after.ref],\n        isRange: true,\n      });\n      i += 2;\n      continue;\n    }\n    out.push({\n      start: t.start,\n      end: t.end,\n      text: t.text,\n      refs: [t.ref],\n      isRange: false,\n    });\n  }\n  return out;\n}\n","/**\n * Pure function that turns `(tokens, caret, registry)` into a ranked list\n * of function-name suggestions. Called on every keystroke by the formula\n * editor to refresh its autocomplete panel.\n *\n * Cell references are A1-form and therefore short enough that an\n * autocomplete panel is not helpful — users pick them by clicking the\n * target cell in the grid. Only function names are suggested here.\n *\n * Matching is case-insensitive prefix first, then \"contains\" as a\n * fallback. Prefix matches rank strictly higher than substring matches\n * so `SU` doesn't promote `SUBSTITUTE` over `SUM`. Results are\n * alphabetical within a rank bucket.\n */\n\nimport type { FormulaFunctionRegistry } from '../../models/formula.model';\nimport type { FormulaEditorToken } from './formula-tokenizer';\nimport { autocompletePrefixAtCaret } from './formula-tokenizer';\n\nexport type FormulaSuggestionKind = 'function';\n\nexport interface FormulaSuggestion {\n  readonly kind: FormulaSuggestionKind;\n  /** Uppercase function name. */\n  readonly name: string;\n  /** `SUM(number1, [number2, ...])` — empty string when no docs are set. */\n  readonly signature: string;\n  /** One-line human summary — empty string when no docs are set. */\n  readonly summary: string;\n  /** 0-based character offset where the replacement should start. */\n  readonly replaceStart: number;\n  /** 0-based character offset where the replacement should end. */\n  readonly replaceEnd: number;\n  /** What the panel typed so far, preserved for visual match highlighting. */\n  readonly prefix: string;\n}\n\nexport interface ComputeSuggestionsOptions {\n  /** Maximum number of entries to return. Defaults to 8. */\n  readonly limit?: number;\n}\n\nexport function computeFormulaSuggestions(\n  tokens: readonly FormulaEditorToken[],\n  caret: number,\n  registry: FormulaFunctionRegistry,\n  options: ComputeSuggestionsOptions = {},\n): FormulaSuggestion[] {\n  const limit = options.limit ?? 8;\n\n  const match = autocompletePrefixAtCaret(tokens, caret);\n  if (!match || match.prefix.length === 0) return [];\n\n  const prefixUpper = match.prefix.toUpperCase();\n  const names = Object.keys(registry);\n\n  const starts: string[] = [];\n  const contains: string[] = [];\n  for (const name of names) {\n    if (name.startsWith(prefixUpper)) {\n      starts.push(name);\n    } else if (name.includes(prefixUpper)) {\n      contains.push(name);\n    }\n  }\n  starts.sort();\n  contains.sort();\n\n  const ranked = [...starts, ...contains];\n  return ranked.slice(0, limit).map((name) => {\n    const docs = registry[name]?.docs;\n    return {\n      kind: 'function',\n      name,\n      signature: docs?.signature ?? '',\n      summary: docs?.summary ?? '',\n      replaceStart: match.token.start,\n      replaceEnd: match.token.end,\n      prefix: match.prefix,\n    } satisfies FormulaSuggestion;\n  });\n}\n\n/**\n * Build the text to insert when accepting a function suggestion — always\n * `NAME(` so the user can immediately start typing the first argument.\n */\nexport function suggestionInsertionText(suggestion: FormulaSuggestion): string {\n  return `${suggestion.name}(`;\n}\n","/**\n * `MozGridFormulaEditorComponent` — specialised inline editor rendered in\n * place of the default text input whenever a cell is being edited and the\n * column has `allowFormula: true`.\n *\n * Phase A (this file): colored-ref overlay driven by the tolerant\n * tokenizer + `FormulaRefHighlightService`. The input stays fully native\n * (IME, copy/paste, selection) — we layer a transparent-text `<pre>` on\n * top that re-paints the text, colouring each reference with a palette\n * slot shared with the grid cell borders.\n *\n * Phase B will add click-to-pick (cells → editor) and Phase C the\n * autocomplete panel. The public surface stays stable across phases:\n * `(value, valueChange, commit, cancel)` — the parent `MozGridCellComponent`\n * already owns the draft state.\n */\n\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  ElementRef,\n  ViewEncapsulation,\n  afterNextRender,\n  afterRenderEffect,\n  computed,\n  effect,\n  inject,\n  input,\n  output,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport {\n  CdkConnectedOverlay,\n  CdkOverlayOrigin,\n  ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport { GridStateManager } from '../../state/grid-state';\nimport { FormulaEngine } from '../../features/formula/formula.engine';\nimport {\n  FormulaRefHighlightService,\n  RefHighlight,\n} from '../../features/formula/formula-ref-highlight.service';\nimport {\n  extractEditorRefTokens,\n  tokenizeFormulaEditor,\n} from '../../features/formula/formula-tokenizer';\nimport {\n  RefMapperContext,\n  rangeToAddresses,\n  structuredRefToAddress,\n} from '../../features/formula/formula-ref-mapper';\nimport { columnIndexToLetters } from '../../features/formula/formula-ast';\nimport {\n  FormulaSuggestion,\n  computeFormulaSuggestions,\n  suggestionInsertionText,\n} from '../../features/formula/formula-suggestions';\nimport type { CellAddress } from '../../models/formula.model';\n\ninterface OverlaySegment {\n  readonly text: string;\n  /** CSS var or `null` when the segment uses the default text color. */\n  readonly color: string | null;\n}\n\n@Component({\n  selector: 'moz-grid-formula-editor',\n  standalone: true,\n  imports: [CdkConnectedOverlay, CdkOverlayOrigin],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: './formula-editor.html',\n  styleUrls: ['./formula-editor.scss'],\n})\nexport class MozGridFormulaEditorComponent {\n  private readonly state = inject(GridStateManager);\n  private readonly highlight = inject(FormulaRefHighlightService);\n  private readonly engine = inject(FormulaEngine);\n  private readonly destroyRef = inject(DestroyRef);\n\n  readonly value = input<string>('');\n  readonly locale = input<'en' | 'fr'>('en');\n  /**\n   * Address of the cell currently being edited. Drives `@row` resolution\n   * for highlighting and click-to-pick. When omitted, the editor falls\n   * back to `cellEditState` to derive it from the inline edit coord.\n   */\n  readonly editingAddr = input<CellAddress | null>(null);\n  /**\n   * When `true`, the editor behaves as a plain text field: no click-to-pick\n   * from grid cells, and no ref-color painting of referenced cells. Used by\n   * the formula bar, where picking-by-click competes with normal cell\n   * selection and confuses users.\n   */\n  readonly disableCellPick = input<boolean>(false);\n\n  readonly valueChange = output<string>();\n  readonly commit = output<void>();\n  readonly cancel = output<void>();\n\n  readonly inputEl = viewChild.required<ElementRef<HTMLInputElement>>('input');\n  readonly origin = viewChild.required(CdkOverlayOrigin);\n\n  private readonly caret = signal<number>(0);\n\n  private readonly fieldOrder = computed(() =>\n    this.state.visibleColumns().map((c) => c.field),\n  );\n\n  private readonly tokens = computed(() =>\n    tokenizeFormulaEditor(this.value(), {\n      locale: this.locale(),\n      fieldOrder: this.fieldOrder(),\n    }),\n  );\n\n  private readonly refTokens = computed(() => extractEditorRefTokens(this.tokens()));\n\n  // ─── Autocomplete state ───────────────────────────────────────────────────\n\n  /** Suggestions recomputed on every (value, caret) change. */\n  readonly suggestions = computed<FormulaSuggestion[]>(() =>\n    computeFormulaSuggestions(this.tokens(), this.caret(), this.engine.getFunctions()),\n  );\n\n  /** Index of the suggestion currently focused in the listbox. */\n  readonly selectedIndex = signal(0);\n\n  /** User-initiated dismissal (Esc, outside click). Resets on next input so\n   *  the panel reappears naturally if they keep typing. */\n  private readonly panelDismissed = signal(false);\n\n  /** Target caret position to restore once Angular has re-synced the\n   *  `[value]` binding after a click-to-pick or suggestion accept. */\n  private readonly pendingCaret = signal<number | null>(null);\n\n  /** `true` iff at least one suggestion is available and the user hasn't\n   *  explicitly dismissed the panel. */\n  readonly panelOpen = computed(\n    () => !this.panelDismissed() && this.suggestions().length > 0,\n  );\n\n  /** CDK overlay placement — below the cell by default, flipped on top when\n   *  there's no room at the bottom of the viewport. */\n  readonly panelPositions: ConnectedPosition[] = [\n    { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 2 },\n    { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -2 },\n  ];\n\n  readonly overlaySegments = computed<OverlaySegment[]>(() => {\n    const src = this.value();\n    const refs = this.refTokens();\n    const segs: OverlaySegment[] = [];\n    let cursor = 0;\n    for (const r of refs) {\n      if (r.start > cursor) {\n        segs.push({ text: src.slice(cursor, r.start), color: null });\n      }\n      const { cssVar } = this.highlight.colorFor(r.text);\n      segs.push({ text: r.text, color: cssVar });\n      cursor = r.end;\n    }\n    if (cursor < src.length) {\n      segs.push({ text: src.slice(cursor), color: null });\n    }\n    return segs;\n  });\n\n  constructor() {\n    // Reset highlighted row whenever the suggestion list changes. Keeping\n    // the index on `0` avoids the panel appearing with an out-of-range\n    // selection when the user continues typing.\n    effect(() => {\n      const size = this.suggestions().length;\n      if (size === 0) {\n        this.selectedIndex.set(0);\n        return;\n      }\n      const idx = this.selectedIndex();\n      if (idx >= size) this.selectedIndex.set(0);\n    });\n\n    // Restore the caret *after* Angular repaints the input. Setting\n    // `el.value` via the `[value]` binding pushes the cursor to the end of\n    // the input; this effect re-applies the intended position once the\n    // render has settled.\n    afterRenderEffect(() => {\n      const target = this.pendingCaret();\n      if (target === null) return;\n      const el = this.inputEl().nativeElement;\n      el.setSelectionRange(target, target);\n      this.pendingCaret.set(null);\n    });\n\n    effect(() => {\n      const refs = this.refTokens();\n      const ctx = this.refMapperContext();\n      const highlights: RefHighlight[] = [];\n      for (const r of refs) {\n        const cells: CellAddress[] = [];\n        if (r.isRange && r.refs.length === 2) {\n          for (const addr of rangeToAddresses(r.refs[0], r.refs[1], ctx)) {\n            if (addr) cells.push(addr);\n          }\n        } else {\n          const addr = structuredRefToAddress(r.refs[0], ctx);\n          if (addr) cells.push(addr);\n        }\n        const { index, cssVar } = this.highlight.colorFor(r.text);\n        highlights.push({\n          key: r.text,\n          cells,\n          tokenStart: r.start,\n          tokenEnd: r.end,\n          colorIndex: index,\n          cssVar,\n        });\n      }\n      this.highlight.setHighlights(highlights);\n    });\n\n    afterNextRender(() => {\n      // Activate unconditionally so referenced cells paint their ref-color\n      // borders and headers show column-letter badges. `pickMode` gates the\n      // click-to-pick behaviour alone — the formula bar opts out because\n      // cell clicks there compete with normal cell selection.\n      this.highlight.activate(\n        {\n          pickCell: (addr, opts) => this.handlePickCell(addr, opts),\n          pickRangeStart: (addr, opts) => this.handlePickRangeStart(addr, opts),\n          pickRangeExtend: (end) => this.handlePickRangeExtend(end),\n          pickRangeCommit: () => this.handlePickRangeCommit(),\n        },\n        { pickMode: !this.disableCellPick() },\n      );\n      this.focus();\n    });\n\n    this.destroyRef.onDestroy(() => this.highlight.deactivate());\n  }\n\n  focus(): void {\n    const el = this.inputEl().nativeElement;\n    el.focus();\n    const end = el.value.length;\n    el.setSelectionRange(end, end);\n    this.caret.set(end);\n  }\n\n  onInput(event: Event): void {\n    const el = event.target as HTMLInputElement;\n    this.caret.set(el.selectionStart ?? el.value.length);\n    // Typing re-arms the autocomplete: a prior `Esc` only dismisses the\n    // current list, not all future ones.\n    this.panelDismissed.set(false);\n    this.valueChange.emit(el.value);\n  }\n\n  onCaretProbe(event: Event): void {\n    const el = event.target as HTMLInputElement;\n    this.caret.set(el.selectionStart ?? 0);\n  }\n\n  onKeyDown(event: KeyboardEvent): void {\n    const open = this.panelOpen();\n\n    if (open && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {\n      event.preventDefault();\n      event.stopPropagation();\n      const size = this.suggestions().length;\n      const idx = this.selectedIndex();\n      const next = event.key === 'ArrowDown' ? (idx + 1) % size : (idx - 1 + size) % size;\n      this.selectedIndex.set(next);\n      return;\n    }\n\n    if (open && (event.key === 'Tab' || event.key === 'Enter')) {\n      event.preventDefault();\n      // Stop bubbling so the grid's edit-mode handler doesn't commit the\n      // cell when the user is just accepting a suggestion.\n      event.stopPropagation();\n      this.acceptSuggestion(this.selectedIndex());\n      return;\n    }\n\n    // `Escape` with an open panel just dismisses the panel — leaves the\n    // editor alive so the user can keep typing. Second Escape cancels edit.\n    if (open && event.key === 'Escape') {\n      event.preventDefault();\n      event.stopPropagation();\n      this.closePanel();\n      return;\n    }\n\n    if (event.key === 'Enter') {\n      event.preventDefault();\n      this.commit.emit();\n      return;\n    }\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      this.cancel.emit();\n      return;\n    }\n  }\n\n  // ─── Suggestion panel ─────────────────────────────────────────────────────\n\n  /** Called by clicking an entry — accept + close the panel. */\n  onSuggestionMouseDown(event: MouseEvent, index: number): void {\n    // `mousedown` handler + preventDefault so the input keeps focus.\n    event.preventDefault();\n    this.acceptSuggestion(index);\n  }\n\n  onSuggestionMouseEnter(index: number): void {\n    this.selectedIndex.set(index);\n  }\n\n  closePanel(): void {\n    this.panelDismissed.set(true);\n  }\n\n  private acceptSuggestion(index: number): void {\n    const list = this.suggestions();\n    const entry = list[index];\n    if (!entry) return;\n    const el = this.inputEl().nativeElement;\n    const insert = suggestionInsertionText(entry);\n    const next =\n      el.value.slice(0, entry.replaceStart) + insert + el.value.slice(entry.replaceEnd);\n    el.value = next;\n    const caret = entry.replaceStart + insert.length;\n    el.setSelectionRange(caret, caret);\n    this.caret.set(caret);\n    this.valueChange.emit(next);\n    el.focus();\n    // Re-pin the caret after the `[value]` binding re-syncs (zoneless render).\n    this.pendingCaret.set(caret);\n  }\n\n  // ─── Click-to-pick ──────────────────────────────────────────────────────\n\n  private pickAnchor: number | null = null;\n  private pickEnd: number | null = null;\n  private pickStartAddr: CellAddress | null = null;\n  private pickAbsolute = false;\n\n  private handlePickCell(addr: CellAddress, opts: { absolute: boolean }): void {\n    const text = this.formatRef(addr, opts.absolute);\n    if (!text) return;\n    this.replacePickTarget(text);\n    this.resetPick();\n  }\n\n  private handlePickRangeStart(addr: CellAddress, opts: { absolute: boolean }): void {\n    const text = this.formatRef(addr, opts.absolute);\n    if (!text) return;\n    const { from, to } = this.replacePickTarget(text);\n    this.pickAnchor = from;\n    this.pickEnd = to;\n    this.pickStartAddr = addr;\n    this.pickAbsolute = opts.absolute;\n  }\n\n  /**\n   * When the caret sits on or adjacent to an existing ref token (simple or\n   * range), clicking another cell should *replace* that ref instead of\n   * appending next to it — mirrors Excel / Google Sheets behaviour. Falls\n   * back to the current selection / caret when no ref is nearby.\n   */\n  private replacePickTarget(text: string): { from: number; to: number } {\n    const el = this.inputEl().nativeElement;\n    const selStart = el.selectionStart ?? el.value.length;\n    const selEnd = el.selectionEnd ?? selStart;\n    // Explicit selection always wins — the user highlighted something on purpose.\n    if (selStart !== selEnd) return this.replaceRange(selStart, selEnd, text);\n\n    const refs = this.refTokens();\n    for (const r of refs) {\n      if (selStart >= r.start && selStart <= r.end) {\n        return this.replaceRange(r.start, r.end, text);\n      }\n    }\n    return this.replaceRange(selStart, selEnd, text);\n  }\n\n  private handlePickRangeExtend(end: CellAddress): void {\n    if (this.pickAnchor === null || this.pickEnd === null || !this.pickStartAddr) return;\n    const startText = this.formatRef(this.pickStartAddr, this.pickAbsolute);\n    const endText = this.formatRef(end, this.pickAbsolute);\n    if (!startText || !endText) return;\n    const sameCell =\n      this.pickStartAddr.rowId === end.rowId && this.pickStartAddr.field === end.field;\n    const text = sameCell ? startText : `${startText}:${endText}`;\n    const { to } = this.replaceRange(this.pickAnchor, this.pickEnd, text);\n    this.pickEnd = to;\n  }\n\n  private handlePickRangeCommit(): void {\n    this.resetPick();\n  }\n\n  private resetPick(): void {\n    this.pickAnchor = null;\n    this.pickEnd = null;\n    this.pickStartAddr = null;\n    this.pickAbsolute = false;\n  }\n\n  private formatRef(addr: CellAddress, absolute: boolean): string {\n    const fields = this.fieldOrder();\n    const colIdx = fields.indexOf(addr.field);\n    if (colIdx < 0) return '';\n    const idField = this.state.rowIdField();\n    const rowIndex = this.state\n      .sourceData()\n      .findIndex((r) => (r as Record<string, unknown>)[idField] === addr.rowId);\n    if (rowIndex < 0) return '';\n    const letters = columnIndexToLetters(colIdx);\n    const row = rowIndex + 1;\n    // Holding the modifier that sets `absolute` locks both axes (`$A$1`),\n    // matching what Excel's F4 produces on a single keystroke.\n    if (absolute) return `$${letters}$${row}`;\n    return `${letters}${row}`;\n  }\n\n  private replaceRange(from: number, to: number, text: string): { from: number; to: number } {\n    const el = this.inputEl().nativeElement;\n    const next = el.value.slice(0, from) + text + el.value.slice(to);\n    el.value = next;\n    const caret = from + text.length;\n    el.setSelectionRange(caret, caret);\n    this.caret.set(caret);\n    this.valueChange.emit(next);\n    el.focus();\n    // In zoneless mode Angular re-syncs `[value]=\"value()\"` on the next\n    // render cycle (via the scheduler, not the microtask queue). That\n    // re-write of `el.value` is what pushes the caret back to the end.\n    // Queue the restore after the paint so it runs once the binding has\n    // re-applied.\n    this.pendingCaret.set(caret);\n    return { from, to: from + text.length };\n  }\n\n  private refMapperContext(): RefMapperContext {\n    const rowIds = this.state.sourceData().map((r) => {\n      const row = r as Record<string, unknown>;\n      return (row[this.state.rowIdField()] as string | number | undefined) ?? '';\n    });\n    return {\n      fields: this.fieldOrder(),\n      rowIds,\n      currentRowId: this.currentRowId(),\n    };\n  }\n\n  /**\n   * Resolve the row the formula is being edited on. `editingAddr` wins when\n   * provided; otherwise we derive the row id from the inline edit coord.\n   */\n  private currentRowId(): string | number | undefined {\n    const addr = this.editingAddr();\n    if (addr) return addr.rowId;\n    const coord = this.state.cellEditState().editingCell;\n    if (!coord) return undefined;\n    const idField = this.state.rowIdField();\n    const row = this.state.sourceData()[coord.row] as Record<string, unknown> | undefined;\n    const rowId = row?.[idField];\n    return typeof rowId === 'string' || typeof rowId === 'number' ? rowId : undefined;\n  }\n\n  onScroll(event: Event): void {\n    // Keep the overlay aligned with the input's horizontal scroll so long\n    // formulas stay glued to the caret rather than drifting out of view.\n    const el = event.target as HTMLInputElement;\n    const overlay = (this.inputEl().nativeElement.parentElement?.querySelector(\n      '.moz-grid-formula-editor__overlay',\n    ) ?? null) as HTMLElement | null;\n    if (overlay) overlay.scrollLeft = el.scrollLeft;\n  }\n}\n","<div class=\"moz-grid-formula-editor\" cdkOverlayOrigin>\n  <div class=\"moz-grid-formula-editor__overlay\" aria-hidden=\"true\">\n    @for (seg of overlaySegments(); track $index) {\n      @if (seg.color) {\n        <span class=\"moz-grid-formula-editor__ref\" [style.color]=\"seg.color\">{{ seg.text }}</span>\n      } @else {\n        <span>{{ seg.text }}</span>\n      }\n    }\n  </div>\n  <input\n    #input\n    class=\"moz-grid-formula-editor__input\"\n    type=\"text\"\n    role=\"combobox\"\n    aria-autocomplete=\"list\"\n    [attr.aria-expanded]=\"panelOpen()\"\n    [attr.aria-controls]=\"panelOpen() ? 'moz-grid-formula-editor-listbox' : null\"\n    [attr.aria-activedescendant]=\"panelOpen() ? 'moz-grid-formula-editor-option-' + selectedIndex() : null\"\n    spellcheck=\"false\"\n    autocomplete=\"off\"\n    autocapitalize=\"off\"\n    [value]=\"value()\"\n    (input)=\"onInput($event)\"\n    (keydown)=\"onKeyDown($event)\"\n    (keyup)=\"onCaretProbe($event)\"\n    (click)=\"onCaretProbe($event)\"\n    (select)=\"onCaretProbe($event)\"\n    (scroll)=\"onScroll($event)\"\n  />\n</div>\n\n<ng-template\n  [cdkConnectedOverlayOrigin]=\"origin()\"\n  [cdkConnectedOverlayOpen]=\"panelOpen()\"\n  [cdkConnectedOverlayPositions]=\"panelPositions\"\n  [cdkConnectedOverlayHasBackdrop]=\"false\"\n  cdkConnectedOverlay\n  (overlayOutsideClick)=\"closePanel()\"\n>\n  <ul\n    id=\"moz-grid-formula-editor-listbox\"\n    class=\"moz-grid-formula-editor__panel\"\n    role=\"listbox\"\n  >\n    @for (s of suggestions(); track s.name; let i = $index) {\n      <li\n        class=\"moz-grid-formula-editor__option\"\n        [class.moz-grid-formula-editor__option--selected]=\"i === selectedIndex()\"\n        [id]=\"'moz-grid-formula-editor-option-' + i\"\n        role=\"option\"\n        [attr.aria-selected]=\"i === selectedIndex()\"\n        (mousedown)=\"onSuggestionMouseDown($event, i)\"\n        (mouseenter)=\"onSuggestionMouseEnter(i)\"\n      >\n        <span class=\"moz-grid-formula-editor__option-name\">{{ s.name }}</span>\n        @if (s.signature) {\n          <span class=\"moz-grid-formula-editor__option-signature\">{{ s.signature }}</span>\n        }\n        @if (s.summary) {\n          <span class=\"moz-grid-formula-editor__option-summary\">{{ s.summary }}</span>\n        }\n      </li>\n    }\n  </ul>\n</ng-template>\n\n<div\n  class=\"moz-grid-formula-editor__a11y-live\"\n  role=\"status\"\n  aria-live=\"polite\"\n>\n  @if (panelOpen()) {\n    {{ suggestions().length }} suggestions. {{ suggestions()[selectedIndex()]?.name }} sélectionné.\n  }\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  effect,\n  ElementRef,\n  inject,\n  input,\n  output,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { GridStateManager } from '../../state/grid-state';\nimport { InlineEditEngine } from '../../features/inline-edit.engine';\nimport { CellSelectionEngine } from '../../features/cell-selection.engine';\nimport { CellValidationEngine } from '../../features/cell-validation.engine';\nimport { ClipboardEngine } from '../../features/clipboard.engine';\nimport { FormulaEngine } from '../../features/formula/formula.engine';\nimport { FormulaRefHighlightService } from '../../features/formula/formula-ref-highlight.service';\nimport { MozGridFormulaEditorComponent } from '../formula-editor/formula-editor';\nimport type { FormulaValue } from '../../models/formula.model';\nimport { GridEngine } from '../../engine/grid-engine';\nimport { ColumnDef, ColumnStateEntry, CellEditorType } from '../../models/column.model';\nimport { MozSelectComponent } from '../../../select/select';\nimport { MozCheckboxComponent } from '../../../checkbox/checkbox';\nimport { MozDatepickerComponent } from '../../../datepicker/datepicker';\nimport { MozTooltipDirective } from '../../../tooltip/tooltip.directive';\nimport { ErrorFilled24 } from '@mozaic-ds/icons-angular';\n\n@Component({\n  selector: 'moz-grid-cell',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    NgTemplateOutlet,\n    FormsModule,\n    MozSelectComponent,\n    MozCheckboxComponent,\n    MozDatepickerComponent,\n    MozTooltipDirective,\n    ErrorFilled24,\n    MozGridFormulaEditorComponent,\n  ],\n  host: {\n    '[style.flex]': 'isLast() ? \"1 0 auto\" : \"0 0 auto\"',\n    '[style.width.px]': 'isLast() ? undefined : colState().currentWidth',\n    '[style.min-width.px]': 'isLast() ? colState().currentWidth : resolvedMinWidth()',\n    '[style.position]': 'pinnedSticky() ? \"sticky\" : null',\n    '[style.left.px]': 'pinnedSticky() === \"left\" ? pinnedOffset() : null',\n    '[style.right.px]': 'pinnedSticky() === \"right\" ? pinnedOffset() : null',\n    '[style.zIndex]': 'pinnedSticky() ? 2 : null',\n    '[class.grid-cell--pinned]': 'pinnedSticky() !== null',\n    '[class.grid-cell--pinned-left-edge]': 'pinnedEdge() === \"left\"',\n    '[class.grid-cell--pinned-right-edge]': 'pinnedEdge() === \"right\"',\n  },\n  templateUrl: './grid-cell.html',\n  styleUrls: ['./grid-cell.scss'],\n})\nexport class MozGridCellComponent<T = unknown> {\n  private readonly state = inject(GridStateManager);\n  private readonly inlineEdit = inject(InlineEditEngine);\n  private readonly cellSelectionEngine = inject(CellSelectionEngine);\n  private readonly validationEngine = inject(CellValidationEngine);\n  private readonly clipboard = inject(ClipboardEngine);\n  private readonly gridEngine = inject(GridEngine);\n  /** Optional: present only when the grid provides `FormulaEngine`. */\n  private readonly formulaEngine = inject(FormulaEngine, { optional: true });\n  private readonly refHighlight = inject(FormulaRefHighlightService, { optional: true });\n  private readonly elRef = inject(ElementRef<HTMLElement>);\n\n  constructor() {\n    effect(() => {\n      if (this.isEditing()) {\n        this.focusEditor();\n      }\n    });\n  }\n\n  private focusEditor(): void {\n    // Wait for the editor DOM to render, then focus it\n    setTimeout(() => {\n      const el = this.elRef.nativeElement;\n      // Formula editor manages its own focus + caret placement (end of\n      // input, no selection) so that click-to-pick replaces the ref at\n      // the caret rather than a globally-selected formula. Bail early.\n      if (this.isFormulaEditing()) return;\n      const focusable: HTMLElement | null = el.querySelector('input, select, textarea');\n      if (focusable) {\n        focusable.focus();\n        if (focusable instanceof HTMLInputElement) {\n          focusable.select();\n        }\n        return;\n      }\n      // Custom editors (e.g. combobox): find and click the trigger button to auto-open\n      const trigger: HTMLButtonElement | null = el.querySelector(\n        'button[role=\"combobox\"], .mc-combobox__control'\n      );\n      if (trigger) {\n        trigger.focus();\n        trigger.click();\n      }\n    });\n  }\n\n  readonly row = input.required<T>();\n  readonly rowIndex = input.required<number>();\n  readonly colIndex = input.required<number>();\n  readonly colState = input.required<ColumnStateEntry>();\n  readonly def = input.required<ColumnDef<T>>();\n  readonly isLast = input<boolean>(false);\n  readonly pinnedEnd = input<boolean>(false);\n  /** When set, applies `position: sticky` with the given side; the offset is\n   * read from `pinnedOffset()`. */\n  readonly pinnedSticky = input<'left' | 'right' | null>(null);\n  /** Pixel offset applied to `left` (when `pinnedSticky === 'left'`) or\n   * `right` (when `'right'`). */\n  readonly pinnedOffset = input<number>(0);\n  /** Marks the cell at the visual edge of its pinned section so it can paint\n   * the shadow that separates frozen columns from the scrollable area. */\n  readonly pinnedEdge = input<'left' | 'right' | null>(null);\n\n  readonly resolvedMinWidth = computed(() => {\n    const def = this.def();\n    return def.minWidth ? parseInt(def.minWidth, 10) || 50 : 50;\n  });\n\n  readonly commitEdit = output<void>();\n  readonly cancelEdit = output<void>();\n\n  onFormulaCancel(): void {\n    this.cancelEdit.emit();\n  }\n\n  readonly cellTemplate = computed(() => this.def().cellTemplate ?? null);\n  readonly editTemplate = computed(() => this.def().editTemplate ?? null);\n  readonly updateDraftFn = (value: unknown): void => this.inlineEdit.updateDraft(value);\n  readonly commitEditFn = (): void => this.commitEdit.emit();\n\n  /**\n   * Stable cell address for the formula engine. `null` when the column\n   * isn't formula-enabled or the row lacks a stable id (e.g. headers).\n   */\n  private readonly formulaAddr = computed(() => {\n    if (!this.def().allowFormula || !this.formulaEngine) return null;\n    const rowId = (this.row() as Record<string, unknown>)[this.state.rowIdField()];\n    if (rowId === undefined || rowId === null) return null;\n    return { rowId: rowId as string | number, field: this.def().field };\n  });\n\n  /**\n   * Last-evaluated `FormulaValue` for this cell, or `null` when the cell\n   * holds no formula. Reactivity is driven by `formulaEngine.values`.\n   */\n  readonly formulaValue = computed(() => {\n    const addr = this.formulaAddr();\n    if (!addr || !this.formulaEngine) return null;\n    // Subscribe to the values signal; `hasFormula` alone doesn't.\n    const map = this.formulaEngine.values();\n    const key = `${addr.rowId}|${addr.field}`;\n    return map.get(key) ?? null;\n  });\n\n  readonly value = computed(() => {\n    const d = this.def();\n    // When a formula is registered for this cell, its evaluated value wins\n    // over the raw source field — the source still holds the formula string\n    // (inline storage mode) and gets shown only while the cell is edited.\n    const fv = this.formulaValue();\n    if (fv && !this.isEditing()) {\n      return formulaValueToJs(fv);\n    }\n    if (d.valueGetter) return d.valueGetter(this.row());\n    return (this.row() as Record<string, unknown>)[d.field];\n  });\n\n  readonly displayValue = computed(() => {\n    const d = this.def();\n    const fv = this.formulaValue();\n    if (fv && !this.isEditing()) {\n      return formulaValueToDisplay(fv);\n    }\n    const val = this.value();\n    if (d.valueFormatter) return d.valueFormatter(val, this.row());\n    return val != null ? String(val) : '';\n  });\n\n  /** `true` when the current cell value is a formula error (e.g. `#DIV/0!`). */\n  readonly hasFormulaError = computed(() => {\n    const fv = this.formulaValue();\n    return fv?.kind === 'error';\n  });\n\n  /**\n   * Currently editing and the draft is a formula (starts with `=`).\n   * Drives the switch to `MozGridFormulaEditorComponent` instead of the\n   * default text input.\n   */\n  readonly isFormulaEditing = computed(() => {\n    if (!this.def().allowFormula) return false;\n    if (!this.isEditing()) return false;\n    const draft = this.editState().draftValue;\n    return typeof draft === 'string' && draft.trimStart().startsWith('=');\n  });\n\n  /**\n   * Palette CSS var for the coloured border shown when this cell is\n   * currently referenced by the formula being edited elsewhere. `null`\n   * when no editor is active or this cell is not referenced.\n   */\n  readonly refHighlightColor = computed<string | null>(() => {\n    if (!this.refHighlight) return null;\n    if (!this.refHighlight.isActive()) return null;\n    const rowId = (this.row() as Record<string, unknown>)[this.state.rowIdField()];\n    if (rowId === undefined || rowId === null) return null;\n    return this.refHighlight.colorByCell().get(`${rowId}|${this.def().field}`) ?? null;\n  });\n\n  readonly editState = computed(() => this.state.cellEditState());\n\n  readonly isEditing = computed(() => {\n    return this.inlineEdit.isEditing(this.rowIndex(), this.colIndex());\n  });\n\n  readonly editorType = computed<CellEditorType>(() => {\n    return this.inlineEdit.resolveEditorType(this.def().field, this.value());\n  });\n\n  readonly isFocused = computed(() => {\n    return this.cellSelectionEngine.isCellFocused(this.rowIndex(), this.colIndex());\n  });\n\n  readonly isInRange = computed(() => {\n    return (\n      !this.isFocused() && this.cellSelectionEngine.isCellInRange(this.rowIndex(), this.colIndex())\n    );\n  });\n\n  readonly isInFillRange = computed(() => {\n    return this.cellSelectionEngine.isCellInFillRange(this.rowIndex(), this.colIndex());\n  });\n\n  readonly isInFillRejectRange = computed(() => {\n    return this.cellSelectionEngine.isCellInFillRejectRange(this.rowIndex(), this.colIndex());\n  });\n\n  readonly cutEdges = computed(() => this.clipboard.cutEdges(this.rowIndex(), this.colIndex()));\n\n  readonly cellError = computed(() => {\n    // Validation errors are keyed by sourceData index, but `rowIndex()` is a\n    // display/paginated index. Resolve to the source index so errors show on\n    // the right cells when sort / filter / grouping is active.\n    const sourceIndex = this.gridEngine.displayIndexToSourceIndex(this.rowIndex());\n    if (sourceIndex < 0) return null;\n    return this.validationEngine.getCellError(sourceIndex, this.def().field);\n  });\n\n  onCellClick(event: MouseEvent): void {\n    // Shift+click: extend range — only when multi-cell selection is enabled\n    if (event.shiftKey && !this.state.multiCellSelectionEnabled()) return;\n    if (event.shiftKey) {\n      const focused = this.state.focusedCell();\n      if (focused) {\n        this.cellSelectionEngine.selectRange(focused, {\n          row: this.rowIndex(),\n          col: this.colIndex(),\n        });\n      } else {\n        this.cellSelectionEngine.startRangeSelection(this.rowIndex(), this.colIndex());\n      }\n      if (this.state.activeSelectionMode() !== 'cells') {\n        this.state.activeSelectionMode.set('cells');\n      }\n      return;\n    }\n\n    // Drag-to-select already handled focus via mousedown — skip redundant focus\n    // Only need to handle the commit of other editing cells\n  }\n\n  onMouseDown(event: MouseEvent): void {\n    // Formula pick mode: a formula editor is active elsewhere. Clicking a\n    // cell inserts its reference into the editor instead of starting a\n    // selection. The editor keeps the focus; we must not focus the grid.\n    if (this.refHighlight?.isPickMode() && !this.isEditing()) {\n      // Double-click wins over pick: abandon the formula edit so the\n      // target cell can open its own editor on the upcoming dblclick.\n      if (event.detail >= 2) {\n        this.cancelEdit.emit();\n      } else {\n        const rowId = (this.row() as Record<string, unknown>)[this.state.rowIdField()];\n        if (rowId !== undefined && rowId !== null) {\n          event.preventDefault();\n          event.stopPropagation();\n          const addr = { rowId: rowId as string | number, field: this.def().field };\n          this.refHighlight.pickRangeStart(addr, { absolute: event.shiftKey });\n        }\n        return;\n      }\n    }\n\n    if (event.shiftKey) {\n      event.preventDefault();\n      return;\n    }\n\n    // Don't intercept mousedown when this cell is being edited —\n    // native interactions (select dropdown, datepicker, etc.) need it.\n    if (this.isEditing()) {\n      return;\n    }\n\n    // Focus the cell (needed even when multi-cell selection is off for single-cell copy/paste)\n    const editState = this.state.cellEditState();\n    if (editState.editingCell) {\n      this.commitEdit.emit();\n    }\n    this.cellSelectionEngine.focusCell(this.rowIndex(), this.colIndex());\n\n    // Drag-to-select range: only when multi-cell selection is enabled\n    if (this.state.multiCellSelectionEnabled()) {\n      this.cellSelectionEngine.startRangeSelection(this.rowIndex(), this.colIndex());\n      if (this.state.activeSelectionMode() !== 'cells') {\n        this.state.activeSelectionMode.set('cells');\n      }\n    }\n\n    event.preventDefault();\n    // Re-focus the grid container so keyboard events keep working\n    const el = this.elRef.nativeElement as HTMLElement;\n    const grid = el.closest('[tabindex]') as HTMLElement | null;\n    grid?.focus();\n  }\n\n  onMouseEnter(): void {\n    if (this.refHighlight?.isPickDragging()) {\n      const rowId = (this.row() as Record<string, unknown>)[this.state.rowIdField()];\n      if (rowId !== undefined && rowId !== null) {\n        this.refHighlight.pickRangeExtend({\n          rowId: rowId as string | number,\n          field: this.def().field,\n        });\n      }\n      return;\n    }\n    if (this.state.isFilling()) {\n      this.cellSelectionEngine.extendFill(this.rowIndex(), this.colIndex());\n    } else if (this.state.isDragging() && this.state.multiCellSelectionEnabled()) {\n      this.cellSelectionEngine.extendRange(this.rowIndex(), this.colIndex());\n    }\n  }\n\n  onDoubleClick(): void {\n    if (!this.def().editable) return;\n    // Another cell is still in edit — commit or cancel it first so its draft\n    // doesn't leak into this cell's editor when we startEdit below.\n    const editing = this.state.cellEditState().editingCell;\n    if (editing && (editing.row !== this.rowIndex() || editing.col !== this.colIndex())) {\n      this.commitEdit.emit();\n    }\n    this.inlineEdit.startEdit(this.rowIndex(), this.def().field);\n  }\n\n  onEditorInput(event: Event): void {\n    const target = event.target as HTMLInputElement;\n    const editorType = this.editorType();\n    const value = editorType === 'number' ? Number(target.value) : target.value;\n    this.inlineEdit.updateDraft(value);\n  }\n\n  onSelectChange(event: Event): void {\n    const target = event.target as HTMLSelectElement;\n    this.inlineEdit.updateDraft(target.value);\n  }\n\n  onCheckboxChange(event: Event): void {\n    const target = event.target as HTMLInputElement;\n    this.inlineEdit.updateDraft(target.checked);\n  }\n\n  onDateChange(value: string | null): void {\n    this.inlineEdit.updateDraft(value);\n  }\n\n  onFillHandleMouseDown(event: MouseEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n    this.cellSelectionEngine.startFill(this.rowIndex(), this.colIndex());\n  }\n\n  onEditorBlur(event: FocusEvent): void {\n    const editorDiv = event.currentTarget as HTMLElement;\n    const relatedTarget = event.relatedTarget as Node | null;\n    // Only commit if focus is leaving the editor entirely (not moving within it)\n    if (relatedTarget && editorDiv.contains(relatedTarget)) return;\n    // CDK overlays (combobox dropdown, datepicker, etc.) render at <body> level.\n    // Don't commit if focus moved to an overlay — the editor is still active.\n    if (relatedTarget instanceof HTMLElement) {\n      const overlay = relatedTarget.closest('.cdk-overlay-container');\n      if (overlay) return;\n    }\n    // Defer the commit so pending interactions can settle. In particular,\n    // typing `=` in the plain text input mounts the formula editor in its\n    // place — the old input's removal fires `focusout` with a null\n    // `relatedTarget` (focus lands on `<body>` for a tick), but the new\n    // formula input grabs focus in its own `afterNextRender`. Re-check\n    // `activeElement` here so we don't commit out from under it.\n    setTimeout(() => {\n      if (!this.isEditing()) return;\n      const active = document.activeElement;\n      if (active instanceof Node && editorDiv.contains(active)) return;\n      this.commitEdit.emit();\n    });\n  }\n}\n\n// ─── Formula value helpers (module-local so they stay tree-shakable) ────────\n\n/**\n * Convert an evaluated `FormulaValue` to a plain JS value suitable for\n * filters, sort comparators and exports. Errors map to their code string\n * (`\"#DIV/0!\"`) so text filters still see the cell as a legitimate value.\n */\nfunction formulaValueToJs(v: FormulaValue): unknown {\n  switch (v.kind) {\n    case 'number':\n    case 'string':\n    case 'boolean':\n      return v.value;\n    case 'empty':\n      return '';\n    case 'error':\n      return v.error;\n  }\n}\n\n/** Format a `FormulaValue` for display in a cell. */\nfunction formulaValueToDisplay(v: FormulaValue): string {\n  switch (v.kind) {\n    case 'number':\n      return formatFormulaNumber(v.value);\n    case 'string':\n      return v.value;\n    case 'boolean':\n      return v.value ? 'TRUE' : 'FALSE';\n    case 'empty':\n      return '';\n    case 'error':\n      return v.error;\n  }\n}\n\n/**\n * Trim IEEE-754 float artefacts (e.g. `89.6999999999999` → `89.7`) by\n * re-rounding to 12 significant digits — the `toPrecision` / `Number`\n * round-trip drops the noisy tail while keeping every \"real\" digit a\n * user might have typed. Matches spreadsheet display conventions.\n */\nfunction formatFormulaNumber(value: number): string {\n  if (!Number.isFinite(value) || Number.isInteger(value)) return String(value);\n  return String(Number(value.toPrecision(12)));\n}\n","<div\n  class=\"grid-cell\"\n  [class.grid-cell--focused]=\"isFocused()\"\n  [class.grid-cell--in-range]=\"isInRange()\"\n  [class.grid-cell--in-fill-range]=\"isInFillRange()\"\n  [class.grid-cell--in-fill-reject-range]=\"isInFillRejectRange()\"\n  [class.grid-cell--cut]=\"cutEdges().any\"\n  [class.grid-cell--last]=\"isLast()\"\n  [class.grid-cell--pinned-end]=\"pinnedEnd()\"\n  [class.grid-cell--readonly]=\"!def().editable\"\n  [class.grid-cell--error]=\"cellError()\"\n  [class.grid-cell--formula-error]=\"hasFormulaError()\"\n  [class.grid-cell--ref-highlight]=\"refHighlightColor()\"\n  [style.--moz-grid-ref-color]=\"refHighlightColor()\"\n  [attr.aria-invalid]=\"cellError() ? 'true' : null\"\n  (click)=\"onCellClick($event)\"\n  (dblclick)=\"onDoubleClick()\"\n  (mousedown)=\"onMouseDown($event)\"\n  (mouseenter)=\"onMouseEnter()\"\n>\n  @if (isEditing()) {\n  <div class=\"grid-cell__editor\" (focusout)=\"onEditorBlur($event)\">\n    @if (isFormulaEditing()) {\n    <moz-grid-formula-editor\n      [value]=\"$any(editState().draftValue)\"\n      (valueChange)=\"updateDraftFn($event)\"\n      (commit)=\"commitEditFn()\"\n      (cancel)=\"onFormulaCancel()\"\n    />\n    } @else if (editTemplate()) {\n    <div class=\"grid-cell__editor-custom\">\n      <ng-container\n        [ngTemplateOutlet]=\"editTemplate()!\"\n        [ngTemplateOutletContext]=\"{\n          $implicit: value(),\n          row: row(),\n          field: def().field,\n          draft: editState().draftValue,\n          updateDraft: updateDraftFn,\n          commitEdit: commitEditFn\n        }\"\n      />\n    </div>\n    } @else { @switch (editorType()) {  @case ('text') {\n    <input\n      class=\"grid-cell__input grid-cell__input--plain\"\n      type=\"text\"\n      [value]=\"editState().draftValue\"\n      (input)=\"onEditorInput($event)\"\n    />\n    } @case ('number') {\n    <input\n      class=\"grid-cell__input grid-cell__input--plain\"\n      type=\"number\"\n      [value]=\"editState().draftValue\"\n      (input)=\"onEditorInput($event)\"\n    />\n    } @case ('select') {\n    <moz-select\n      name=\"cell-editor\"\n      [options]=\"def().cellEditorOptions ?? []\"\n      [ngModel]=\"editState().draftValue\"\n      (change)=\"onSelectChange($event)\"\n      [size]=\"'s'\"\n    />\n    } @case ('checkbox') {\n    <moz-checkbox\n      [id]=\"'grid-cell-editor-' + rowIndex() + '-' + colIndex()\"\n      [ngModel]=\"!!editState().draftValue\"\n      (change)=\"onCheckboxChange($event)\"\n    />\n    } @case ('date') {\n    <moz-datepicker\n      [id]=\"'grid-cell-editor-' + rowIndex() + '-' + colIndex()\"\n      size=\"s\"\n      [ngModel]=\"editState().draftValue\"\n      (ngModelChange)=\"onDateChange($event)\"\n    />\n    } @default {\n    <input\n      class=\"grid-cell__input grid-cell__input--plain\"\n      type=\"text\"\n      [value]=\"editState().draftValue\"\n      (input)=\"onEditorInput($event)\"\n    />\n    } } }\n  </div>\n  } @else { @if (cellTemplate()) {\n  <div class=\"grid-cell__custom\">\n    <ng-container\n      [ngTemplateOutlet]=\"cellTemplate()!\"\n      [ngTemplateOutletContext]=\"{ $implicit: value(), row: row(), field: def().field }\"\n    />\n  </div>\n  } @else {\n  <span class=\"grid-cell__value\">{{ displayValue() }}</span>\n  } } @if (cutEdges(); as edges) { @if (edges.top) {\n  <div class=\"grid-cell__cut-mark grid-cell__cut-mark--top\"></div>\n  } @if (edges.bottom) {\n  <div class=\"grid-cell__cut-mark grid-cell__cut-mark--bottom\"></div>\n  } @if (edges.left) {\n  <div class=\"grid-cell__cut-mark grid-cell__cut-mark--left\"></div>\n  } @if (edges.right) {\n  <div class=\"grid-cell__cut-mark grid-cell__cut-mark--right\"></div>\n  } } @if (isFocused() && !isEditing() && def().editable) {\n  <div class=\"grid-cell__fill-handle\" (mousedown)=\"onFillHandleMouseDown($event)\"></div>\n  } @if (cellError(); as error) {\n  <div\n    class=\"grid-cell__error-icon\"\n    [mozTooltip]=\"error.message\"\n    tooltipPosition=\"top\"\n    aria-label=\"Erreur de validation\"\n  >\n    <ErrorFilled24 />\n  </div>\n  }\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  ElementRef,\n  inject,\n  input,\n  output,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { GridStateManager } from '../../state/grid-state';\nimport { InlineEditEngine } from '../../features/inline-edit.engine';\nimport { RowSelectionEngine } from '../../features/row-selection.engine';\nimport { ExpandableRowEngine } from '../../features/expandable-row.engine';\nimport { MozGridCellComponent } from '../cell/grid-cell';\nimport { trackByField } from '../../utils/track-by';\nimport { ChevronRight20, ChevronDown20 } from '@mozaic-ds/icons-angular';\nimport { MozCheckboxComponent } from '../../../checkbox/checkbox';\n\n@Component({\n  selector: 'moz-grid-row',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [MozGridCellComponent, ChevronRight20, ChevronDown20, MozCheckboxComponent, FormsModule],\n  host: {\n    '[attr.data-row-index]': 'rowIndex()',\n  },\n  templateUrl: './grid-row.html',\n  styleUrls: ['./grid-row.scss'],\n})\nexport class MozGridRowComponent<T = unknown> {\n  protected readonly state = inject(GridStateManager);\n  private readonly inlineEdit = inject(InlineEditEngine);\n  private readonly rowSelection = inject(RowSelectionEngine);\n  private readonly expandableEngine = inject(ExpandableRowEngine);\n  private readonly elRef = inject(ElementRef<HTMLElement>);\n  protected readonly trackByField = trackByField;\n\n  readonly row = input.required<T>();\n  readonly rowIndex = input.required<number>();\n  readonly showCheckbox = input<boolean>(false);\n  readonly showExpand = input<boolean>(false);\n\n  readonly cellEdit = output<{\n    row: T;\n    rowIndex: number;\n    field: string;\n    oldValue: unknown;\n    newValue: unknown;\n  }>();\n  readonly cellEditCancel = output<{ rowIndex: number; field: string; originalValue: unknown }>();\n  readonly rowSelectionToggle = output<void>();\n\n  readonly isSelected = computed(() => this.rowSelection.isRowSelected(this.row()));\n\n  readonly isExpanded = computed(() => {\n    const row = this.row() as Record<string, unknown>;\n    const idField = this.state.rowIdField();\n    const rowId = row[idField];\n    return rowId !== undefined && this.expandableEngine.isRowExpanded(rowId);\n  });\n\n  /** Width consumed by sticky utility cells before the first pinned-left\n   * column (expand button + checkbox). */\n  protected readonly utilityLeftWidth = computed(() => {\n    let w = 0;\n    if (this.showExpand()) w += 36;\n    if (this.showCheckbox()) w += 48;\n    return w;\n  });\n\n  onExpandClick(event: Event): void {\n    event.stopPropagation();\n    const row = this.row() as Record<string, unknown>;\n    const idField = this.state.rowIdField();\n    const rowId = row[idField];\n    if (rowId !== undefined) {\n      this.expandableEngine.toggleRow(rowId);\n    }\n  }\n\n  onCheckboxClick(event: MouseEvent): void {\n    event.stopPropagation();\n    if (event.shiftKey && this.rowSelection.lastToggledRow() !== null) {\n      this.rowSelection.selectRowRangeToRow(this.row());\n    } else {\n      this.rowSelection.toggleRow(this.row());\n      this.rowSelection.lastToggledRow.set(this.row());\n    }\n    this.rowSelectionToggle.emit();\n  }\n\n  onCommitEdit(): void {\n    const event = this.inlineEdit.commitEdit();\n    if (event) {\n      this.cellEdit.emit(\n        event as { row: T; rowIndex: number; field: string; oldValue: unknown; newValue: unknown },\n      );\n    }\n    setTimeout(() => {\n      const el = this.elRef.nativeElement as HTMLElement;\n      const grid = el.closest('[tabindex]') as HTMLElement | null;\n      grid?.focus();\n    });\n  }\n\n  onCancelEdit(): void {\n    const event = this.inlineEdit.cancelEdit();\n    if (event) {\n      this.cellEditCancel.emit(event);\n    }\n  }\n}\n","<div\n  class=\"grid-row\"\n  role=\"row\"\n  [class.grid-row--selected]=\"isSelected()\"\n  [style.height.px]=\"state.rowHeight()\"\n>\n  <!-- Expand utility (sticky, leftmost) -->\n  @if (showExpand()) {\n  <button\n    class=\"grid-row__expand grid-row__sticky-utility\"\n    [style.left.px]=\"0\"\n    (click)=\"onExpandClick($event)\"\n    [attr.aria-label]=\"isExpanded() ? 'Collapse row ' + rowIndex() : 'Expand row ' + rowIndex()\"\n    type=\"button\"\n  >\n    @if (isExpanded()) {\n    <ChevronDown20 />\n    } @else {\n    <ChevronRight20 />\n    }\n  </button>\n  }\n\n  <!-- Checkbox utility (sticky, after expand) -->\n  @if (showCheckbox()) {\n  <div\n    class=\"grid-row__checkbox grid-row__sticky-utility\"\n    [style.left.px]=\"showExpand() ? 36 : 0\"\n    (click)=\"onCheckboxClick($event)\"\n  >\n    <moz-checkbox\n      [id]=\"'grid-row-' + rowIndex() + '-checkbox'\"\n      [label]=\"'Select row ' + rowIndex()\"\n      [ngModel]=\"isSelected()\"\n    />\n  </div>\n  }\n\n  <!-- Pinned-left columns (sticky) -->\n  @for (col of state.pinnedLeftColumns(); track trackByField($index, col); let i = $index, last = $last) {\n  <moz-grid-cell\n    [row]=\"row()\"\n    [rowIndex]=\"rowIndex()\"\n    [colIndex]=\"i\"\n    [colState]=\"col\"\n    [def]=\"state.columnDefMap().get(col.field)!\"\n    [isLast]=\"false\"\n    [pinnedSticky]=\"'left'\"\n    [pinnedOffset]=\"utilityLeftWidth() + state.pinnedLeftCumulativeOffsets()[i]\"\n    [pinnedEdge]=\"last && state.pinnedLeftColumns().length > 0 ? 'left' : null\"\n    (commitEdit)=\"onCommitEdit()\"\n    (cancelEdit)=\"onCancelEdit()\"\n  />\n  }\n\n  <!-- Leading column spacer -->\n  @if (state.leadingColumnSpacer() > 0) {\n  <div\n    class=\"grid-row__h-spacer\"\n    aria-hidden=\"true\"\n    [style.width.px]=\"state.leadingColumnSpacer()\"\n    [style.min-width.px]=\"state.leadingColumnSpacer()\"\n  ></div>\n  }\n\n  <!-- Unpinned (rendered slice) -->\n  @for (col of state.renderedUnpinnedColumns(); track trackByField($index, col); let i = $index, last = $last) {\n  <moz-grid-cell\n    [row]=\"row()\"\n    [rowIndex]=\"rowIndex()\"\n    [colIndex]=\"state.pinnedLeftColumns().length + state.effectiveColumnRange().start + i\"\n    [colState]=\"col\"\n    [def]=\"state.columnDefMap().get(col.field)!\"\n    [isLast]=\"last && state.trailingColumnSpacer() === 0 && state.pinnedRightColumns().length === 0\"\n    (commitEdit)=\"onCommitEdit()\"\n    (cancelEdit)=\"onCancelEdit()\"\n  />\n  }\n\n  <!-- Trailing column spacer -->\n  @if (state.trailingColumnSpacer() > 0) {\n  <div\n    class=\"grid-row__h-spacer\"\n    aria-hidden=\"true\"\n    [style.width.px]=\"state.trailingColumnSpacer()\"\n    [style.min-width.px]=\"state.trailingColumnSpacer()\"\n  ></div>\n  }\n\n  <!-- Pinned-right columns (sticky) -->\n  @for (col of state.pinnedRightColumns(); track trackByField($index, col); let i = $index, first = $first, last = $last) {\n  <moz-grid-cell\n    [row]=\"row()\"\n    [rowIndex]=\"rowIndex()\"\n    [colIndex]=\"state.pinnedLeftColumns().length + state.unpinnedColumns().length + i\"\n    [colState]=\"col\"\n    [def]=\"state.columnDefMap().get(col.field)!\"\n    [isLast]=\"last\"\n    [pinnedEnd]=\"true\"\n    [pinnedSticky]=\"'right'\"\n    [pinnedOffset]=\"state.pinnedRightCumulativeOffsets()[i]\"\n    [pinnedEdge]=\"first ? 'right' : null\"\n    (commitEdit)=\"onCommitEdit()\"\n    (cancelEdit)=\"onCancelEdit()\"\n  />\n  }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport { GroupRow } from '../../models/display-row.model';\nimport { GridStateManager } from '../../state/grid-state';\nimport { ChevronRight20 } from '@mozaic-ds/icons-angular';\n\n@Component({\n  selector: 'moz-grid-group-row',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [ChevronRight20],\n  templateUrl: './grid-group-row.html',\n  styleUrls: ['./grid-group-row.scss'],\n})\nexport class MozGridGroupRowComponent<T = unknown> {\n  protected readonly state = inject(GridStateManager);\n\n  readonly groupRow = input.required<GroupRow<T>>();\n  readonly toggleExpand = output<string>();\n\n  readonly fieldLabel = computed(() => {\n    const field = this.groupRow().field;\n    const def = this.state.columnDefMap().get(field);\n    return def?.headerName ?? field;\n  });\n\n  readonly groupValue = computed(() => {\n    return String(this.groupRow().value ?? '');\n  });\n}\n","<div\n  class=\"grid-group-row\"\n  role=\"row\"\n  [style.padding-left.px]=\"groupRow().depth * 24 + 16\"\n  (click)=\"toggleExpand.emit(groupRow().groupKey)\"\n>\n  <span\n    class=\"grid-group-row__toggle\"\n    [class.grid-group-row__toggle--expanded]=\"groupRow().expanded\"\n  >\n    <ChevronRight20 />\n  </span>\n  <div class=\"grid-group-row__info\">\n    <span class=\"grid-group-row__field\">{{ fieldLabel() }}</span>\n    <span class=\"grid-group-row__value\">{{ groupValue() }}</span>\n  </div>\n  <span class=\"grid-group-row__count\">{{ groupRow().count }}</span>\n</div>\n","import { ChangeDetectionStrategy, Component, input, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet, JsonPipe } from '@angular/common';\n\n@Component({\n  selector: 'moz-grid-detail-row',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [NgTemplateOutlet, JsonPipe],\n  templateUrl: './grid-detail-row.html',\n  styleUrls: ['./grid-detail-row.scss'],\n})\nexport class MozGridDetailRowComponent<T = unknown> {\n  readonly data = input.required<T>();\n  readonly rowIndex = input.required<number>();\n  readonly detailTemplate = input<TemplateRef<unknown> | null>(null);\n}\n","<div class=\"grid-detail-row\">\n  @if (detailTemplate()) {\n    <ng-container\n      [ngTemplateOutlet]=\"detailTemplate()!\"\n      [ngTemplateOutletContext]=\"{ $implicit: data(), index: rowIndex() }\"\n    />\n  } @else {\n    <pre class=\"grid-detail-row__default\">{{ data() | json }}</pre>\n  }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { GridStateManager } from '../../state/grid-state';\n\n@Component({\n  selector: 'moz-grid-skeleton-row',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"grid-skeleton-row\" [style.height.px]=\"state.rowHeight()\">\n      @if (showExpand()) {\n      <div class=\"grid-skeleton-row__utility\" [style.width.px]=\"36\" [style.left.px]=\"0\"></div>\n      } @if (showCheckbox()) {\n      <div\n        class=\"grid-skeleton-row__utility\"\n        [style.width.px]=\"48\"\n        [style.left.px]=\"showExpand() ? 36 : 0\"\n      ></div>\n      }\n\n      @for (col of state.pinnedLeftColumns(); track col.field; let i = $index) {\n      <div\n        class=\"grid-skeleton-row__cell grid-skeleton-row__cell--sticky-left\"\n        [style.width.px]=\"col.currentWidth\"\n        [style.min-width.px]=\"col.currentWidth\"\n        [style.left.px]=\"utilityLeftWidth() + state.pinnedLeftCumulativeOffsets()[i]\"\n      >\n        <div class=\"grid-skeleton-row__shimmer\"></div>\n      </div>\n      } @if (state.leadingColumnSpacer() > 0) {\n      <div\n        class=\"grid-skeleton-row__spacer\"\n        [style.width.px]=\"state.leadingColumnSpacer()\"\n      ></div>\n      } @for (col of state.renderedUnpinnedColumns(); track col.field) {\n      <div\n        class=\"grid-skeleton-row__cell\"\n        [style.width.px]=\"col.currentWidth\"\n        [style.min-width.px]=\"col.currentWidth\"\n      >\n        <div class=\"grid-skeleton-row__shimmer\"></div>\n      </div>\n      } @if (state.trailingColumnSpacer() > 0) {\n      <div\n        class=\"grid-skeleton-row__spacer\"\n        [style.width.px]=\"state.trailingColumnSpacer()\"\n      ></div>\n      } @for (col of state.pinnedRightColumns(); track col.field; let i = $index) {\n      <div\n        class=\"grid-skeleton-row__cell grid-skeleton-row__cell--sticky-right\"\n        [style.width.px]=\"col.currentWidth\"\n        [style.min-width.px]=\"col.currentWidth\"\n        [style.right.px]=\"state.pinnedRightCumulativeOffsets()[i]\"\n      >\n        <div class=\"grid-skeleton-row__shimmer\"></div>\n      </div>\n      }\n    </div>\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n        background: var(--color-background-primary);\n        border-bottom: 1px solid var(--color-border-primary);\n      }\n\n      .grid-skeleton-row {\n        display: flex;\n        width: max-content;\n        min-width: 100%;\n        box-sizing: border-box;\n        background: inherit;\n      }\n\n      .grid-skeleton-row__utility {\n        flex: 0 0 auto;\n        height: 100%;\n        position: sticky;\n        z-index: 2;\n        background: inherit;\n      }\n\n      .grid-skeleton-row__cell {\n        flex: 0 0 auto;\n        height: 100%;\n        display: flex;\n        align-items: center;\n        padding: 0 12px;\n        box-sizing: border-box;\n        background: inherit;\n      }\n\n      .grid-skeleton-row__cell--sticky-left {\n        position: sticky;\n        z-index: 1;\n      }\n\n      .grid-skeleton-row__cell--sticky-right {\n        position: sticky;\n        z-index: 1;\n      }\n\n      .grid-skeleton-row__spacer {\n        flex: 0 0 auto;\n        height: 100%;\n        background: inherit;\n      }\n\n      .grid-skeleton-row__shimmer {\n        width: 60%;\n        height: 12px;\n        border-radius: var(--border-radius-s, 4px);\n        background: linear-gradient(\n          90deg,\n          var(--color-border-primary, #e0e6ea) 25%,\n          var(--color-background-tertiary, #f0f4f6) 50%,\n          var(--color-border-primary, #e0e6ea) 75%\n        );\n        background-size: 200% 100%;\n        animation: moz-grid-shimmer 1.5s ease-in-out infinite;\n      }\n\n      @keyframes moz-grid-shimmer {\n        0% {\n          background-position: 200% center;\n        }\n        100% {\n          background-position: -200% center;\n        }\n      }\n    `,\n  ],\n})\nexport class MozGridSkeletonRowComponent {\n  protected readonly state = inject(GridStateManager);\n\n  readonly showCheckbox = input<boolean>(false);\n  readonly showExpand = input<boolean>(false);\n\n  protected readonly utilityLeftWidth = computed(() => {\n    let w = 0;\n    if (this.showExpand()) w += 36;\n    if (this.showCheckbox()) w += 48;\n    return w;\n  });\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  effect,\n  ElementRef,\n  inject,\n  input,\n  output,\n  TemplateRef,\n  viewChild,\n  viewChildren,\n  afterNextRender,\n} from '@angular/core';\nimport { GridStateManager } from '../../state/grid-state';\nimport { GridEngine } from '../../engine/grid-engine';\nimport { MozGridRowComponent } from '../row/grid-row';\nimport { MozGridGroupRowComponent } from '../group-row/grid-group-row';\nimport { MozGridDetailRowComponent } from '../detail-row/grid-detail-row';\nimport { MozGridSkeletonRowComponent } from '../skeleton-row/grid-skeleton-row';\nimport { ExpandableRowEngine } from '../../features/expandable-row.engine';\nimport { VerticalVirtualScrollEngine } from '../../features/vertical-virtual-scroll.engine';\nimport { CellEditEvent, CellEditCancelEvent } from '../../models/cell.model';\n\n@Component({\n  selector: 'moz-grid-body',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [MozGridRowComponent, MozGridGroupRowComponent, MozGridDetailRowComponent, MozGridSkeletonRowComponent],\n  templateUrl: './grid-body.html',\n  styleUrls: ['./grid-body.scss'],\n})\nexport class MozGridBodyComponent {\n  protected readonly state = inject(GridStateManager);\n  protected readonly engine = inject(GridEngine);\n  private readonly expandableEngine = inject(ExpandableRowEngine);\n  private readonly verticalEngine = inject(VerticalVirtualScrollEngine);\n\n  readonly bodyContainer = viewChild<ElementRef<HTMLElement>>('bodyContainer');\n  private readonly rowEls = viewChildren('rowEl', { read: ElementRef });\n\n  readonly showCheckbox = input<boolean>(false);\n  readonly showExpand = input<boolean>(false);\n  readonly detailTemplate = input<TemplateRef<unknown> | null>(null);\n\n  readonly cellEdit = output<CellEditEvent>();\n  readonly cellEditCancel = output<CellEditCancelEvent>();\n  readonly rowSelectionToggle = output<void>();\n  readonly groupToggle = output<string>();\n\n  /** Width consumed by sticky utility cells before the first pinned-left\n   * column — must match `MozGridRowComponent.utilityLeftWidth()` so the\n   * detail/group rows align with the data row layout. */\n  protected readonly utilityLeftWidth = computed(() => {\n    let w = 0;\n    if (this.showExpand()) w += 36;\n    if (this.showCheckbox()) w += 48;\n    return w;\n  });\n\n  /** Number of skeleton rows shown while loading — match page size, max 20. */\n  protected readonly skeletonRows = computed(() => {\n    const count = Math.min(this.state.pageSize(), 20);\n    return new Array<number>(count).fill(0).map((_, i) => i);\n  });\n\n  /** Concrete display-row indices to render this frame. */\n  protected readonly visibleIndices = computed(() => {\n    const { start, end } = this.state.visibleRowRange();\n    if (end <= start) return [] as number[];\n    const out = new Array<number>(end - start);\n    for (let i = 0; i < out.length; i++) out[i] = start + i;\n    return out;\n  });\n\n  protected isRowExpanded(data: unknown): boolean {\n    const row = data as Record<string, unknown>;\n    const rowId = row[this.state.rowIdField()];\n    return rowId !== undefined && this.expandableEngine.isRowExpanded(rowId);\n  }\n\n  private resizeObserver: ResizeObserver | null = null;\n\n  constructor() {\n    afterNextRender(() => {\n      this.resizeObserver = new ResizeObserver((entries) =>\n        this.verticalEngine.onRowsResized(entries),\n      );\n    });\n\n    effect(() => {\n      // Re-observe rendered rows whenever the visible window or expansion\n      // state changes — only expanded rows actually need measurement, but\n      // observing all of them is cheap (border-box sizes are O(1) in RO).\n      const rows = this.rowEls();\n      const ro = this.resizeObserver;\n      if (!ro) return;\n      const range = this.state.visibleRowRange();\n      ro.disconnect();\n      rows.forEach((ref, i) => {\n        const el = (ref as ElementRef<HTMLElement>).nativeElement;\n        this.verticalEngine.observeRow(range.start + i, el, ro);\n      });\n    });\n  }\n}\n","<div\n  class=\"grid-body__container\"\n  #bodyContainer\n  [style.min-width.px]=\"state.totalContentWidth() + utilityLeftWidth()\"\n>\n  <!-- Top spacer (replaces translateY): forces visible rows to render at the\n       correct vertical position. Pure block flow, no transform → keeps the\n       sticky containing block on the scroll container. -->\n  <div\n    class=\"grid-body__spacer\"\n    aria-hidden=\"true\"\n    [style.height.px]=\"state.topSpacerHeight()\"\n  ></div>\n\n  @if (state.isLoading()) {\n  @for (i of skeletonRows(); track i) {\n  <moz-grid-skeleton-row [showCheckbox]=\"showCheckbox()\" [showExpand]=\"showExpand()\" />\n  } } @else {\n  @for (idx of visibleIndices(); track idx) {\n  @let displayRow = engine.displayRows()[idx];\n  @if (displayRow.type === 'data') {\n  <moz-grid-row\n    [row]=\"displayRow.data\"\n    [rowIndex]=\"displayRow.index\"\n    [showCheckbox]=\"showCheckbox()\"\n    [showExpand]=\"showExpand()\"\n    [attr.data-row-index]=\"idx\"\n    #rowEl\n    (cellEdit)=\"cellEdit.emit($event)\"\n    (cellEditCancel)=\"cellEditCancel.emit($event)\"\n    (rowSelectionToggle)=\"rowSelectionToggle.emit()\"\n  />\n  @if (isRowExpanded(displayRow.data)) {\n  <moz-grid-detail-row\n    [data]=\"displayRow.data\"\n    [rowIndex]=\"displayRow.index\"\n    [detailTemplate]=\"detailTemplate()\"\n    [style.width.px]=\"state.scrollViewportWidth()\"\n  />\n  } } @else if (displayRow.type === 'group') {\n  <moz-grid-group-row\n    [groupRow]=\"displayRow.group\"\n    [style.width.px]=\"state.scrollViewportWidth()\"\n    (toggleExpand)=\"groupToggle.emit($event)\"\n  />\n  } }\n  }\n\n  <!-- Bottom spacer: makes the scroll container tall enough to expose the\n       full virtual range. -->\n  <div\n    class=\"grid-body__spacer\"\n    aria-hidden=\"true\"\n    [style.height.px]=\"state.bottomSpacerHeight()\"\n  ></div>\n</div>\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { GridStateManager } from '../../state/grid-state';\nimport { GridEngine } from '../../engine/grid-engine';\nimport { MozPaginationComponent } from '../../../pagination/pagination';\nimport { MozSelectComponent } from '../../../select/select';\nimport { PageEvent } from '../../models/pagination.model';\n\n@Component({\n  selector: 'moz-grid-footer',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [MozPaginationComponent, MozSelectComponent, FormsModule],\n  templateUrl: './grid-footer.html',\n  styleUrls: ['./grid-footer.scss'],\n})\nexport class MozGridFooterComponent {\n  protected readonly state = inject(GridStateManager);\n  protected readonly engine = inject(GridEngine);\n\n  readonly pageSizeOptions = input<number[]>([10, 20, 50, 100]);\n\n  readonly pageChange = output<PageEvent>();\n\n  readonly currentPageSizeStr = computed(() => String(this.state.pageSize()));\n\n  readonly pageSizeSelectOptions = computed(() => {\n    return this.pageSizeOptions().map((size) => ({\n      text: String(size),\n      value: String(size),\n    }));\n  });\n\n  readonly paginationOptions = computed(() => {\n    const totalPages = this.state.totalPages();\n    return Array.from({ length: totalPages }, (_, i) => ({\n      text: String(i + 1),\n      value: i,\n    }));\n  });\n\n  readonly rangeLabel = computed(() => {\n    const pageIndex = this.state.pageIndex();\n    const pageSize = this.state.pageSize();\n    const total = this.engine.computedTotalItems();\n    const start = pageIndex * pageSize + 1;\n    const end = Math.min((pageIndex + 1) * pageSize, total);\n    return `${start}-${end} of ${total} items`;\n  });\n\n  onPageChange(newPageIndex: number): void {\n    const previousPageIndex = this.state.pageIndex();\n    const pageSize = this.state.pageSize();\n    this.state.pageIndex.set(newPageIndex);\n    this.state.expandedGroups.set(new Set());\n    this.pageChange.emit({\n      pageIndex: newPageIndex,\n      pageSize,\n      previousPageIndex,\n      previousPageSize: pageSize,\n    });\n  }\n\n  onPageSizeChange(event: Event): void {\n    const target = event.target as HTMLSelectElement;\n    const newSize = Number(target.value);\n    const previousPageSize = this.state.pageSize();\n    const previousPageIndex = this.state.pageIndex();\n    this.state.pageSize.set(newSize);\n    this.state.pageIndex.set(0);\n    this.state.expandedGroups.set(new Set());\n    this.pageChange.emit({\n      pageIndex: 0,\n      pageSize: newSize,\n      previousPageIndex,\n      previousPageSize,\n    });\n  }\n}\n","<div class=\"grid-footer\">\n  <div class=\"grid-footer__info\">\n    <span class=\"grid-footer__page-size-label\">Rows per page:</span>\n    <moz-select\n      name=\"page-size\"\n      [options]=\"pageSizeSelectOptions()\"\n      [ngModel]=\"currentPageSizeStr()\"\n      (change)=\"onPageSizeChange($event)\"\n      [size]=\"'s'\"\n    />\n    <span class=\"grid-footer__count\">\n      {{ rangeLabel() }}\n    </span>\n  </div>\n\n  <moz-pagination\n    [buttonSize]=\"'s'\"\n    [buttonAppearance]=\"'rounded'\"\n    id=\"grid-pagination\"\n    [options]=\"paginationOptions()\"\n    [value]=\"state.pageIndex()\"\n    (updateValue)=\"onPageChange($event)\"\n  />\n</div>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { MozLoaderComponent } from '../../../loader';\n\n@Component({\n  selector: 'moz-grid-loading-indicator',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [MozLoaderComponent],\n  template: `\n    <div class=\"grid-loading-indicator\">\n      <moz-loader size=\"s\" text=\"Loading more data...\" />\n    </div>\n  `,\n  styles: [\n    `\n      .grid-loading-indicator {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        padding: var(--spacing-m, 16px);\n        border-top: 1px solid var(--color-border-primary);\n        background: var(--color-background-primary);\n      }\n    `,\n  ],\n})\nexport class MozGridLoadingIndicatorComponent {}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  inject,\n  output,\n} from '@angular/core';\nimport { GridStateManager } from '../../state/grid-state';\nimport { CellSelectionEngine } from '../../features/cell-selection.engine';\nimport { RowSelectionEngine } from '../../features/row-selection.engine';\n\n@Component({\n  selector: 'moz-grid-selection-bar',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './grid-selection-bar.html',\n  styleUrls: ['./grid-selection-bar.scss'],\n})\nexport class MozGridSelectionBarComponent {\n  private readonly state = inject(GridStateManager);\n  private readonly cellSelection = inject(CellSelectionEngine);\n  private readonly rowSelection = inject(RowSelectionEngine);\n\n  readonly editClick = output<void>();\n  readonly copyClick = output<void>();\n  readonly pasteClick = output<void>();\n  readonly deleteClick = output<void>();\n  readonly exportClick = output<void>();\n\n  readonly selectedCount = computed(() => {\n    const mode = this.state.activeSelectionMode();\n    if (mode === 'rows') {\n      return this.rowSelection.pageSelectedCount();\n    }\n    if (mode === 'cells') {\n      const range = this.cellSelection.getNormalizedRange();\n      if (!range) return 0;\n      const rows = range.end.row - range.start.row + 1;\n      const cols = range.end.col - range.start.col + 1;\n      const total = rows * cols;\n      return total > 1 ? total : 0;\n    }\n    return 0;\n  });\n\n  readonly selectionLabel = computed(() => {\n    const mode = this.state.activeSelectionMode();\n    if (mode === 'rows') return 'rows selected';\n    if (mode === 'cells') return 'cells selected';\n    return 'selected';\n  });\n\n  onClear(): void {\n    const mode = this.state.activeSelectionMode();\n    if (mode === 'cells') {\n      this.cellSelection.clearFocus();\n      this.state.activeSelectionMode.set('none');\n    } else if (mode === 'rows') {\n      this.rowSelection.deselectPage();\n      // Only reset mode if no rows remain selected\n      if (this.rowSelection.count() === 0) {\n        this.state.activeSelectionMode.set('none');\n      }\n    }\n  }\n}\n","@if (selectedCount() > 0) {\n<div class=\"selection-bar\" role=\"toolbar\" aria-label=\"Bulk actions\">\n  <button\n    type=\"button\"\n    class=\"selection-bar__close\"\n    aria-label=\"Clear selection\"\n    (click)=\"onClear()\"\n  >\n    <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n      <path d=\"M8 6.586L12.293 2.293a1 1 0 1 1 1.414 1.414L9.414 8l4.293 4.293a1 1 0 0 1-1.414 1.414L8 9.414l-4.293 4.293a1 1 0 0 1-1.414-1.414L6.586 8 2.293 3.707a1 1 0 0 1 1.414-1.414L8 6.586z\"/>\n    </svg>\n  </button>\n  <span class=\"selection-bar__count\">\n    <strong>{{ selectedCount() }}</strong> {{ selectionLabel() }}\n  </span>\n  <div class=\"selection-bar__divider\"></div>\n  <button type=\"button\" class=\"selection-bar__action\" (click)=\"editClick.emit()\">Edit</button>\n  <button type=\"button\" class=\"selection-bar__action\" (click)=\"copyClick.emit()\">Copy</button>\n  <button type=\"button\" class=\"selection-bar__action\" (click)=\"pasteClick.emit()\">Paste</button>\n  <button type=\"button\" class=\"selection-bar__action\" (click)=\"exportClick.emit()\">Export</button>\n  <button type=\"button\" class=\"selection-bar__action selection-bar__action--danger\" (click)=\"deleteClick.emit()\">Delete</button>\n</div>\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { MozDrawerRef } from '../../../drawer/ref/drawer-ref';\nimport { MozDrawerFooterDirective } from '../../../drawer/directive/drawer-footer.directive';\nimport { MozButtonComponent } from '../../../button/button';\nimport { MozSelectComponent } from '../../../select/select';\nimport { MozToggleComponent } from '../../../toggle/toggle';\nimport { DRAWER_DATA } from '../../../drawer/config/drawer.config';\nimport { FormsModule } from '@angular/forms';\nimport {\n  CdkDropList,\n  CdkDrag,\n  CdkDragHandle,\n  CdkDragDrop,\n  moveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport { ChevronRight20, Drag20 } from '@mozaic-ds/icons-angular';\nimport { GridDensity, GridSettingsData, GridSettingsResult } from '../../models/grid-events.model';\n\ntype SettingsScreen = 'main' | 'density' | 'columns';\n\ninterface DraftColumn {\n  field: string;\n  headerName: string;\n  visible: boolean;\n}\n\nconst DENSITY_OPTIONS = [\n  { text: 'Small', value: 'small' },\n  { text: 'Default', value: 'default' },\n  { text: 'Large', value: 'large' },\n];\n\nconst DENSITY_LABELS: Record<GridDensity, string> = {\n  small: 'Small',\n  default: 'Default',\n  large: 'Large',\n};\n\n@Component({\n  selector: 'moz-grid-settings-drawer',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    FormsModule,\n    CdkDropList,\n    CdkDrag,\n    CdkDragHandle,\n    MozButtonComponent,\n    MozDrawerFooterDirective,\n    MozSelectComponent,\n    MozToggleComponent,\n    ChevronRight20,\n    Drag20,\n  ],\n  templateUrl: './grid-settings-drawer.html',\n  styleUrls: ['./grid-settings-drawer.scss'],\n})\nexport class GridSettingsDrawerComponent {\n  private readonly drawerRef = inject<MozDrawerRef<GridSettingsResult>>(MozDrawerRef);\n  private readonly data = inject<GridSettingsData>(DRAWER_DATA);\n\n  readonly screen = signal<SettingsScreen>('main');\n  readonly draftDensity = signal<GridDensity>(this.data.density);\n  readonly draftColumns = signal<DraftColumn[]>(this.data.columns.map((c) => ({ ...c })));\n  readonly searchQuery = signal('');\n\n  readonly densityOptions = DENSITY_OPTIONS;\n\n  readonly densityLabel = computed(() => DENSITY_LABELS[this.draftDensity()]);\n\n  readonly columnsLabel = computed(() => {\n    const cols = this.draftColumns();\n    const visible = cols.filter((c) => c.visible).length;\n    return `${visible}/${cols.length} displayed`;\n  });\n\n  readonly filteredColumns = computed(() => {\n    const q = this.searchQuery().toLowerCase();\n    if (!q) return this.draftColumns();\n    return this.draftColumns().filter((c) => c.headerName.toLowerCase().includes(q));\n  });\n\n  // Store default columns for factory reset\n  private readonly defaultColumns = this.data.defaultColumns.map((c) => ({ ...c }));\n\n  constructor() {\n    this.drawerRef.onBackClick().subscribe(() => {\n      this.goTo('main');\n    });\n  }\n\n  goTo(screen: SettingsScreen): void {\n    this.screen.set(screen);\n    switch (screen) {\n      case 'main':\n        this.drawerRef.title.set('Settings');\n        this.drawerRef.contentTitle.set('');\n        this.drawerRef.back.set(false);\n        break;\n      case 'density':\n        this.drawerRef.title.set('Data density');\n        this.drawerRef.contentTitle.set('');\n        this.drawerRef.back.set(true);\n        break;\n      case 'columns':\n        this.drawerRef.title.set('Display columns');\n        this.drawerRef.contentTitle.set('');\n        this.drawerRef.back.set(true);\n        break;\n    }\n  }\n\n  onColumnToggle(field: string, checked: boolean): void {\n    this.draftColumns.update((cols) =>\n      cols.map((c) => (c.field === field ? { ...c, visible: checked } : c))\n    );\n  }\n\n  onColumnDrop(event: CdkDragDrop<DraftColumn[]>): void {\n    const filtered = this.filteredColumns();\n    const fromField = filtered[event.previousIndex]?.field;\n    const toField = filtered[event.currentIndex]?.field;\n    if (!fromField || !toField) return;\n\n    this.draftColumns.update((cols) => {\n      const updated = [...cols];\n      const fromIdx = updated.findIndex((c) => c.field === fromField);\n      const toIdx = updated.findIndex((c) => c.field === toField);\n      if (fromIdx >= 0 && toIdx >= 0) {\n        moveItemInArray(updated, fromIdx, toIdx);\n      }\n      return updated;\n    });\n  }\n\n  onSearchInput(event: Event): void {\n    this.searchQuery.set((event.target as HTMLInputElement).value);\n  }\n\n  hideAll(): void {\n    this.draftColumns.update((cols) => cols.map((c) => ({ ...c, visible: false })));\n  }\n\n  showAll(): void {\n    this.draftColumns.update((cols) => cols.map((c) => ({ ...c, visible: true })));\n  }\n\n  apply(): void {\n    const result: GridSettingsResult = {\n      density: this.draftDensity(),\n      columns: this.draftColumns().map((c, i) => ({\n        field: c.field,\n        visible: c.visible,\n        order: i,\n      })),\n    };\n    this.drawerRef.close(result);\n  }\n\n  reset(): void {\n    this.draftDensity.set('default');\n    this.draftColumns.set(this.defaultColumns.map((c) => ({ ...c })));\n    this.searchQuery.set('');\n  }\n}\n","@switch (screen()) { @case ('main') {\n<div class=\"settings-list\">\n  <button type=\"button\" class=\"settings-list__item\" (click)=\"goTo('density')\">\n    <div class=\"settings-list__item-text\">\n      <span class=\"settings-list__item-title\">Data density</span>\n      <span class=\"settings-list__item-subtitle\">{{ densityLabel() }}</span>\n    </div>\n    <ChevronRight20 />\n  </button>\n  <button type=\"button\" class=\"settings-list__item\" (click)=\"goTo('columns')\">\n    <div class=\"settings-list__item-text\">\n      <span class=\"settings-list__item-title\">Display columns</span>\n      <span class=\"settings-list__item-subtitle\">{{ columnsLabel() }}</span>\n    </div>\n    <ChevronRight20 />\n  </button>\n</div>\n} @case ('density') {\n<div class=\"settings-density\">\n  <label class=\"settings-density__label\">Data density</label>\n  <moz-select\n    name=\"density\"\n    [options]=\"densityOptions\"\n    [ngModel]=\"draftDensity()\"\n    (ngModelChange)=\"draftDensity.set($event)\"\n  />\n</div>\n} @case ('columns') {\n<div class=\"settings-columns\">\n  <input\n    class=\"settings-columns__search\"\n    type=\"text\"\n    placeholder=\"Find a column\"\n    [value]=\"searchQuery()\"\n    (input)=\"onSearchInput($event)\"\n    aria-label=\"Search columns\"\n  />\n  <div class=\"settings-columns__list\" cdkDropList (cdkDropListDropped)=\"onColumnDrop($event)\">\n    @for (col of filteredColumns(); track col.field) {\n    <div class=\"settings-columns__item\" cdkDrag>\n      <div class=\"settings-columns__item-left\">\n        <span class=\"settings-columns__drag-handle\" cdkDragHandle>\n          <Drag20 />\n        </span>\n        <span class=\"settings-columns__item-label\">{{ col.headerName }}</span>\n      </div>\n      <moz-toggle\n        [id]=\"'col-toggle-' + col.field\"\n        [ngModel]=\"col.visible\"\n        (ngModelChange)=\"onColumnToggle(col.field, $event)\"\n      />\n    </div>\n    }\n  </div>\n  <div class=\"settings-columns__bulk-actions\">\n    <button type=\"button\" class=\"settings-columns__bulk-btn\" (click)=\"hideAll()\">Hide all</button>\n    <button type=\"button\" class=\"settings-columns__bulk-btn\" (click)=\"showAll()\">Show all</button>\n  </div>\n</div>\n} }\n\n<ng-template mozDrawerFooter>\n  <button moz-button (click)=\"apply()\" [appearance]=\"'accent'\">Apply</button>\n  <button moz-button [outlined]=\"true\" (click)=\"reset()\">Reset</button>\n</ng-template>\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { MozDrawerRef } from '../../../drawer/ref/drawer-ref';\nimport { MozDrawerFooterDirective } from '../../../drawer/directive/drawer-footer.directive';\nimport { MozButtonComponent } from '../../../button/button';\nimport { DRAWER_DATA } from '../../../drawer/config/drawer.config';\nimport {\n  CdkDropList,\n  CdkDrag,\n  CdkDragHandle,\n  CdkDragDrop,\n  moveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport { Drag20, Cross20, ListAdd20 } from '@mozaic-ds/icons-angular';\nimport { GroupDrawerData, GroupDrawerResult } from '../../models/grid-events.model';\n\ninterface DraftGroupItem {\n  field: string;\n  headerName: string;\n  sortDirection: 'asc' | 'desc';\n}\n\n@Component({\n  selector: 'moz-grid-group-drawer',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CdkDropList,\n    CdkDrag,\n    CdkDragHandle,\n    MozButtonComponent,\n    MozDrawerFooterDirective,\n    Drag20,\n    Cross20,\n    ListAdd20,\n  ],\n  templateUrl: './grid-group-drawer.html',\n  styleUrls: ['./grid-group-drawer.scss'],\n})\nexport class GridGroupDrawerComponent {\n  private readonly drawerRef = inject<MozDrawerRef<GroupDrawerResult>>(MozDrawerRef);\n  private readonly data = inject<GroupDrawerData>(DRAWER_DATA);\n\n  readonly draftGrouped = signal<DraftGroupItem[]>(\n    this.data.groups.map((entry) => {\n      const col = this.data.availableColumns.find((c) => c.field === entry.field);\n      return {\n        field: entry.field,\n        headerName: col?.headerName ?? entry.field,\n        sortDirection: entry.sortDirection,\n      };\n    })\n  );\n\n  private readonly allAvailable = this.data.availableColumns;\n\n  readonly available = computed(() => {\n    const grouped = new Set(this.draftGrouped().map((g) => g.field));\n    return this.allAvailable.filter((c) => !grouped.has(c.field));\n  });\n\n  onDrop(event: CdkDragDrop<DraftGroupItem[]>): void {\n    this.draftGrouped.update((items) => {\n      const updated = [...items];\n      moveItemInArray(updated, event.previousIndex, event.currentIndex);\n      return updated;\n    });\n  }\n\n  onSortDirectionChange(index: number, event: Event): void {\n    const value = (event.target as HTMLSelectElement).value as 'asc' | 'desc';\n    this.draftGrouped.update((items) =>\n      items.map((item, i) => (i === index ? { ...item, sortDirection: value } : item))\n    );\n  }\n\n  addGroup(field: string): void {\n    const col = this.allAvailable.find((c) => c.field === field);\n    if (!col) return;\n    this.draftGrouped.update((items) => [\n      ...items,\n      { field: col.field, headerName: col.headerName, sortDirection: 'asc' },\n    ]);\n  }\n\n  removeGroup(field: string): void {\n    this.draftGrouped.update((items) => items.filter((i) => i.field !== field));\n  }\n\n  apply(): void {\n    const result: GroupDrawerResult = {\n      groups: this.draftGrouped().map((i) => ({ field: i.field, sortDirection: i.sortDirection })),\n    };\n    this.drawerRef.close(result);\n  }\n\n  reset(): void {\n    this.draftGrouped.set([]);\n  }\n}\n","<div class=\"group-drawer__list\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\n  @for (item of draftGrouped(); track item.field; let idx = $index) {\n  <div class=\"group-drawer__item\" cdkDrag>\n    <span class=\"group-drawer__drag-handle\" cdkDragHandle>\n      <Drag20 />\n    </span>\n    <span class=\"group-drawer__item-label\">{{ item.headerName }}</span>\n    <select\n      class=\"group-drawer__sort-select\"\n      [value]=\"item.sortDirection\"\n      [attr.aria-label]=\"'Sort direction for ' + item.headerName\"\n      (change)=\"onSortDirectionChange(idx, $event)\"\n    >\n      <option value=\"asc\">A → Z</option>\n      <option value=\"desc\">Z → A</option>\n    </select>\n    <button\n      type=\"button\"\n      moz-button\n      [attr.aria-label]=\"'Remove ' + item.headerName\"\n      (click)=\"removeGroup(item.field)\"\n      [iconPosition]=\"'only'\"\n      [size]=\"'s'\"\n      [ghost]=\"true\"\n    >\n      <Cross20 icon />\n    </button>\n  </div>\n  }\n</div>\n\n@if (available().length > 0) {\n<div class=\"group-drawer__available\">\n  <h4 class=\"group-drawer__section-title\">Available columns</h4>\n  @for (col of available(); track col.field) {\n  <div class=\"group-drawer__available-item\">\n    <span class=\"group-drawer__available-label\">{{ col.headerName }}</span>\n    <button\n      type=\"button\"\n      class=\"group-drawer__add-btn\"\n      [attr.aria-label]=\"'Add ' + col.headerName + ' as group'\"\n      (click)=\"addGroup(col.field)\"\n    >\n      <ListAdd20 />\n    </button>\n  </div>\n  }\n</div>\n} @if (draftGrouped().length === 0 && available().length === 0) {\n<p class=\"group-drawer__empty\">No groupable columns available.</p>\n}\n\n<ng-template mozDrawerFooter>\n  <button moz-button (click)=\"apply()\" [appearance]=\"'accent'\">Apply</button>\n  <button moz-button [outlined]=\"true\" (click)=\"reset()\">Reset</button>\n</ng-template>\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { MozDrawerRef } from '../../../drawer/ref/drawer-ref';\nimport { MozDrawerFooterDirective } from '../../../drawer/directive/drawer-footer.directive';\nimport { MozButtonComponent } from '../../../button/button';\n\ninterface ShortcutItem {\n  keys: string;\n  label: string;\n}\n\ninterface ShortcutGroup {\n  title: string;\n  items: ShortcutItem[];\n}\n\ninterface RenderedItem {\n  keys: string;\n  parts: string[];\n  label: string;\n}\n\ninterface RenderedGroup {\n  title: string;\n  items: RenderedItem[];\n}\n\nconst EXCEL_SHORTCUTS: ShortcutGroup[] = [\n  {\n    title: 'Navigation',\n    items: [\n      { keys: '← ↑ → ↓', label: 'Déplacer la cellule active' },\n      { keys: 'Ctrl + Flèche', label: 'Sauter au bord du bloc de données' },\n      { keys: 'Home / End', label: 'Début / fin de la ligne' },\n      { keys: 'Ctrl + Home / End', label: 'Première / dernière cellule' },\n      { keys: 'PageUp / PageDown', label: 'Page précédente / suivante' },\n      { keys: 'Tab / Shift+Tab', label: 'Cellule suivante / précédente' },\n      { keys: 'Enter / Shift+Enter', label: 'Descendre / remonter' },\n    ],\n  },\n  {\n    title: 'Sélection',\n    items: [\n      { keys: 'Shift + Flèche', label: 'Étendre la plage' },\n      { keys: 'Shift + Ctrl + Flèche', label: \"Étendre jusqu'au bord du bloc\" },\n      { keys: 'Shift + Home / End', label: 'Étendre au début / fin de la ligne' },\n      { keys: 'Shift + Ctrl + Home / End', label: 'Étendre au début / fin du tableau' },\n      { keys: 'Shift + PageUp / Down', label: \"Étendre d'une page\" },\n      { keys: 'Ctrl + A', label: 'Sélectionner tout' },\n      { keys: 'Shift + Espace', label: 'Sélectionner la ligne' },\n      { keys: 'Ctrl + Espace', label: 'Sélectionner la colonne' },\n    ],\n  },\n  {\n    title: 'Édition',\n    items: [\n      { keys: 'Enter / F2', label: 'Entrer en édition' },\n      { keys: 'Touche imprimable', label: 'Typing-to-edit (remplace la valeur)' },\n      { keys: 'Escape', label: \"Annuler l'édition\" },\n      { keys: 'Enter', label: 'Valider + descendre' },\n      { keys: 'Tab / Shift+Tab', label: 'Valider + droite / gauche' },\n      { keys: 'Alt + Enter', label: 'Retour à la ligne (texte)' },\n      { keys: 'Ctrl + Enter', label: 'Valider + remplir la sélection' },\n      { keys: 'Backspace / Delete', label: 'Effacer les cellules sélectionnées' },\n    ],\n  },\n  {\n    title: 'Presse-papier',\n    items: [\n      { keys: 'Ctrl + C', label: 'Copier (TSV)' },\n      { keys: 'Ctrl + X', label: 'Couper (marching ants)' },\n      { keys: 'Ctrl + V', label: 'Coller (déplace après Ctrl+X)' },\n      { keys: 'Ctrl + D', label: 'Remplir vers le bas (fill down)' },\n      { keys: 'Ctrl + R', label: 'Remplir vers la droite (fill right)' },\n    ],\n  },\n  {\n    title: 'Historique',\n    items: [\n      { keys: 'Ctrl + Z', label: 'Annuler (undo)' },\n      { keys: 'Ctrl + Y', label: 'Rétablir (redo)' },\n      { keys: 'Ctrl + Shift + Z', label: 'Rétablir (redo, alt.)' },\n    ],\n  },\n];\n\n@Component({\n  selector: 'moz-grid-keyboard-shortcuts-drawer',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [MozButtonComponent, MozDrawerFooterDirective],\n  templateUrl: './grid-keyboard-shortcuts-drawer.html',\n  styleUrls: ['./grid-keyboard-shortcuts-drawer.scss'],\n})\nexport class GridKeyboardShortcutsDrawerComponent {\n  private readonly drawerRef = inject<MozDrawerRef<void>>(MozDrawerRef);\n\n  readonly groups: RenderedGroup[] = EXCEL_SHORTCUTS.map((group) => ({\n    title: group.title,\n    items: group.items.map((item) => ({\n      keys: item.keys,\n      label: item.label,\n      parts: item.keys.split(' '),\n    })),\n  }));\n\n  close(): void {\n    this.drawerRef.close();\n  }\n}\n","<div class=\"shortcuts\">\n  @for (group of groups; track group.title) {\n  <section class=\"shortcuts__group\">\n    <h4 class=\"shortcuts__group-title\">{{ group.title }}</h4>\n    <dl class=\"shortcuts__list\">\n      @for (item of group.items; track item.keys) {\n      <div class=\"shortcuts__item\">\n        <dt class=\"shortcuts__keys\">\n          @for (part of item.parts; track $index) { @if (part === '+' || part === '/') {\n          <span class=\"shortcuts__separator\">{{ part }}</span>\n          } @else {\n          <kbd class=\"shortcuts__key\">{{ part }}</kbd>\n          } }\n        </dt>\n        <dd class=\"shortcuts__label\">{{ item.label }}</dd>\n      </div>\n      }\n    </dl>\n  </section>\n  }\n</div>\n\n<ng-template mozDrawerFooter>\n  <button moz-button (click)=\"close()\">Close</button>\n</ng-template>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ViewEncapsulation,\n  computed,\n  inject,\n  signal,\n} from '@angular/core';\nimport { MozDrawerRef } from '../../../drawer/ref/drawer-ref';\nimport { MozDrawerFooterDirective } from '../../../drawer/directive/drawer-footer.directive';\nimport { MozButtonComponent } from '../../../button/button';\nimport { DRAWER_DATA } from '../../../drawer/config/drawer.config';\n\nexport interface FormulaReferenceEntry {\n  readonly name: string;\n  readonly signature: string;\n  readonly summary: string;\n}\n\nexport interface FormulaReferenceData {\n  readonly entries: readonly FormulaReferenceEntry[];\n}\n\ninterface FormulaReferenceGroup {\n  readonly title: string;\n  readonly entries: readonly FormulaReferenceEntry[];\n}\n\nconst CATEGORY_ORDER = ['Math & stats', 'Logique', 'Texte', 'Autres'] as const;\n\nconst CATEGORY_MAP: Readonly<Record<string, (typeof CATEGORY_ORDER)[number]>> = {\n  SUM: 'Math & stats',\n  PRODUCT: 'Math & stats',\n  AVERAGE: 'Math & stats',\n  MIN: 'Math & stats',\n  MAX: 'Math & stats',\n  COUNT: 'Math & stats',\n  COUNTA: 'Math & stats',\n  ROUND: 'Math & stats',\n  ABS: 'Math & stats',\n  MOD: 'Math & stats',\n  POWER: 'Math & stats',\n  IF: 'Logique',\n  AND: 'Logique',\n  OR: 'Logique',\n  NOT: 'Logique',\n  IFERROR: 'Logique',\n  IFS: 'Logique',\n  CONCAT: 'Texte',\n  LEN: 'Texte',\n  LOWER: 'Texte',\n  UPPER: 'Texte',\n  TRIM: 'Texte',\n  LEFT: 'Texte',\n  RIGHT: 'Texte',\n  MID: 'Texte',\n  SUBSTITUTE: 'Texte',\n};\n\n@Component({\n  selector: 'moz-grid-formula-reference-drawer',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  imports: [MozButtonComponent, MozDrawerFooterDirective],\n  templateUrl: './grid-formula-reference-drawer.html',\n  styleUrls: ['./grid-formula-reference-drawer.scss'],\n})\nexport class GridFormulaReferenceDrawerComponent {\n  private readonly drawerRef = inject<MozDrawerRef<void>>(MozDrawerRef);\n  private readonly data = inject<FormulaReferenceData>(DRAWER_DATA);\n\n  readonly query = signal('');\n\n  private readonly allGroups = computed<readonly FormulaReferenceGroup[]>(() => {\n    const bucket = new Map<string, FormulaReferenceEntry[]>();\n    for (const title of CATEGORY_ORDER) bucket.set(title, []);\n    for (const entry of this.data.entries) {\n      const category = CATEGORY_MAP[entry.name] ?? 'Autres';\n      bucket.get(category)!.push(entry);\n    }\n    return CATEGORY_ORDER\n      .map((title) => ({\n        title,\n        entries: (bucket.get(title) ?? []).slice().sort((a, b) => a.name.localeCompare(b.name)),\n      }))\n      .filter((g) => g.entries.length > 0);\n  });\n\n  readonly filteredGroups = computed<readonly FormulaReferenceGroup[]>(() => {\n    const q = this.query().trim().toLowerCase();\n    if (!q) return this.allGroups();\n    return this.allGroups()\n      .map((g) => ({\n        title: g.title,\n        entries: g.entries.filter(\n          (e) =>\n            e.name.toLowerCase().includes(q) ||\n            e.signature.toLowerCase().includes(q) ||\n            e.summary.toLowerCase().includes(q),\n        ),\n      }))\n      .filter((g) => g.entries.length > 0);\n  });\n\n  readonly totalCount = computed(() => this.data.entries.length);\n  readonly matchCount = computed(() =>\n    this.filteredGroups().reduce((sum, g) => sum + g.entries.length, 0),\n  );\n\n  onQueryInput(event: Event): void {\n    this.query.set((event.target as HTMLInputElement).value);\n  }\n\n  close(): void {\n    this.drawerRef.close();\n  }\n}\n","<div class=\"formula-ref\">\n  <div class=\"formula-ref__search\">\n    <input\n      type=\"search\"\n      class=\"formula-ref__search-input\"\n      placeholder=\"Rechercher une fonction…\"\n      [value]=\"query()\"\n      (input)=\"onQueryInput($event)\"\n      aria-label=\"Rechercher une fonction\"\n    />\n    <span class=\"formula-ref__count\" aria-live=\"polite\">\n      @if (query()) {\n      {{ matchCount() }} / {{ totalCount() }}\n      } @else {\n      {{ totalCount() }} fonctions\n      }\n    </span>\n  </div>\n\n  <div class=\"formula-ref__scroll\">\n    @if (filteredGroups().length === 0) {\n    <p class=\"formula-ref__empty\">Aucune fonction ne correspond à « {{ query() }} ».</p>\n    } @else { @for (group of filteredGroups(); track group.title) {\n    <section class=\"formula-ref__group\">\n      <h4 class=\"formula-ref__group-title\">{{ group.title }}</h4>\n      <ul class=\"formula-ref__list\">\n        @for (fn of group.entries; track fn.name) {\n        <li class=\"formula-ref__item\">\n          <div class=\"formula-ref__head\">\n            <span class=\"formula-ref__name\">{{ fn.name }}</span>\n            <code class=\"formula-ref__signature\">{{ fn.signature }}</code>\n          </div>\n          <p class=\"formula-ref__summary\">{{ fn.summary }}</p>\n        </li>\n        }\n      </ul>\n    </section>\n    } }\n  </div>\n</div>\n\n<ng-template mozDrawerFooter>\n  <button moz-button (click)=\"close()\">Fermer</button>\n</ng-template>\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { MozDrawerRef } from '../../../drawer/ref/drawer-ref';\nimport { MozDrawerFooterDirective } from '../../../drawer/directive/drawer-footer.directive';\nimport { MozButtonComponent } from '../../../button/button';\nimport { DRAWER_DATA } from '../../../drawer/config/drawer.config';\nimport {\n  FilterDrawerData,\n  FilterDrawerResult,\n  FilterModel,\n} from '../../models/filter.model';\nimport { MozGridFilterBuilderComponent } from '../filter-builder/grid-filter-builder';\n\n@Component({\n  selector: 'moz-grid-filter-drawer',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [MozGridFilterBuilderComponent, MozButtonComponent, MozDrawerFooterDirective],\n  templateUrl: './grid-filter-drawer.html',\n  styleUrls: ['./grid-filter-drawer.scss'],\n})\nexport class MozGridFilterDrawerComponent {\n  private readonly drawerRef = inject<MozDrawerRef<FilterDrawerResult>>(MozDrawerRef);\n  private readonly data = inject<FilterDrawerData>(DRAWER_DATA);\n\n  readonly availableColumns = this.data.availableColumns;\n\n  readonly draft = signal<FilterModel>({\n    conditions: this.data.model.conditions.map((c) => ({ ...c, value: { ...c.value } })),\n  });\n\n  readonly activeCount = computed(() => this.draft().conditions.length);\n\n  onDraftChange(model: FilterModel): void {\n    this.draft.set(model);\n  }\n\n  apply(): void {\n    this.drawerRef.close({ model: this.draft(), applied: true });\n  }\n\n  clearAll(): void {\n    this.draft.set({ conditions: [] });\n  }\n\n  cancel(): void {\n    this.drawerRef.close({ model: this.data.model, applied: false });\n  }\n}\n","<div class=\"filter-drawer\">\n  <p class=\"filter-drawer__subtitle\">{{ activeCount() }} active filter(s)</p>\n  <moz-grid-filter-builder\n    [model]=\"draft()\"\n    [availableColumns]=\"availableColumns\"\n    [applyMode]=\"'manual'\"\n    [showSubtitle]=\"false\"\n    (modelChange)=\"onDraftChange($event)\"\n  />\n</div>\n\n<ng-template mozDrawerFooter>\n  <button moz-button [appearance]=\"'accent'\" (click)=\"apply()\">Apply</button>\n  <button moz-button [outlined]=\"true\" (click)=\"clearAll()\">Clear all</button>\n</ng-template>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  contentChildren,\n  effect,\n  DestroyRef,\n  ElementRef,\n  inject,\n  input,\n  output,\n  signal,\n  TemplateRef,\n  viewChild,\n  afterNextRender,\n  NgZone,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { GridStateManager } from './state/grid-state';\nimport { GridEngine } from './engine/grid-engine';\nimport { SortEngine } from './features/sort.engine';\nimport { ColumnResizeEngine } from './features/column-resize.engine';\nimport { InlineEditEngine } from './features/inline-edit.engine';\nimport { RowSelectionEngine } from './features/row-selection.engine';\nimport { CellSelectionEngine } from './features/cell-selection.engine';\nimport { CellValidationEngine } from './features/cell-validation.engine';\nimport { KeyboardEngine } from './features/keyboard.engine';\nimport { ClipboardEngine, HistoryCellChange, PASTE_SKIP } from './features/clipboard.engine';\nimport { HistoryEngine } from './features/history.engine';\nimport { GroupEngine } from './features/group.engine';\nimport { FilterEngine } from './features/filter.engine';\nimport { ColumnReorderEngine } from './features/column-reorder.engine';\nimport { ColumnDragEngine } from './features/column-drag.engine';\nimport { ExpandableRowEngine } from './features/expandable-row.engine';\nimport { StatePersistenceEngine } from './features/state-persistence.engine';\nimport { ExportEngine } from './features/export.engine';\nimport { TreeEngine } from './features/tree.engine';\nimport { HorizontalVirtualScrollEngine } from './features/horizontal-virtual-scroll.engine';\nimport { VerticalVirtualScrollEngine } from './features/vertical-virtual-scroll.engine';\nimport { PaginationEngine } from './features/pagination.engine';\nimport { InfiniteScrollEngine } from './features/infinite-scroll.engine';\nimport { FormulaEngine } from './features/formula/formula.engine';\nimport { FormulaRefHighlightService } from './features/formula/formula-ref-highlight.service';\nimport { shiftFormulaRefs } from './features/formula/formula-shift';\nimport { columnIndexToLetters } from './features/formula/formula-ast';\nimport { a1ToLongForm } from './features/formula/formula-ref-mapper';\nimport type { CellAddress } from './models/formula.model';\nimport { GridPlugin } from './models/plugin.model';\nimport { MozGridColumnDef } from './directives/grid-column-def';\nimport { MozGridToolbarDef } from './directives/grid-toolbar-def';\nimport { GridEmptyContext, GridEmptyKind, MozGridEmptyDef } from './directives/grid-empty-def';\nimport { MozGridEmptyStateComponent } from './components/empty-state/grid-empty-state';\nimport { MozGridHeaderComponent } from './components/header/grid-header';\nimport { MozGridBodyComponent } from './components/body/grid-body';\nimport { MozGridFooterComponent } from './components/footer/grid-footer';\nimport { MozGridLoadingIndicatorComponent } from './components/loading-indicator/grid-loading-indicator';\nimport { MozTagComponent } from '../tag/tag';\nimport { MozIconButtonComponent } from '../icon-button/icon-button';\nimport { MozNumberBadgeComponent } from '../number-badge/number-badge';\nimport { HeaderMenuActionId } from './models/column.model';\nimport { SortEvent } from './models/sort.model';\nimport { LoadingStrategy, PageEvent, LoadMoreEvent } from './models/pagination.model';\nimport {\n  CellEditEvent,\n  CellEditCancelEvent,\n  BulkEditEvent,\n  BulkCopyEvent,\n  BulkPasteEvent,\n  BulkDeleteEvent,\n  BulkCellChange,\n  FillDownEvent,\n  CellRange,\n} from './models/cell.model';\nimport { MozGridSelectionBarComponent } from './components/selection-bar/grid-selection-bar';\nimport {\n  RowSelectionEvent,\n  CellSelectionEvent,\n  GroupEvent,\n  FilterEvent,\n  GridExportEvent,\n  GridSettingsData,\n  GridSettingsResult,\n  GridDensity,\n  GroupDrawerData,\n  GroupDrawerResult,\n} from './models/grid-events.model';\nimport { MozDrawerService } from '../drawer/service/drawer.service';\nimport { GridSettingsDrawerComponent } from './components/settings-drawer/grid-settings-drawer';\nimport { GridGroupDrawerComponent } from './components/group-drawer/grid-group-drawer';\nimport { GridKeyboardShortcutsDrawerComponent } from './components/keyboard-shortcuts-drawer/grid-keyboard-shortcuts-drawer';\nimport {\n  GridFormulaReferenceDrawerComponent,\n  FormulaReferenceData,\n  FormulaReferenceEntry,\n} from './components/formula-reference-drawer/grid-formula-reference-drawer';\nimport { MozGridFormulaEditorComponent } from './components/formula-editor/formula-editor';\nimport { MozGridFilterDrawerComponent } from './components/filter-drawer/grid-filter-drawer';\nimport { FilterApplyMode, FilterDrawerData, FilterDrawerResult, FilterMode } from './models/filter.model';\nimport { ActiveFilter } from './models/grid-events.model';\nimport {\n  ViewGridX420,\n  Filter20,\n  Settings20,\n  FullscreenEnter20,\n  FullscreenExit20,\n  Download20,\n  ChevronUp20,\n  ChevronDown20,\n  Keyboard20,\n  Calculator20,\n} from '@mozaic-ds/icons-angular';\nimport { MozButtonComponent } from '../button';\n\n@Component({\n  selector: 'moz-grid',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    GridStateManager,\n    GridEngine,\n    SortEngine,\n    ColumnResizeEngine,\n    InlineEditEngine,\n    RowSelectionEngine,\n    CellSelectionEngine,\n    KeyboardEngine,\n    ClipboardEngine,\n    HistoryEngine,\n    GroupEngine,\n    FilterEngine,\n    ColumnReorderEngine,\n    ColumnDragEngine,\n    ExpandableRowEngine,\n    StatePersistenceEngine,\n    ExportEngine,\n    TreeEngine,\n    CellValidationEngine,\n    HorizontalVirtualScrollEngine,\n    VerticalVirtualScrollEngine,\n    PaginationEngine,\n    InfiniteScrollEngine,\n    FormulaEngine,\n    FormulaRefHighlightService,\n    Overlay,\n  ],\n  imports: [\n    NgTemplateOutlet,\n    MozGridHeaderComponent,\n    MozGridBodyComponent,\n    MozGridFooterComponent,\n    MozGridLoadingIndicatorComponent,\n    MozGridSelectionBarComponent,\n    MozGridEmptyStateComponent,\n    MozTagComponent,\n    MozIconButtonComponent,\n    MozNumberBadgeComponent,\n    ViewGridX420,\n    Filter20,\n    Settings20,\n    FullscreenEnter20,\n    FullscreenExit20,\n    Download20,\n    ChevronUp20,\n    ChevronDown20,\n    Keyboard20,\n    Calculator20,\n    MozButtonComponent,\n    MozGridFormulaEditorComponent,\n  ],\n  template: `\n    <div class=\"moz-grid-wrapper\" [class.moz-grid-wrapper--fullscreen]=\"isFullscreen()\">\n      <!-- Toolbar (outside .moz-grid) -->\n      @if (showToolbar()) {\n      <div class=\"moz-grid__toolbar\">\n        <div class=\"moz-grid__toolbar-left\">\n          @if (fullscreen()) {\n          <moz-icon-button\n            id=\"grid-fullscreen\"\n            [ghost]=\"true\"\n            size=\"s\"\n            [ariaLabel]=\"isFullscreen() ? 'Exit fullscreen' : 'Fullscreen'\"\n            (activated)=\"toggleFullscreen()\"\n          >\n            @if (isFullscreen()) {\n            <FullscreenExit20 icon />\n            } @else {\n            <FullscreenEnter20 icon />\n            }\n          </moz-icon-button>\n          } @if (exportable()) {\n          <moz-icon-button\n            id=\"grid-export\"\n            [ghost]=\"true\"\n            size=\"s\"\n            ariaLabel=\"Export CSV\"\n            (activated)=\"onExportCsv()\"\n          >\n            <Download20 icon />\n          </moz-icon-button>\n          }\n          <div class=\"moz-grid__toolbar-filter\">\n            <moz-icon-button\n              id=\"grid-filter\"\n              size=\"s\"\n              [ghost]=\"true\"\n              ariaLabel=\"Filters\"\n              (activated)=\"onFiltersClick()\"\n            >\n              <Filter20 icon />\n            </moz-icon-button>\n            @if (activeFilterCount() > 0) {\n            <moz-number-badge\n              class=\"moz-grid__toolbar-filter-badge\"\n              [label]=\"activeFilterCount()\"\n              appearance=\"accent\"\n              size=\"s\"\n            />\n            }\n          </div>\n          <moz-icon-button\n            id=\"grid-settings\"\n            size=\"s\"\n            [ghost]=\"true\"\n            ariaLabel=\"Settings\"\n            (activated)=\"onSettingsClick()\"\n          >\n            <Settings20 icon />\n          </moz-icon-button>\n          <moz-icon-button\n            id=\"grid-group\"\n            size=\"s\"\n            [ghost]=\"true\"\n            ariaLabel=\"Group\"\n            (activated)=\"onGroupClick()\"\n          >\n            <ViewGridX420 icon />\n          </moz-icon-button>\n          <moz-icon-button\n            id=\"grid-keyboard-shortcuts\"\n            size=\"s\"\n            [ghost]=\"true\"\n            ariaLabel=\"Keyboard shortcuts\"\n            (activated)=\"onKeyboardShortcutsClick()\"\n          >\n            <Keyboard20 icon />\n          </moz-icon-button>\n          @if (state.hasFormulaColumns()) {\n          <moz-icon-button\n            id=\"grid-formula-reference\"\n            size=\"s\"\n            [ghost]=\"true\"\n            ariaLabel=\"Formula reference\"\n            (activated)=\"onFormulaReferenceClick()\"\n          >\n            <Calculator20 icon />\n          </moz-icon-button>\n          } @for (def of toolbarStartDefs(); track def) {\n          <ng-container [ngTemplateOutlet]=\"def.template\" />\n          }\n        </div>\n\n        <!-- Selection banner -->\n        @if (selectionBannerVisible()) {\n        <div class=\"moz-grid__selection-banner\">\n          <span class=\"moz-grid__selection-text\">\n            {{ rowSelectionEngine.count() }} row(s) selected\n          </span>\n          @if (rowSelectionEngine.count() < selectionTotalCount()) {\n          <button\n            moz-button\n            type=\"button\"\n            [size]=\"'s'\"\n            [ghost]=\"true\"\n            [appearance]=\"'accent'\"\n            (click)=\"onSelectAllRows()\"\n          >\n            Select all {{ selectionTotalCount() }} rows\n          </button>\n          }\n          <button moz-button type=\"button\" [size]=\"'s'\" [ghost]=\"true\" (click)=\"onClearSelection()\">\n            Clear\n          </button>\n        </div>\n        }\n\n        <div class=\"moz-grid__toolbar-right\">\n          @for (def of toolbarEndDefs(); track def) {\n          <ng-container [ngTemplateOutlet]=\"def.template\" />\n          }\n        </div>\n      </div>\n      }\n\n      <!-- Tag bars (outside .moz-grid) -->\n      @if (state.groupColumns().length > 0) {\n      <div class=\"moz-grid__tag-bar\">\n        <span class=\"moz-grid__tag-bar-label\">GROUPED BY</span>\n        @for (entry of state.groupColumns(); track entry.field) {\n        <div>\n          <moz-tag\n            type=\"removable\"\n            size=\"s\"\n            [id]=\"'group-' + entry.field\"\n            (removeTag)=\"onRemoveGroup(entry.field)\"\n          >\n            <button\n              type=\"button\"\n              class=\"moz-grid__group-tag-btn\"\n              (click)=\"onToggleGroupSort(entry.field)\"\n            >\n              {{ getColumnLabel(entry.field) }}\n              @if (entry.sortDirection === 'asc') {\n              <ChevronUp20 />\n              } @else {\n              <ChevronDown20 />\n              }\n            </button>\n          </moz-tag>\n        </div>\n        }\n      </div>\n      } @if (hasHiddenColumns()) {\n      <div class=\"moz-grid__tag-bar\">\n        <span class=\"moz-grid__tag-bar-label\">HIDDEN COLUMNS</span>\n        @for (col of hiddenColumnsList(); track col.field) {\n        <moz-tag\n          type=\"removable\"\n          size=\"s\"\n          [id]=\"'hidden-' + col.field\"\n          removableLabel=\"Restore\"\n          (removeTag)=\"onRestoreColumn(col.field)\"\n          >{{ col.label }}</moz-tag\n        >\n        } @if (hiddenColumnsList().length > 1) {\n        <button type=\"button\" class=\"moz-grid__tag-action-btn\" (click)=\"onRestoreAllColumns()\">\n          Restore all\n        </button>\n        }\n      </div>\n      } @if (activeFilters().length > 0) {\n      <div class=\"moz-grid__tag-bar\">\n        <span class=\"moz-grid__tag-bar-label\">FILTERED BY</span>\n        @for (filter of activeFilters(); track filter.id) {\n        <moz-tag\n          [type]=\"filter.removable ? 'removable' : 'informative'\"\n          size=\"s\"\n          [id]=\"'filter-' + filter.id\"\n          (removeTag)=\"onRemoveFilter(filter.id)\"\n          >{{ filter.label }}</moz-tag\n        >\n        }\n        <button type=\"button\" class=\"moz-grid__tag-action-btn\" (click)=\"onRemoveAllFilters()\">\n          Remove all\n        </button>\n      </div>\n      }\n      <ng-content select=\"[mozGridFilterTags]\" />\n\n      <!-- Formula bar (spreadsheet-style preview & editor of the focused cell) -->\n      @if (state.hasFormulaColumns()) {\n      <div class=\"moz-grid__formula-bar\" (focusout)=\"onFormulaBarWrapperFocusout($event)\">\n        <div class=\"moz-grid__formula-bar-addr\">{{ formulaBarAddress() }}</div>\n        <div class=\"moz-grid__formula-bar-fx\" aria-hidden=\"true\">\n          <span>fx</span>\n        </div>\n        <div class=\"moz-grid__formula-bar-content\">\n          @if (formulaBarEditing()) {\n          <moz-grid-formula-editor\n            class=\"moz-grid__formula-bar-editor\"\n            [value]=\"formulaBarDraft() ?? ''\"\n            [editingAddr]=\"formulaBarEditingAddr()\"\n            [disableCellPick]=\"true\"\n            (valueChange)=\"onFormulaBarEditorChange($event)\"\n            (commit)=\"onFormulaBarEditorCommit()\"\n            (cancel)=\"onFormulaBarEditorCancel()\"\n          />\n          } @else {\n          <input\n            type=\"text\"\n            class=\"moz-grid__formula-bar-input\"\n            aria-label=\"Formule de la cellule\"\n            [value]=\"formulaBarContent()\"\n            [disabled]=\"!formulaBarEditable()\"\n            (focus)=\"onFormulaBarInputFocus()\"\n            readonly\n            spellcheck=\"false\"\n            autocomplete=\"off\"\n          />\n          }\n        </div>\n      </div>\n      }\n\n      <!-- Grid container: layout chrome (footer, overlays) lives here. The\n           inner #gridContainer is the only scrollable element so footer &\n           overlays don't move when the user scrolls the data. -->\n      <div\n        class=\"moz-grid\"\n        (keydown)=\"onKeydown($event)\"\n        (mouseup)=\"onMouseUp()\"\n      >\n        <!-- Scrollable area: header (sticky top) + body (virtualized rows). -->\n        <div class=\"moz-grid__scroll\" tabindex=\"0\" #gridContainer>\n          <moz-grid-header\n            [showCheckbox]=\"rowSelection()\"\n            [showExpand]=\"expandable()\"\n            [reorderable]=\"reorderable()\"\n            (sortClick)=\"onSortClick($event)\"\n            (menuAction)=\"onMenuAction($event)\"\n            (resizeStart)=\"onResizeStart($event)\"\n            (selectAllToggle)=\"onSelectAllToggle()\"\n          />\n\n          <moz-grid-body\n            [showCheckbox]=\"rowSelection()\"\n            [showExpand]=\"expandable()\"\n            [detailTemplate]=\"detailTemplate()\"\n            (cellEdit)=\"onCellEdit($event)\"\n            (cellEditCancel)=\"cellEditCancel.emit($event)\"\n            (groupToggle)=\"onGroupToggle($event)\"\n            (rowSelectionToggle)=\"onRowSelectionToggle()\"\n          />\n        </div>\n\n        <!-- Empty state overlay (consumer template wins, fallback default) -->\n        @if (emptyStateKind() !== 'none') {\n        <div class=\"moz-grid__empty-overlay\">\n          @if (emptyTemplate(); as tpl) {\n          <ng-container *ngTemplateOutlet=\"tpl; context: emptyTemplateContext()\" />\n          } @else {\n          <moz-grid-empty-state\n            [kind]=\"$any(emptyStateKind())\"\n            [title]=\"emptyStateKind() === 'no-results' ? noResultsTitle() : emptyDataTitle()\"\n            [description]=\"\n              emptyStateKind() === 'no-results' ? noResultsDescription() : emptyDataDescription()\n            \"\n            [actionLabel]=\"emptyStateKind() === 'no-results' ? resolvedNoResultsActionLabel() : ''\"\n            (action)=\"onRemoveAllFilters()\"\n          />\n          }\n        </div>\n        }\n\n        <!-- Footer: pagination or infinite scroll loading indicator -->\n        @if (showPagination()) {\n        <moz-grid-footer\n          [pageSizeOptions]=\"pageSizeOptions()\"\n          (pageChange)=\"pageChange.emit($event)\"\n        />\n        } @if (showInfiniteScrollLoader()) {\n        <moz-grid-loading-indicator />\n        }\n\n        <!-- Bulk selection action bar -->\n        <moz-grid-selection-bar\n          (editClick)=\"onBulkEdit()\"\n          (copyClick)=\"onBulkCopy()\"\n          (pasteClick)=\"onBulkPaste()\"\n          (exportClick)=\"onBulkExport()\"\n          (deleteClick)=\"onBulkDelete()\"\n        />\n      </div>\n    </div>\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n        height: 100%;\n        /* Formula ref highlight palette — cyclic, stable per edit session.\n           Consumers can override these CSS vars to rebrand the colors. */\n        --moz-grid-ref-color-0: #1a73e8;\n        --moz-grid-ref-color-1: #d93025;\n        --moz-grid-ref-color-2: #188038;\n        --moz-grid-ref-color-3: #e37400;\n        --moz-grid-ref-color-4: #8430ce;\n        --moz-grid-ref-color-5: #009e95;\n        --moz-grid-ref-color-6: #c5221f;\n        --moz-grid-ref-color-7: #5f6368;\n      }\n\n      .moz-grid-wrapper {\n        display: flex;\n        flex-direction: column;\n        font-family: var(--font-family-primary);\n        height: 100%;\n        min-height: 0;\n        gap: 16px;\n      }\n\n      .moz-grid-wrapper--fullscreen {\n        position: fixed;\n        top: 0;\n        left: 0;\n        width: 100vw;\n        height: 100vh;\n        z-index: 9999;\n        background: var(--color-background-primary);\n      }\n\n      .moz-grid {\n        display: flex;\n        flex-direction: column;\n        border-radius: var(--border-radius-l);\n        overflow: hidden;\n        background: var(--color-background-primary);\n        flex: 1;\n        min-height: 0;\n        position: relative;\n        box-shadow: 0px 0px 6px #cdd4d8;\n      }\n\n      /* The actual scroll viewport. Sticky header & sticky pinned column\n         cells anchor to this element's containing block — there is no\n         transform anywhere inside, so position:sticky behaves natively. */\n      .moz-grid__scroll {\n        flex: 1 1 auto;\n        min-height: 0;\n        overflow: auto;\n        overscroll-behavior: contain;\n        background: inherit;\n      }\n\n      .moz-grid__scroll:focus {\n        outline: none;\n      }\n\n      /* Header is sticky to the top of the scroll viewport. */\n      .moz-grid__scroll moz-grid-header {\n        position: sticky;\n        top: 0;\n        z-index: 5;\n        background: var(--color-background-primary, #fff);\n      }\n\n      /* Empty-state overlay sits above the (empty) virtual scroll viewport\n         so column headers stay visible. The body keeps its layout to give\n         the overlay something to be measured against. */\n      .moz-grid__empty-overlay {\n        position: absolute;\n        inset: 0;\n        top: var(--moz-grid-header-height, 48px);\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        background: var(--Background-Primary, #fff);\n        z-index: 1;\n      }\n\n      .moz-grid:focus {\n        outline: none;\n      }\n\n.moz-grid__toolbar {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        flex-shrink: 0;\n        min-height: 48px;\n        gap: var(--spacing-s, 8px);\n      }\n\n      .moz-grid__toolbar-left,\n      .moz-grid__toolbar-right {\n        display: flex;\n        align-items: center;\n        gap: var(--spacing-xs, 4px);\n      }\n\n      .moz-grid__toolbar-filter {\n        position: relative;\n        display: inline-flex;\n      }\n\n      .moz-grid__formula-bar {\n        display: flex;\n        align-items: stretch;\n        flex-shrink: 0;\n        height: 32px;\n        border: 1px solid var(--Border-Primary, #cdd4d8);\n        border-radius: var(--border-radius-s, 4px);\n        background: var(--color-background-primary, #fff);\n        font-family: var(--font-family-monospace, ui-monospace, SFMono-Regular, Menlo, monospace);\n        font-size: var(--font-size-s, 13px);\n        overflow: hidden;\n      }\n\n      .moz-grid__formula-bar-addr {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        min-width: 72px;\n        padding: 0 8px;\n        border-right: 1px solid var(--Border-Primary, #cdd4d8);\n        color: var(--color-text-primary);\n        font-weight: 600;\n        user-select: text;\n      }\n\n      .moz-grid__formula-bar-fx {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        width: 32px;\n        border-right: 1px solid var(--Border-Primary, #cdd4d8);\n        color: var(--color-text-secondary);\n        font-style: italic;\n        font-weight: 500;\n      }\n\n      .moz-grid__formula-bar-content {\n        flex: 1;\n        min-width: 0;\n        display: flex;\n        align-items: stretch;\n        overflow: hidden;\n      }\n\n      .moz-grid__formula-bar-input {\n        flex: 1;\n        min-width: 0;\n        padding: 0 10px;\n        color: var(--color-text-primary);\n        font: inherit;\n        background: transparent;\n        border: none;\n        outline: none;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n      }\n\n      .moz-grid__formula-bar-input:focus {\n        outline: 2px solid var(--color-border-accent, #1a73e8);\n        outline-offset: -2px;\n        border-radius: var(--border-radius-xs, 2px);\n      }\n\n      .moz-grid__formula-bar-input:disabled {\n        color: var(--color-text-secondary);\n        cursor: not-allowed;\n      }\n\n      .moz-grid__formula-bar-editor {\n        flex: 1;\n        min-width: 0;\n        display: flex;\n        align-items: stretch;\n      }\n\n      .moz-grid__formula-bar-editor .moz-grid-formula-editor,\n      .moz-grid__formula-bar-editor .moz-grid-formula-editor__input {\n        width: 100%;\n        height: 100%;\n      }\n\n      .moz-grid__toolbar-filter-badge {\n        position: absolute;\n        top: -2px;\n        right: -2px;\n        pointer-events: none;\n      }\n\n      .moz-grid__selection-banner {\n        display: flex;\n        align-items: center;\n        gap: var(--spacing-s, 8px);\n        flex: 1;\n        justify-content: center;\n        border-radius: var(--border-radius-s);\n        border: 1px solid var(--Border-Primary, #cdd4d8);\n        background: var(--Neutral-Grey-000, #fff);\n      }\n\n      .moz-grid__selection-text {\n        font-size: var(--font-size-s, 14px);\n        color: var(--color-text-primary);\n        white-space: nowrap;\n      }\n\n      .moz-grid__selection-link {\n        padding: 0;\n        border: none;\n        background: transparent;\n        color: var(--color-background-accent-inverse);\n        font-size: var(--font-size-s, 14px);\n        font-weight: 600;\n        cursor: pointer;\n        white-space: nowrap;\n        text-decoration: underline;\n      }\n\n      .moz-grid__selection-link:hover {\n        color: var(--color-primary-dark, #1557b0);\n      }\n\n      .moz-grid__tag-bar {\n        display: flex;\n        align-items: center;\n        flex-wrap: wrap;\n        gap: var(--spacing-xs, 4px);\n        padding: var(--spacing-xxs, 2px) var(--spacing-s, 8px);\n        flex-shrink: 0;\n      }\n\n      .moz-grid__tag-bar-label {\n        width: 100%;\n        font-size: var(--font-size-xs, 12px);\n        text-transform: uppercase;\n        white-space: nowrap;\n\n        color: var(--text-icon-tertiary);\n        font-size: var(--Typography-Font-size-Body-XS, 12px);\n        font-weight: 400;\n      }\n\n      .moz-grid__tag-action-btn {\n        padding: 2px 8px;\n        border: none;\n        background: transparent;\n        color: var(--color-background-accent-inverse);\n        font-size: var(--font-size-xs, 12px);\n        font-weight: 600;\n        cursor: pointer;\n      }\n\n      .moz-grid__tag-action-btn:hover {\n        text-decoration: underline;\n      }\n\n      .moz-grid__group-tag-btn {\n        display: inline-flex;\n        align-items: center;\n        gap: 2px;\n        padding: 0;\n        border: none;\n        background: transparent;\n        cursor: pointer;\n        font: inherit;\n        color: inherit;\n        line-height: 1;\n      }\n\n      .moz-grid__group-tag-btn ::ng-deep svg {\n        fill: #fff !important;\n        width: 16px;\n        height: 16px;\n      }\n    `,\n  ],\n})\nexport class MozGridComponent<T = unknown> {\n  protected readonly state = inject<GridStateManager<T>>(GridStateManager);\n  private readonly gridEngine = inject<GridEngine<T>>(GridEngine);\n  private readonly sortEngine = inject<SortEngine<T>>(SortEngine);\n  private readonly inlineEditEngine = inject<InlineEditEngine<T>>(InlineEditEngine);\n  private readonly resizeEngine = inject<ColumnResizeEngine<T>>(ColumnResizeEngine);\n  protected readonly rowSelectionEngine = inject<RowSelectionEngine<T>>(RowSelectionEngine);\n  private readonly cellSelectionEngine = inject<CellSelectionEngine<T>>(CellSelectionEngine);\n  private readonly keyboardEngine = inject<KeyboardEngine<T>>(KeyboardEngine);\n  private readonly clipboardEngine = inject<ClipboardEngine<T>>(ClipboardEngine);\n  private readonly historyEngine = inject<HistoryEngine<T>>(HistoryEngine);\n  private readonly groupEngine = inject<GroupEngine<T>>(GroupEngine);\n  private readonly filterEngine = inject<FilterEngine<T>>(FilterEngine);\n  protected readonly formulaEngine = inject<FormulaEngine<T>>(FormulaEngine);\n  private readonly refHighlight = inject(FormulaRefHighlightService);\n  private readonly persistenceEngine = inject<StatePersistenceEngine<T>>(StatePersistenceEngine);\n  private readonly exportEngine = inject<ExportEngine<T>>(ExportEngine);\n  private readonly validationEngine = inject<CellValidationEngine<T>>(CellValidationEngine);\n  private readonly verticalVirtualScrollEngine = inject(VerticalVirtualScrollEngine);\n  private readonly horizontalVirtualScrollEngine = inject<HorizontalVirtualScrollEngine<T>>(\n    HorizontalVirtualScrollEngine\n  );\n  private readonly paginationEngine = inject<PaginationEngine<T>>(PaginationEngine);\n  private readonly infiniteScrollEngine = inject<InfiniteScrollEngine<T>>(InfiniteScrollEngine);\n\n  private readonly gridContainer = viewChild<ElementRef<HTMLElement>>('gridContainer');\n  private readonly ngZone = inject(NgZone);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly drawerService = inject(MozDrawerService);\n\n  // --- Content children ---\n  private readonly columnDefs = contentChildren(MozGridColumnDef);\n  private readonly toolbarDefs = contentChildren(MozGridToolbarDef);\n  private readonly emptyDefs = contentChildren(MozGridEmptyDef);\n\n  // --- Inputs ---\n  readonly data = input<T[]>([]);\n  readonly mode = input<'client' | 'server'>('client');\n  readonly filterMode = input<FilterMode>('client');\n  readonly totalItems = input<number>(0);\n  readonly pagination = input<boolean>(true);\n  readonly pageSize = input<number>(20);\n  readonly pageSizeOptions = input<number[]>([10, 20, 50, 100]);\n  readonly rowHeight = input<number>(48);\n  readonly loading = input<boolean>(false);\n  readonly rowSelection = input<boolean>(false);\n  readonly expandable = input<boolean>(false);\n  readonly rowIdField = input<string>('id');\n  /**\n   * Enables the spreadsheet-style formula engine. When `true`, any cell\n   * committed with a leading `=` in a column declaring `allowFormula: true`\n   * is routed to `FormulaEngine` and its evaluated value is rendered.\n   */\n  readonly formulas = input<boolean>(false);\n  readonly detailTemplate = input<TemplateRef<unknown> | null>(null);\n  readonly fullscreen = input<boolean>(false);\n  readonly reorderable = input<boolean>(false);\n  readonly stateKey = input<string | null>(null);\n\n  // --- Empty state customization ---\n  /** Title for the default \"no data\" empty state. */\n  readonly emptyDataTitle = input<string>('');\n  /** Description for the default \"no data\" empty state. */\n  readonly emptyDataDescription = input<string>('');\n  /** Title for the default \"no results\" empty state (active filters). */\n  readonly noResultsTitle = input<string>('');\n  /** Description for the default \"no results\" empty state. */\n  readonly noResultsDescription = input<string>('');\n  /** CTA label on the \"no results\" state. Empty disables the button. */\n  readonly noResultsActionLabel = input<string>('Clear filters');\n  readonly exportable = input<boolean>(false);\n  /**\n   * `'client'` (default): the grid builds and downloads the CSV itself.\n   * `'server'`: the grid emits `(exportRequest)` instead, leaving the consumer\n   * to perform the export (e.g. a back-end download).\n   */\n  readonly exportMode = input<'client' | 'server'>('client');\n  readonly showToolbar = input<boolean>(true);\n  readonly multiCellSelection = input<boolean>(true);\n  readonly horizontalVirtualScroll = input<boolean>(false);\n  readonly loadingStrategy = input<LoadingStrategy>('pagination');\n  readonly scrollThreshold = input<number>(200);\n  readonly plugins = input<GridPlugin[]>([]);\n\n  // --- Outputs ---\n  readonly sortChange = output<SortEvent>();\n  readonly pageChange = output<PageEvent>();\n  readonly loadMore = output<LoadMoreEvent>();\n  readonly cellEdit = output<CellEditEvent<T>>();\n  readonly cellEditCancel = output<CellEditCancelEvent>();\n  readonly selectionChange = output<RowSelectionEvent<T>>();\n  readonly cellSelectionChange = output<CellSelectionEvent<T>>();\n  readonly groupChange = output<GroupEvent>();\n  readonly filterChange = output<FilterEvent>();\n  readonly bulkEdit = output<BulkEditEvent>();\n  readonly bulkCopy = output<BulkCopyEvent>();\n  readonly bulkPaste = output<BulkPasteEvent>();\n  readonly bulkDelete = output<BulkDeleteEvent>();\n  readonly fillDown = output<FillDownEvent>();\n  readonly settingsChange = output<GridSettingsResult>();\n  /** Emitted when the toolbar export is triggered while `exportMode === 'server'`. */\n  readonly exportRequest = output<GridExportEvent>();\n\n  // --- Internal ---\n  protected readonly isFullscreen = signal(false);\n  protected readonly groupPanelOpen = signal(false);\n  /**\n   * Mode controlling how the builder emits `filterChange`:\n   *  - `auto`   : each mutation triggers an event (default in `client` mode).\n   *  - `manual` : only an explicit Apply emits (default in `server` mode).\n   */\n  readonly filterApplyMode = input<FilterApplyMode | null>(null);\n\n  protected readonly resolvedFilterApplyMode = computed<FilterApplyMode>(() => {\n    const override = this.filterApplyMode();\n    if (override) return override;\n    return this.state.mode() === 'server' ? 'manual' : 'auto';\n  });\n\n  /** Display descriptors for the \"FILTERED BY\" tag bar. */\n  protected readonly activeFilters = computed<ActiveFilter[]>(() => {\n    return this.filterEngine.conditions().map((c) => ({\n      id: c.id,\n      field: c.field,\n      label: this.filterEngine.toLabel(c),\n      removable: true,\n    }));\n  });\n\n  protected readonly activeFilterCount = computed(() => this.filterEngine.conditions().length);\n\n  /**\n   * Kind of empty state to show, or `'none'` when rows are present:\n   *  - `'no-data'`    : no rows have been loaded (and the source is empty).\n   *  - `'no-results'` : the source has rows but the active filters yield 0.\n   *\n   * Loading and infinite-scroll loading-more states are *not* treated as\n   * empty (we let the loading indicator drive the UX instead).\n   */\n  protected readonly emptyStateKind = computed<GridEmptyKind | 'none'>(() => {\n    if (this.gridEngine.displayRows().length > 0) return 'none';\n    if (this.state.isLoading()) return 'none';\n\n    const hasFilters = this.filterEngine.conditions().length > 0;\n    const sourceCount =\n      this.state.mode() === 'server' ? this.state.totalItems() : this.state.sourceData().length;\n\n    // In server mode `totalItems` may not reflect filters, so trust active\n    // filters as the discriminator. Same heuristic in client mode.\n    if (hasFilters) return 'no-results';\n    if (sourceCount === 0) return 'no-data';\n    // Source has rows, no filters, but display is empty (e.g. group with no\n    // matching rows after pagination). Fall back to `no-results` which\n    // offers the \"Clear filters\" CTA — harmless when no filters are active\n    // because we hide the button when the count is zero.\n    return 'no-results';\n  });\n\n  /** Resolves the projected `<ng-template mozGridEmptyDef>` for the kind. */\n  protected readonly emptyTemplate = computed(() => {\n    const kind = this.emptyStateKind();\n    if (kind === 'none') return null;\n    const defs = this.emptyDefs();\n    const exact = defs.find((d) => d.kind() === kind);\n    if (exact) return exact.template;\n    // Fallback to a `no-data` template for the `no-results` kind.\n    return defs.find((d) => d.kind() === 'no-data')?.template ?? null;\n  });\n\n  /** Context object exposed to projected empty-state templates. */\n  protected readonly emptyContext = computed<GridEmptyContext>(() => ({\n    activeFilterCount: this.filterEngine.conditions().length,\n    clearFilters: () => this.filterEngine.clearAll(),\n  }));\n\n  /**\n   * Wrap the empty context for `ngTemplateOutlet` so consumers can use\n   * either `let-ctx` (positional, via `$implicit`) or named bindings\n   * (`let-clearFilters=\"clearFilters\"`) without having to choose at\n   * declaration time.\n   */\n  protected readonly emptyTemplateContext = computed(() => {\n    const ctx = this.emptyContext();\n    return { $implicit: ctx, ...ctx };\n  });\n\n  /** CTA label for the default no-results state — hidden when no filters. */\n  protected readonly resolvedNoResultsActionLabel = computed(() => {\n    if (this.filterEngine.conditions().length === 0) return '';\n    return this.noResultsActionLabel();\n  });\n\n  protected readonly hasHiddenColumns = computed(() =>\n    this.state.columnStates().some((col) => !col.visible)\n  );\n  protected readonly hiddenColumnsList = computed(() => {\n    const defMap = this.state.columnDefMap();\n    return this.state\n      .columnStates()\n      .filter((col) => !col.visible)\n      .map((col) => ({ field: col.field, label: defMap.get(col.field)?.headerName ?? col.field }));\n  });\n  protected readonly toolbarStartDefs = computed(() =>\n    this.toolbarDefs().filter((d) => d.slot() === 'start')\n  );\n  protected readonly toolbarEndDefs = computed(() =>\n    this.toolbarDefs().filter((d) => d.slot() === 'end')\n  );\n  protected readonly selectionBannerVisible = computed(() => {\n    return this.rowSelectionEngine.count() > 0;\n  });\n  protected readonly selectionTotalCount = computed(\n    () => this.state.totalItems() || this.state.sourceData().length\n  );\n  protected readonly showPagination = computed(\n    () => this.pagination() && this.state.loadingStrategy() === 'pagination'\n  );\n  protected readonly showInfiniteScrollLoader = computed(\n    () => this.state.loadingStrategy() === 'infinite-scroll' && this.state.isLoading()\n  );\n\n  /** Focused cell coord picked up by the formula bar — falls back to the\n   *  selected cell so the bar stays populated after focus is lost (e.g.\n   *  the user clicked outside to dismiss an overlay). */\n  private readonly formulaBarCoord = computed(() => {\n    return this.state.focusedCell() ?? this.state.selectedCell();\n  });\n\n  /** Snapshot coord captured at edit entry — kept as a signal so the\n   *  bar's address reads from it reactively and stays pinned to the\n   *  original cell even when the user clicks elsewhere to pick refs. */\n  private readonly formulaBarActiveCoord = signal<{ row: number; col: number } | null>(null);\n\n  /** A1 address (`A5`, `$A$5`) of the formula-bar target cell. While the\n   *  bar is editing the address stays pinned to the snapshot so ref\n   *  picking doesn't visually jump the label around. */\n  protected readonly formulaBarAddress = computed(() => {\n    const coord = this.formulaBarActiveCoord() ?? this.formulaBarCoord();\n    if (!coord) return '';\n    const cols = this.state.visibleColumns();\n    if (!cols[coord.col]) return '';\n    return `${columnIndexToLetters(coord.col)}${coord.row + 1}`;\n  });\n\n  /** Formula source if the target cell holds one, otherwise the displayed\n   *  value as a string. Mirrors Excel's formula-bar behaviour. */\n  protected readonly formulaBarContent = computed(() => {\n    const coord = this.formulaBarCoord();\n    if (!coord) return '';\n    const cols = this.state.visibleColumns();\n    const field = cols[coord.col]?.field;\n    if (!field) return '';\n    const sourceIdx = this.displayIndexToSourceIndex(coord.row);\n    if (sourceIdx < 0) return '';\n    const row = this.state.sourceData()[sourceIdx] as Record<string, unknown> | undefined;\n    if (!row) return '';\n    const rowId = row[this.state.rowIdField()] as string | number | undefined;\n    if (rowId !== undefined && rowId !== null) {\n      const formula = this.formulaEngine.displayFormula({ rowId, field });\n      if (formula) return formula;\n    }\n    const raw = row[field];\n    if (raw === undefined || raw === null) return '';\n    return typeof raw === 'string' ? raw : String(raw);\n  });\n\n  /** `true` while the user is editing in the formula bar (mounts the\n   *  full-featured formula editor with ref highlights + autocomplete). */\n  protected readonly formulaBarEditing = signal(false);\n\n  /** Live draft while the formula-bar input is focused. `null` means\n   *  \"not editing\" and the input mirrors `formulaBarContent()`. */\n  protected readonly formulaBarDraft = signal<string | null>(null);\n\n  /** Snapshot of the cell targeted when the formula bar gained focus.\n   *  Needed because blur fires *after* the click that moved the\n   *  selection elsewhere — without this we'd commit into the new cell. */\n  private formulaBarEditSnapshot: {\n    coord: { row: number; col: number };\n    initial: string;\n  } | null = null;\n\n  /** Value shown in the bar input — draft while editing, committed value otherwise. */\n  protected readonly formulaBarDisplay = computed(() => {\n    const draft = this.formulaBarDraft();\n    return draft !== null ? draft : this.formulaBarContent();\n  });\n\n  /** Address of the cell the formula bar is editing (for `@row`\n   *  highlighting inside the embedded editor). Reads from the snapshot\n   *  so it stays stable while the user clicks other cells to pick refs. */\n  protected readonly formulaBarEditingAddr = computed<CellAddress | null>(() => {\n    const coord = this.formulaBarActiveCoord() ?? this.formulaBarCoord();\n    if (!coord) return null;\n    const field = this.state.visibleColumns()[coord.col]?.field;\n    if (!field) return null;\n    const sourceIdx = this.displayIndexToSourceIndex(coord.row);\n    if (sourceIdx < 0) return null;\n    const row = this.state.sourceData()[sourceIdx] as Record<string, unknown> | undefined;\n    const rowId = row?.[this.state.rowIdField()] as string | number | undefined;\n    if (rowId === undefined || rowId === null) return null;\n    return { rowId, field };\n  });\n\n  /** `true` when the target cell sits in an editable column. */\n  protected readonly formulaBarEditable = computed(() => {\n    const coord = this.formulaBarCoord();\n    if (!coord) return false;\n    const field = this.state.visibleColumns()[coord.col]?.field;\n    if (!field) return false;\n    return this.state.columnDefMap().get(field)?.editable === true;\n  });\n\n  private columnsInitialized = false;\n  private stateRestored = false;\n  private documentMouseUpHandler: (() => void) | null = null;\n\n  constructor() {\n    this.keyboardEngine.registerActions({\n      copy: () => this.onBulkCopy(),\n      paste: () => {\n        void this.onBulkPaste();\n      },\n      cut: () => this.onCutShortcut(),\n      deleteRange: () => this.onBulkDelete(),\n      undo: () => this.onUndo(),\n      redo: () => this.onRedo(),\n      fillDown: () => this.onFillDownShortcut(),\n      fillRight: () => this.onFillRightShortcut(),\n      startEdit: (row, col, char) => this.onStartEditShortcut(row, col, char),\n    });\n\n    // Bind history persistence to the grid's stateKey (same key we use for\n    // column/sort persistence — one localStorage namespace per grid).\n    effect(() => {\n      this.historyEngine.attach(this.stateKey());\n    });\n\n    // Global mouseup listener for fill handle — if the user drags the fill\n    // handle outside the grid and releases, we still need to end the fill.\n    afterNextRender(() => {\n      this.documentMouseUpHandler = (): void => {\n        if (this.state.isFilling()) {\n          this.ngZone.run(() => this.onMouseUp());\n        }\n      };\n      document.addEventListener('mouseup', this.documentMouseUpHandler);\n      this.destroyRef.onDestroy(() => {\n        if (this.documentMouseUpHandler) {\n          document.removeEventListener('mouseup', this.documentMouseUpHandler);\n        }\n      });\n    });\n\n    // Single scroll container: the `.moz-grid` element is now the unique\n    // overflow:auto host. Header sits inside it as `position: sticky; top: 0`,\n    // and pinned column cells are `position: sticky; left/right: …px` —\n    // both rely on this element being their containing block. No transforms\n    // anywhere on the subtree (CDK virtual scroll has been replaced by\n    // `VerticalVirtualScrollEngine` + a height-based top spacer).\n    afterNextRender(() => {\n      const grid = this.gridContainer();\n      if (!grid) return;\n      const scrollEl = grid.nativeElement as HTMLElement;\n\n      const pushScroll = (): void => {\n        this.horizontalVirtualScrollEngine.onScroll(scrollEl.scrollLeft, scrollEl.clientWidth);\n        this.verticalVirtualScrollEngine.onScroll(scrollEl.scrollTop, scrollEl.clientHeight);\n      };\n\n      // Prime the engines with the initial size *after* the current render\n      // cycle settles — calling tick() / writing signals here would re-enter\n      // the change-detection cycle that just placed us in afterNextRender.\n      queueMicrotask(pushScroll);\n\n      let rafPending = false;\n      scrollEl.addEventListener(\n        'scroll',\n        () => {\n          if (rafPending) return;\n          rafPending = true;\n          requestAnimationFrame(() => {\n            pushScroll();\n            rafPending = false;\n          });\n        },\n        { passive: true },\n      );\n\n      const ro = new ResizeObserver(() => pushScroll());\n      ro.observe(scrollEl);\n\n      this.infiniteScrollEngine.attach(scrollEl, (event) => {\n        this.loadMore.emit(event);\n      });\n    });\n\n    // Sync column definitions from content children (run only once).\n    // Defer the read to a microtask so required signal inputs on dynamically\n    // created column defs (e.g. generated via @for) are flushed before we\n    // call toColumnDef() — otherwise field() throws NG0950.\n    effect(\n      () => {\n        const defs = this.columnDefs();\n        if (defs.length === 0 || this.columnsInitialized) return;\n        this.columnsInitialized = true;\n        queueMicrotask(() => {\n          this.state.initColumns(defs.map((d) => d.toColumnDef()));\n        });\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Sync data input → state\n    effect(\n      () => {\n        this.state.sourceData.set(this.data());\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Revalidate all cells when data changes\n    effect(\n      () => {\n        const data = this.state.sourceData();\n        this.validationEngine.validateAll(data);\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Sync mode input → state\n    effect(\n      () => {\n        this.state.mode.set(this.mode());\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Sync filterMode input → state\n    effect(\n      () => {\n        this.state.filterMode.set(this.filterMode());\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Sync horizontal virtual scroll flag → state\n    effect(\n      () => {\n        this.state.horizontalVirtualScrollEnabled.set(this.horizontalVirtualScroll());\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Sync totalItems input → state (server mode)\n    effect(\n      () => {\n        this.state.totalItems.set(this.totalItems());\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Sync pageSize input → state\n    effect(\n      () => {\n        this.state.pageSize.set(this.pageSize());\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Sync visibleRowCount from paginated data + clear focus on page change (#5 + #6)\n    effect(\n      () => {\n        const count = this.gridEngine.paginatedData().length;\n        this.state.visibleRowCount.set(count);\n      },\n      { allowSignalWrites: true }\n    );\n    let prevPageIndex = this.state.pageIndex();\n    effect(\n      () => {\n        const current = this.state.pageIndex();\n        if (current === prevPageIndex) return;\n        prevPageIndex = current;\n        this.cellSelectionEngine.clearFocus();\n        // Reset scroll to top so the next cell click doesn't cause a jump\n        queueMicrotask(() => {\n          const grid = this.gridContainer();\n          if (grid) grid.nativeElement.scrollTop = 0;\n        });\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Sync rowHeight input → state\n    effect(\n      () => {\n        this.state.rowHeight.set(this.rowHeight());\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Sync loading input → state\n    effect(\n      () => {\n        this.state.isLoading.set(this.loading());\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Sync loadingStrategy input → state\n    effect(\n      () => {\n        this.state.loadingStrategy.set(this.loadingStrategy());\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Sync pagination input → state — drives the slice in `paginatedData`.\n    effect(\n      () => {\n        this.state.paginationEnabled.set(this.pagination());\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Sync multiCellSelection input → state\n    effect(\n      () => {\n        this.state.multiCellSelectionEnabled.set(this.multiCellSelection());\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Sync scrollThreshold input → infinite scroll engine\n    effect(() => {\n      this.infiniteScrollEngine.scrollThreshold.set(this.scrollThreshold());\n    });\n\n    // Sync rowIdField input → state\n    effect(\n      () => {\n        this.state.rowIdField.set(this.rowIdField());\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Auto-register formula cells from the initial / updated dataset.\n    // Without this effect, only formulas committed via the inline editor\n    // would be tracked — formulas baked into `[data]` would render as raw\n    // strings (e.g. `=REF(COLUMN(\"price\"),ROW(1))`) instead of their evaluated value.\n    effect(\n      () => {\n        if (!this.formulas()) return;\n        // Track these signals so the engine reconciles on every change.\n        this.state.sourceData();\n        const defs = this.state.columnDefMap();\n        this.formulaEngine.syncFromSource((field) => defs.get(field)?.allowFormula === true);\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Restore persisted state after columns are initialized (once only)\n    effect(\n      () => {\n        const key = this.stateKey();\n        const cols = this.state.columnStates();\n        if (key && cols.length > 0 && !this.stateRestored) {\n          this.stateRestored = true;\n          this.persistenceEngine.restore(key);\n        }\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Auto-save state on column/sort/filter changes\n    effect(() => {\n      const key = this.stateKey();\n      if (!key) return;\n      // Read signals to track them\n      this.state.columnStates();\n      this.state.activeSorts();\n      this.state.filterModel();\n      this.persistenceEngine.save(key);\n    });\n\n    // Emit `filterChange` once per mutation. The engine's `lastEvent` signal\n    // is set synchronously from every mutation path, guaranteeing we emit\n    // exactly once per reason (add / update / remove / reorder / clear / replace).\n    effect(() => {\n      const event = this.filterEngine.lastEvent();\n      if (!event) return;\n      this.filterChange.emit(event);\n      this.resetInfiniteScrollIfActive();\n    });\n\n    // Initialize plugins\n    effect(() => {\n      const pluginList = this.plugins();\n      for (const plugin of pluginList) {\n        plugin.init(this.state as unknown as GridStateManager<never>);\n      }\n    });\n\n    // Scroll focused cell into view on keyboard navigation only\n    effect(() => {\n      const cell = this.state.focusedCell();\n      if (!cell) return;\n      if (this.state.focusSource() !== 'keyboard') return;\n\n      const grid = this.gridContainer();\n      if (!grid) return;\n      const scrollEl = grid.nativeElement;\n\n      // Vertical: when the row is in the DOM, hand off to the browser's\n      // native `scrollIntoView({ block: 'nearest' })` — it accounts for\n      // sticky-header occlusion AND for any outline/border that extends\n      // past the cell box. When the row is outside the rendered window\n      // (virtualization), we fall back to manual math so we land in the\n      // right neighbourhood; the engine then refines the range and the\n      // next focus update lets `scrollIntoView` polish the position.\n      const rowEl = scrollEl.querySelector(`[data-row-index=\"${cell.row}\"]`) as\n        | HTMLElement\n        | null;\n      if (rowEl) {\n        rowEl.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'instant' });\n      } else {\n        const viewportSize = scrollEl.clientHeight;\n        const scrollOffset = scrollEl.scrollTop;\n        const headerEl = scrollEl.querySelector('moz-grid-header') as HTMLElement | null;\n        const stickyTopHeight = headerEl ? headerEl.getBoundingClientRect().height : 0;\n\n        const pageOffset = this.state.pageIndex() * this.state.pageSize();\n        const localRow = cell.row - pageOffset;\n        const rowTop = this.verticalVirtualScrollEngine.scrollOffsetForIndex(localRow);\n        const rowBottom = rowTop + this.verticalVirtualScrollEngine.getRowHeight(localRow);\n\n        if (rowTop < scrollOffset + stickyTopHeight) {\n          scrollEl.scrollTop = rowTop - stickyTopHeight;\n        } else if (rowBottom > scrollOffset + viewportSize) {\n          scrollEl.scrollTop = rowBottom - viewportSize;\n        }\n      }\n\n      // Horizontal: find the cell's horizontal offset and scroll if needed.\n      // With sticky-inline pinned cells, the row itself is `min-width:\n      // utilityLeftWidth + totalContentWidth`. Unpinned column `i` lives at\n      // absolute X = utilityLeftWidth + pinnedLeftWidth + Σ(prev unpinned).\n      // Visible window inside the row (after sticky reservation) is\n      // [scrollLeft + leftReserve, scrollLeft + clientWidth − pinnedRightWidth].\n      const cols = this.state.visibleColumns();\n      if (cell.col >= 0 && cell.col < cols.length) {\n        const pinnedLeftCount = this.state.pinnedLeftColumns().length;\n        const utilityLeftWidth =\n          (this.expandable() ? 36 : 0) + (this.rowSelection() ? 48 : 0);\n        const leftReserve = utilityLeftWidth + this.state.pinnedLeftWidth();\n        const rightReserve = this.state.pinnedRightWidth();\n\n        const unpinned = this.state.unpinnedColumns();\n        const unpinnedIdx = cell.col - pinnedLeftCount;\n\n        if (unpinnedIdx >= 0 && unpinnedIdx < unpinned.length) {\n          let colAbsolute = leftReserve;\n          for (let i = 0; i < unpinnedIdx; i++) {\n            colAbsolute += unpinned[i].currentWidth;\n          }\n          const colRight = colAbsolute + unpinned[unpinnedIdx].currentWidth;\n\n          const visibleLeft = scrollEl.scrollLeft + leftReserve;\n          const visibleRight = scrollEl.scrollLeft + scrollEl.clientWidth - rightReserve;\n\n          if (colAbsolute < visibleLeft) {\n            scrollEl.scrollLeft = colAbsolute - leftReserve;\n          } else if (colRight > visibleRight) {\n            scrollEl.scrollLeft = colRight - (scrollEl.clientWidth - rightReserve);\n          }\n        }\n      }\n    });\n  }\n\n  // --- Event handlers ---\n\n  onSortClick(event: { field: string; isMultiSort: boolean }): void {\n    this.sortEngine.toggleSort(event.field, event.isMultiSort);\n    this.sortChange.emit({ sorts: this.state.activeSorts() });\n    this.resetInfiniteScrollIfActive();\n  }\n\n  onMenuAction(event: { field: string; actionId: HeaderMenuActionId }): void {\n    switch (event.actionId) {\n      case 'sort-asc':\n        this.sortEngine.setSort(event.field, 'asc');\n        this.sortChange.emit({ sorts: this.state.activeSorts() });\n        break;\n      case 'sort-desc':\n        this.sortEngine.setSort(event.field, 'desc');\n        this.sortChange.emit({ sorts: this.state.activeSorts() });\n        break;\n      case 'group-column':\n        this.groupEngine.addGroup(event.field);\n        this.groupChange.emit({\n          columns: this.state.groupColumns().map((g) => g.field),\n          groups: [...this.state.groupColumns()],\n        });\n        break;\n      case 'filter-column':\n        // Filter is handled via the per-column search input toggle\n        this.state.updateColumnState(event.field, { searchVisible: true });\n        break;\n      case 'hide-column':\n        this.state.updateColumnState(event.field, { visible: false });\n        break;\n      case 'toggle-column-search': {\n        const col = this.state.columnStates().find((c) => c.field === event.field);\n        if (col) {\n          this.state.updateColumnState(event.field, { searchVisible: !col.searchVisible });\n        }\n        break;\n      }\n      case 'freeze-column-left':\n        this.freezeLeft(event.field);\n        break;\n      case 'freeze-column-right':\n        this.freezeRight(event.field);\n        break;\n      case 'unfreeze-column':\n        this.state.updateColumnState(event.field, { pinned: null });\n        break;\n    }\n  }\n\n  onCellEdit(event: CellEditEvent<unknown>): void {\n    this.cellEdit.emit(event as CellEditEvent<T>);\n  }\n\n  onSelectAllToggle(): void {\n    this.rowSelectionEngine.toggleSelectAllPage();\n    this.activateRowSelectionMode();\n    this.selectionChange.emit(this.rowSelectionEngine.getSelectionEvent());\n  }\n\n  onRowSelectionToggle(): void {\n    this.activateRowSelectionMode();\n    this.selectionChange.emit(this.rowSelectionEngine.getSelectionEvent());\n  }\n\n  private activateRowSelectionMode(): void {\n    if (this.rowSelectionEngine.count() > 0) {\n      this.state.activeSelectionMode.set('rows');\n      this.cellSelectionEngine.clearFocus();\n    } else {\n      this.state.activeSelectionMode.set('none');\n    }\n  }\n\n  onKeydown(event: KeyboardEvent): void {\n    const editState = this.state.cellEditState();\n    const isEditing = editState.editingCell !== null;\n\n    // In edit mode, intercept Tab/Enter/Escape even from input/select elements\n    if (isEditing) {\n      this.handleEditModeKeydown(event);\n      return;\n    }\n\n    // Don't intercept keystrokes inside interactive elements (filter slots, etc.)\n    const tag = (event.target as HTMLElement)?.tagName?.toLowerCase();\n    if (tag === 'input' || tag === 'select' || tag === 'textarea') {\n      return;\n    }\n\n    // Row-selection mode forwards a small set of shortcuts without touching\n    // cell focus. Cell-mode (and anywhere else) goes through the keyboard engine.\n    const selMode = this.state.activeSelectionMode();\n    if (selMode === 'rows') {\n      if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'c') {\n        event.preventDefault();\n        this.onBulkCopy();\n        return;\n      }\n      if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'v') {\n        event.preventDefault();\n        void this.onBulkPaste();\n        return;\n      }\n      if (event.key === 'Delete' || event.key === 'Backspace') {\n        event.preventDefault();\n        this.onBulkDelete();\n        return;\n      }\n    }\n\n    this.keyboardEngine.handleKeydown(event);\n  }\n\n  private handleEditModeKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      const cancelEvt = this.inlineEditEngine.cancelEdit();\n      if (cancelEvt) {\n        this.cellEditCancel.emit(cancelEvt);\n      }\n      return;\n    }\n\n    if (event.key === 'Enter') {\n      // Alt+Enter: insert a newline in the draft for text editors (Excel-style).\n      if (event.altKey) {\n        const editState = this.state.cellEditState();\n        const def = this.state\n          .columnDefMap()\n          .get(this.state.visibleColumns()[editState.editingCell?.col ?? -1]?.field ?? '');\n        const editorType = def?.cellEditor ?? 'text';\n        if (editorType === 'text') {\n          event.preventDefault();\n          const draft = editState.draftValue;\n          const next = (typeof draft === 'string' ? draft : String(draft ?? '')) + '\\n';\n          this.inlineEditEngine.updateDraft(next);\n        }\n        return;\n      }\n\n      // Ctrl+Enter: commit current draft and broadcast it to the active range.\n      if (event.ctrlKey || event.metaKey) {\n        event.preventDefault();\n        const editState = this.state.cellEditState();\n        const value = editState.draftValue;\n        const cancel = this.inlineEditEngine.cancelEdit();\n        if (cancel) this.cellEditCancel.emit(cancel);\n        const range = this.cellSelectionEngine.getNormalizedRange();\n        if (range) {\n          const changes = this.clipboardEngine.fillSelection(range, value);\n          this.historyEngine.record('fill-selection', changes);\n        }\n        this.refocusGrid();\n        return;\n      }\n\n      event.preventDefault();\n      this.commitFromEditMode();\n      if (event.shiftKey) this.cellSelectionEngine.moveUp();\n      else this.cellSelectionEngine.moveDown();\n      this.refocusGrid();\n      return;\n    }\n\n    if (event.key === 'Tab') {\n      event.preventDefault();\n      this.commitFromEditMode();\n      if (event.shiftKey) this.cellSelectionEngine.moveLeft();\n      else this.cellSelectionEngine.moveRight();\n      this.refocusGrid();\n    }\n  }\n\n  private commitFromEditMode(): void {\n    const evt = this.inlineEditEngine.commitEdit();\n    if (!evt) return;\n    this.cellEdit.emit(evt as CellEditEvent<T>);\n    this.clipboardEngine.clearCut();\n  }\n\n  private onCutShortcut(): void {\n    const range = this.cellSelectionEngine.getNormalizedRange();\n    if (!range) return;\n    const values = this.clipboardEngine.extractTsv(range);\n    const tsv = values.map((row) => row.join('\\t')).join('\\n');\n    navigator.clipboard.writeText(tsv);\n    this.clipboardEngine.markCut(range);\n    this.bulkCopy.emit({\n      range,\n      data: values,\n      rowIds: this.getRangeRowIds(range),\n      fields: this.getRangeFields(range),\n    });\n  }\n\n  private onUndo(): void {\n    this.historyEngine.undo();\n    this.clipboardEngine.clearCut();\n  }\n\n  private onRedo(): void {\n    this.historyEngine.redo();\n    this.clipboardEngine.clearCut();\n  }\n\n  private onFillDownShortcut(): void {\n    const range = this.cellSelectionEngine.getNormalizedRange();\n    if (!range) return;\n    const changes = this.clipboardEngine.fillDown(range);\n    if (changes.length === 0) return;\n    this.historyEngine.record('fill-down', changes);\n    this.clipboardEngine.clearCut();\n  }\n\n  private onFillRightShortcut(): void {\n    const range = this.cellSelectionEngine.getNormalizedRange();\n    if (!range) return;\n    const changes = this.clipboardEngine.fillRight(range);\n    if (changes.length === 0) return;\n    this.historyEngine.record('fill-right', changes);\n    this.clipboardEngine.clearCut();\n  }\n\n  private onStartEditShortcut(row: number, col: number, initialChar?: string): void {\n    const colDef = this.state.visibleColumns()[col];\n    if (!colDef) return;\n    const def = this.state.columnDefMap().get(colDef.field);\n    if (!def?.editable) return;\n    if (initialChar !== undefined) {\n      this.inlineEditEngine.startEditWithChar(row, colDef.field, initialChar);\n    } else {\n      this.inlineEditEngine.startEdit(row, colDef.field);\n    }\n  }\n\n  private resetInfiniteScrollIfActive(): void {\n    if (this.state.loadingStrategy() !== 'infinite-scroll') return;\n    if (this.state.mode() !== 'server') return;\n    this.infiniteScrollEngine.reset((event) => {\n      this.loadMore.emit(event);\n    });\n  }\n\n  private refocusGrid(): void {\n    // Use setTimeout to ensure focus happens after CDK overlay cleanup\n    // (e.g. combobox/datepicker close restoring focus asynchronously)\n    setTimeout(() => {\n      const container = this.gridContainer();\n      if (container) {\n        container.nativeElement.focus();\n      }\n    });\n  }\n\n  onMouseUp(): void {\n    // Formula pick-range drag wins over the normal cell-range drag: when a\n    // formula editor is active, any mouseup ends the pick and the cell\n    // selection should stay untouched.\n    if (this.refHighlight.isPickDragging()) {\n      this.refHighlight.pickRangeCommit();\n      return;\n    }\n    // Fill takes priority over range selection\n    if (this.state.isFilling()) {\n      const result = this.cellSelectionEngine.endFill();\n      if (result) {\n        this.applyFill(result.anchor, result.target);\n      }\n      return;\n    }\n    this.cellSelectionEngine.endRangeSelection();\n  }\n\n  /**\n   * Shifts a formula's relative refs by the given (row, col) delta when the\n   * value is a formula string dropped on a new cell during a fill. Non-formula\n   * values are returned as-is so downstream code can still see the raw value.\n   */\n  private shiftFormulaForFill(\n    value: unknown,\n    allowFormula: boolean,\n    rowDelta: number,\n    colDelta: number\n  ): unknown {\n    if (!allowFormula) return value;\n    if (typeof value !== 'string') return value;\n    if (!value.trimStart().startsWith('=')) return value;\n    if (rowDelta === 0 && colDelta === 0) return value;\n    const fieldOrder = this.state.visibleColumns().map((c) => c.field);\n    return shiftFormulaRefs(value, { rowDelta, colDelta, fieldOrder });\n  }\n\n  /**\n   * Maps a display row index (from displayRow.index) to the actual index in\n   * sourceData(). When grouping or sorting is active the display index doesn't\n   * match sourceData order, so we resolve via object identity.\n   */\n  private displayIndexToSourceIndex(displayIndex: number): number {\n    const displayRows = this.gridEngine.displayRows();\n    const match = displayRows.find((r) => r.type === 'data' && r.index === displayIndex);\n    if (!match || match.type !== 'data') return -1;\n    return this.state.sourceData().indexOf(match.data);\n  }\n\n  private applyFill(\n    anchor: { row: number; col: number },\n    target: { row: number; col: number }\n  ): void {\n    const cols = this.state.visibleColumns();\n    const sourceField = cols[anchor.col]?.field;\n    if (!sourceField) return;\n\n    const sourceDef = this.state.columnDefMap().get(sourceField);\n    if (!sourceDef?.editable) return;\n\n    const anchorSourceIdx = this.displayIndexToSourceIndex(anchor.row);\n    if (anchorSourceIdx < 0) return;\n\n    const data = this.state.sourceData();\n    const sourceRow = data[anchorSourceIdx];\n    if (!sourceRow) return;\n\n    const sourceValue = sourceDef.valueGetter\n      ? sourceDef.valueGetter(sourceRow)\n      : (sourceRow as Record<string, unknown>)[sourceField];\n\n    const vertical = target.col === anchor.col;\n    if (vertical) {\n      this.applyVerticalFill(anchor, target, sourceField, sourceValue);\n    } else {\n      this.applyHorizontalFill(anchor, target, sourceValue, anchorSourceIdx);\n    }\n  }\n\n  private applyVerticalFill(\n    anchor: { row: number; col: number },\n    target: { row: number; col: number },\n    field: string,\n    sourceValue: unknown\n  ): void {\n    const minRow = Math.min(anchor.row, target.row);\n    const maxRow = Math.max(anchor.row, target.row);\n    const affected = maxRow - minRow;\n    if (affected === 0) return;\n\n    const allowFormula = this.state.columnDefMap().get(field)?.allowFormula === true;\n    // Build a map of display index → sourceData index for the fill range\n    const indexMap = new Map<number, number>();\n    for (let r = minRow; r <= maxRow; r++) {\n      if (r === anchor.row) continue;\n      const srcIdx = this.displayIndexToSourceIndex(r);\n      if (srcIdx >= 0) indexMap.set(r, srcIdx);\n    }\n\n    const changes: { rowIndex: number; field: string; before: unknown; after: unknown }[] = [];\n    this.state.sourceData.update((d) => {\n      const updated = [...d];\n      for (const [displayIdx, srcIdx] of indexMap) {\n        if (!updated[srcIdx]) continue;\n        const after = this.shiftFormulaForFill(\n          sourceValue,\n          allowFormula,\n          displayIdx - anchor.row,\n          0\n        );\n        const before = (updated[srcIdx] as Record<string, unknown>)[field];\n        if (before === after) continue;\n        const rowCopy = { ...updated[srcIdx] } as Record<string, unknown>;\n        rowCopy[field] = after;\n        updated[srcIdx] = rowCopy as T;\n        changes.push({ rowIndex: srcIdx, field, before, after });\n      }\n      return updated;\n    });\n    if (changes.length > 0) {\n      this.historyEngine.record('fill', changes);\n    }\n    this.clipboardEngine.clearCut();\n\n    this.fillDown.emit({\n      sourceCell: anchor,\n      sourceValue,\n      direction: 'vertical',\n      affectedCellCount: affected,\n      field,\n      targetRange: { startRow: minRow, endRow: maxRow },\n      affectedRowCount: affected,\n    });\n  }\n\n  private applyHorizontalFill(\n    anchor: { row: number; col: number },\n    target: { row: number; col: number },\n    sourceValue: unknown,\n    anchorSourceIdx: number\n  ): void {\n    const cols = this.state.visibleColumns();\n    const defMap = this.state.columnDefMap();\n    const minCol = Math.min(anchor.col, target.col);\n    const maxCol = Math.max(anchor.col, target.col);\n\n    // Collect editable target fields, skipping the anchor, non-editable columns,\n    // and columns with incompatible editor types.\n    const sourceColEntry = cols[anchor.col];\n    const sourceDef2 = sourceColEntry ? defMap.get(sourceColEntry.field) : undefined;\n    const sourceEditorType = sourceDef2?.cellEditor ?? 'text';\n\n    const targetFields: string[] = [];\n    for (let c = minCol; c <= maxCol; c++) {\n      if (c === anchor.col) continue;\n      const colEntry = cols[c];\n      if (!colEntry) continue;\n      const def = defMap.get(colEntry.field);\n      if (!def?.editable) continue;\n      // Skip type-incompatible columns\n      const targetEditorType = def.cellEditor ?? 'text';\n      if (targetEditorType !== sourceEditorType) continue;\n      targetFields.push(colEntry.field);\n    }\n    if (targetFields.length === 0) return;\n\n    const changes: { rowIndex: number; field: string; before: unknown; after: unknown }[] = [];\n    this.state.sourceData.update((d) => {\n      const updated = [...d];\n      const src = updated[anchorSourceIdx];\n      if (!src) return updated;\n      const rowCopy = { ...src } as Record<string, unknown>;\n      for (const f of targetFields) {\n        const before = (src as Record<string, unknown>)[f];\n        const targetColIdx = cols.findIndex((c) => c.field === f);\n        const targetDef = defMap.get(f);\n        const allowFormula = targetDef?.allowFormula === true;\n        const after = this.shiftFormulaForFill(\n          sourceValue,\n          allowFormula,\n          0,\n          targetColIdx - anchor.col\n        );\n        if (before === after) continue;\n        rowCopy[f] = after;\n        changes.push({ rowIndex: anchorSourceIdx, field: f, before, after });\n      }\n      updated[anchorSourceIdx] = rowCopy as T;\n      return updated;\n    });\n    if (changes.length > 0) {\n      this.historyEngine.record('fill', changes);\n    }\n    this.clipboardEngine.clearCut();\n\n    this.fillDown.emit({\n      sourceCell: anchor,\n      sourceValue,\n      direction: 'horizontal',\n      affectedCellCount: targetFields.length,\n      targetFields,\n    });\n  }\n\n  onGroupToggle(groupKey: string): void {\n    this.groupEngine.toggleGroupExpand(groupKey);\n  }\n\n  onRemoveGroup(field: string): void {\n    this.groupEngine.removeGroup(field);\n    this.groupChange.emit({\n      columns: this.state.groupColumns().map((g) => g.field),\n      groups: [...this.state.groupColumns()],\n    });\n  }\n\n  onToggleGroupSort(field: string): void {\n    const groups = this.state.groupColumns().map((g) =>\n      g.field === field\n        ? {\n            ...g,\n            sortDirection: g.sortDirection === 'asc' ? ('desc' as const) : ('asc' as const),\n          }\n        : g\n    );\n    this.groupEngine.applyGroups(groups);\n    this.state.expandedGroups.set(new Set());\n    this.groupChange.emit({ columns: groups.map((g) => g.field), groups: [...groups] });\n  }\n\n  onSelectAllRows(): void {\n    this.rowSelectionEngine.selectAll();\n    this.activateRowSelectionMode();\n    this.selectionChange.emit(this.rowSelectionEngine.getSelectionEvent());\n  }\n\n  onClearSelection(): void {\n    this.rowSelectionEngine.deselectAll();\n    this.state.activeSelectionMode.set('none');\n    this.selectionChange.emit(this.rowSelectionEngine.getSelectionEvent());\n  }\n\n  /** Removes a single condition by id (tag \"×\" button). */\n  onRemoveFilter(id: string): void {\n    this.filterEngine.removeCondition(id);\n  }\n\n  /** Clears the whole filter model (\"Remove all\" button). */\n  onRemoveAllFilters(): void {\n    this.filterEngine.clearAll();\n  }\n\n  // --- Filter drawer ---\n\n  onFiltersClick(): void {\n    const data: FilterDrawerData = {\n      model: { conditions: this.filterEngine.conditions().slice() },\n      availableColumns: this.filterEngine.describeFilterableColumns(),\n      applyMode: this.resolvedFilterApplyMode(),\n    };\n\n    const ref = this.drawerService.open<\n      MozGridFilterDrawerComponent,\n      FilterDrawerData,\n      FilterDrawerResult\n    >(MozGridFilterDrawerComponent, { title: 'Filters', data, extended: true });\n\n    ref.afterClosed().subscribe((result) => {\n      if (result?.applied) {\n        this.filterEngine.setModel(result.model, 'replace');\n      }\n    });\n  }\n\n  onRestoreColumn(field: string): void {\n    this.state.updateColumnState(field, { visible: true });\n  }\n\n  toggleFullscreen(): void {\n    this.isFullscreen.update((v) => !v);\n    // After the layout flip, push a fresh measurement through the engines so\n    // the visible row/column ranges are recomputed against the new size.\n    requestAnimationFrame(() => {\n      const grid = this.gridContainer();\n      if (!grid) return;\n      const el = grid.nativeElement;\n      this.horizontalVirtualScrollEngine.onScroll(el.scrollLeft, el.clientWidth);\n      this.verticalVirtualScrollEngine.onScroll(el.scrollTop, el.clientHeight);\n    });\n  }\n\n  onRestoreAllColumns(): void {\n    this.state.columnStates.update((states) =>\n      states.map((s) => (s.visible ? s : { ...s, visible: true }))\n    );\n  }\n\n  getColumnLabel(field: string): string {\n    const def = this.state.columnDefMap().get(field);\n    return def?.headerName ?? field;\n  }\n\n  onResizeStart(event: { field: string; event: MouseEvent }): void {\n    this.resizeEngine.startResize(event.field, event.event);\n  }\n\n  onExportCsv(): void {\n    if (this.exportMode() === 'server') {\n      this.exportRequest.emit({\n        format: 'csv',\n        sorts: this.state.activeSorts(),\n        filterModel: this.state.filterModel(),\n        columns: this.state.visibleColumns().map((c) => c.field),\n      });\n      return;\n    }\n    this.exportEngine.exportCsv(this.data());\n  }\n\n  // --- Group drawer ---\n\n  onGroupClick(): void {\n    const allGroupable = this.state\n      .columnDefs()\n      .map((d) => ({ field: d.field, headerName: d.headerName ?? d.field }));\n\n    const data: GroupDrawerData = {\n      groups: [...this.state.groupColumns()],\n      availableColumns: allGroupable,\n    };\n\n    const ref = this.drawerService.open<\n      GridGroupDrawerComponent,\n      GroupDrawerData,\n      GroupDrawerResult\n    >(GridGroupDrawerComponent, { title: 'Group by', data });\n\n    ref.afterClosed().subscribe((result) => {\n      if (result) {\n        this.applyGroupResult(result);\n      }\n    });\n  }\n\n  private applyGroupResult(result: GroupDrawerResult): void {\n    this.groupEngine.applyGroups(result.groups);\n    this.state.expandedGroups.set(new Set());\n    this.groupChange.emit({\n      columns: result.groups.map((g) => g.field),\n      groups: [...result.groups],\n    });\n  }\n\n  // --- Keyboard shortcuts drawer ---\n\n  onKeyboardShortcutsClick(): void {\n    this.drawerService.open<GridKeyboardShortcutsDrawerComponent, void, void>(\n      GridKeyboardShortcutsDrawerComponent,\n      { title: 'Keyboard shortcuts' }\n    );\n  }\n\n  // --- Formula bar edit handlers ---\n\n  /** Clicking the readonly preview flips the bar into edit mode: we mount\n   *  the full formula editor on the next tick (it auto-focuses) and\n   *  snapshot the target cell so blur-ordering races can't mis-route\n   *  the commit to a different row. */\n  onFormulaBarInputFocus(): void {\n    if (!this.formulaBarEditable() || this.formulaBarEditing()) return;\n    const coord = this.formulaBarCoord();\n    if (!coord) return;\n    const initial = this.formulaBarContent();\n    this.formulaBarEditSnapshot = { coord: { ...coord }, initial };\n    this.formulaBarActiveCoord.set({ ...coord });\n    this.formulaBarDraft.set(initial);\n    this.formulaBarEditing.set(true);\n    this.state.formulaBarEditingActive.set(true);\n  }\n\n  onFormulaBarEditorChange(value: string): void {\n    this.formulaBarDraft.set(value);\n  }\n\n  onFormulaBarEditorCommit(): void {\n    this.commitFormulaBar();\n    this.exitFormulaBarEdit();\n  }\n\n  onFormulaBarEditorCancel(): void {\n    this.exitFormulaBarEdit();\n  }\n\n  /** Commit-on-outside-focus: when the user tabs or clicks truly away\n   *  from the bar (not onto a grid cell — cells aren't focusable so they\n   *  don't steal focus), persist the draft. */\n  onFormulaBarWrapperFocusout(event: FocusEvent): void {\n    if (!this.formulaBarEditing()) return;\n    const wrapper = event.currentTarget as HTMLElement;\n    const next = event.relatedTarget as Node | null;\n    // Focus moving within the bar (e.g. editor ↔ suggestion list) is fine.\n    if (next && wrapper.contains(next)) return;\n    // Suggestion overlay renders at <body> level — don't close the bar\n    // while the user is picking a suggestion.\n    if (next instanceof HTMLElement && next.closest('.cdk-overlay-container')) return;\n    // Defer so a re-focus initiated by the ref-picker (cells call\n    // `input.focus()` after inserting) can cancel this close.\n    setTimeout(() => {\n      if (!this.formulaBarEditing()) return;\n      const active = document.activeElement;\n      if (active && wrapper.contains(active)) return;\n      if (active instanceof HTMLElement && active.closest('.cdk-overlay-container')) return;\n      this.commitFormulaBar();\n      this.exitFormulaBarEdit();\n    });\n  }\n\n  private exitFormulaBarEdit(): void {\n    this.formulaBarEditing.set(false);\n    this.formulaBarDraft.set(null);\n    this.formulaBarEditSnapshot = null;\n    this.formulaBarActiveCoord.set(null);\n    this.state.formulaBarEditingActive.set(false);\n  }\n\n  private commitFormulaBar(): void {\n    const draft = this.formulaBarDraft();\n    const snapshot = this.formulaBarEditSnapshot;\n    if (draft === null || !snapshot) return;\n    // No-op when the user opened the bar and clicked away without typing —\n    // prevents accidental writes caused by the blur→click ordering.\n    if (draft === snapshot.initial) return;\n    const coord = snapshot.coord;\n    const field = this.state.visibleColumns()[coord.col]?.field;\n    if (!field) return;\n    const def = this.state.columnDefMap().get(field);\n    if (!def?.editable) return;\n\n    const sourceIdx = this.displayIndexToSourceIndex(coord.row);\n    if (sourceIdx < 0) return;\n    const currentRow = this.state.sourceData()[sourceIdx] as Record<string, unknown> | undefined;\n    if (!currentRow) return;\n    const rowId = currentRow[this.state.rowIdField()] as string | number | undefined;\n    if (rowId === undefined || rowId === null) return;\n\n    const oldValue = currentRow[field];\n    // `displayFormula` mirrors the A1 surface the editor uses, so the\n    // no-op short-circuit actually catches unchanged formula edits.\n    const oldFormulaA1 = this.formulaEngine.displayFormula({ rowId, field });\n    const oldFormulaStored = this.formulaEngine.getFormula({ rowId, field });\n    const oldSerialized =\n      oldFormulaA1 ?? (oldValue === undefined || oldValue === null ? '' : String(oldValue));\n    if (draft === oldSerialized) return;\n\n    // Coerce the draft: plain numeric strings become numbers so downstream\n    // consumers (and formulas depending on this cell) see the right type.\n    // Formula drafts are authored in A1; sourceData holds REF long-form\n    // storage, so we normalise before writing.\n    const looksLikeFormula = draft.trimStart().startsWith('=');\n    const newValue: unknown = looksLikeFormula\n      ? this.a1FormulaToStorage(draft)\n      : coerceDraftValue(draft, oldValue);\n\n    if (def.cellEditorValidator) {\n      const result = def.cellEditorValidator(newValue, currentRow as T);\n      if (result === false || typeof result === 'string') return;\n    }\n\n    this.state.sourceData.update((data) => {\n      const updated = [...data];\n      updated[sourceIdx] = { ...updated[sourceIdx], [field]: newValue } as T;\n      return updated;\n    });\n    const newRow = this.state.sourceData()[sourceIdx];\n\n    const addr = { rowId, field };\n    const allowFormula = def.allowFormula === true;\n    if (allowFormula && looksLikeFormula) {\n      this.formulaEngine.set(addr, draft);\n    } else if (allowFormula && oldFormulaStored && !looksLikeFormula) {\n      this.formulaEngine.remove(addr);\n    }\n    this.formulaEngine.invalidate(addr);\n\n    this.cellEdit.emit({\n      row: newRow,\n      rowIndex: sourceIdx,\n      field,\n      oldValue,\n      newValue,\n    } as CellEditEvent<T>);\n  }\n\n  /**\n   * Convert a formula-bar A1 draft to REF long-form storage. Kept as a\n   * member so it can re-use the grid's reactive context without threading\n   * `fields` / `rowIds` through every caller.\n   */\n  private a1FormulaToStorage(draft: string): string {\n    const rowIds = this.state.sourceData().map((row) => {\n      const r = row as Record<string, unknown>;\n      return (r[this.state.rowIdField()] as string | number | undefined) ?? '';\n    });\n    const fields = this.state.visibleColumns().map((c) => c.field);\n    return a1ToLongForm(draft, { fields, rowIds });\n  }\n\n  // --- Formula reference drawer ---\n\n  onFormulaReferenceClick(): void {\n    const registry = this.formulaEngine.getFunctions();\n    const entries: FormulaReferenceEntry[] = Object.entries(registry)\n      .filter(([, impl]) => !!impl.docs)\n      .map(([name, impl]) => ({\n        name,\n        signature: impl.docs!.signature,\n        summary: impl.docs!.summary,\n      }));\n    this.drawerService.open<GridFormulaReferenceDrawerComponent, FormulaReferenceData, void>(\n      GridFormulaReferenceDrawerComponent,\n      {\n        title: 'Fonctions disponibles',\n        data: { entries },\n      }\n    );\n  }\n\n  // --- Settings drawer ---\n\n  private static readonly DENSITY_ROW_HEIGHT: Record<GridDensity, number> = {\n    small: 32,\n    default: 48,\n    large: 64,\n  };\n\n  onSettingsClick(): void {\n    const data: GridSettingsData = {\n      columns: this.state.columnStates().map((col) => ({\n        field: col.field,\n        headerName: this.state.columnDefMap().get(col.field)?.headerName ?? col.field,\n        visible: col.visible,\n      })),\n      density: this.state.density(),\n      defaultColumns: this.state.columnDefs().map((def) => ({\n        field: def.field,\n        headerName: def.headerName ?? def.field,\n        visible: def.visible !== false,\n      })),\n    };\n\n    const ref = this.drawerService.open<\n      GridSettingsDrawerComponent,\n      GridSettingsData,\n      GridSettingsResult\n    >(GridSettingsDrawerComponent, { title: 'Settings', data });\n\n    ref.afterClosed().subscribe((result) => {\n      if (result) {\n        this.applySettings(result);\n      }\n    });\n  }\n\n  private applySettings(result: GridSettingsResult): void {\n    this.state.density.set(result.density);\n    this.state.rowHeight.set(MozGridComponent.DENSITY_ROW_HEIGHT[result.density]);\n\n    for (const col of result.columns) {\n      this.state.updateColumnState(col.field, { visible: col.visible, order: col.order });\n    }\n\n    this.settingsChange.emit(result);\n  }\n\n  // --- Freeze helpers ---\n\n  private freezeLeft(field: string): void {\n    this.state.updateColumnState(field, { pinned: 'start' });\n  }\n\n  private freezeRight(field: string): void {\n    this.state.updateColumnState(field, { pinned: 'end' });\n  }\n\n  // --- Bulk actions ---\n\n  private getRangeRowIds(range: {\n    start: { row: number; col: number };\n    end: { row: number; col: number };\n  }): unknown[] {\n    const data = this.state.sourceData();\n    const ids: unknown[] = [];\n    for (let r = range.start.row; r <= range.end.row; r++) {\n      if (data[r]) {\n        ids.push(this.rowSelectionEngine.getRowId(data[r]));\n      }\n    }\n    return ids;\n  }\n\n  private getRangeFields(range: {\n    start: { row: number; col: number };\n    end: { row: number; col: number };\n  }): string[] {\n    const cols = this.state.visibleColumns();\n    const fields: string[] = [];\n    for (let c = range.start.col; c <= range.end.col; c++) {\n      if (cols[c]) fields.push(cols[c].field);\n    }\n    return fields;\n  }\n\n  private getRowSelectionIds(event: RowSelectionEvent<T>): unknown[] {\n    return event.selectedIds as unknown[];\n  }\n\n  private getAllVisibleFields(): string[] {\n    return this.state.visibleColumns().map((c) => c.field);\n  }\n\n  /**\n   * Resolves a list of internal `HistoryCellChange` records into the public\n   * `BulkCellChange[]` shape exposed on bulk events. Looks up each row's\n   * configured id so consumers can persist changes without a second pass.\n   */\n  private toBulkCellChanges(changes: HistoryCellChange[]): BulkCellChange[] {\n    if (changes.length === 0) return [];\n    const data = this.state.sourceData();\n    const idField = this.state.rowIdField?.() ?? 'id';\n    return changes.map((c) => {\n      const row = data[c.rowIndex] as Record<string, unknown> | undefined;\n      return {\n        rowIndex: c.rowIndex,\n        rowId: row ? row[idField] : undefined,\n        field: c.field,\n        oldValue: c.before,\n        newValue: c.after,\n      };\n    });\n  }\n\n  private clearSelectionAndCloseBar(): void {\n    const mode = this.state.activeSelectionMode();\n    if (mode === 'rows') {\n      this.rowSelectionEngine.deselectAll();\n    } else if (mode === 'cells') {\n      this.cellSelectionEngine.clearFocus();\n    }\n    this.state.activeSelectionMode.set('none');\n  }\n\n  onBulkEdit(): void {\n    if (this.state.activeSelectionMode() === 'rows') {\n      const event = this.rowSelectionEngine.getSelectionEvent();\n      this.bulkEdit.emit({\n        range: null,\n        cellCount: event.count,\n        rowIds: this.getRowSelectionIds(event),\n        fields: this.getAllVisibleFields(),\n        selectionMode: 'rows',\n        rowSelection: event,\n      });\n      return;\n    }\n    const range = this.cellSelectionEngine.getNormalizedRange();\n    if (!range) return;\n    const rows = range.end.row - range.start.row + 1;\n    const cols = range.end.col - range.start.col + 1;\n    this.bulkEdit.emit({\n      range,\n      cellCount: rows * cols,\n      rowIds: this.getRangeRowIds(range),\n      fields: this.getRangeFields(range),\n    });\n  }\n\n  onBulkCopy(): void {\n    // A fresh copy always cancels any pending cut (Excel parity).\n    this.clipboardEngine.clearCut();\n\n    if (this.state.activeSelectionMode() === 'rows') {\n      const event = this.rowSelectionEngine.getSelectionEvent();\n      const rowData = this.extractRowSelectionData(event.selectedRows as T[]);\n      const tsv = rowData.map((row) => row.join('\\t')).join('\\n');\n      navigator.clipboard.writeText(tsv);\n      this.bulkCopy.emit({\n        range: null,\n        data: rowData,\n        rowIds: this.getRowSelectionIds(event),\n        fields: this.getAllVisibleFields(),\n        selectionMode: 'rows',\n        rowSelection: event,\n      });\n      return;\n    }\n    const data = this.extractRangeData();\n    if (!data) return;\n    const tsv = data.values.map((row) => row.join('\\t')).join('\\n');\n    navigator.clipboard.writeText(tsv);\n    this.bulkCopy.emit({\n      range: data.range,\n      data: data.values,\n      rowIds: this.getRangeRowIds(data.range),\n      fields: this.getRangeFields(data.range),\n    });\n  }\n\n  async onBulkPaste(): Promise<void> {\n    if (this.state.activeSelectionMode() === 'rows') {\n      const event = this.rowSelectionEngine.getSelectionEvent();\n      try {\n        const text = await navigator.clipboard.readText();\n        const pasteRows = text.split('\\n').map((line) => line.split('\\t'));\n        const changes = this.applyPasteToSelectedRows(event.selectedRows as T[], pasteRows);\n        if (changes.length > 0) {\n          this.historyEngine.record('paste', changes);\n        }\n        this.bulkPaste.emit({\n          range: null,\n          data: pasteRows,\n          rowIds: this.getRowSelectionIds(event),\n          fields: this.getAllVisibleFields(),\n          changes: this.toBulkCellChanges(changes),\n          selectionMode: 'rows',\n          rowSelection: event,\n        });\n      } catch {\n        // Clipboard access denied\n      }\n      return;\n    }\n    // Use focusedCell as the anchor for paste (enables cross-page paste)\n    const focused = this.state.focusedCell();\n    if (!focused) return;\n    try {\n      const text = await navigator.clipboard.readText();\n      const rows = text\n        .replace(/\\r?\\n$/, '')\n        .split('\\n')\n        .map((line) => line.split('\\t'));\n      const cols = this.state.visibleColumns();\n\n      // Excel-style: a single clipboard value pasted over a multi-cell selection\n      // fills the entire selection rather than only the focused anchor.\n      const isSingleValue = rows.length === 1 && rows[0].length === 1;\n      const selection = this.cellSelectionEngine.getNormalizedRange();\n      const isMultiCellSelection =\n        !!selection &&\n        (selection.start.row !== selection.end.row || selection.start.col !== selection.end.col);\n\n      let pasteRange: CellRange;\n      let pasteChanges: HistoryCellChange[];\n      if (isSingleValue && isMultiCellSelection && selection) {\n        pasteRange = selection;\n        pasteChanges = this.clipboardEngine.fillSelection(selection, rows[0][0]);\n      } else {\n        pasteRange = {\n          start: { row: focused.row, col: focused.col },\n          end: {\n            row: Math.min(focused.row + rows.length - 1, this.state.sourceData().length - 1),\n            col: Math.min(focused.col + (rows[0]?.length ?? 1) - 1, cols.length - 1),\n          },\n        };\n        pasteChanges = this.clipboardEngine.applyPaste(pasteRange, rows);\n      }\n\n      // If a cut is pending, first wipe the source cells so cut+paste == move,\n      // and fold both halves into a single undoable history op.\n      const cutSource = this.state.cutSource();\n      const clearChanges = cutSource ? this.clipboardEngine.clearRange(cutSource) : [];\n      const allChanges = [...clearChanges, ...pasteChanges];\n      if (allChanges.length > 0) {\n        this.historyEngine.record(cutSource ? 'cut' : 'paste', allChanges);\n      }\n      this.clipboardEngine.clearCut();\n      this.bulkPaste.emit({\n        range: pasteRange,\n        data: rows,\n        rowIds: this.getRangeRowIds(pasteRange),\n        fields: this.getRangeFields(pasteRange),\n        changes: this.toBulkCellChanges(allChanges),\n      });\n    } catch {\n      // Clipboard access denied\n    }\n  }\n\n  onBulkExport(): void {\n    if (this.state.activeSelectionMode() === 'rows') {\n      const event = this.rowSelectionEngine.getSelectionEvent();\n      this.exportEngine.exportCsv(event.selectedRows as T[], {\n        filename: 'selection-export',\n      });\n      return;\n    }\n    // Cell range selection: export the data rows covered by the range\n    const range = this.cellSelectionEngine.getNormalizedRange();\n    if (!range) return;\n    const data = this.state.sourceData();\n    const cols = this.state.visibleColumns();\n    const rangeFields = cols.slice(range.start.col, range.end.col + 1).map((c) => c.field);\n    const rangeRows: T[] = [];\n    for (let r = range.start.row; r <= range.end.row; r++) {\n      if (data[r]) rangeRows.push(data[r]);\n    }\n    this.exportEngine.exportCsv(rangeRows, {\n      filename: 'selection-export',\n      columns: rangeFields,\n    });\n  }\n\n  onBulkDelete(): void {\n    if (this.state.activeSelectionMode() === 'rows') {\n      const event = this.rowSelectionEngine.getSelectionEvent();\n      const changes = this.deleteSelectedRows(event.selectedRows as T[]);\n      if (changes.length > 0) {\n        this.historyEngine.record('delete', changes);\n      }\n      // Intentionally keep the selection active so users can chain actions\n      // (undo, then paste, etc.) — the overlay only closes via the ✕ button.\n      this.bulkDelete.emit({\n        range: null,\n        cellCount: event.count,\n        rowIds: this.getRowSelectionIds(event),\n        fields: this.getAllVisibleFields(),\n        changes: this.toBulkCellChanges(changes),\n        selectionMode: 'rows',\n        rowSelection: event,\n      });\n      return;\n    }\n    const range = this.cellSelectionEngine.getNormalizedRange();\n    if (!range) return;\n\n    // Guard: ensure the range belongs to the current page\n    const pageStart = this.state.pageIndex() * this.state.pageSize();\n    const pageEnd = pageStart + this.gridEngine.paginatedData().length - 1;\n    if (range.start.row < pageStart || range.end.row > pageEnd) return;\n\n    const rows = range.end.row - range.start.row + 1;\n    const colCount = range.end.col - range.start.col + 1;\n\n    const changes = this.clipboardEngine.clearRange(range);\n    if (changes.length > 0) {\n      this.historyEngine.record('delete', changes);\n    }\n    this.clipboardEngine.clearCut();\n\n    this.bulkDelete.emit({\n      range,\n      cellCount: rows * colCount,\n      rowIds: this.getRangeRowIds(range),\n      fields: this.getRangeFields(range),\n      changes: this.toBulkCellChanges(changes),\n    });\n  }\n\n  private extractRangeData(): {\n    range: ReturnType<CellSelectionEngine<T>['getNormalizedRange']> & object;\n    values: string[][];\n  } | null {\n    const range = this.cellSelectionEngine.getNormalizedRange();\n    if (!range) return null;\n    const cols = this.state.visibleColumns();\n    const data = this.state.sourceData();\n    const defMap = this.state.columnDefMap();\n    const values: string[][] = [];\n\n    for (let r = range.start.row; r <= range.end.row; r++) {\n      const row = data[r];\n      if (!row) continue;\n      const rowValues: string[] = [];\n      for (let c = range.start.col; c <= range.end.col; c++) {\n        const field = cols[c]?.field;\n        if (!field) {\n          rowValues.push('');\n          continue;\n        }\n        const def = defMap.get(field);\n        const val = def?.valueGetter\n          ? def.valueGetter(row)\n          : (row as Record<string, unknown>)[field];\n        rowValues.push(val != null ? String(val) : '');\n      }\n      values.push(rowValues);\n    }\n    return { range, values };\n  }\n\n  private extractRowSelectionData(selectedRows: T[]): string[][] {\n    const cols = this.state.visibleColumns();\n    const defMap = this.state.columnDefMap();\n    return selectedRows.map((row) => {\n      return cols.map((col) => {\n        const def = defMap.get(col.field);\n        const val = def?.valueGetter\n          ? def.valueGetter(row)\n          : (row as Record<string, unknown>)[col.field];\n        return val != null ? String(val) : '';\n      });\n    });\n  }\n\n  private applyPasteToSelectedRows(selectedRows: T[], pasteRows: string[][]): HistoryCellChange[] {\n    const cols = this.state.visibleColumns();\n    const idField = this.state.rowIdField?.() ?? 'id';\n    const changes: HistoryCellChange[] = [];\n\n    this.state.sourceData.update((data) => {\n      const updated = [...data];\n      for (let ri = 0; ri < Math.min(selectedRows.length, pasteRows.length); ri++) {\n        const selectedRow = selectedRows[ri];\n        const selectedId = (selectedRow as Record<string, unknown>)[idField];\n        const dataIndex = updated.findIndex(\n          (r) => (r as Record<string, unknown>)[idField] === selectedId\n        );\n        if (dataIndex < 0) continue;\n\n        const rowCopy = { ...updated[dataIndex] } as Record<string, unknown>;\n        let changed = false;\n        for (let ci = 0; ci < Math.min(pasteRows[ri].length, cols.length); ci++) {\n          const field = cols[ci]?.field;\n          if (!field) continue;\n          const coerced = this.coerceAndValidate(field, pasteRows[ri][ci], updated[dataIndex]);\n          if (coerced === PASTE_SKIP) continue;\n          const before = (updated[dataIndex] as Record<string, unknown>)[field];\n          if (before === coerced) continue;\n          rowCopy[field] = coerced;\n          changes.push({ rowIndex: dataIndex, field, before, after: coerced });\n          changed = true;\n        }\n        if (changed) {\n          updated[dataIndex] = rowCopy as T;\n        }\n      }\n      return updated;\n    });\n\n    return changes;\n  }\n\n  private deleteSelectedRows(selectedRows: T[]): HistoryCellChange[] {\n    const cols = this.state.visibleColumns();\n    const idField = this.state.rowIdField?.() ?? 'id';\n    const changes: HistoryCellChange[] = [];\n\n    this.state.sourceData.update((data) => {\n      const updated = [...data];\n      for (const selectedRow of selectedRows) {\n        const selectedId = (selectedRow as Record<string, unknown>)[idField];\n        const dataIndex = updated.findIndex(\n          (r) => (r as Record<string, unknown>)[idField] === selectedId\n        );\n        if (dataIndex < 0) continue;\n\n        const rowCopy = { ...updated[dataIndex] } as Record<string, unknown>;\n        let changed = false;\n        for (const col of cols) {\n          const coerced = this.coerceAndValidate(col.field, null, updated[dataIndex]);\n          if (coerced === PASTE_SKIP) continue;\n          const before = (updated[dataIndex] as Record<string, unknown>)[col.field];\n          if (before === coerced) continue;\n          rowCopy[col.field] = coerced;\n          changes.push({ rowIndex: dataIndex, field: col.field, before, after: coerced });\n          changed = true;\n        }\n        if (changed) {\n          updated[dataIndex] = rowCopy as T;\n        }\n      }\n      return updated;\n    });\n\n    return changes;\n  }\n\n  private coerceAndValidate(field: string, rawValue: unknown, row: T): unknown {\n    const def = this.state.columnDefMap().get(field);\n    if (!def?.editable) return PASTE_SKIP;\n\n    const editorType = def.cellEditor;\n\n    // Handle delete (null) — return appropriate empty value per type\n    if (rawValue === null) {\n      let clearValue: unknown;\n      switch (editorType) {\n        case 'number':\n          clearValue = null;\n          break;\n        case 'checkbox':\n          clearValue = false;\n          break;\n        default:\n          clearValue = '';\n          break;\n      }\n      if (def.cellEditorValidator) {\n        const result = def.cellEditorValidator(clearValue, row);\n        if (result === false || typeof result === 'string') return PASTE_SKIP;\n      }\n      return clearValue;\n    }\n\n    let value: unknown = rawValue;\n\n    if (editorType === 'number') {\n      const num = Number(rawValue);\n      if (isNaN(num)) return PASTE_SKIP;\n      value = num;\n    } else if (editorType === 'checkbox') {\n      if (rawValue === 'true' || rawValue === true) {\n        value = true;\n      } else if (rawValue === 'false' || rawValue === false) {\n        value = false;\n      } else {\n        return PASTE_SKIP;\n      }\n    } else if (editorType === 'select' && def.cellEditorOptions?.length) {\n      const allowed = def.cellEditorOptions.map((o) => String(o.value));\n      if (!allowed.includes(String(rawValue))) return PASTE_SKIP;\n      value = rawValue;\n    }\n\n    if (def.cellEditorValidator) {\n      const result = def.cellEditorValidator(value, row);\n      if (result === false || typeof result === 'string') return PASTE_SKIP;\n    }\n\n    return value;\n  }\n}\n\n/**\n * Coerce a raw formula-bar draft (always a string) back to the column's\n * natural type. Empty → `''`, numeric literal → `number` (when the old\n * cell was numeric), booleans → boolean, otherwise the string is kept\n * verbatim. Matches the inline editor's commit-time coercion closely\n * enough that downstream consumers see a consistent type.\n */\nfunction coerceDraftValue(raw: string, previous: unknown): unknown {\n  if (raw === '') return '';\n  if (typeof previous === 'number' || (previous === undefined && /^-?\\d+(?:\\.\\d+)?$/.test(raw))) {\n    const n = Number(raw);\n    if (!Number.isNaN(n)) return n;\n  }\n  if (typeof previous === 'boolean') {\n    if (raw === 'true' || raw === 'TRUE') return true;\n    if (raw === 'false' || raw === 'FALSE') return false;\n  }\n  return raw;\n}\n","export interface GridOptions<T = unknown> {\n  /** Data mode */\n  mode: 'client' | 'server';\n\n  /** Pagination */\n  pagination: boolean;\n  pageSize: number;\n  pageSizeOptions: number[];\n\n  /** Row height for virtual scroll (px) */\n  rowHeight: number;\n\n  /** Enable row checkbox selection */\n  rowSelection: boolean;\n\n  /** Selection mode */\n  selectionMode: 'single' | 'multiple';\n\n  /** Enable column grouping */\n  grouping: boolean;\n\n  /** Enable fullscreen toggle */\n  fullscreen: boolean;\n\n  /** Enable expandable rows */\n  expandableRows: boolean;\n\n  /** Enable column resize */\n  columnResize: boolean;\n\n  /** Enable column reorder */\n  columnReorder: boolean;\n\n  /** Show or hide the toolbar. Defaults to true. */\n  showToolbar?: boolean;\n\n  /** Enable multi-cell selection (click / drag range / keyboard navigation). Defaults to true. */\n  multiCellSelection?: boolean;\n\n  /** Track by function for virtual scroll */\n  trackBy: (index: number, item: T) => unknown;\n}\n\nexport const DEFAULT_GRID_OPTIONS: GridOptions = {\n  mode: 'client',\n  pagination: true,\n  pageSize: 20,\n  pageSizeOptions: [10, 20, 50, 100],\n  rowHeight: 48,\n  rowSelection: false,\n  selectionMode: 'multiple',\n  grouping: false,\n  fullscreen: false,\n  expandableRows: false,\n  columnResize: true,\n  columnReorder: false,\n  showToolbar: true,\n  multiCellSelection: true,\n  trackBy: (index: number) => index,\n};\n","import { ChangeDetectionStrategy, Component, computed, inject, output } from '@angular/core';\nimport { GridStateManager } from '../../state/grid-state';\n\n@Component({\n  selector: 'moz-grid-column-visibility-panel',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './grid-column-visibility-panel.html',\n  styleUrls: ['./grid-column-visibility-panel.scss'],\n})\nexport class MozGridColumnVisibilityPanelComponent {\n  private readonly state = inject(GridStateManager);\n\n  readonly restoreColumn = output<string>();\n  readonly restoreAll = output<void>();\n\n  readonly hiddenColumns = computed(() => {\n    const allStates = this.state.columnStates();\n    const defMap = this.state.columnDefMap();\n    return allStates\n      .filter((col) => !col.visible)\n      .map((col) => ({\n        field: col.field,\n        label: defMap.get(col.field)?.headerName ?? col.field,\n      }));\n  });\n\n  onRestore(field: string): void {\n    this.restoreColumn.emit(field);\n  }\n\n  onRestoreAll(): void {\n    this.restoreAll.emit();\n  }\n}\n","<div class=\"column-visibility-panel\">\n  <span class=\"column-visibility-panel__label\">Hidden columns:</span>\n  @for (col of hiddenColumns(); track col.field) {\n  <button\n    type=\"button\"\n    class=\"column-visibility-panel__chip\"\n    (click)=\"onRestore(col.field)\"\n    [attr.aria-label]=\"'Restore column ' + col.label\"\n  >\n    {{ col.label }}\n    <span class=\"column-visibility-panel__chip-icon\" aria-hidden=\"true\">+</span>\n  </button>\n  } @if (hiddenColumns().length > 1) {\n  <button type=\"button\" class=\"column-visibility-panel__restore-all\" (click)=\"onRestoreAll()\">\n    Restore all\n  </button>\n  }\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  inject,\n  input,\n  output,\n} from '@angular/core';\nimport { MozActionListboxComponent } from '../../../action-listbox/action-listbox';\nimport { MozActionListItem } from '../../../action-listbox/model/action-listbox.model';\nimport { GridStateManager } from '../../state/grid-state';\nimport { HeaderMenuActionId } from '../../models/column.model';\nimport {\n  ChevronDown20,\n  ChevronUp20,\n} from '@mozaic-ds/icons-angular';\n\n@Component({\n  selector: 'moz-grid-header-menu',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [MozActionListboxComponent],\n  templateUrl: './grid-header-menu.html',\n  styleUrls: ['./grid-header-menu.scss'],\n})\nexport class MozGridHeaderMenuComponent {\n  private readonly state = inject(GridStateManager);\n\n  readonly field = input.required<string>();\n  readonly isOpen = input<boolean>(false);\n\n  readonly actionClick = output<{ field: string; actionId: HeaderMenuActionId }>();\n  readonly close = output<void>();\n\n  readonly menuItems = computed<MozActionListItem[]>(() => {\n    const field = this.field();\n    const defMap = this.state.columnDefMap();\n    const def = defMap.get(field);\n    const colState = this.state.columnStates().find((c) => c.field === field);\n    if (!def || !colState) return [];\n\n    const colIndex = this.state.visibleColumns().findIndex((c) => c.field === field);\n    const items: MozActionListItem[] = [];\n\n    // Group 1: Sort\n    if (def.sortable !== false) {\n      items.push(\n        { id: 'sort-asc', icon: ChevronUp20, label: 'Sort A → Z' },\n        { id: 'sort-desc', icon: ChevronDown20, label: 'Sort Z → A' },\n      );\n    }\n\n    // Group 2: Filter & Group\n    if (def.filterable) {\n      items.push({\n        id: 'filter-column',\n        label: 'Filter in this column',\n        divider: items.length > 0,\n      });\n    }\n    if (def.groupable) {\n      items.push({\n        id: 'group-column',\n        label: 'Group by this column',\n        divider: !def.filterable && items.length > 0,\n      });\n    }\n\n    // Group 3: Freeze\n    if (def.freezable !== false) {\n      if (colState.pinned) {\n        items.push({\n          id: 'unfreeze-column',\n          label: 'Unfreeze column',\n          divider: items.length > 0,\n        });\n      } else {\n        items.push({\n          id: 'freeze-column-left',\n          label: `Freeze left until column ${colIndex + 1}`,\n          divider: items.length > 0,\n        });\n        items.push({\n          id: 'freeze-column-right',\n          label: `Freeze right from column ${colIndex + 1}`,\n        });\n      }\n    }\n\n    // Group 4: Hide & Search\n    if (def.hideable !== false) {\n      items.push({\n        id: 'hide-column',\n        label: 'Hide column',\n        divider: items.length > 0,\n      });\n    }\n    items.push({\n      id: 'toggle-column-search',\n      label: colState.searchVisible ? 'Hide search by column' : 'Show search by column',\n      divider: def.hideable === false && items.length > 0,\n    });\n\n    return items;\n  });\n\n  onItemClick(item: MozActionListItem): void {\n    this.actionClick.emit({\n      field: this.field(),\n      actionId: item.id as HeaderMenuActionId,\n    });\n    this.close.emit();\n  }\n}\n","@if (isOpen()) {\n  <div class=\"grid-header-menu\" (click)=\"$event.stopPropagation()\">\n    <moz-action-listbox\n      [items]=\"menuItems()\"\n      (itemClick)=\"onItemClick($event)\"\n    />\n  </div>\n}\n","export function generateRandomIntMinMax(min: number, max: number): number {\n  const array = new Uint32Array(1);\n  crypto.getRandomValues(array);\n  const n = (array[0] % (max - min + 1)) + min;\n  return n;\n}\n\nexport function generateRandomInt(numberOfDigits: number): number {\n  const array = new Uint32Array(1);\n  crypto.getRandomValues(array);\n  const n = array[0] % Math.pow(10, numberOfDigits);\n  return n;\n}\n","/**\n * McCombobox — Data models & type guards\n *\n * @packageDocumentation\n */\n\n// ---------------------------------------------------------------------------\n// Option\n// ---------------------------------------------------------------------------\n\nexport interface MozComboboxOption<T = unknown> {\n  /** Unique value used for selection comparison */\n  value: T;\n  /** Display label */\n  label: string;\n  /** Optional secondary text rendered below the label */\n  content?: string;\n  /** Whether the option is individually disabled */\n  disabled?: boolean;\n  /** Optional icon identifier (rendered in the prepend slot) */\n  icon?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Section (group header + children)\n// ---------------------------------------------------------------------------\n\nexport interface MozComboboxSection<T = unknown> {\n  /** Section heading text */\n  title: string;\n  /** Options belonging to this section */\n  options: MozComboboxOption<T>[];\n  /** When `true` in `multiple` mode, clicking the header toggles all children */\n  checkable?: boolean;\n  /**\n   * When `true`, the section header's \"toggle all\" action is disabled, but\n   * children remain individually interactable. The header checkbox still\n   * reflects the selection state (checked / indeterminate) of its children.\n   */\n  disabled?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Union & helpers\n// ---------------------------------------------------------------------------\n\nexport type MozComboboxItem<T = unknown> = MozComboboxOption<T> | MozComboboxSection<T>;\n\nexport type MozComboboxSize = 's' | 'm';\n\n/** Type-guard: returns `true` when the item is a section header */\nexport function isSection<T>(item: MozComboboxItem<T>): item is MozComboboxSection<T> {\n  return 'options' in item;\n}\n\n// ---------------------------------------------------------------------------\n// Internal flat representation (used for rendering)\n// ---------------------------------------------------------------------------\n\nexport interface FlatOption<T = unknown> {\n  type: 'option';\n  value: T;\n  label: string;\n  content?: string;\n  disabled?: boolean;\n  icon?: string;\n  /** Parent section title (if any) */\n  sectionTitle?: string;\n}\n\nexport interface FlatSection {\n  type: 'section';\n  title: string;\n  checkable?: boolean;\n  disabled?: boolean;\n}\n\nexport type FlatItem<T = unknown> = FlatOption<T> | FlatSection;\n\nexport function isFlatSection<T>(item: FlatItem<T>): item is FlatSection {\n  return item.type === 'section';\n}\n\nexport function isFlatOption<T>(item: FlatItem<T>): item is FlatOption<T> {\n  return item.type === 'option';\n}\n","import { CdkConnectedOverlay, CdkOverlayOrigin, ConnectedPosition } from '@angular/cdk/overlay';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { DOCUMENT } from '@angular/common';\nimport {\n  afterNextRender,\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  effect,\n  ElementRef,\n  forwardRef,\n  inject,\n  input,\n  model,\n  output,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n  CheckCircle24,\n  ChevronDown24,\n  CrossCircleFilled24,\n  Search24,\n} from '@mozaic-ds/icons-angular';\nimport { MozButtonComponent } from '../button';\nimport { MozCheckboxComponent } from '../checkbox/checkbox';\nimport { MozLoaderComponent } from '../loader/loader';\nimport { MozTextInput } from '../text-input/text-input.directive';\nimport { generateRandomInt } from '../utils/generate-random-int';\nimport {\n  FlatItem,\n  FlatOption,\n  FlatSection,\n  isFlatOption,\n  isFlatSection,\n  isSection,\n  MozComboboxItem,\n  MozComboboxOption,\n  MozComboboxSize,\n} from './combobox.model';\n\n/** Height of a single option row in px (matches design system 3rem @ 16px base) */\nexport const ITEM_SIZE_PX = 48;\n\n/** Visible viewport height in px (matches design system max-height of 18.75rem) */\nconst VIEWPORT_HEIGHT_PX = 300;\n\n@Component({\n  selector: 'moz-combobox',\n  imports: [\n    CdkConnectedOverlay,\n    CdkOverlayOrigin,\n    ScrollingModule,\n    MozLoaderComponent,\n    MozButtonComponent,\n    CrossCircleFilled24,\n    ChevronDown24,\n    Search24,\n    MozTextInput,\n    MozCheckboxComponent,\n    FormsModule,\n    CheckCircle24,\n  ],\n  templateUrl: './combobox.component.html',\n  styleUrl: './combobox.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MozComboboxComponent),\n      multi: true,\n    },\n  ],\n})\nexport class MozComboboxComponent<T = string> implements ControlValueAccessor {\n  private readonly _doc = inject(DOCUMENT);\n\n  // -----------------------------------------------------------------------\n  // Public inputs\n  // -----------------------------------------------------------------------\n\n  /** Items to display (flat options or sections) */\n  readonly items = input<MozComboboxItem<T>[]>([]);\n\n  /** Currently selected value(s) — two-way binding with model() */\n  readonly value = model<T | T[] | null>(null);\n\n  /** Placeholder text shown when nothing is selected */\n  readonly placeholder = input<string>('Select an option');\n\n  /** Enable multi-selection */\n  readonly multiple = input<boolean>(false);\n\n  /** Show counter instead of tags in multi mode */\n  readonly compact = input<boolean>(false);\n\n  /** Component size variant */\n  readonly size = input<MozComboboxSize>('m');\n\n  /** Disable the entire component */\n  readonly disabled = input<boolean>(false);\n\n  /** Readonly mode — no interaction allowed */\n  readonly readonly = input<boolean>(false);\n\n  /** Show invalid/error styling */\n  readonly invalid = input<boolean>(false);\n\n  /** Show a clear button when a value is selected */\n  readonly clearable = input<boolean>(false);\n\n  /** Show a search/filter input inside the dropdown */\n  readonly searchable = input<boolean>(false);\n\n  /**\n   * When true, the search query is split on spaces/commas and each term is\n   * matched independently (e.g. \"red shoe\" matches labels containing either\n   * \"red\" or \"shoe\"). When false, the query is matched as a single substring\n   * so users can search for multi-word labels like \"Item 1\".\n   */\n  readonly multiSearch = input<boolean>(false);\n\n  /** Show \"Select all / Clear\" action buttons (multiple only) */\n  readonly showActions = input<boolean>(false);\n\n  /** Whether the component is in a loading state (e.g. async data) */\n  readonly loading = input<boolean>(false);\n\n  /** Custom comparator for option values */\n  readonly compareWith = input<(a: T, b: T) => boolean>((a, b) => a === b);\n\n  /**\n   * Predicate used by `selectAll()` to decide whether a non-disabled option\n   * should be included. Receives each candidate option and must return `true`\n   * to keep it. Defaults to including every selectable option. Use this to\n   * apply custom business rules (quotas, role-based filtering, etc.) when the\n   * user triggers the \"Select all\" action.\n   */\n  readonly canSelectAll = input<(option: MozComboboxOption<T>) => boolean>(() => true);\n\n  /** Accessible label */\n  readonly ariaLabel = input<string | undefined>(undefined);\n\n  /** Reference to an external label element */\n  readonly ariaLabelledBy = input<string | undefined>(undefined);\n\n  // -----------------------------------------------------------------------\n  // Customizable text labels (i18n)\n  // -----------------------------------------------------------------------\n\n  /** Placeholder shown inside the search input */\n  readonly searchPlaceholder = input<string>('Find an option...');\n\n  /** Text shown when no items match the search query */\n  readonly noResultsText = input<string>('No results found');\n\n  /** Label for the \"Select all\" action button */\n  readonly selectAllText = input<string>('Select all');\n\n  /** Label for the \"Clear\" action button */\n  readonly clearText = input<string>('Clear');\n\n  /** Suffix for the compact counter (e.g. \"3 selected\") */\n  readonly selectedSuffix = input<string>('selected');\n\n  /** Accessible label for the clear button */\n  readonly clearAriaLabel = input<string>('Clear selection');\n\n  /** Text shown inside the dropdown while loading */\n  readonly loadingText = input<string>('Loading...');\n\n  /** Whether to show the \"No results found\" message when no items match */\n  readonly showNoResultText = input<boolean>(true);\n\n  // -----------------------------------------------------------------------\n  // Outputs\n  // -----------------------------------------------------------------------\n\n  readonly opened = output<void>();\n  readonly closed = output<void>();\n  readonly searched = output<string>();\n\n  // -----------------------------------------------------------------------\n  // View queries\n  // -----------------------------------------------------------------------\n\n  private readonly triggerEl = viewChild<ElementRef<HTMLButtonElement>>('triggerBtn');\n  private readonly viewportEl = viewChild<CdkVirtualScrollViewport>('viewport');\n\n  // -----------------------------------------------------------------------\n  // Internal state\n  // -----------------------------------------------------------------------\n\n  /** Unique instance id */\n  readonly uniqId = generateRandomInt(5); // random 5 digits number to avoid ID collisions when multiple comboboxes are present\n  readonly comboboxId = `mc-combobox-${this.uniqId}`;\n  readonly listboxId = `${this.comboboxId}-listbox`;\n\n  /** Whether the dropdown panel is open */\n  readonly isOpen = signal(false);\n\n  /** Keyboard-focused item index within filteredItems() */\n  readonly focusedIndex = signal(-1);\n\n  /** Current search/filter query */\n  readonly searchQuery = signal('');\n\n  /** Disabled state from ControlValueAccessor */\n  private readonly _disabledFromForm = signal(false);\n\n  /** Cache of value → label for all options ever seen (survives items changes) */\n  private readonly _labelCache = new Map<T, string>();\n\n  /** CVA callbacks */\n  private _onChange: (val: T | T[] | null) => void = () => {};\n  private _onTouched: () => void = () => {};\n\n  // -----------------------------------------------------------------------\n  // Computed signals\n  // -----------------------------------------------------------------------\n\n  /** Effective disabled state (input OR form-driven) */\n  readonly isEffectivelyDisabled = computed(() => this.disabled() || this._disabledFromForm());\n\n  /** CSS classes for the wrapper element */\n  readonly wrapperClasses = computed(() => {\n    const classes = ['mc-combobox'];\n    if (this.isOpen()) classes.push('mc-combobox--open');\n    if (this.multiple()) classes.push('mc-combobox--multiple');\n    if (this.invalid()) classes.push('mc-combobox--invalid');\n    if (this.isEffectivelyDisabled()) classes.push('mc-combobox--disabled');\n    if (this.readonly()) classes.push('mc-combobox--readonly');\n    if (this.size() === 's') classes.push('mc-combobox--s');\n    return classes.join(' ');\n  });\n\n  /** Flatten items into a renderable list */\n  readonly flatItems = computed<FlatItem<T>[]>(() => {\n    const result: FlatItem<T>[] = [];\n    for (const item of this.items()) {\n      if (isSection(item)) {\n        result.push({\n          type: 'section',\n          title: item.title,\n          checkable: item.checkable,\n          disabled: item.disabled,\n        });\n        for (const opt of item.options) {\n          result.push({ type: 'option', ...opt, sectionTitle: item.title });\n        }\n      } else {\n        result.push({ type: 'option', ...item });\n      }\n    }\n    return result;\n  });\n\n  /** Filtered items based on search query */\n  readonly filteredItems = computed<FlatItem<T>[]>(() => {\n    const query = this.searchQuery().trim();\n    if (!query) return this.flatItems();\n\n    const flat = this.flatItems();\n    const parts = this.multiSearch()\n      ? query\n          .split(/[,\\s]+/)\n          .map((s) => s.toLowerCase().trim())\n          .filter(Boolean)\n      : [query.toLowerCase()];\n\n    // Find which section titles have matching children\n    const matchingSections = new Set<string>();\n    for (const item of flat) {\n      if (isFlatOption(item)) {\n        const label = item.label.toLowerCase();\n        const match = parts.some((p) => label.includes(p));\n        if (match && item.sectionTitle) matchingSections.add(item.sectionTitle);\n      }\n    }\n\n    return flat.filter((item) => {\n      if (isFlatSection(item)) {\n        return matchingSections.has(item.title);\n      }\n      const label = item.label.toLowerCase();\n      return parts.some((p) => label.includes(p));\n    });\n  });\n\n  /** All selectable (non-disabled) option values */\n  readonly allSelectableValues = computed<T[]>(() =>\n    this.filteredItems()\n      .filter((i): i is FlatOption<T> => isFlatOption(i) && !i.disabled)\n      .map((i) => i.value)\n  );\n\n  /** The display string shown on the trigger button */\n  readonly displayValue = computed<string>(() => {\n    const val = this.value();\n    if (val == null) return '';\n    const flat = this.flatItems();\n    const options = flat.filter(isFlatOption) as FlatOption<T>[];\n    const cmp = this.compareWith();\n    const cache = this._labelCache;\n\n    const findLabel = (v: T): string =>\n      options.find((o) => cmp(o.value, v))?.label ?? cache.get(v) ?? '';\n\n    if (Array.isArray(val)) {\n      return val.map(findLabel).filter(Boolean).join(', ');\n    }\n    return findLabel(val);\n  });\n\n  /** Number of selected items (for compact counter) */\n  readonly selectedCount = computed<number>(() => {\n    const val = this.value();\n    if (val == null) return 0;\n    if (Array.isArray(val)) return val.length;\n    if (this.multiple()) return 0;\n    return 1;\n  });\n\n  /** Whether the clear button should be visible */\n  readonly showClear = computed(\n    () =>\n      this.clearable() &&\n      this.selectedCount() > 0 &&\n      !this.isEffectivelyDisabled() &&\n      !this.readonly()\n  );\n\n  /** Viewport height: capped to VIEWPORT_HEIGHT_PX, shrinks for small lists */\n  readonly viewportHeight = computed(() => {\n    const count = this.filteredItems().length;\n    return Math.min(count * ITEM_SIZE_PX, VIEWPORT_HEIGHT_PX);\n  });\n\n  /**\n   * Whether all non-disabled children of a section are selected. Disabled\n   * children are ignored so the header state stays aligned with what a click\n   * on the section checkbox will actually toggle.\n   */\n  readonly isSectionFullySelected = (sectionTitle: string): boolean => {\n    const val = this._currentValueAsArray();\n    if (val.length === 0) return false;\n    const cmp = this.compareWith();\n    const children = this.flatItems()\n      .filter(\n        (i): i is FlatOption<T> => isFlatOption(i) && i.sectionTitle === sectionTitle && !i.disabled\n      )\n      .map((i) => i.value);\n    return children.length > 0 && children.every((cv) => val.some((sv) => cmp(sv, cv)));\n  };\n\n  /** Whether a section's non-disabled children are partially selected. */\n  readonly isSectionPartiallySelected = (sectionTitle: string): boolean => {\n    const val = this._currentValueAsArray();\n    if (val.length === 0) return false;\n    const cmp = this.compareWith();\n    const children = this.flatItems()\n      .filter(\n        (i): i is FlatOption<T> => isFlatOption(i) && i.sectionTitle === sectionTitle && !i.disabled\n      )\n      .map((i) => i.value);\n    const selectedCount = children.filter((cv) => val.some((sv) => cmp(sv, cv))).length;\n    return selectedCount > 0 && selectedCount < children.length;\n  };\n\n  // -----------------------------------------------------------------------\n  // Overlay positions\n  // -----------------------------------------------------------------------\n\n  readonly overlayPositions: ConnectedPosition[] = [\n    {\n      originX: 'start',\n      originY: 'bottom',\n      overlayX: 'start',\n      overlayY: 'top',\n      offsetY: 4,\n    },\n    {\n      originX: 'start',\n      originY: 'top',\n      overlayX: 'start',\n      overlayY: 'bottom',\n      offsetY: -4,\n    },\n  ];\n\n  /** Width of the trigger (to match overlay width) */\n  readonly triggerWidth = signal<number>(0);\n\n  // -----------------------------------------------------------------------\n  // Constructor effects\n  // -----------------------------------------------------------------------\n\n  constructor() {\n    // Propagate value changes to CVA\n    effect(() => {\n      const val = this.value();\n      this._onChange(val);\n    });\n\n    // Keep the label cache up to date whenever items change\n    effect(() => {\n      const flat = this.flatItems();\n      for (const item of flat) {\n        if (isFlatOption(item)) {\n          this._labelCache.set(item.value, item.label);\n        }\n      }\n    });\n\n    // Inject global overlay styles — CDK teleports content outside the\n    // component host so scoped CSS never reaches .cdk-overlay-pane.\n    // Check DOM each render — Storybook may remove the tag on navigation.\n    afterNextRender(() => {\n      if (!this._doc.head.querySelector('style[data-moz-combobox-overlay]')) {\n        const style = this._doc.createElement('style');\n        style.setAttribute('data-moz-combobox-overlay', '');\n        style.textContent = `\n          .cdk-overlay-pane .mc-combobox__listbox.mc-combobox__listbox {\n            position: static;\n            visibility: visible;\n            opacity: 1;\n            width: 100%;\n          }\n          /* A bare <input> keeps an intrinsic, size-attribute-based\n             min-width, so on a narrow panel the search field refuses to\n             shrink and its placeholder overflows the dropdown. Allow it\n             to shrink to the available width. */\n          .cdk-overlay-pane .mc-combobox__listbox .mc-option-listbox__search .text-input__control {\n            min-width: 0;\n          }\n          .mc-combobox-backdrop {\n            background: transparent;\n          }\n        `;\n        this._doc.head.appendChild(style);\n      }\n    });\n  }\n\n  // -----------------------------------------------------------------------\n  // Open / Close\n  // -----------------------------------------------------------------------\n\n  open(): void {\n    if (this.isOpen() || this.isEffectivelyDisabled() || this.readonly()) {\n      return;\n    }\n    this._updateTriggerWidth();\n    this.isOpen.set(true);\n    this.opened.emit();\n  }\n\n  close(): void {\n    if (!this.isOpen()) return;\n    this.isOpen.set(false);\n    this.focusedIndex.set(-1);\n    this.closed.emit();\n    this._onTouched();\n  }\n\n  /** Fully reset the combobox: clear value, search query, and close the panel. */\n  reset(): void {\n    this.value.set(null);\n    this.searchQuery.set('');\n    this.searched.emit('');\n    this.close();\n  }\n\n  toggle(): void {\n    if (this.isOpen()) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n\n  // -----------------------------------------------------------------------\n  // Trigger keyboard handler (manual ARIA combobox)\n  // -----------------------------------------------------------------------\n\n  onTriggerKeydown(event: KeyboardEvent): void {\n    if (this.isEffectivelyDisabled() || this.readonly()) return;\n\n    // When the panel is already open, delegate navigation keys to the panel handler\n    if (this.isOpen()) {\n      switch (event.key) {\n        case 'ArrowDown':\n        case 'ArrowUp':\n        case 'Home':\n        case 'End':\n        case 'Enter':\n          this.onPanelKeydown(event);\n          return;\n        case ' ':\n          this.onPanelKeydown(event);\n          return;\n        case 'Escape':\n          event.preventDefault();\n          this.close();\n          return;\n        case 'Tab':\n          this.close();\n          return;\n      }\n    }\n\n    switch (event.key) {\n      case 'Enter':\n      case ' ':\n        event.preventDefault();\n        this.open();\n        break;\n      case 'ArrowDown':\n      case 'ArrowUp':\n        event.preventDefault();\n        this.open();\n        break;\n      case 'Escape':\n        break;\n      case 'Tab':\n        break;\n      case 'Home':\n      case 'End':\n        event.preventDefault();\n        this.open();\n        break;\n    }\n  }\n\n  // -----------------------------------------------------------------------\n  // Panel keyboard handler\n  // -----------------------------------------------------------------------\n\n  onPanelKeydown(event: KeyboardEvent): void {\n    const items = this.filteredItems();\n    const navigableIndices = items\n      .map((item, i) => ({ item, i }))\n      .filter(({ item }) => isFlatOption(item) && !(item as FlatOption<T>).disabled)\n      .map(({ i }) => i);\n\n    switch (event.key) {\n      case 'ArrowDown': {\n        event.preventDefault();\n        const cur = this.focusedIndex();\n        const next = navigableIndices.find((i) => i > cur) ?? navigableIndices[0];\n        if (next !== undefined) {\n          this.focusedIndex.set(next);\n          this.viewportEl()?.scrollToIndex(next);\n        }\n        break;\n      }\n      case 'ArrowUp': {\n        event.preventDefault();\n        const cur = this.focusedIndex();\n        const prev =\n          [...navigableIndices].reverse().find((i) => i < cur) ??\n          navigableIndices[navigableIndices.length - 1];\n        if (prev !== undefined) {\n          this.focusedIndex.set(prev);\n          this.viewportEl()?.scrollToIndex(prev);\n        }\n        break;\n      }\n      case 'Enter':\n      case ' ': {\n        // Allow space to type in the search input\n        if (event.key === ' ' && (event.target as HTMLElement).tagName === 'INPUT') {\n          break;\n        }\n        const fi = this.focusedIndex();\n        if (fi >= 0) {\n          const item = items[fi];\n          if (isFlatOption(item) && !item.disabled) {\n            event.preventDefault();\n            this.selectOption(item.value as T);\n          }\n        }\n        break;\n      }\n      case 'Home': {\n        event.preventDefault();\n        if (navigableIndices.length) {\n          this.focusedIndex.set(navigableIndices[0]);\n          this.viewportEl()?.scrollToIndex(navigableIndices[0]);\n        }\n        break;\n      }\n      case 'End': {\n        event.preventDefault();\n        if (navigableIndices.length) {\n          const last = navigableIndices[navigableIndices.length - 1];\n          this.focusedIndex.set(last);\n          this.viewportEl()?.scrollToIndex(last);\n        }\n        break;\n      }\n      case 'Escape':\n        event.preventDefault();\n        this.close();\n        this.triggerEl()?.nativeElement.focus();\n        break;\n      case 'Tab':\n        this.close();\n        break;\n    }\n  }\n\n  // -----------------------------------------------------------------------\n  // Selection handling\n  // -----------------------------------------------------------------------\n\n  selectOption(optionValue: T): void {\n    if (this.multiple()) {\n      const cmp = this.compareWith();\n      const current = this._currentValueAsArray();\n      const idx = current.findIndex((v) => cmp(v, optionValue));\n      const next = idx >= 0 ? current.filter((_, i) => i !== idx) : [...current, optionValue];\n      this.value.set(next as T & T[]);\n    } else {\n      this.value.set(optionValue);\n      this.close();\n      this.triggerEl()?.nativeElement.focus();\n    }\n  }\n\n  // -----------------------------------------------------------------------\n  // Actions\n  // -----------------------------------------------------------------------\n\n  selectAll(): void {\n    if (!this.multiple()) return;\n    const cmp = this.compareWith();\n    const predicate = this.canSelectAll();\n    const disabledValues = this.flatItems()\n      .filter((i): i is FlatOption<T> => isFlatOption(i) && !!i.disabled)\n      .map((i) => i.value);\n    const current = this._currentValueAsArray();\n    const keptDisabled = current.filter((sv) => disabledValues.some((dv) => cmp(sv, dv)));\n    const next = this.filteredItems()\n      .filter((i): i is FlatOption<T> => isFlatOption(i) && !i.disabled && predicate(i))\n      .map((i) => i.value);\n    for (const dv of keptDisabled) {\n      if (!next.some((sv) => cmp(sv, dv))) next.push(dv);\n    }\n    this.value.set(next as T & T[]);\n  }\n\n  clearSelection(): void {\n    const cmp = this.compareWith();\n    const disabledValues = this.flatItems()\n      .filter((i): i is FlatOption<T> => isFlatOption(i) && !!i.disabled)\n      .map((i) => i.value);\n\n    if (this.multiple()) {\n      const current = this._currentValueAsArray();\n      const kept = current.filter((sv) => disabledValues.some((dv) => cmp(sv, dv)));\n      this.value.set(kept as T & T[]);\n    } else {\n      const raw = this.value();\n      if (raw != null && !Array.isArray(raw) && disabledValues.some((dv) => cmp(raw, dv))) {\n        return;\n      }\n      this.value.set(null);\n    }\n  }\n\n  onClear(event: MouseEvent): void {\n    event.stopPropagation();\n    this.clearSelection();\n    this.triggerEl()?.nativeElement.focus();\n  }\n\n  // -----------------------------------------------------------------------\n  // Section toggle\n  // -----------------------------------------------------------------------\n\n  toggleSection(sectionTitle: string): void {\n    if (!this.multiple()) return;\n    const section = this.flatItems().find(\n      (i): i is FlatSection => isFlatSection(i) && i.title === sectionTitle\n    );\n    if (section?.disabled) return;\n    const cmp = this.compareWith();\n    const childValues = this.flatItems()\n      .filter(\n        (i): i is FlatOption<T> => isFlatOption(i) && i.sectionTitle === sectionTitle && !i.disabled\n      )\n      .map((i) => i.value);\n\n    const current = this._currentValueAsArray();\n    let next: T[];\n    if (this.isSectionFullySelected(sectionTitle)) {\n      next = current.filter((sv) => !childValues.some((cv) => cmp(sv, cv)));\n    } else {\n      const toAdd = childValues.filter((cv) => !current.some((sv) => cmp(sv, cv)));\n      next = [...current, ...toAdd];\n    }\n    this.value.set(next as T & T[]);\n  }\n\n  // -----------------------------------------------------------------------\n  // Search\n  // -----------------------------------------------------------------------\n\n  onSearchInput(event: Event): void {\n    const query = (event.target as HTMLInputElement).value;\n    this.searchQuery.set(query);\n    this.searched.emit(query);\n  }\n\n  onSearchKeydown(event: KeyboardEvent): void {\n    if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n      event.stopPropagation();\n      this.onPanelKeydown(event);\n    }\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      this.close();\n      this.triggerEl()?.nativeElement.focus();\n    }\n  }\n\n  // -----------------------------------------------------------------------\n  // Overlay events\n  // -----------------------------------------------------------------------\n\n  onOverlayOutsideClick(): void {\n    this.close();\n  }\n\n  onOverlayAttached(): void {\n    this._updateTriggerWidth();\n    if (this.searchable()) {\n      // viewChild can't resolve elements inside CDK overlay ng-template\n      // (they live in a separate view container). Query the DOM directly.\n      setTimeout(() => {\n        const input = this._doc.querySelector<HTMLInputElement>(\n          '.mc-combobox__listbox .mc-option-listbox__search input'\n        );\n        input?.focus();\n      });\n    }\n  }\n\n  /** Coerce the current value into an array (safe for .some/.filter/.every). */\n  private _currentValueAsArray(): T[] {\n    const raw = this.value();\n    if (Array.isArray(raw)) return raw;\n    if (raw != null && raw !== '') return [raw];\n    return [];\n  }\n\n  // -----------------------------------------------------------------------\n  // ControlValueAccessor\n  // -----------------------------------------------------------------------\n\n  writeValue(val: T | T[] | null): void {\n    this.value.set(val);\n  }\n\n  registerOnChange(fn: (val: T | T[] | null) => 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._disabledFromForm.set(isDisabled);\n  }\n\n  // -----------------------------------------------------------------------\n  // Template helpers\n  // -----------------------------------------------------------------------\n\n  readonly isFlatSection = isFlatSection;\n  readonly isFlatOption = isFlatOption;\n  readonly itemSizePx = ITEM_SIZE_PX;\n\n  trackByFlatItem(_index: number, item: FlatItem<T>): string {\n    if (isFlatSection(item)) return `section-${item.title}`;\n    return `option-${item.label}`;\n  }\n\n  /** Set of currently selected values, recomputed reactively for OnPush */\n  readonly selectedValues = computed<T[]>(() => {\n    const val = this.value();\n    if (val == null) return [];\n    if (Array.isArray(val)) return val;\n    return [val];\n  });\n\n  /** Whether a given option value is currently selected */\n  isOptionSelected(optionValue: T): boolean {\n    const cmp = this.compareWith();\n    return this.selectedValues().some((v) => cmp(v, optionValue));\n  }\n\n  // -----------------------------------------------------------------------\n  // Private helpers\n  // -----------------------------------------------------------------------\n\n  private _updateTriggerWidth(): void {\n    const el = this.triggerEl()?.nativeElement;\n    if (el) {\n      this.triggerWidth.set(el.closest('.mc-combobox__input')?.clientWidth ?? el.clientWidth);\n    }\n  }\n}\n","<!-- ====================================================================== -->\n<!-- TRIGGER                                                                -->\n<!-- ====================================================================== -->\n<div [class]=\"wrapperClasses()\">\n  <div class=\"mc-combobox__input\">\n    <button\n      #triggerBtn\n      [id]=\"comboboxId + '-trigger'\"\n      type=\"button\"\n      class=\"mc-combobox__control\"\n      role=\"combobox\"\n      cdkOverlayOrigin\n      #overlayOrigin=\"cdkOverlayOrigin\"\n      [disabled]=\"isEffectivelyDisabled()\"\n      [attr.aria-expanded]=\"isOpen()\"\n      [attr.aria-haspopup]=\"'listbox'\"\n      [attr.aria-controls]=\"listboxId\"\n      [attr.aria-activedescendant]=\"\n        focusedIndex() >= 0 ? comboboxId + '-opt-' + focusedIndex() : null\n      \"\n      [attr.aria-label]=\"ariaLabel()\"\n      [attr.aria-labelledby]=\"ariaLabelledBy()\"\n      [attr.aria-invalid]=\"invalid() || null\"\n      (click)=\"toggle()\"\n      (keydown)=\"onTriggerKeydown($event)\"\n    >\n      @if (displayValue()) {\n      <span class=\"mc-combobox__value\">{{ displayValue() }}</span>\n      } @else {\n      <span class=\"mc-combobox__placeholder\">{{ placeholder() }}</span>\n      }\n    </button>\n\n    <!-- Counter (compact + multiple) -->\n    @if (multiple() && compact() && selectedCount() > 0) {\n    <span [id]=\"comboboxId + '-counter'\" class=\"mc-combobox__counter\" aria-live=\"polite\">\n      {{ selectedCount() }} {{ selectedSuffix() }}\n    </span>\n    }\n\n    <!-- Clear button -->\n    @if (showClear()) {\n    <button\n      [id]=\"comboboxId + '-clear'\"\n      type=\"button\"\n      class=\"mc-combobox__clear\"\n      [attr.aria-label]=\"clearAriaLabel()\"\n      (click)=\"onClear($event)\"\n    >\n      <CrossCircleFilled24 />\n    </button>\n    }\n\n    <!-- Trigger loader -->\n    @if (loading()) {\n    <moz-loader\n      [id]=\"comboboxId + '-trigger-loader'\"\n      size=\"s\"\n      [appearance]=\"'accent'\"\n      class=\"mc-combobox__loader\"\n    />\n    }\n\n    <!-- Chevron -->\n    <button\n      [id]=\"comboboxId + '-chevron'\"\n      type=\"button\"\n      class=\"mc-combobox__icon\"\n      tabindex=\"-1\"\n      aria-hidden=\"true\"\n      (click)=\"toggle()\"\n    >\n      <ChevronDown24 />\n    </button>\n  </div>\n</div>\n\n<!-- ====================================================================== -->\n<!-- OVERLAY / DROPDOWN                                                     -->\n<!-- ====================================================================== -->\n<ng-template\n  cdkConnectedOverlay\n  [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n  [cdkConnectedOverlayOpen]=\"isOpen()\"\n  [cdkConnectedOverlayWidth]=\"triggerWidth()\"\n  [cdkConnectedOverlayPositions]=\"overlayPositions\"\n  [cdkConnectedOverlayHasBackdrop]=\"true\"\n  cdkConnectedOverlayBackdropClass=\"mc-combobox-backdrop\"\n  (backdropClick)=\"onOverlayOutsideClick()\"\n  (attach)=\"onOverlayAttached()\"\n>\n  <div\n    [id]=\"comboboxId + '-panel'\"\n    class=\"mc-option-listbox mc-listbox__content mc-combobox__listbox\"\n    (keydown)=\"onPanelKeydown($event)\"\n  >\n    <!-- Search -->\n    @if (searchable()) {\n    <div [id]=\"comboboxId + '-search'\" class=\"mc-option-listbox__search\">\n      <Search24 icon />\n      <input\n        #searchInput\n        [id]=\"comboboxId + '-search-input'\"\n        moz-text-input\n        type=\"text\"\n        [placeholder]=\"searchPlaceholder()\"\n        autocomplete=\"off\"\n        aria-autocomplete=\"list\"\n        [attr.aria-controls]=\"listboxId\"\n        [value]=\"searchQuery()\"\n        (input)=\"onSearchInput($event)\"\n        (keydown)=\"onSearchKeydown($event)\"\n        [size]=\"'s'\"\n      />\n    </div>\n    <hr class=\"mc-option-listbox__separator\" />\n    }\n\n    <!-- Actions (multiple only) -->\n    @if (showActions() && multiple()) {\n    <div [id]=\"comboboxId + '-actions'\" class=\"mc-option-listbox__actions\">\n      <button\n        [id]=\"comboboxId + '-select-all'\"\n        moz-button\n        type=\"button\"\n        [size]=\"'s'\"\n        [ghost]=\"true\"\n        [appearance]=\"'accent'\"\n        (click)=\"selectAll()\"\n      >\n        {{ selectAllText() }}\n      </button>\n      <button\n        [id]=\"comboboxId + '-clear-selection'\"\n        moz-button\n        type=\"button\"\n        [size]=\"'s'\"\n        [ghost]=\"true\"\n        (click)=\"clearSelection()\"\n      >\n        {{ clearText() }}\n      </button>\n    </div>\n    <hr class=\"mc-option-listbox__separator\" />\n    }\n\n    <!-- Listbox with virtual scroll -->\n    <div\n      #listbox\n      role=\"listbox\"\n      [id]=\"listboxId\"\n      class=\"mc-option-listbox__list mc-combobox__virtual-host\"\n      [attr.aria-multiselectable]=\"multiple() || null\"\n      [attr.aria-label]=\"ariaLabel() ?? 'Options'\"\n      [attr.aria-busy]=\"loading() || null\"\n      [attr.aria-activedescendant]=\"\n        focusedIndex() >= 0 ? comboboxId + '-opt-' + focusedIndex() : null\n      \"\n      tabindex=\"-1\"\n    >\n      @if (loading()) {\n      <div [id]=\"comboboxId + '-loading'\" class=\"mc-combobox__loading\" role=\"status\">\n        <moz-loader size=\"s\" [appearance]=\"'accent'\" [text]=\"loadingText()\" />\n      </div>\n      } @else if (filteredItems().length === 0 && showNoResultText() && searchQuery().length > 0) {\n      <div\n        [id]=\"comboboxId + '-empty'\"\n        class=\"mc-option-listbox__empty\"\n        role=\"presentation\"\n        aria-live=\"polite\"\n      >\n        {{ noResultsText() }}\n      </div>\n      } @else {\n      <cdk-virtual-scroll-viewport\n        #viewport\n        [id]=\"comboboxId + '-viewport'\"\n        [itemSize]=\"itemSizePx\"\n        [style.height.px]=\"viewportHeight()\"\n        class=\"mc-combobox__viewport\"\n      >\n        <ng-container\n          *cdkVirtualFor=\"let item of filteredItems(); let i = index; trackBy: trackByFlatItem\"\n        >\n          <!-- Section header -->\n          @if (isFlatSection(item)) {\n          <div\n            [id]=\"comboboxId + '-section-' + i\"\n            class=\"mc-option-listbox__item mc-option-listbox__item--section\"\n            [class.mc-option-listbox__item--selectable]=\"\n              item.checkable && multiple() && !item.disabled\n            \"\n            [class.mc-option-listbox__item--disabled]=\"item.disabled\"\n            [class.mc-option-listbox__item--selected]=\"\n              item.checkable &&\n              multiple() &&\n              (isSectionFullySelected(item.title) || isSectionPartiallySelected(item.title))\n            \"\n            role=\"presentation\"\n            (click)=\"\n              item.checkable && multiple() && !item.disabled ? toggleSection(item.title) : null\n            \"\n          >\n            <div class=\"mc-option-listbox__label\">\n              <div class=\"mc-option-listbox__content\">\n                <span class=\"mc-option-listbox__section-title\">{{ item.title }}</span>\n              </div>\n              <div class=\"mc-option-listbox__spacer\"></div>\n              @if (item.checkable && multiple()) {\n              <moz-checkbox\n                class=\"mc-option-listbox__checkbox\"\n                [id]=\"comboboxId + '-section-cb-' + i\"\n                [ngModel]=\"isSectionFullySelected(item.title)\"\n                [indeterminate]=\"isSectionPartiallySelected(item.title)\"\n                [disabled]=\"!!item.disabled\"\n              />\n              }\n            </div>\n          </div>\n          }\n\n          <!-- Option -->\n          @if (isFlatOption(item)) {\n          <div\n            role=\"option\"\n            [id]=\"comboboxId + '-opt-' + i\"\n            [attr.aria-selected]=\"isOptionSelected($any(item.value))\"\n            [attr.aria-disabled]=\"item.disabled || null\"\n            class=\"mc-option-listbox__item\"\n            [class.mc-option-listbox__item--selectable]=\"!item.disabled\"\n            [class.mc-option-listbox__item--disabled]=\"item.disabled\"\n            [class.mc-option-listbox__item--selected]=\"isOptionSelected($any(item.value))\"\n            [class.mc-option-listbox__item--active]=\"focusedIndex() === i\"\n            (click)=\"!item.disabled && selectOption($any(item.value))\"\n            (mouseenter)=\"focusedIndex.set(i)\"\n          >\n            <div class=\"mc-option-listbox__label\">\n              @if (item.icon) {\n              <div class=\"mc-option-listbox__prepend\">\n                <span class=\"mc-option-listbox__icon\">{{ item.icon }}</span>\n              </div>\n              }\n              <div class=\"mc-option-listbox__content\">\n                <span class=\"mc-option-listbox__text\">{{ item.label }}</span>\n                @if (item.content) {\n                <span class=\"mc-option-listbox__additional\">{{ item.content }}</span>\n                }\n              </div>\n              <div class=\"mc-option-listbox__spacer\"></div>\n\n              <!-- Selection indicator -->\n              @if (multiple()) {\n              <moz-checkbox\n                class=\"mc-option-listbox__checkbox\"\n                [id]=\"comboboxId + '-cb-' + i\"\n                [ngModel]=\"isOptionSelected($any(item.value))\"\n                [disabled]=\"!!item.disabled\"\n              />\n              } @else {\n              <CheckCircle24 class=\"mc-option-listbox__selection-icon\" />\n              }\n            </div>\n          </div>\n          }\n        </ng-container>\n      </cdk-virtual-scroll-viewport>\n      }\n    </div>\n  </div>\n</ng-template>\n","import { ComponentHarness, TestKey } from '@angular/cdk/testing';\n\n/**\n * Harness for a single option inside the combobox dropdown.\n */\nexport class MozComboboxOptionHarness extends ComponentHarness {\n  static hostSelector = '.mc-option-listbox__item:not(.mc-option-listbox__item--section)';\n\n  async getLabel(): Promise<string> {\n    const text = await this.locatorForOptional('.mc-option-listbox__text')();\n    return text ? text.text() : '';\n  }\n\n  async isSelected(): Promise<boolean> {\n    const host = await this.host();\n    return (await host.getAttribute('aria-selected')) === 'true';\n  }\n\n  async isDisabled(): Promise<boolean> {\n    const host = await this.host();\n    return (await host.getAttribute('aria-disabled')) === 'true';\n  }\n\n  async select(): Promise<void> {\n    const host = await this.host();\n    await host.click();\n  }\n}\n\n/**\n * Harness for the McCombobox component.\n *\n * Usage:\n * ```ts\n * const harness = await loader.getHarness(McComboboxHarness);\n * await harness.open();\n * await harness.selectOption({ label: 'Option 1' });\n * expect(await harness.getDisplayValue()).toBe('Option 1');\n * ```\n */\nexport class MozComboboxHarness extends ComponentHarness {\n  static hostSelector = '.mc-combobox';\n\n  // -- Locators ---------------------------------------------------------------\n\n  private _getTrigger = this.locatorFor('[role=\"combobox\"]');\n  private _getClearButton = this.locatorForOptional('.mc-combobox__clear');\n  private _getSearchInput = this.documentRootLocatorFactory().locatorForOptional(\n    '.mc-option-listbox__search input[moz-text-input]',\n  );\n\n  // -- Open / Close -----------------------------------------------------------\n\n  async open(): Promise<void> {\n    if (await this.isOpen()) return;\n    const trigger = await this._getTrigger();\n    await trigger.click();\n  }\n\n  async close(): Promise<void> {\n    if (!(await this.isOpen())) return;\n    const trigger = await this._getTrigger();\n    await trigger.sendKeys(TestKey.ESCAPE);\n  }\n\n  async isOpen(): Promise<boolean> {\n    const trigger = await this._getTrigger();\n    return (await trigger.getAttribute('aria-expanded')) === 'true';\n  }\n\n  // -- Value ------------------------------------------------------------------\n\n  async getDisplayValue(): Promise<string> {\n    const trigger = await this._getTrigger();\n    return trigger.text();\n  }\n\n  async getPlaceholder(): Promise<string> {\n    const placeholder = await this.locatorForOptional('.mc-combobox__placeholder')();\n    return placeholder ? placeholder.text() : '';\n  }\n\n  // -- Options ----------------------------------------------------------------\n\n  async getOptions(): Promise<MozComboboxOptionHarness[]> {\n    await this.open();\n    return this.documentRootLocatorFactory().locatorForAll(MozComboboxOptionHarness)();\n  }\n\n  async selectOption(filter: { label: string }): Promise<void> {\n    await this.open();\n    const options = await this.getOptions();\n    for (const opt of options) {\n      if ((await opt.getLabel()) === filter.label) {\n        await opt.select();\n        return;\n      }\n    }\n    throw new Error(`Option with label \"${filter.label}\" not found`);\n  }\n\n  // -- Actions ----------------------------------------------------------------\n\n  async clear(): Promise<void> {\n    const clearBtn = await this._getClearButton();\n    if (!clearBtn) throw new Error('Clear button not found. Is clearable enabled?');\n    await clearBtn.click();\n  }\n\n  async search(query: string): Promise<void> {\n    await this.open();\n    const input = await this._getSearchInput();\n    if (!input) throw new Error('Search input not found. Is searchable enabled?');\n    await input.clear();\n    await input.sendKeys(query);\n  }\n\n  // -- State checks -----------------------------------------------------------\n\n  async isDisabled(): Promise<boolean> {\n    const host = await this.host();\n    return host.hasClass('mc-combobox--disabled');\n  }\n\n  async isInvalid(): Promise<boolean> {\n    const host = await this.host();\n    return host.hasClass('mc-combobox--invalid');\n  }\n\n  async isReadonly(): Promise<boolean> {\n    const host = await this.host();\n    return host.hasClass('mc-combobox--readonly');\n  }\n\n  async getSelectedCount(): Promise<number> {\n    const counter = await this.locatorForOptional('.mc-combobox__counter')();\n    if (!counter) return 0;\n    const text = await counter.text();\n    const match = text.match(/(\\d+)/);\n    return match ? parseInt(match[1], 10) : 0;\n  }\n}\n","import { computed, Injectable, signal } from '@angular/core';\nimport { Observable, of, take, tap } from 'rxjs';\nimport { FlatNode, LoadChildrenFn, TreeNode } from '../models/tree.model';\n\n@Injectable()\nexport class TreeStateService<T = unknown> {\n  readonly expandedIds = signal<Set<string | number>>(new Set());\n  readonly loadingIds = signal<Set<string | number>>(new Set());\n  readonly internalNodes = signal<TreeNode<T>[]>([]);\n  readonly loadChildrenFn = signal<LoadChildrenFn<T> | null>(null);\n\n  /**\n   * Parent IDs for which children have been patched in (via lazy-load).\n   * Grows monotonically — consumers diff against their own \"processed\" set.\n   * Not emitted for statically-populated children present at init.\n   */\n  readonly loadedParentIds = signal<ReadonlySet<string | number>>(new Set());\n\n  readonly flatVisibleNodes = computed<FlatNode<T>[]>(() => {\n    const result: FlatNode<T>[] = [];\n    this._flatten(this.internalNodes(), result, 0, null);\n    return result;\n  });\n\n  private _flatten(\n    nodes: TreeNode<T>[],\n    result: FlatNode<T>[],\n    depth: number,\n    parentId: string | number | null\n  ): void {\n    for (let i = 0; i < nodes.length; i++) {\n      const node = nodes[i];\n      result.push({\n        node,\n        depth,\n        parentId,\n        siblingCount: nodes.length,\n        posInSet: i + 1,\n      });\n      if (this.expandedIds().has(node.id) && node.children && node.children.length > 0) {\n        this._flatten(node.children, result, depth + 1, node.id);\n      }\n    }\n  }\n\n  setExpanded(ids: Set<string | number>): void {\n    this.expandedIds.set(new Set(ids));\n  }\n\n  toggleExpanded(id: string | number): void {\n    this.expandedIds.update((current) => {\n      const next = new Set(current);\n      if (next.has(id)) {\n        next.delete(id);\n      } else {\n        next.add(id);\n      }\n      return next;\n    });\n  }\n\n  expandAndLoad(node: TreeNode<T>): Observable<void> {\n    const wasExpanded = this.expandedIds().has(node.id);\n    this.toggleExpanded(node.id);\n    if (!wasExpanded) {\n      const loadFn = this.loadChildrenFn();\n      const resolved = this.findNode(node.id) ?? node;\n      if (loadFn && resolved.children === undefined) {\n        this.addLoading(node.id);\n        return (loadFn as LoadChildrenFn)(node as TreeNode).pipe(\n          take(1),\n          tap((children) => {\n            this.patchChildren(node.id, children as TreeNode<T>[]);\n            this.removeLoading(node.id);\n          }),\n          tap(() => void 0),\n        ) as unknown as Observable<void>;\n      }\n    }\n    return of(undefined);\n  }\n\n  addLoading(id: string | number): void {\n    this.loadingIds.update((s) => new Set([...s, id]));\n  }\n\n  removeLoading(id: string | number): void {\n    this.loadingIds.update((s) => {\n      const next = new Set(s);\n      next.delete(id);\n      return next;\n    });\n  }\n\n  patchChildren(nodeId: string | number, children: TreeNode<T>[]): void {\n    this.internalNodes.update((nodes) => this._patchNode(nodes, nodeId, children));\n    this.loadedParentIds.update((set) => {\n      const next = new Set(set);\n      next.add(nodeId);\n      return next;\n    });\n  }\n\n  private _patchNode(\n    nodes: TreeNode<T>[],\n    targetId: string | number,\n    children: TreeNode<T>[]\n  ): TreeNode<T>[] {\n    return nodes.map((n) => {\n      if (n.id === targetId) {\n        return { ...n, children };\n      }\n      if (n.children) {\n        return { ...n, children: this._patchNode(n.children, targetId, children) };\n      }\n      return n;\n    });\n  }\n\n  findNode(nodeId: string | number): TreeNode<T> | null {\n    return this._findNodeRecursive(this.internalNodes(), nodeId);\n  }\n\n  private _findNodeRecursive(nodes: TreeNode<T>[], id: string | number): TreeNode<T> | null {\n    for (const node of nodes) {\n      if (node.id === id) return node;\n      if (node.children) {\n        const found = this._findNodeRecursive(node.children as TreeNode<T>[], id);\n        if (found) return found;\n      }\n    }\n    return null;\n  }\n\n  findParentId(nodeId: string | number): string | number | null {\n    const flat = this.flatVisibleNodes();\n    const entry = flat.find((f) => f.node.id === nodeId);\n    return entry?.parentId ?? null;\n  }\n}\n","import { computed, inject, Injectable, signal } from '@angular/core';\nimport { TreeNode, TreeSelectionMode } from '../models/tree.model';\nimport { TreeStateService } from './tree-state';\n\n@Injectable()\nexport class TreeSelectionService<T = unknown> {\n  private readonly stateService = inject(TreeStateService);\n  readonly selectedIds = signal<Set<string | number>>(new Set());\n  readonly selectionMode = signal<TreeSelectionMode>('none');\n  readonly rootNodes = signal<TreeNode<T>[]>([]);\n  readonly canSelectFn = signal<((node: TreeNode<T>) => boolean) | null>(null);\n\n  setSelectedIds(ids: Set<string | number>): void {\n    const pred = this.canSelectFn();\n    if (!pred) {\n      this.selectedIds.set(new Set(ids));\n      return;\n    }\n    const next = new Set<string | number>();\n    for (const id of ids) {\n      const node = this._resolveNode({ id } as TreeNode<T>);\n      if (pred(node)) next.add(id);\n    }\n    this.selectedIds.set(next);\n  }\n\n  setMode(mode: TreeSelectionMode): void {\n    this.selectionMode.set(mode);\n  }\n\n  setRootNodes(nodes: TreeNode<T>[]): void {\n    this.rootNodes.set(nodes);\n  }\n\n  setCanSelect(fn: ((node: TreeNode<T>) => boolean) | null): void {\n    this.canSelectFn.set(fn);\n  }\n\n  canSelect(node: TreeNode<T>): boolean {\n    const pred = this.canSelectFn();\n    return pred ? pred(node) : true;\n  }\n\n  isSelected(id: string | number): boolean {\n    return this.selectedIds().has(id);\n  }\n\n  /**\n   * A node is considered disabled only by its own `disabled` flag — a disabled\n   * parent does not propagate the state to its descendants. Children of a\n   * disabled parent remain individually interactable; the parent itself just\n   * has its bulk \"toggle all\" action locked. This mirrors the combobox's\n   * disabled-section semantics.\n   */\n  isDisabled(node: TreeNode<T>): boolean {\n    return !!node.disabled;\n  }\n\n  /**\n   * A node is indeterminate when it has loaded children AND at least one\n   * descendant is selected without the node being fully checked. Disabled\n   * descendants count so a pre-selected disabled leaf still surfaces on the\n   * parent (useful when the parent itself is also disabled).\n   */\n  isIndeterminate(node: TreeNode<T>): boolean {\n    if (this.isCheckedComputed(node)) return false;\n    const resolved = this._resolveNode(node);\n    const allLeaves = this._collectLeafIds(resolved, { includeDisabled: true });\n    if (allLeaves.length === 0) return false;\n    return allLeaves.some((id) => this.selectedIds().has(id));\n  }\n\n  /**\n   * A node is checked when:\n   * - Leaf node (no children or children not loaded): its ID is in selectedIds\n   * - Parent with loaded children: ALL leaf descendants are selected\n   */\n  isCheckedComputed(node: TreeNode<T>): boolean {\n    if (this.selectionMode() === 'radio') {\n      return this.selectedIds().has(node.id);\n    }\n    const resolved = this._resolveNode(node);\n    const leaves = this._collectLeafIds(resolved);\n    // Node is a leaf or has no loaded children\n    if (leaves.length === 0) {\n      return this.selectedIds().has(node.id);\n    }\n    return leaves.every((id) => this.selectedIds().has(id));\n  }\n\n  /**\n   * Select a node: add all leaf descendant IDs (or the node's own ID if leaf).\n   */\n  selectNode(node: TreeNode<T>): void {\n    if (!this.canSelect(node)) return;\n    if (this.selectionMode() === 'radio') {\n      this.selectedIds.set(new Set([node.id]));\n      return;\n    }\n    const resolved = this._resolveNode(node);\n    this.selectedIds.update((current) => {\n      const next = new Set(current);\n      const leaves = this._collectLeafIds(resolved);\n      if (leaves.length === 0) {\n        // Node is a leaf\n        if (!node.disabled) next.add(node.id);\n      } else {\n        leaves.forEach((id) => next.add(id));\n      }\n      return next;\n    });\n  }\n\n  /**\n   * Deselect a node: remove all leaf descendant IDs (or the node's own ID if leaf).\n   * Also remove the node's own ID in case it's in the set from external sources.\n   */\n  deselectNode(node: TreeNode<T>): void {\n    if (this.selectionMode() === 'radio') {\n      this.selectedIds.update((current) => {\n        const next = new Set(current);\n        next.delete(node.id);\n        return next;\n      });\n      return;\n    }\n    const resolved = this._resolveNode(node);\n    this.selectedIds.update((current) => {\n      const next = new Set(current);\n      // Always remove the node itself\n      next.delete(node.id);\n      // Remove all known descendants (leaf + parents)\n      this._collectAllDescendantIds(resolved).forEach((id) => next.delete(id));\n      return next;\n    });\n  }\n\n  toggleNode(node: TreeNode<T>): void {\n    if (this.isCheckedComputed(node)) {\n      this.deselectNode(node);\n    } else {\n      this.selectNode(node);\n    }\n  }\n\n  /**\n   * Called when children are loaded for a node.\n   * - If parent ID was in selectedIds: replace it with children's leaf IDs (propagate down).\n   * - If parent ID was NOT in selectedIds: remove any orphan children IDs that\n   *   may have been left from a prior bulk operation (e.g. Select All → deselect parent).\n   */\n  propagateOnChildrenLoaded(parentId: string | number): void {\n    const parent = this._resolveNode({ id: parentId } as TreeNode<T>);\n    if (!parent || !parent.children || parent.children.length === 0) return;\n\n    const selected = this.selectedIds();\n    const next = new Set(selected);\n\n    if (selected.has(parentId)) {\n      // Parent was selected → replace with leaf children\n      next.delete(parentId);\n      for (const child of parent.children) {\n        if (!(child as TreeNode<T>).disabled) {\n          const childLeaves = this._collectLeafIds(this._resolveNode(child as TreeNode<T>));\n          if (childLeaves.length === 0) {\n            next.add(child.id);\n          } else {\n            childLeaves.forEach((id) => next.add(id));\n          }\n        }\n      }\n    } else {\n      // Parent was NOT selected → clean up any orphan descendant IDs\n      this._collectAllDescendantIds(parent).forEach((id) => next.delete(id));\n    }\n\n    this.selectedIds.set(next);\n  }\n\n  /**\n   * Collect leaf-level IDs (terminal nodes that have no loaded children).\n   * Returns empty array if the node itself is a leaf.\n   * When `includeDisabled` is true, disabled descendants are also collected —\n   * used by the indeterminate computation so pre-selected disabled leaves\n   * count toward a parent's state.\n   */\n  private _collectLeafIds(\n    node: TreeNode<T>,\n    opts: { includeDisabled?: boolean } = {}\n  ): Array<string | number> {\n    const resolved = this._resolveNode(node);\n    if (!resolved.children || resolved.children.length === 0) {\n      return [];\n    }\n    const ids: Array<string | number> = [];\n    for (const child of resolved.children) {\n      if (!opts.includeDisabled && (child as TreeNode<T>).disabled) continue;\n      const resolvedChild = this._resolveNode(child as TreeNode<T>);\n      const childLeaves = this._collectLeafIds(resolvedChild, opts);\n      if (childLeaves.length === 0) {\n        // This child is a leaf\n        ids.push(resolvedChild.id);\n      } else {\n        ids.push(...childLeaves);\n      }\n    }\n    return ids;\n  }\n\n  /**\n   * Collect ALL descendant IDs (both parents and leaves) for thorough cleanup on deselect.\n   */\n  private _collectAllDescendantIds(node: TreeNode<T>): Array<string | number> {\n    const resolved = this._resolveNode(node);\n    const ids: Array<string | number> = [];\n    if (!resolved.children) return ids;\n    for (const child of resolved.children) {\n      const resolvedChild = this._resolveNode(child as TreeNode<T>);\n      ids.push(resolvedChild.id);\n      ids.push(...this._collectAllDescendantIds(resolvedChild));\n    }\n    return ids;\n  }\n\n  readonly allSelectedIds = computed(() => new Set(this.selectedIds()));\n\n  private _resolveNode(node: TreeNode<T>): TreeNode<T> {\n    return (this.stateService.findNode(node.id) as TreeNode<T>) ?? node;\n  }\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { TreeStateService } from './tree-state';\nimport { TreeSelectionService } from './tree-selection';\nimport { FlatNode, TreeNode } from '../models/tree.model';\n\n@Injectable()\nexport class TreeKeyboardService<T = unknown> {\n  private readonly state = inject<TreeStateService<T>>(TreeStateService);\n  private readonly selection = inject<TreeSelectionService<T>>(TreeSelectionService);\n\n  readonly focusedNodeId = signal<string | number | null>(null);\n\n  initFocus(): void {\n    if (this.focusedNodeId() !== null) return;\n    const flat = this.state.flatVisibleNodes();\n    if (flat.length > 0) {\n      this.focusedNodeId.set(flat[0].node.id);\n    }\n  }\n\n  handleKeydown(event: KeyboardEvent): void {\n    const flat = this.state.flatVisibleNodes();\n    if (flat.length === 0) return;\n\n    const focusedId = this.focusedNodeId();\n    const currentIndex = focusedId !== null ? flat.findIndex((f) => f.node.id === focusedId) : -1;\n\n    if (currentIndex === -1 && !['Home', 'End'].includes(event.key)) return;\n\n    const current: FlatNode<T> | undefined = flat[currentIndex];\n\n    switch (event.key) {\n      case 'ArrowDown': {\n        event.preventDefault();\n        const next = flat[currentIndex + 1];\n        if (next) this._setFocusAndScroll(next.node.id);\n        break;\n      }\n\n      case 'ArrowUp': {\n        event.preventDefault();\n        const prev = flat[currentIndex - 1];\n        if (prev) this._setFocusAndScroll(prev.node.id);\n        break;\n      }\n\n      case 'ArrowRight': {\n        event.preventDefault();\n        if (!current) break;\n        const isExpanded = this.state.expandedIds().has(current.node.id);\n\n        if (this._hasChildren(current.node) && !isExpanded) {\n          this.state.expandAndLoad(current.node as TreeNode<T>).subscribe();\n        } else if (isExpanded) {\n          const firstChild = flat[currentIndex + 1];\n          if (firstChild && firstChild.depth > current.depth) {\n            this._setFocusAndScroll(firstChild.node.id);\n          }\n        }\n        break;\n      }\n\n      case 'ArrowLeft': {\n        event.preventDefault();\n        if (!current) break;\n        const isExpanded = this.state.expandedIds().has(current.node.id);\n\n        if (isExpanded) {\n          this.state.toggleExpanded(current.node.id);\n        } else if (current.parentId !== null) {\n          this._setFocusAndScroll(current.parentId);\n        }\n        break;\n      }\n\n      case 'Enter': {\n        event.preventDefault();\n        if (!current) break;\n        if (this._hasChildren(current.node)) {\n          this.state.expandAndLoad(current.node as TreeNode<T>).subscribe();\n        }\n        break;\n      }\n\n      case ' ': {\n        event.preventDefault();\n        if (!current) break;\n        if (this.selection.selectionMode() !== 'none') {\n          this.selection.toggleNode(current.node as unknown as TreeNode<T>);\n        }\n        break;\n      }\n\n      case '*': {\n        event.preventDefault();\n        if (!current) break;\n        this._expandSiblings(flat, current);\n        break;\n      }\n\n      case 'Home': {\n        event.preventDefault();\n        this._setFocusAndScroll(flat[0].node.id);\n        break;\n      }\n\n      case 'End': {\n        event.preventDefault();\n        this._setFocusAndScroll(flat[flat.length - 1].node.id);\n        break;\n      }\n    }\n  }\n\n  private _setFocusAndScroll(id: string | number): void {\n    this.focusedNodeId.set(id);\n    requestAnimationFrame(() => {\n      const el = document.querySelector<HTMLElement>(`[data-tree-node-id=\"${id}\"]`);\n      el?.focus({ preventScroll: false });\n      el?.scrollIntoView({ block: 'nearest' });\n    });\n  }\n\n  private _hasChildren(node: FlatNode<T>['node']): boolean {\n    return (\n      node.hasChildren !== false &&\n      (node.children === undefined || node.children.length > 0 || node.hasChildren === true)\n    );\n  }\n\n  private _expandSiblings(flat: readonly FlatNode<T>[], current: FlatNode<T>): void {\n    const siblings = flat.filter(\n      (f) => f.depth === current.depth && f.parentId === current.parentId\n    );\n    for (const sibling of siblings) {\n      if (this._hasChildren(sibling.node) && !this.state.expandedIds().has(sibling.node.id)) {\n        this.state.expandAndLoad(sibling.node as TreeNode<T>).subscribe();\n      }\n    }\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  inject,\n  input,\n  output,\n  TemplateRef,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { MozCheckboxComponent } from '../../../checkbox/checkbox';\nimport { MozRadioComponent } from '../../../radio/radio';\nimport { MozLoaderComponent } from '../../../loader/loader';\nimport { ChevronDown20, ChevronRight20 } from '@mozaic-ds/icons-angular';\nimport {\n  LoadChildrenFn,\n  TreeNode,\n  TreeNodeContext,\n  TreeSelectionMode,\n} from '../../models/tree.model';\nimport { TreeStateService } from '../../services/tree-state';\nimport { TreeSelectionService } from '../../services/tree-selection';\nimport { TreeKeyboardService } from '../../services/tree-keyboard';\n\n@Component({\n  selector: 'moz-tree-node',\n  templateUrl: './tree-node.html',\n  styleUrls: ['./tree-node.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: { style: 'display: block' },\n  imports: [\n    FormsModule,\n    NgTemplateOutlet,\n    MozCheckboxComponent,\n    MozRadioComponent,\n    MozLoaderComponent,\n    ChevronDown20,\n    ChevronRight20,\n  ],\n})\nexport class MozTreeNodeComponent<T = unknown> {\n  protected readonly stateService = inject(TreeStateService);\n  protected readonly selectionService = inject(TreeSelectionService);\n  protected readonly keyboardService = inject(TreeKeyboardService);\n\n  readonly node = input.required<TreeNode<T>>();\n  readonly depth = input<number>(0);\n  readonly selectionMode = input<TreeSelectionMode>('none');\n  readonly indentSize = input<number>(24);\n  readonly nodeTemplate = input<TemplateRef<TreeNodeContext<T>> | null>(null);\n  readonly nodeTemplates = input<Record<string, TemplateRef<TreeNodeContext<T>>> | null>(null);\n  readonly loadChildren = input<LoadChildrenFn<T> | null>(null);\n  readonly ancestors = input<TreeNode<T>[]>([]);\n  readonly flat = input<boolean>(false);\n  readonly noResultText = input<string>('No result found');\n  readonly expandChange = output<string | number>();\n  readonly selectionChange = output<Set<string | number>>();\n\n  readonly isExpanded = computed(() => this.stateService.expandedIds().has(this.node().id));\n  readonly isLoading = computed(() => this.stateService.loadingIds().has(this.node().id));\n  readonly isDisabled = computed(() => this.selectionService.isDisabled(this.node()));\n  readonly isSelected = computed(() => this.selectionService.isCheckedComputed(this.node()));\n  readonly isIndeterminate = computed(() => this.selectionService.isIndeterminate(this.node()));\n  readonly isFocused = computed(() => this.keyboardService.focusedNodeId() === this.node().id);\n  readonly isSelectable = computed(() => {\n    if (this.selectionMode() === 'none') return false;\n    return this.selectionService.canSelect(this.node());\n  });\n\n  readonly hasChildren = computed(() => {\n    const node = this.node();\n    return (\n      node.hasChildren !== false &&\n      (node.children === undefined || node.children.length > 0 || node.hasChildren === true)\n    );\n  });\n\n  readonly resolvedTemplate = computed<TemplateRef<TreeNodeContext<T>> | null>(() => {\n    const type = this.node().type;\n    if (type) {\n      const templates = this.nodeTemplates();\n      if (templates?.[type]) return templates[type];\n    }\n    return this.nodeTemplate();\n  });\n\n  readonly templateContext = computed<TreeNodeContext<T>>(() => ({\n    $implicit: this.node(),\n    depth: this.depth(),\n    isExpanded: this.isExpanded(),\n    isSelected: this.isSelected(),\n    isIndeterminate: this.isIndeterminate(),\n    isLoading: this.isLoading(),\n    isDisabled: this.isDisabled(),\n  }));\n\n  readonly indentPx = computed(() => this.depth() * this.indentSize());\n\n  readonly ancestorsWithSelf = computed<TreeNode<T>[]>(() => [...this.ancestors(), this.node()]);\n\n  readonly radioName = 'moz-tree-radio-group';\n\n  readonly resolvedChildren = computed<TreeNode<T>[]>(() => {\n    const internalNode = this._findNode(\n      this.stateService.internalNodes() as TreeNode<T>[],\n      this.node().id\n    );\n    return (internalNode?.children ?? this.node().children ?? []) as TreeNode<T>[];\n  });\n\n  onHeaderClick(): void {\n    this.keyboardService.focusedNodeId.set(this.node().id);\n    if (this.hasChildren()) {\n      this.onToggleExpand();\n    }\n  }\n\n  onToggleExpand(): void {\n    this.stateService.expandAndLoad(this.node() as TreeNode).subscribe();\n    this.expandChange.emit(this.node().id);\n  }\n\n  onCheckboxChange(event: Event): void {\n    if (this.isDisabled()) return;\n    const checked = (event.target as HTMLInputElement).checked;\n    if (checked) {\n      this.selectionService.selectNode(this.node());\n    } else {\n      this.selectionService.deselectNode(this.node());\n    }\n    this.selectionChange.emit(this.selectionService.allSelectedIds());\n  }\n\n  onRadioChange(event: Event): void {\n    const checked = (event.target as HTMLInputElement).checked;\n    if (!checked || this.isDisabled()) return;\n    this.selectionService.selectNode(this.node());\n    this.selectionChange.emit(this.selectionService.allSelectedIds());\n  }\n\n  private _findNode(nodes: TreeNode<T>[], id: string | number): TreeNode<T> | null {\n    for (const node of nodes) {\n      if (node.id === id) return node;\n      if (node.children) {\n        const found = this._findNode(node.children as TreeNode<T>[], id);\n        if (found) return found;\n      }\n    }\n    return null;\n  }\n}\n","<li\n  class=\"tree-node\"\n  [class.tree-node--selected]=\"isSelected()\"\n  [class.tree-node--disabled]=\"isDisabled()\"\n  [class.tree-node--focused]=\"isFocused()\"\n  role=\"treeitem\"\n  [id]=\"'tree-node-' + node().id\"\n  [attr.aria-level]=\"depth() + 1\"\n  [attr.aria-expanded]=\"hasChildren() ? isExpanded() : null\"\n  [attr.aria-selected]=\"isSelectable() ? isSelected() : null\"\n  [attr.aria-disabled]=\"isDisabled() || null\"\n  [attr.data-tree-node-id]=\"node().id\"\n  [tabindex]=\"isFocused() ? 0 : -1\"\n>\n  <div\n    class=\"tree-node__header\"\n    [class.tree-node__header--expandable]=\"hasChildren()\"\n    (click)=\"onHeaderClick()\"\n  >\n    <div class=\"tree-node__indent\" [style.width.px]=\"indentPx()\"></div>\n\n    <div class=\"tree-node__row\">\n      <span class=\"tree-node__chevron\" [class.tree-node__chevron--leaf]=\"!hasChildren()\">\n        @if (hasChildren()) { @if (isExpanded()) {\n        <ChevronDown20 />\n        } @else {\n        <ChevronRight20 />\n        } }\n      </span>\n\n      <div class=\"tree-node__content\">\n        @if (resolvedTemplate()) {\n        <ng-container\n          [ngTemplateOutlet]=\"resolvedTemplate()!\"\n          [ngTemplateOutletContext]=\"templateContext()\"\n        />\n        } @else {\n        <span class=\"tree-node__label\">{{ node().id }}</span>\n        }\n      </div>\n\n      @if (isSelectable()) { @if (selectionMode() === 'checkbox') {\n      <moz-checkbox\n        class=\"tree-node__selection\"\n        [id]=\"'tree-checkbox-' + node().id\"\n        [indeterminate]=\"isIndeterminate()\"\n        [disabled]=\"isDisabled()\"\n        [ngModel]=\"isSelected()\"\n        (click)=\"$event.stopPropagation()\"\n        (change)=\"onCheckboxChange($event)\"\n      />\n      } @else if (selectionMode() === 'radio') {\n      <moz-radio\n        class=\"tree-node__selection\"\n        [id]=\"'tree-radio-' + node().id\"\n        [name]=\"radioName\"\n        [disabled]=\"isDisabled()\"\n        [ngModel]=\"isSelected()\"\n        (click)=\"$event.stopPropagation()\"\n        (change)=\"onRadioChange($event)\"\n      />\n      } }\n    </div>\n  </div>\n\n  @if (isExpanded() && !flat()) {\n  <ul class=\"tree-node__children\" role=\"group\">\n    @if (isLoading()) {\n    <li class=\"tree-node__loading\" role=\"presentation\">\n      <moz-loader size=\"s\" [appearance]=\"'accent'\" />\n    </li>\n    } @else { @if (resolvedChildren().length === 0) {\n    <li class=\"tree-node__empty\" role=\"presentation\">\n      <span>{{ noResultText() }}</span>\n    </li>\n    } @for (child of resolvedChildren(); track child.id) {\n    <moz-tree-node\n      [node]=\"child\"\n      [depth]=\"depth() + 1\"\n      [selectionMode]=\"selectionMode()\"\n      [indentSize]=\"indentSize()\"\n      [nodeTemplate]=\"nodeTemplate()\"\n      [nodeTemplates]=\"nodeTemplates()\"\n      [loadChildren]=\"loadChildren()\"\n      [ancestors]=\"ancestorsWithSelf()\"\n      (expandChange)=\"expandChange.emit($event)\"\n      (selectionChange)=\"selectionChange.emit($event)\"\n    />\n    } }\n  </ul>\n  }\n</li>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  contentChild,\n  contentChildren,\n  Directive,\n  effect,\n  inject,\n  input,\n  output,\n  TemplateRef,\n} from '@angular/core';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { firstValueFrom, take } from 'rxjs';\nimport { MozTreeNodeComponent } from './components/tree-node/tree-node';\nimport { TreeNode, TreeNodeContext, TreeSelectionMode, LoadChildrenFn } from './models/tree.model';\nimport { TreeStateService } from './services/tree-state';\nimport { TreeSelectionService } from './services/tree-selection';\nimport { TreeKeyboardService } from './services/tree-keyboard';\n\n@Directive({ selector: 'ng-template[mozTreeNode]' })\nexport class MozTreeNodeTemplateDirective {\n  readonly type = input<string>();\n  constructor(public readonly templateRef: TemplateRef<TreeNodeContext>) {}\n}\n\n@Component({\n  selector: 'moz-tree',\n  templateUrl: './tree.html',\n  styleUrls: ['./tree.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [MozTreeNodeComponent, ScrollingModule],\n  providers: [TreeStateService, TreeSelectionService, TreeKeyboardService],\n})\nexport class MozTreeComponent<T = unknown> {\n  protected readonly stateService = inject(TreeStateService);\n  protected readonly selectionService = inject(TreeSelectionService);\n  protected readonly keyboardService = inject(TreeKeyboardService);\n\n  // Inputs\n  readonly nodes = input<TreeNode<T>[]>([]);\n  readonly selectionMode = input<TreeSelectionMode>('none');\n  readonly expandedIds = input<Set<string | number>>(new Set());\n  readonly selectedIds = input<Set<string | number>>(new Set());\n  readonly loadChildren = input<LoadChildrenFn<T> | null>(null);\n  readonly canSelect = input<((node: TreeNode<T>) => boolean) | null>(null);\n  readonly indentSize = input<number>(24);\n  readonly virtualScroll = input<boolean | 'auto'>('auto');\n  readonly virtualScrollThreshold = input<number>(100);\n  readonly rowHeight = input<number>(57);\n  readonly viewportHeight = input<string>('400px');\n\n  // Content-projected templates\n  readonly _defaultTemplate = contentChild(MozTreeNodeTemplateDirective);\n  readonly _typedTemplates = contentChildren(MozTreeNodeTemplateDirective);\n\n  readonly nodeTemplate = computed<TemplateRef<TreeNodeContext<T>> | null>(() => {\n    const dirs = this._typedTemplates();\n    const defaultDir = dirs.find((d) => !d.type());\n    return (defaultDir?.templateRef ?? null) as TemplateRef<TreeNodeContext<T>> | null;\n  });\n\n  readonly nodeTemplates = computed<Record<string, TemplateRef<TreeNodeContext<T>>> | null>(() => {\n    const dirs = this._typedTemplates();\n    const typed = dirs.filter((d) => !!d.type());\n    if (typed.length === 0) return null;\n    return Object.fromEntries(\n      typed.map((d) => [d.type()!, d.templateRef as TemplateRef<TreeNodeContext<T>>])\n    );\n  });\n\n  // Outputs\n  readonly expandedIdsChange = output<Set<string | number>>();\n  readonly selectionChange = output<Set<string | number>>();\n\n  readonly useVirtualScroll = computed(() => {\n    const mode = this.virtualScroll();\n    if (mode === true) return true;\n    if (mode === false) return false;\n    return this.stateService.flatVisibleNodes().length > this.virtualScrollThreshold();\n  });\n\n  readonly itemSize = computed(() => this.rowHeight());\n\n  constructor() {\n    // Sync inputs → services\n    effect(() => {\n      this.stateService.internalNodes.set(this.nodes() as TreeNode[]);\n    });\n\n    effect(() => {\n      this.stateService.setExpanded(this.expandedIds());\n    });\n\n    effect(() => {\n      this.selectionService.setSelectedIds(this.selectedIds());\n    });\n\n    effect(() => {\n      this.selectionService.setMode(this.selectionMode());\n    });\n\n    effect(() => {\n      this.selectionService.setRootNodes(this.nodes() as TreeNode[]);\n    });\n\n    effect(() => {\n      this.selectionService.setCanSelect(\n        this.canSelect() as ((node: TreeNode) => boolean) | null\n      );\n    });\n\n    effect(() => {\n      this.stateService.loadChildrenFn.set(this.loadChildren() as LoadChildrenFn | null);\n    });\n\n    // React to genuine lazy-load events emitted by patchChildren. Static\n    // initial children never go through patchChildren, so pre-selected\n    // descendants of statically-populated parents are left untouched.\n    const processed = new Set<string | number>();\n    effect(() => {\n      const loaded = this.stateService.loadedParentIds();\n      if (this.selectionService.selectionMode() !== 'checkbox') return;\n      for (const parentId of loaded) {\n        if (processed.has(parentId)) continue;\n        processed.add(parentId);\n        this.selectionService.propagateOnChildrenLoaded(parentId);\n      }\n    });\n  }\n\n  onTreeKeydown(event: KeyboardEvent): void {\n    const prevSelection = this.selectionService.allSelectedIds();\n    this.keyboardService.handleKeydown(event);\n    const newSelection = this.selectionService.allSelectedIds();\n    if (prevSelection !== newSelection) {\n      this.selectionChange.emit(newSelection);\n    }\n  }\n\n  onTreeFocus(): void {\n    this.keyboardService.initFocus();\n  }\n\n  onExpandChange(): void {\n    this.expandedIdsChange.emit(new Set(this.stateService.expandedIds()));\n  }\n\n  onSelectionChange(ids: Set<string | number>): void {\n    this.selectionChange.emit(ids);\n  }\n\n  async expandPath(path: Array<string | number>): Promise<void> {\n    const loadFn = this.stateService.loadChildrenFn();\n    for (let i = 0; i < path.length - 1; i++) {\n      const nodeId = path[i];\n      const node = this.stateService.findNode(nodeId) as TreeNode | null;\n      if (!node) break;\n\n      // Expand first so the children area is visible\n      if (!this.stateService.expandedIds().has(nodeId)) {\n        this.stateService.toggleExpanded(nodeId);\n        this.expandedIdsChange.emit(new Set(this.stateService.expandedIds()));\n        // Yield to let Angular render the expansion\n        await new Promise((resolve) => setTimeout(resolve));\n      }\n\n      // Load children if needed\n      if (loadFn && node.children === undefined) {\n        this.stateService.addLoading(nodeId);\n        this.expandedIdsChange.emit(new Set(this.stateService.expandedIds()));\n        // Yield to let Angular render the loader\n        await new Promise((resolve) => setTimeout(resolve));\n        const children = await firstValueFrom((loadFn as LoadChildrenFn)(node).pipe(take(1)));\n        this.stateService.patchChildren(nodeId, children as TreeNode[]);\n        this.stateService.removeLoading(nodeId);\n        // Yield to let Angular render the new children\n        await new Promise((resolve) => setTimeout(resolve));\n      }\n    }\n    this.expandedIdsChange.emit(new Set(this.stateService.expandedIds()));\n  }\n\n  scrollToNode(nodeId: string | number): void {\n    setTimeout(() => {\n      const el = document.querySelector<HTMLElement>(`[data-tree-node-id=\"${nodeId}\"]`);\n      el?.scrollIntoView({ block: 'center', behavior: 'smooth' });\n    });\n  }\n\n  expandAll(): void {\n    const flat = this.stateService.flatVisibleNodes();\n    const allIds = new Set(flat.map((f) => f.node.id));\n    this.stateService.setExpanded(allIds);\n    this.expandedIdsChange.emit(new Set(allIds));\n  }\n\n  collapseAll(): void {\n    this.stateService.setExpanded(new Set());\n    this.expandedIdsChange.emit(new Set());\n  }\n\n  trackNode(_index: number, node: TreeNode<T>): string | number {\n    return node.id;\n  }\n\n  trackFlatNode(_index: number, flat: import('./models/tree.model').FlatNode<T>): string | number {\n    return flat.node.id;\n  }\n}\n","<ul\n  class=\"tree\"\n  role=\"tree\"\n  tabindex=\"0\"\n  [attr.aria-multiselectable]=\"selectionMode() === 'checkbox' ? 'true' : null\"\n  [attr.aria-activedescendant]=\"keyboardService.focusedNodeId() ? 'tree-node-' + keyboardService.focusedNodeId() : null\"\n  (keydown)=\"onTreeKeydown($event)\"\n  (focus)=\"onTreeFocus()\"\n>\n  @if (!useVirtualScroll()) { @for (node of nodes(); track trackNode($index, node)) {\n  <moz-tree-node\n    [node]=\"node\"\n    [depth]=\"0\"\n    [selectionMode]=\"selectionMode()\"\n    [indentSize]=\"indentSize()\"\n    [nodeTemplate]=\"nodeTemplate()\"\n    [nodeTemplates]=\"nodeTemplates()\"\n    [loadChildren]=\"loadChildren()\"\n    [ancestors]=\"[]\"\n    (expandChange)=\"onExpandChange()\"\n    (selectionChange)=\"onSelectionChange($event)\"\n  />\n  } } @else {\n  <cdk-virtual-scroll-viewport\n    class=\"tree__viewport\"\n    [itemSize]=\"itemSize()\"\n    [style.height]=\"viewportHeight()\"\n  >\n    <moz-tree-node\n      *cdkVirtualFor=\"let flatNode of stateService.flatVisibleNodes(); trackBy: trackFlatNode\"\n      [node]=\"flatNode.node\"\n      [depth]=\"flatNode.depth\"\n      [flat]=\"true\"\n      [selectionMode]=\"selectionMode()\"\n      [indentSize]=\"indentSize()\"\n      [nodeTemplate]=\"nodeTemplate()\"\n      [nodeTemplates]=\"nodeTemplates()\"\n      [loadChildren]=\"loadChildren()\"\n      [ancestors]=\"[]\"\n      (expandChange)=\"onExpandChange()\"\n      (selectionChange)=\"onSelectionChange($event)\"\n    />\n  </cdk-virtual-scroll-viewport>\n  }\n</ul>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["isDigit","isAlpha","i1","i2"],"mappings":";;;;;;;;;;;;;;;;;MAWa,sBAAsB,CAAA;AACxB,IAAA,UAAU,GAAG,KAAK,CAA0B,UAAU,iFAAC;AACvD,IAAA,KAAK,GAAG,KAAK,CAAsB,EAAE,4EAAC;AAEtC,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QACnC,OAAO;AACL,YAAA,YAAY,EAAE,IAAI;YAClB,CAAC,CAAA,YAAA,EAAe,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,UAAU,EAAE;SACxD;AACH,IAAA,CAAC,kFAAC;IAEF,YAAY,GAAA;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,GAAG,CAAA,OAAA,EAAU,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE;QACvF,OAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAE;IACxC;IAEA,mBAAmB,GAAA;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,GAAG,CAAA,OAAA,EAAU,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE;QACvF,OAAO,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAE;IAC/C;wGAnBW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,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,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,ECXnC,i8BAyBA,EAAA,MAAA,EAAA,CAAA,2pGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDhBY,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,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAET,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,mBAGT,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,UAAU,CAAC,EAAA,QAAA,EAAA,i8BAAA,EAAA,MAAA,EAAA,CAAA,2pGAAA,CAAA,EAAA;;;MEqBV,kBAAkB,CAAA;AACpB,IAAA,UAAU,GAAG,KAAK,CAAsB,UAAU,iFAAC;IACnD,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAiB;IAC7B,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAW;IAC3B,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAW;IACxB,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAW;AAC3B,IAAA,YAAY,GAAG,KAAK,CAAwB,IAAI,mFAAC;AACjD,IAAA,IAAI,GAAG,KAAK,CAAgB,QAAQ,2EAAC;IACrC,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAW;IAC5B,OAAO,GAAG,YAAY,CAAoB,MAAM,+EAAI,WAAW,EAAE,KAAK,EAAA,CAAG;AAEzE,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC;AAE1B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrB,OAAO,CAAC,IAAI,CAAC,CAAA,QAAA,EAAW,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE,CAAC;QAC9C;AACA,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,CAAA,QAAA,EAAW,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,CAAC;QACxC;AACA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;AAChB,YAAA,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC;QAC/B;AACA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC;QAClC;AACA,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,MAAM,EAAE;AAClC,YAAA,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACnC;AACA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC;QACjC;AAEA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,8EAAC;wGAlCS,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,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,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,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,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,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,eAAA,EAAA,0BAAA,EAAA,WAAA,EAAA,QAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9B/B,g3BA2BA,EAAA,MAAA,EAAA,CAAA,25lBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDNY,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FASf,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAb9B,SAAS;+BACE,oBAAoB,EAAA,OAAA,EAGrB,CAAC,gBAAgB,CAAC,mBACV,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,iBAAiB,EAAE,wBAAwB;AAC3C,wBAAA,aAAa,EAAE,QAAQ;qBACxB,EAAA,aAAA,EACc,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,g3BAAA,EAAA,MAAA,EAAA,CAAA,25lBAAA,CAAA,EAAA;AAWc,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,MAAM,EAAA,EAAA,GAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEVtE,oBAAoB,CAAA;AACtB,IAAA,EAAE,GAAG,KAAK,CAAC,QAAQ,wEAAU;IAC7B,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;IAClC,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;AACnC,IAAA,aAAa,GAAG,KAAK,CAAC,KAAK,oFAAC;AAC5B,IAAA,SAAS,GAAG,KAAK,CAAC,KAAK,gFAAC;AACxB,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;AACvB,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;AAEzB,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,6EAAC;AAE7B,IAAA,QAAQ,GAAyB,MAAM,KAAK,CAAC;AAC7C,IAAA,SAAS,GAAe,MAAM,KAAK,CAAC;AAE3B,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QACnC,OAAO;AACL,YAAA,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE;SAC/B;AACH,IAAA,CAAC,kFAAC;AAEO,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;AACL,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,oBAAoB,EAAE,IAAI,CAAC,QAAQ,EAAE;SACtC;AACH,IAAA,CAAC,8EAAC;AAEF,IAAA,UAAU,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;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,aAAa,CAAC,KAAY,EAAA;AACxB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAC1D,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtB,IAAI,CAAC,SAAS,EAAE;IAClB;wGA5CW,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,cAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,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,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,SAAA,EATpB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,oBAAoB,CAAC;AACnD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1BH,gkBAoBA,EAAA,MAAA,EAAA,CAAA,4tIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDHY,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAY/B,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAdhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,WACf,CAAC,WAAW,EAAE,mBAAmB,CAAC,EAAA,SAAA,EAGhC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,0BAA0B,CAAC;AACnD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,gkBAAA,EAAA,MAAA,EAAA,CAAA,4tIAAA,CAAA,EAAA;;;MEJpC,yBAAyB,CAAA;AAC3B,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAU;IAC/B,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IACxB,kBAAkB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IACpC,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC1B,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IACxB,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAQrB;AACM,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,6EAAC;AAE9B,IAAA,MAAM,GAAG,MAAM,CAAW,EAAE,6EAAC;AAC7B,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;QACtC,OAAO;AACL,YAAA,gBAAgB,EAAE,IAAI;AACtB,YAAA,wBAAwB,EAAE,IAAI,CAAC,MAAM,EAAE;SACxC;AACH,IAAA,CAAC,qFAAC;AAEF,IAAA,QAAQ,GAA0B,MAAM,KAAK,CAAC;AAC9C,IAAA,SAAS,GAAe,MAAM,KAAK,CAAC;AAEpC,IAAA,UAAU,CAAC,KAAe,EAAA;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAC9B;AAEA,IAAA,gBAAgB,CAAC,EAA6B,EAAA;AAC5C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;IAEA,eAAe,CAAC,KAAY,EAAE,GAAW,EAAA;AACvC,QAAA,MAAM,SAAS,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;QAC5D,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAEjC,IAAI,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACtC,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAClB;aAAO,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;AACjC,YAAA,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACzB;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA,IAAA,SAAS,CAAC,KAAa,EAAA;QACrB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;IACtC;AAEA,IAAA,qBAAqB,CAAC,MAA+B,EAAA;QACnD,OAAO;AACL,YAAA,iBAAiB,EAAE,IAAI;AACvB,YAAA,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS;SACjC;IACH;wGAjEW,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,oBAAA,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,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,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,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,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,SAAA,EATzB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,yBAAyB,CAAC;AACxD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBH,m4BA4BA,EAAA,MAAA,EAAA,CAAA,+qSAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDLa,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAbrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,SAAA,EAGnB;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,+BAA+B,CAAC;AACxD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,m4BAAA,EAAA,MAAA,EAAA,CAAA,+qSAAA,CAAA,EAAA;;;AElBjD;;AAEG;MAOU,mBAAmB,CAAA;AAC9B;;AAEG;AACM,IAAA,WAAW,GAAG,KAAK,CAAwB,YAAY,kFAAC;AACjE;;AAEG;AACM,IAAA,UAAU,GAAG,KAAK,CAAuB,SAAS,iFAAC;AAC5D;;AAEG;AACM,IAAA,IAAI,GAAG,KAAK,CAAiB,GAAG,2EAAC;AAEjC,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;YACL,CAAC,CAAA,QAAA,EAAW,IAAI,CAAC,WAAW,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,WAAW,EAAE;AACrD,YAAA,CAAC,uBAAuB,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE,GACzC,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,SAAS;AACtD,YAAA,CAAC,uBAAuB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;SAC3E;AACH,IAAA,CAAC,8EAAC;wGArBS,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,ydCZhC,0HAIA,EAAA,MAAA,EAAA,CAAA,0nCAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDQa,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;+BACE,aAAa,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,0HAAA,EAAA,MAAA,EAAA,CAAA,0nCAAA,CAAA,EAAA;;;MEOpC,iBAAiB,CAAA;IACnB,EAAE,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,IAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AACpB,IAAA,aAAa,GAAG,YAAY,CAAuB,OAAO,oFAAC;AAC3D,IAAA,mBAAmB,GAAG,YAAY,CAAuB,iBAAiB,0FAAC;AAC3E,IAAA,YAAY,GAAG,YAAY,CAAuB,UAAU,mFAAC;IAC7D,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;AACpC,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;AAC/B,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;IACjC,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;IACvC,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;AAErC,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;AACL,YAAA,8BAA8B,EAAE,IAAI;AACpC,YAAA,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE;AAC1B,YAAA,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE;SAC/B;AACH,IAAA,CAAC,8EAAC;wGAjBS,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,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,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,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjB9B,4yBA4BA,EAAA,MAAA,EAAA,CAAA,2qJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDdY,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGf,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAP7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,WAGZ,CAAC,gBAAgB,CAAC,EAAA,eAAA,EACV,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4yBAAA,EAAA,MAAA,EAAA,CAAA,2qJAAA,CAAA,EAAA;kKAIa,OAAO,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CACD,iBAAiB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CACxB,UAAU,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEb1D,sBAAsB,CAAA;AACxB,IAAA,EAAE,GAAG,KAAK,CAAC,QAAQ,wEAAU;AAC7B,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAU;IACjC,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;IAC7C,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;AACtC,IAAA,OAAO,GAAG,KAAK,CAAC,KAAK,8EAAC;AACtB,IAAA,SAAS,GAAG,KAAK,CAAC,KAAK,gFAAC;IACxB,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;wGAPnC,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,s9BCRnC,mnBAyBA,EAAA,MAAA,EAAA,CAAA,ssKAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDjBa,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;+BACE,iBAAiB,EAAA,eAAA,EAGV,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,mnBAAA,EAAA,MAAA,EAAA,CAAA,ssKAAA,CAAA,EAAA;;;MEOpC,sBAAsB,CAAA;AACxB,IAAA,EAAE,GAAG,KAAK,CAAC,QAAQ,wEAAU;AAC7B,IAAA,UAAU,GAAG,KAAK,CAA0B,UAAU,iFAAC;AACvD,IAAA,IAAI,GAAG,KAAK,CAAoB,GAAG,2EAAC;IACpC,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAW;IAC3B,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAW;IACxB,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAW;AAC3B,IAAA,IAAI,GAAG,KAAK,CAAoB,QAAQ,2EAAC;IACzC,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC3B,SAAS,GAAG,MAAM,EAAc;AAEhC,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;AACL,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,wBAAwB,EAAE,IAAI;YAC9B,CAAC,CAAA,WAAA,EAAc,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,UAAU,EAAE;YACtD,CAAC,CAAA,WAAA,EAAc,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE;AAC1C,YAAA,kBAAkB,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK;AACzC,YAAA,qBAAqB,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK;SAChD;AACH,IAAA,CAAC,8EAAC;AAEF,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5B;wGAzBW,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,ylCCbnC,kSAYA,EAAA,MAAA,EAAA,CAAA,yjXAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDCa,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;+BACE,iBAAiB,EAAA,eAAA,EAGV,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,kSAAA,EAAA,MAAA,EAAA,CAAA,yjXAAA,CAAA,EAAA;;;MEFpC,mCAAmC,CAAA;AACrC,IAAA,YAAY,GAAG,KAAK,CAAS,CAAC,mFAAC;AAC/B,IAAA,IAAI,GAAG,KAAK,CAAiC,GAAG,2EAAC;AACjD,IAAA,SAAS,GAAG,KAAK,CAAS,cAAc,gFAAC;AAEzC,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,OAAO,GAAG,CAAC,8BAA8B,CAAC;AAChD,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC;AACxE,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC;AACxE,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC;AACxE,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,8EAAC;wGAXS,mCAAmC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mCAAmC,4eCThD,oWAWA,EAAA,MAAA,EAAA,CAAA,ijBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDFa,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBAN/C,SAAS;+BACE,gCAAgC,EAAA,eAAA,EAGzB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,oWAAA,EAAA,MAAA,EAAA,CAAA,ijBAAA,CAAA,EAAA;;;ME4BpC,4BAA4B,CAAA;AAC9B,IAAA,MAAM,GAAG,KAAK,CAA4B,QAAQ,6EAAC;AACnD,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;AAC/B,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;IACjC,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAC9B,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAClC,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAQ;IAC7B,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA0B;AACjD,IAAA,gBAAgB,GAAG,KAAK,CAAS,OAAO,uFAAC;AACzC,IAAA,iBAAiB,GAAG,KAAK,CAAS,QAAQ,wFAAC;AAC3C,IAAA,kBAAkB,GAAG,KAAK,CAAS,SAAS,yFAAC;IAE7C,MAAM,GAAG,MAAM,EAAQ;IACvB,KAAK,GAAG,MAAM,EAAQ;IACtB,OAAO,GAAG,MAAM,EAAQ;AAExB,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,+EAAC;AAE3C,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE;QACzC,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC;;AAGA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3C,OAAO,CAAA,EAAG,IAAI,CAAA,GAAA,EAAM,IAAI,CAAC,IAAI,IAAI,cAAc,CAAA,CAAE;AACnD,IAAA,CAAC,+EAAC;AAEO,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,QAAQ,+EAAC;AAErD,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QACrC,IAAI,IAAI,CAAC,OAAO,EAAE;AAAE,YAAA,OAAO,OAAO;QAClC,IAAI,IAAI,CAAC,SAAS,EAAE;AAAE,YAAA,OAAO,SAAS;AACtC,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC,oFAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;AAClC,QAAA,OAAO,KAAK,KAAK,SAAS,GAAG,CAAA,uBAAA,EAA0B,KAAK,CAAA,CAAE,GAAG,EAAE;AACrE,IAAA,CAAC,oFAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,KAAK,SAAS,kFAAC;AAEhE,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;AAClC,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,OAAO,EAAE,aAAa;AACtB,YAAA,OAAO,EAAE,WAAW;AACpB,YAAA,KAAK,EAAE,eAAe;SACvB;AACD,QAAA,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB,IAAA,CAAC,gFAAC;AAEO,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,wFAAC;AAE1E,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,yFAAC;IAErF,QAAQ,GAAA;QACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B;IAEA,OAAO,GAAA;QACL,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC9B;IAEA,SAAS,GAAA;QACP,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAChC;AAEQ,IAAA,cAAc,CAAC,KAAa,EAAA;QAClC,IAAI,KAAK,KAAK,CAAC;AAAE,YAAA,OAAO,SAAS;QAEjC,MAAM,CAAC,GAAG,IAAI;QACd,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QACzC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEnD,OAAO,UAAU,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;IACzE;wGA/EW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,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,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,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,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,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,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,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnCzC,u1GAwGA,EAAA,MAAA,EAAA,CAAA,g9HAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDlFI,mCAAmC,0HACnC,kBAAkB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,aAAa,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,mBAAmB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,SAAS,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACT,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,SAAS,6EACT,WAAW,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,KAAK,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,eAAe,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGN,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAnBxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,eAAA,EAGjB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,mCAAmC;wBACnC,kBAAkB;wBAClB,aAAa;wBACb,mBAAmB;wBACnB,SAAS;wBACT,mBAAmB;wBACnB,sBAAsB;wBACtB,SAAS;wBACT,WAAW;wBACX,KAAK;wBACL,eAAe;AAChB,qBAAA,EAAA,QAAA,EAAA,u1GAAA,EAAA,MAAA,EAAA,CAAA,g9HAAA,CAAA,EAAA;;;MEVU,wBAAwB,CAAA;;AAE1B,IAAA,EAAE,GAAG,KAAK,CAAC,QAAQ,wEAAU;IAC7B,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IACvB,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC1B,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AACxB,IAAA,kBAAkB,GAAG,KAAK,CAAS,EAAE,yFAAC;AACtC,IAAA,WAAW,GAAG,KAAK,CAAU,IAAI,kFAAC;AAClC,IAAA,aAAa,GAAG,KAAK,CAAU,IAAI,oFAAC;AACpC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,aAAa,GAAG,KAAK,CAAU,IAAI,oFAAC;IACpC,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AACxB,IAAA,KAAK,GAAG,KAAK,CAAS,aAAa,4EAAC;AACpC,IAAA,QAAQ,GAAG,KAAK,CAAS,IAAI,+EAAC;AAC9B,IAAA,iBAAiB,GAAG,KAAK,CAAS,gBAAgB,wFAAC;;AAGnD,IAAA,MAAM,GAAG,KAAK,CAAwB,QAAQ,6EAAC;IAC/C,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAC9B,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;AAC/B,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAClC,IAAA,gBAAgB,GAAG,KAAK,CAAS,OAAO,uFAAC;AACzC,IAAA,iBAAiB,GAAG,KAAK,CAAS,QAAQ,wFAAC;AAC3C,IAAA,kBAAkB,GAAG,KAAK,CAAS,SAAS,yFAAC;IAC7C,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC7B,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA0B;;IAGjD,SAAS,GAAG,MAAM,EAAQ;IAC1B,WAAW,GAAG,MAAM,EAAQ;;AAG5B,IAAA,KAAK,GAAG,MAAM,CAAS,EAAE,4EAAC;AAC1B,IAAA,SAAS,GAAG,MAAM,CAAU,KAAK,gFAAC;;AAGlC,IAAA,YAAY,GAAG,KAAK,CAAS,EAAE,mFAAC;AAEhC,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,0BAA0B,EAAE,IAAI,CAAC,WAAW,EAAE;AAC/C,KAAA,CAAC,8EAAC;AAEM,IAAA,YAAY,GAAG,QAAQ,CAAC,OAAO;AACtC,QAAA,gCAAgC,EAAE,IAAI,CAAC,QAAQ,EAAE;AACjD,QAAA,+BAA+B,EAAE,IAAI,CAAC,SAAS,EAAE;AAClD,KAAA,CAAC,mFAAC;IAEM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AACtD,IAAA,SAAS,GAAG,SAAS,CAA+B,WAAW,gFAAC;IAEzE,QAAQ,GAAA;AACN,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;AACnC,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;QACzB;IACF;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE;AACjC,QAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;AAC3D,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC1B;AAEA,IAAA,YAAY,CAAC,IAAU,EAAA;AACrB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE;AACjC,QAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;AACjE,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC1B;AAEA,IAAA,WAAW,CAAC,IAAU,EAAA;AACpB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;AAEA,IAAA,aAAa,CAAC,IAAU,EAAA;AACtB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B;AAEA,IAAA,YAAY,CAAC,KAAY,EAAA;AACvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;AAC/C,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE;YAChB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAEzC,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;;AAExB,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE;AACjC,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,QAAQ,CAAC,CAAC;YAChD;iBAAO;;AAEL,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC1B;QACF;IACF;AAEA,IAAA,MAAM,CAAC,KAAgB,EAAA;QACrB,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AAEzB,QAAA,IAAI,KAAK,CAAC,YAAY,EAAE,KAAK,EAAE;AAC7B,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC;AAErD,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;;AAExB,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE;AACjC,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,QAAQ,CAAC,CAAC;YAChD;iBAAO;;AAEL,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC1B;QACF;IACF;IAEA,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QAErB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa;QAC7C,KAAK,EAAE,KAAK,EAAE;IAChB;AAEA,IAAA,UAAU,CAAC,KAAgB,EAAA;QACzB,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAC1B;AAEA,IAAA,WAAW,CAAC,KAAgB,EAAA;QAC1B,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;IAC3B;wGA/HW,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,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,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,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,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,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,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,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,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,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,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,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,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,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,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,WAAA,EAAA,aAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBrC,4yEAyEA,EAAA,MAAA,EAAA,CAAA,mvuBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDpDY,4BAA4B,gRAAE,QAAQ,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAErC,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;+BACE,mBAAmB,EAAA,eAAA,EAGZ,uBAAuB,CAAC,MAAM,WACtC,CAAC,4BAA4B,EAAE,QAAQ,CAAC,EAAA,QAAA,EAAA,4yEAAA,EAAA,MAAA,EAAA,CAAA,mvuBAAA,CAAA,EAAA;kjFAmDY,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ME5D7D,gBAAgB,CAAA;IAClB,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;IAClC,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;AACpC,IAAA,UAAU,GAAG,KAAK,CAAoB,UAAU,iFAAC;AACjD,IAAA,IAAI,GAAG,KAAK,CAAc,GAAG,2EAAC;AAC9B,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,6EAAC;AAC9B,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,6EAAC;AAC9B,IAAA,YAAY,GAAG,KAAK,CAAsB,MAAM,mFAAC;AACjD,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;AAC/B,IAAA,WAAW,GAAG,KAAK,CAAgB,IAAI,kFAAC;AAEhC,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,EAAE;AAC3D,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;IAEc,UAAU,GAAG,MAAM,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAElE,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;AACL,YAAA,MAAM,EAAE,IAAI;YACZ,CAAC,CAAA,MAAA,EAAS,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,UAAU,EAAE;YACjD,CAAC,CAAA,MAAA,EAAS,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE;YACrC,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AAChD,YAAA,mBAAmB,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE;AACnC,YAAA,cAAc,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,IAAI,KAAK;AACxD,YAAA,2BAA2B,EAAE,IAAI,CAAC,OAAO,EAAE;SAC5C;AACH,IAAA,CAAC,8EAAC;wGA3BS,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,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,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,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,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,QAAA,EAAA,EAAA,EAAA,QAAA,ECZ7B,uqCA+CA,EAAA,MAAA,EAAA,CAAA,8wEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxCY,gBAAgB,oJAAE,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,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAK3B,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;+BACE,UAAU,EAAA,OAAA,EACX,CAAC,gBAAgB,EAAE,UAAU,CAAC,EAAA,eAAA,EAGtB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,uqCAAA,EAAA,MAAA,EAAA,CAAA,8wEAAA,CAAA,EAAA;;;MEDpC,kBAAkB,CAAA;AACpB,IAAA,UAAU,GAAG,KAAK,CAAsB,UAAU,iFAAC;AACnD,IAAA,IAAI,GAAG,KAAK,CAAgB,GAAG,2EAAC;IAChC,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAEtB,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;AACL,YAAA,QAAQ,EAAE,IAAI;YACd,CAAC,CAAA,QAAA,EAAW,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE;YACvC,CAAC,CAAA,QAAA,EAAW,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,UAAU,EAAE;YACnD,CAAC,CAAA,oBAAA,CAAsB,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;SAC7C;AACH,IAAA,CAAC,8EAAC;AAEO,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,QAAQ,IAAI,CAAC,IAAI,EAAE;AACjB,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,WAAW;AACpB,YAAA,KAAK,GAAG;AACN,gBAAA,OAAO,WAAW;AACpB,YAAA,KAAK,GAAG;AACN,gBAAA,OAAO,WAAW;AACpB,YAAA;AACE,gBAAA,OAAO,WAAW;;AAExB,IAAA,CAAC,8EAAC;AAEO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,QAAQ,IAAI,CAAC,IAAI,EAAE;AACjB,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,CAAC;AACV,YAAA,KAAK,GAAG;AACN,gBAAA,OAAO,CAAC;AACV,YAAA,KAAK,GAAG;AACN,gBAAA,OAAO,EAAE;AACX,YAAA;AACE,gBAAA,OAAO,CAAC;;AAEd,IAAA,CAAC,mFAAC;wGAtCS,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,mcCT/B,4bAgBA,EAAA,MAAA,EAAA,CAAA,i4FAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDPa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;+BACE,YAAY,EAAA,eAAA,EAGL,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4bAAA,EAAA,MAAA,EAAA,CAAA,i4FAAA,CAAA,EAAA;;;MEEpC,0BAA0B,CAAA;AAC5B,IAAA,KAAK,GAAG,KAAK,CAAS,YAAY,4EAAC;AACnC,IAAA,OAAO,GAAG,KAAK,CAAU,IAAI,8EAAC;wGAF5B,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,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,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECTvC,8SAQA,EAAA,MAAA,EAAA,CAAA,oaAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDHY,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAIjB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBANtC,SAAS;+BACE,qBAAqB,EAAA,OAAA,EACtB,CAAC,kBAAkB,CAAC,EAAA,QAAA,EAAA,8SAAA,EAAA,MAAA,EAAA,CAAA,oaAAA,CAAA,EAAA;;;AEL/B;MAsBa,iBAAiB,CAAA;AACnB,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;AAChC,IAAA,IAAI,GAAG,KAAK,CAAe,GAAG,2EAAC;AAC/B,IAAA,cAAc,GAAG,KAAK,CAAC,IAAI,qFAAC;AAC5B,IAAA,eAAe,GAAG,KAAK,CAAC,IAAI,sFAAC;AAC7B,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,6EAAC;AAE9B,IAAA,SAAS,GAAG,YAAY,CAAoB,aAAa,gFAAC;AAE1D,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE;AACxB,QAAA,CAAC,CAAA,OAAA,EAAU,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AAC/C,KAAA,CAAC,8EAAC;IAEH,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAC1B,IAAI,CAAC,KAAK,EAAE;QACd;IACF;wGA3BW,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,43BCtB9B,q/BAuCA,EAAA,MAAA,EAAA,CAAA,2gGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtBY,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,2EAAW,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKzD,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAP7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,OAAA,EACZ,CAAC,sBAAsB,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAGpD,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,q/BAAA,EAAA,MAAA,EAAA,CAAA,2gGAAA,CAAA,EAAA;8lBASM,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEjBvD,YAAY,GAAG,IAAI,cAAc,CAAiB,cAAc;MAChE,UAAU,GAAG,IAAI,cAAc,CAAU,YAAY;AAE3D,MAAM,oBAAoB,GAA4B;AAC3D,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,eAAe,EAAE,IAAI;AACrB,IAAA,aAAa,EAAE,IAAI;;;MCdR,WAAW,CAAA;AAaO,IAAA,UAAA;AAZZ,IAAA,YAAY,GAAG,IAAI,OAAO,EAAiB;AAC3C,IAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;AAE1C,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,6EAAC;AACtB,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,4EAAC;AAClB,IAAA,IAAI,GAAG,MAAM,CAAe,GAAG,2EAAC;AAChC,IAAA,cAAc,GAAG,MAAM,CAAC,IAAI,qFAAC;AAC7B,IAAA,eAAe,GAAG,MAAM,CAAC,IAAI,sFAAC;AAC9B,IAAA,aAAa,GAAG,MAAM,CAAC,IAAI,oFAAC;IAE7B,iBAAiB,GAAG,GAAG;AAE/B,IAAA,WAAA,CAA6B,UAAsB,EAAA;QAAtB,IAAA,CAAA,UAAU,GAAV,UAAU;IAAe;IAEtD,IAAI,GAAA;QACF,qBAAqB,CAAC,MAAK;AACzB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACxB,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC9B,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,KAAK,CAAC,MAAU,EAAA;AACd,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QAEtB,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC9B,QAAA,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAC5B;IAEA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;IAEA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;AACD;;MCpBY,uBAAuB,CAAA;AACzB,IAAA,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;AAC9B,IAAA,MAAM,GAAG,MAAM,CAAiB,YAAY,CAAC;AAE7C,IAAA,YAAY,GAAG,SAAS,CAAC,eAAe,mFAAC;IAElD,SAAS,GAA6B,IAAI;IAElC,YAAY,GAAiC,IAAI;AAEhD,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AACjC,QAAA,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG;AACjE,KAAA,CAAC,8EAAC;IAEM,SAAS,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEhF,IAAA,eAAe,CAAI,SAAkB,EAAA;AACnC,QAAA,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,SAAS,CAAC;AAC7C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;QAElC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC;QACnD;QAEA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC;QACxD,OAAO,IAAI,CAAC,YAA+B;IAC7C;AAEA,IAAA,cAAc,CAAC,GAAsB,EAAA;AACnC,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG;IACtB;AAEA,IAAA,eAAe,CAAC,KAAiB,EAAA;QAC/B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE;AACnC,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;QACvB;IACF;IAGA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE;AAC3D,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;QACvB;IACF;wGA9CW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAIA,eAAe,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7BnD,wkCAwCA,EAAA,MAAA,EAAA,CAAA,2gGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDpBY,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKjE,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,OAAA,EACtB,CAAC,sBAAsB,EAAE,OAAO,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAA,eAAA,EAG5D,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wkCAAA,EAAA,MAAA,EAAA,CAAA,2gGAAA,CAAA,EAAA;8FAMb,eAAe,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA;sBAqChD,YAAY;uBAAC,gBAAgB;;;AElEhC;MAca,eAAe,CAAA;AACT,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAE5C,IAAI,CAA8B,SAAkB,EAAE,MAAyB,EAAA;AAC7E,QAAA,MAAM,YAAY,GAAsB;AACtC,YAAA,GAAG,oBAAoB;AACvB,YAAA,GAAG,MAAM;SACW;AAEtB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE;AACvC,QAAA,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAI,UAAU,CAAC;QAE/C,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,GAAG,CAAC;QAC3C,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,IAAI,IAAI,CAAC;QAChE,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,IAAI,IAAI,CAAC;QAClE,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,aAAa,IAAI,IAAI,CAAC;AAE9D,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,QAAQ;AACrB,YAAA,SAAS,EAAE;AACT,gBAAA,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE;AAC5C,gBAAA,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE;gBACjD,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE;AACrD,aAAA;AACF,SAAA,CAAC;QAEF,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,uBAAuB,EAAE,IAAI,EAAE,QAAQ,CAAC;QACpF,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC;;AAGvD,QAAA,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC;QAEhD,QAAQ,CAAC,IAAI,EAAE;AAEf,QAAA,OAAO,QAAQ;IACjB;IAEQ,aAAa,GAAA;AACnB,QAAA,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;AAC/B,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,kBAAkB,EAAE,CAAC,gBAAgB,EAAE;YAC1F,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE;AACtD,SAAA,CAAC;QAEF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC;wGA/CW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cADF,MAAM,EAAA,CAAA;;4FACnB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCNrB,uBAAuB,CAAA;AACjB,IAAA,GAAG,GAAG,MAAM,EAAC,WAAiB,EAAC;AAC/B,IAAA,SAAS,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAE5D,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAK;YACnB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;AACzC,QAAA,CAAC,CAAC;IACJ;wGARW,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,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;;;MCMY,uBAAuB,CAAA;AACzB,IAAA,KAAK,GAAG,KAAK,CAAS,CAAC,4EAAC;AACxB,IAAA,UAAU,GAAG,KAAK,CAA2B,UAAU,iFAAC;AACxD,IAAA,IAAI,GAAG,KAAK,CAAqB,GAAG,2EAAC;AAErC,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;AACL,YAAA,iBAAiB,EAAE,IAAI;YACvB,CAAC,CAAA,iBAAA,EAAoB,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,UAAU,EAAE;YAC5D,CAAC,CAAA,iBAAA,EAAoB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE;SACjD;AACH,IAAA,CAAC,8EAAC;wGAXS,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,wfCZpC,oDACA,EAAA,MAAA,EAAA,CAAA,s9BAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDWa,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBATnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,eAAA,EAGX,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,OAAO,EAAE,gBAAgB;AAC1B,qBAAA,EAAA,QAAA,EAAA,oDAAA,EAAA,MAAA,EAAA,CAAA,s9BAAA,CAAA,EAAA;;;MEFU,mBAAmB,CAAA;IACrB,aAAa,GAAG,MAAM,EAAQ;IAC9B,eAAe,GAAG,MAAM,EAAQ;AAEzC;;AAEG;IACM,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAW;AAErC;;AAEG;IACM,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAE7B,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;AACL,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE;SAC/B;AACH,IAAA,CAAC,8EAAC;IAEF,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;IAC3B;AAEA,IAAA,IAAI,KAAI;wGAzBG,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,kbCRhC,kRAWA,EAAA,MAAA,EAAA,CAAA,ywBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDHa,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;+BACE,aAAa,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,kRAAA,EAAA,MAAA,EAAA,CAAA,ywBAAA,CAAA,EAAA;;;MEmBpC,kBAAkB,CAAA;IACpB,EAAE,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,IAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AACpB,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAU;IAC/B,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAqB;IACpC,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAC7B,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,IAAI,GAAG,KAAK,CAAgB,GAAG,2EAAC;AAEhC,IAAA,MAAM,GAAG,MAAM,CAAiB,IAAI,6EAAC;AAE9C,IAAA,QAAQ,GAAoC,MAAM,KAAK,CAAC;AACxD,IAAA,SAAS,GAAe,MAAM,KAAK,CAAC;AAEpC,IAAA,UAAU,CAAC,KAAqB,EAAA;AAC9B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;AAEA,IAAA,gBAAgB,CAAC,EAAmC,EAAA;AAClD,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,YAAY,CAAC,KAAY,EAAA;AACvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA2B;AAChD,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK;AAC1B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IACtB;AAES,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QACnC,OAAO;AACL,YAAA,QAAQ,EAAE,IAAI;YACd,CAAC,CAAA,QAAA,EAAW,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE;SACxC;AACH,IAAA,CAAC,kFAAC;AAEO,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;AACL,YAAA,iBAAiB,EAAE,IAAI;AACvB,YAAA,kBAAkB,EAAE,IAAI,CAAC,QAAQ,EAAE;AACnC,YAAA,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE;SAC/B;AACH,IAAA,CAAC,8EAAC;wGA/CS,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,YAAA,EAAA,MAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,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,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,SAAA,EAVlB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,kBAAkB,CAAC;AACjD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrBH,+oBAwBA,07FDFY,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGV,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAd9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,SAAA,EAGX;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,wBAAwB,CAAC;AACjD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,OAAA,EACQ,CAAC,WAAW,CAAC,EAAA,eAAA,EACL,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+oBAAA,EAAA,MAAA,EAAA,CAAA,m4FAAA,CAAA,EAAA;;;MEapC,sBAAsB,CAAA;AACxB,IAAA,EAAE,GAAG,KAAK,CAAC,QAAQ,wEAAU;AAC7B,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;AAC/B,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,6EAAqC;AAC7D,IAAA,WAAW,GAAG,KAAK,CAAS,aAAa,kFAAC;AAC1C,IAAA,gBAAgB,GAAG,KAAK,CAAgC,QAAQ,uFAAC;AACjE,IAAA,UAAU,GAAG,KAAK,CAA0B,GAAG,iFAAC;IAEhD,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IACvB,WAAW,GAAG,MAAM,EAAU;AAE9B,IAAA,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,oFAAC;AAExC,IAAA,YAAY,GAAG,QAAQ,CAC9B,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,mFAClF;AAEQ,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,kFAAC;IACvD,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,iFAAC;AAE9E,IAAA,eAAe,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,sFACzF;IAED,QAAQ,GAAA;AACN,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AACxC,QAAA,IAAI,YAAY,GAAG,CAAC,EAAE;AACpB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK;AACvD,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;AAChC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QACjC;IACF;IAEA,IAAI,GAAA;AACF,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;QACxC,IAAI,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5C,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK;AACvD,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;AAChC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QACjC;IACF;AAEA,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;IAC/B;wGA7CW,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,0gCCpCnC,k5DA8EA,EAAA,MAAA,EAAA,CAAA,+OAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDvDI,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,aAAa,iFACb,cAAc,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,WAAA,EAAA,IAAA,EACX,aAAa,iFACb,cAAc,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAML,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAhBlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,OAAA,EACjB;wBACP,sBAAsB;wBACtB,kBAAkB;wBAClB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,WAAW;wBACX,aAAa;wBACb,cAAc;qBACf,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,k5DAAA,EAAA,MAAA,EAAA,CAAA,+OAAA,CAAA,EAAA;;;AEdjD;;;AAGG;MAwBU,yBAAyB,CAAA;AA8BhB,IAAA,UAAA;AAAkD,IAAA,QAAA;AA7B7D,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,UAAU,GAAG,KAAK,CAAS,eAAe,iFAAC;IAC3C,WAAW,GAAG,KAAK,CAAiC;AAC3D,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,IAAI,EAAE,MAAM;AACb,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IAEM,OAAO,GAAuB,IAAI;IAClC,WAAW,GAAuB,IAAI;IACtC,YAAY,GAAuB,IAAI;IACvC,qBAAqB,GAA6C,IAAI;AACtE,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC/C,IAAA,MAAM,GAAG,MAAM,CAAS,EAAE,6EAAC;AAC7B,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,iFAAC;IAEzB,SAAS,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,GAAG,UAAU,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IACrE,WAAW,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IACpE,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC,kFAAC;;IAGnF,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE;IACtB;AAEA,IAAA,QAAQ,GAA4B,MAAM,KAAK,CAAC;AAChD,IAAA,SAAS,GAAe,MAAM,KAAK,CAAC;IAEpC,WAAA,CAAoB,UAAwC,EAAU,QAAmB,EAAA;QAArE,IAAA,CAAA,UAAU,GAAV,UAAU;QAAwC,IAAA,CAAA,QAAQ,GAAR,QAAQ;IAAc;IAE5F,eAAe,GAAA;QACb,IAAI,CAAC,SAAS,EAAE;IAClB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE;QACtC;IACF;IAEQ,SAAS,GAAA;AACf,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AAC3C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa;AAElC,QAAA,IAAI,CAAC,MAAM;YAAE;;QAGb,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC;QACtD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC;AAElD,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC;QACpD;;AAGA,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;;QAGvD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;;AAG9C,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB,IAAI,CAAC,iBAAiB,EAAE;QAC1B;;QAGA,IAAI,CAAC,kBAAkB,EAAE;IAC3B;IAEQ,iBAAiB,GAAA;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QAEnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACxD,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC;QAC9D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,0BAA0B,CAAC;AACpE,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;;AAGxE,QAAA,IAAI,CAAC,qBAAqB,GAAG,eAAe,CAAC,mBAAmB,EAAE;YAChE,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;AAC9C,SAAA,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,aAAa;QACrE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,wBAAwB,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,aAAa,EAAE,MAAM,CAAC;QAE9D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;AACxD,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QAElE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;AAClD,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC;;QAGzD,IAAI,CAAC,2BAA2B,EAAE;IACpC;IAEQ,kBAAkB,GAAA;QACxB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;;QAGnB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACzD,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC;AAC/D,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC;QACnD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC;QACtD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC;;AAG1D,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;;QAG/E,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC;AAE3D,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;IAC5D;IAEQ,2BAA2B,GAAA;QACjC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;AAE5C,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;AACtB,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC;QAC9D;aAAO;AACL,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC;QAC7D;IACF;AAEQ,IAAA,sBAAsB,CAAC,aAA2B,EAAA;AACxD,QAAA,MAAM,MAAM,GAAG,aAAa,IAAI,IAAI,CAAC,YAAY;AACjD,QAAA,IAAI,CAAC,MAAM;YAAE;QAEb,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI;QAClF,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC;AACtD,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IACxE;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,CAAC;AACrE,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,2BAA2B,EAAE;IACpC;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,sBAAsB,EAAE;IAC/B;AAEA,IAAA,OAAO,CAAC,KAAY,EAAA;AAClB,QAAA,MAAM,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK;AACtD,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,2BAA2B,EAAE;IACpC;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;AACnC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,EAAE,eAAe,CAAC;QAClF,IAAI,CAAC,2BAA2B,EAAE;IACpC;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;wGA7KW,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,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,2BAAA,EAAA,MAAA,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,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,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,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,aAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,iDAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,MAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,EAAA,SAAA,EAlBzB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,yBAAyB,CAAC;AACxD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EATS,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wgmBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAqBD,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAvBrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,YAC3B,EAAE,EAAA,eAAA,EAEK,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,+BAA+B,CAAC;AACxD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,aAAA,EACc,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,SAAS,EAAE,+CAA+C;AAC1D,wBAAA,qBAAqB,EAAE,aAAa;AACpC,wBAAA,uBAAuB,EAAE,YAAY;AACrC,wBAAA,QAAQ,EAAE,aAAa;AACvB,wBAAA,SAAS,EAAE,iBAAiB;AAC5B,wBAAA,QAAQ,EAAE,aAAa;AACvB,wBAAA,YAAY,EAAE,YAAY;AAC3B,qBAAA,EAAA,MAAA,EAAA,CAAA,wgmBAAA,CAAA,EAAA;;;MCdU,wBAAwB,CAAA;AAClB,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAE/B,IAAA,EAAE,GAAG,KAAK,CAAC,QAAQ,wEAAU;AAC7B,IAAA,MAAM,GAAG,KAAK,CAAmB,CAAC,6EAAC;AACnC,IAAA,IAAI,GAAG,KAAK,CAAqB,SAAS,2EAAC;AAC3C,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,GAAG,GAA6B,MAAM,CAAC,EAAE,0EAAC;AAE1C,IAAA,SAAS,GAAG,YAAY,CAA+B,aAAa,gFAAC;IAEtE,MAAM,GAAG,EAAE;AAEZ,IAAA,QAAQ,GAA4B,MAAM,KAAK,CAAC;AAChD,IAAA,SAAS,GAAe,MAAM,KAAK,CAAC;AAElC,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,kBAAkB,EAAE,IAAI;AACxB,QAAA,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE;AAC/B,KAAA,CAAC,8EAAC;IAEH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3C,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9B;IACF;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;AACjC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACpF,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;IACtB;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;AAEQ,IAAA,UAAU,CAAC,KAAa,EAAA;AAC9B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,QAAA,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC,EAAE;AAC7C,YAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;gBACjC,IAAI,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE;AACpC,YAAA,CAAC,CAAC;QACJ;IACF;IAEA,OAAO,CAAC,KAAY,EAAE,KAAa,EAAA;AACjC,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;AACjC,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,MAA0B;AACrD,YAAA,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YAEjD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,UAAU,KAAI;AAC7B,gBAAA,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC;AAC9B,gBAAA,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;AACjC,gBAAA,OAAO,MAAM;AACf,YAAA,CAAC,CAAC;YAEF,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;YAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AACpC,YAAA,IAAI,CAAC,MAAM,GAAG,QAAQ;AACtB,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACvB,IAAI,GAAG,IAAI,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AACpC,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;YAC5B;YACA,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,CAAC;IACJ;IAEA,SAAS,CAAC,KAAoB,EAAE,KAAa,EAAA;AAC3C,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;YACjC,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,GAAG,CAAC,EAAE;AAC1C,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;YAC5B;AAAO,iBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;AAClE,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;YAC5B;AAAO,iBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;AACpC,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;YAChC;YACA,IAAI,CAAC,SAAS,EAAE;AAClB,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,CAAC,KAAoB,EAAE,KAAa,EAAA;AAC7C,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;AACjC,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE;gBACnC,KAAK,CAAC,cAAc,EAAE;gBAEtB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,UAAU,KAAI;AAC7B,oBAAA,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC;AAC9B,oBAAA,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE;AACtB,oBAAA,OAAO,MAAM;AACf,gBAAA,CAAC,CAAC;gBAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AACpC,gBAAA,IAAI,CAAC,MAAM,GAAG,QAAQ;AACtB,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACvB,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;AAC1B,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,OAAO,CAAC,KAAqB,EAAA;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;YACjC,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;YACzD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;AAE1E,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAE9E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AACpC,YAAA,IAAI,CAAC,MAAM,GAAG,QAAQ;AACtB,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,CAAC;IACJ;wGA9HW,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,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,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,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,SAAA,EATxB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,wBAAwB,CAAC;AACvD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5BH,4jBAqBA,EAAA,MAAA,EAAA,CAAA,6kFAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDUa,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAbpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAAA,SAAA,EAGZ;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,8BAA8B,CAAC;AACvD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4jBAAA,EAAA,MAAA,EAAA,CAAA,6kFAAA,CAAA,EAAA;mnBAciB,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEjBlE,4BAA4B,CAAA;AAC9B,IAAA,EAAE,GAAG,KAAK,CAAC,QAAQ,wEAAU;AAC7B,IAAA,IAAI,GAAG,KAAK,CAAS,yBAAyB,2EAAC;AAC/C,IAAA,IAAI,GAAG,KAAK,CAA0B,GAAG,2EAAC;AAC1C,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,GAAG,GAAG,KAAK,CAAS,CAAC,0EAAC;AACtB,IAAA,GAAG,GAAG,KAAK,CAAS,GAAG,0EAAC;AACxB,IAAA,IAAI,GAAG,KAAK,CAAS,CAAC,2EAAC;AACvB,IAAA,cAAc,GAAG,KAAK,CAAS,WAAW,qFAAC;AAC3C,IAAA,cAAc,GAAG,KAAK,CAAS,WAAW,qFAAC;AAE3C,IAAA,MAAM,GAAG,MAAM,CAAS,CAAC,6EAAC;AAE1B,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,mBAAmB,EAAE,IAAI;QACzB,CAAC,CAAA,mBAAA,EAAsB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE;AAClD,QAAA,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE;AAC/B,KAAA,CAAC,8EAAC;AAEK,IAAA,QAAQ,GAA4B,MAAM,KAAK,CAAC;AAChD,IAAA,SAAS,GAAe,MAAM,KAAK,CAAC;AAE5C,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;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,aAAa,CAAC,KAAY,EAAA;QACxB,IAAI,KAAK,GAAG,MAAM,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QAE5D,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;AACzD,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,EAAE;IAClB;IAEA,SAAS,GAAA;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAC/D,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,EAAE;IAClB;IAEA,SAAS,GAAA;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAC/D,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,EAAE;IAClB;wGAzDW,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,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,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,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,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,EAAA,SAAA,EAR5B;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,4BAA4B,CAAC;AAC3D,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxBH,61CAiDA,EAAA,MAAA,EAAA,CAAA,mtLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDnCY,MAAM,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,MAAM,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAYb,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAdxC,SAAS;+BACE,uBAAuB,EAAA,OAAA,EACxB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAA,eAAA,EAGR,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,kCAAkC,CAAC;AAC3D,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,61CAAA,EAAA,MAAA,EAAA,CAAA,mtLAAA,CAAA,EAAA;;;MEDU,iBAAiB,CAAA;AACnB,IAAA,EAAE,GAAG,KAAK,CAAC,QAAQ,wEAAU;IAC7B,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;IAClC,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;AACnC,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAEhC,IAAA,MAAM,GAAG,MAAM,CAAU,KAAK,6EAAC;AAExC,IAAA,QAAQ,GAAyB,MAAM,KAAK,CAAC;AAC7C,IAAA,SAAS,GAAe,MAAM,KAAK,CAAC;AAEpC,IAAA,YAAY,CAAC,KAAY,EAAA;AACvB,QAAA,MAAM,SAAS,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAC5D,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QACxB,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA,IAAA,UAAU,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;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;AAES,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;AACL,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE;SAC/B;AACH,IAAA,CAAC,8EAAC;wGApCS,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,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,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,SAAA,EARjB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,iBAAiB,CAAC;AAChD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrBH,yXAeA,EAAA,MAAA,EAAA,CAAA,s8EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDQa,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAb7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,eAAA,EAGJ,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,uBAAuB,CAAC;AAChD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,yXAAA,EAAA,MAAA,EAAA,CAAA,s8EAAA,CAAA,EAAA;;;MEIU,sBAAsB,CAAA;AACxB,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAU;AAC/B,IAAA,OAAO,GAAG,KAAK,CAAqE,EAAE,8EAAC;AACvF,IAAA,SAAS,GAAG,KAAK,CAAC,KAAK,gFAAC;AACxB,IAAA,MAAM,GAAG,KAAK,CAAC,KAAK,6EAAC;AAErB,IAAA,MAAM,GAAG,MAAM,CAAgB,IAAI,6EAAC;AAE7C,IAAA,QAAQ,GAA4B,MAAM,KAAK,CAAC;AAChD,IAAA,SAAS,GAAe,MAAM,KAAK,CAAC;AAEpC,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;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,MAAM,CAAC,KAAa,EAAA;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,EAAE;IAClB;AAES,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;AACL,YAAA,gBAAgB,EAAE,IAAI;AACtB,YAAA,wBAAwB,EAAE,IAAI,CAAC,MAAM,EAAE;SACxC;AACH,IAAA,CAAC,8EAAC;wGAlCS,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,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,SAAA,EAVtB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,sBAAsB,CAAC;AACrD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrBH,wbAeA,EAAA,MAAA,EAAA,CAAA,+5JAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDQY,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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;;4FAE7B,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAdlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,SAAA,EAGhB;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,4BAA4B,CAAC;AACrD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,iBAAiB,EAAE,WAAW,CAAC,EAAA,QAAA,EAAA,wbAAA,EAAA,MAAA,EAAA,CAAA,+5JAAA,CAAA,EAAA;;;MEd9B,qBAAqB,CAAA;AACvB,IAAA,MAAM,GAAG,KAAK,CAAqB,MAAM,6EAAC;AAC1C,IAAA,IAAI,GAAG,KAAK,CAAmB,GAAG,2EAAC;AAEnC,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;AACL,YAAA,eAAe,EAAE,IAAI;YACrB,CAAC,CAAA,eAAA,EAAkB,IAAI,CAAC,MAAM,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,MAAM,EAAE;YAClD,CAAC,CAAA,eAAA,EAAkB,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE;SAC/C;AACH,IAAA,CAAC,8EAAC;wGAVS,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,sUCTlC,uCACA,EAAA,MAAA,EAAA,CAAA,unBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDQa,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;+BACE,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,uCAAA,EAAA,MAAA,EAAA,CAAA,unBAAA,CAAA,EAAA;;;MEIpC,uBAAuB,CAAA;IACzB,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AACvB,IAAA,MAAM,GAAG,KAAK,CAAuB,MAAM,6EAAC;AAE5C,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;AACL,YAAA,iBAAiB,EAAE,IAAI;YACvB,CAAC,CAAA,iBAAA,EAAoB,IAAI,CAAC,MAAM,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,MAAM,EAAE;SACrD;AACH,IAAA,CAAC,8EAAC;wGATS,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,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,ECXpC,kJAIA,EAAA,MAAA,EAAA,CAAA,40CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDEY,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKpB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAPnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,WACnB,CAAC,qBAAqB,CAAC,EAAA,eAAA,EAGf,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,kJAAA,EAAA,MAAA,EAAA,CAAA,40CAAA,CAAA,EAAA;;;MEoBpC,8BAA8B,CAAA;AAChC,IAAA,EAAE,GAAG,KAAK,CAAS,qBAAqB,yEAAC;IACzC,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AACvB,IAAA,MAAM,GAAG,KAAK,CAA8B,MAAM,6EAAC;AACnD,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;IAChC,MAAM,GAAG,MAAM,EAAQ;IACvB,cAAc,GAAG,YAAY,CAAoB,aAAa,sFAAI,WAAW,EAAE,KAAK,EAAA,CAAG;IACvF,SAAS,GAAG,YAAY,CAAoB,QAAQ,iFAAI,WAAW,EAAE,KAAK,EAAA,CAAG;AAE7E,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,wBAAwB,EAAE,IAAI;QAC9B,CAAC,CAAA,wBAAA,EAA2B,IAAI,CAAC,MAAM,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5D,KAAA,CAAC,8EAAC;AAEM,IAAA,aAAa,GAA0B,QAAQ,CAAC,MAAK;AAC5D,QAAA,QAAQ,IAAI,CAAC,MAAM,EAAE;AACnB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,aAAa;AACtB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,eAAe;AACxB,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,aAAa;AACtB,YAAA;AACE,gBAAA,OAAO,YAAY;;AAEzB,IAAA,CAAC,oFAAC;IAEF,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;wGA7BW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA9B,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,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,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,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,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7B3C,4gCAkCA,EAAA,MAAA,EAAA,CAAA,ssFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDPY,OAAO,2EAAE,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEnE,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAP1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAAA,eAAA,EAGlB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,4gCAAA,EAAA,MAAA,EAAA,CAAA,ssFAAA,CAAA,EAAA;AAQrB,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,EAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,IAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,aAAa,EAAA,EAAA,GAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAC1C,QAAQ,EAAA,EAAA,GAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ME7B1E,eAAe,CAAA;AAC1B,IAAA,EAAE,GAAG,KAAK,CAAC,QAAQ,wEAAU;AAC7B,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;IAChC,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAiB;AAC7B,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;IACvB,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC5B,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA+B;wGANjC,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,yyBAHhB,CAAA,yBAAA,CAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAG1B,eAAe,EAAA,UAAA,EAAA,CAAA;kBAL3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,QAAQ,EAAE,CAAA,yBAAA,CAA2B;oBACrC,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAChD,iBAAA;;;MCqBY,gBAAgB,CAAA;AACO,IAAA,IAAI;IAEtC,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;AACzC,IAAA,OAAO,GAAG,KAAK,CAAC,IAAI,8EAAC;AACrB,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;AACvB,IAAA,aAAa,GAAG,KAAK,CAAS,CAAC,oFAAC;IAChC,SAAS,GAAG,KAAK,CAAe,EAAE,iFAAI,KAAK,EAAE,MAAM,EAAA,CAAG;AAE5C,IAAA,mBAAmB,GAAG,IAAI,YAAY,EAAU;AAE1D,IAAA,SAAS,GAAG,MAAM,CAAoB,EAAE,gFAAC;AACzC,IAAA,WAAW,GAAG,MAAM,CAAe,EAAE,kFAAC;AAEtC,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACxB,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;YACjC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAK;AAC/B,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AACzC,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,CAAC,qFAAC;AAErD,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,MAAM,EAAE,IAAI;AACZ,QAAA,gBAAgB,EAAE,IAAI,CAAC,QAAQ,EAAE;AAClC,KAAA,CAAC,8EAAC;AAEH,IAAA,aAAa,GAAG,CAAC,KAAa,KAAc,KAAK,KAAK,IAAI,CAAC,aAAa,EAAE;AAE1E,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,OAAO,QAAQ,CAAC,MAAK;YACnB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC;YACnC,OAAO;AACL,gBAAA,WAAW,EAAE,IAAI;AACjB,gBAAA,qBAAqB,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AAChD,gBAAA,qBAAqB,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE;aACzC;AACH,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,oBAAoB,CAAC,KAAa,EAAA;QAChC,OAAO,QAAQ,CAAC,MAAK;YACnB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC;YACrC,OAAO;AACL,gBAAA,WAAW,EAAE,IAAI;AACjB,gBAAA,qBAAqB,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AAChD,gBAAA,qBAAqB,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ;aACvC;AACH,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC;AACnC,QAAA,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE;YAAE;AAC5B,QAAA,IAAI,KAAK,KAAK,IAAI,CAAC,aAAa,EAAE,EAAE;AAClC,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;AACpC,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B;IACF;IAEA,iBAAiB,CAAC,KAAa,EAAE,GAAe,EAAA;QAC9C,IAAI,GAAG,CAAC,QAAQ;YAAE;AAClB,QAAA,IAAI,KAAK,KAAK,IAAI,CAAC,aAAa,EAAE,EAAE;AAClC,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;AACpC,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B;IACF;wGA5EW,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,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,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,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,MAAA,EAAA,SAAA,EACV,eAAe,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5BlC,6iHAuGA,45FD/EY,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,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,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGjD,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;+BACE,UAAU,EAAA,OAAA,EAGX,CAAC,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,CAAC,EAAA,eAAA,EAC5C,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6iHAAA,EAAA,MAAA,EAAA,CAAA,o2FAAA,CAAA,EAAA;;sBAG9C,eAAe;uBAAC,eAAe;;sBAQ/B;;;MEPU,eAAe,CAAA;AACjB,IAAA,IAAI,GAAG,KAAK,CAAa,aAAa,2EAAC;AACvC,IAAA,IAAI,GAAG,KAAK,CAAa,GAAG,2EAAC;AAC7B,IAAA,EAAE,GAAG,KAAK,CAAC,QAAQ,wEAAU;IAC7B,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AACtB,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,oBAAoB,GAAG,KAAK,CAAS,EAAE,2FAAC;AACxC,IAAA,cAAc,GAAG,KAAK,CAAS,QAAQ,qFAAC;AAExC,IAAA,MAAM,GAAG,MAAM,CAAU,IAAI,6EAAC;IAE9B,SAAS,GAAG,MAAM,EAAU;AAE5B,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;QACjC,CAAC,CAAA,IAAA,EAAO,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE;QACnC,CAAC,CAAA,KAAA,EAAQ,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE;AACrC,KAAA,CAAC,8EAAC;AAEK,IAAA,QAAQ,GAA6B,MAAM,KAAK,CAAC;AACjD,IAAA,SAAS,GAAe,MAAM,KAAK,CAAC;AAE5C,IAAA,UAAU,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;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,KAAY,EAAA;AAC3B,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAC1D,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtB,IAAI,CAAC,SAAS,EAAE;IAClB;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAChC;wGA1CW,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,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,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,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,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,SAAA,EARf;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,eAAe,CAAC;AAC9C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3BH,izDA8DA,EAAA,MAAA,EAAA,CAAA,i5SAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED7CY,mBAAmB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,uBAAuB,sGAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAY7D,eAAe,EAAA,UAAA,EAAA,CAAA;kBAd3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,EAAA,OAAA,EACV,CAAC,mBAAmB,EAAE,uBAAuB,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAGxD,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,qBAAqB,CAAC;AAC9C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,izDAAA,EAAA,MAAA,EAAA,CAAA,i5SAAA,CAAA,EAAA;;;AEZH;;;AAGG;MAwBU,WAAW,CAAA;AAeF,IAAA,UAAA;AAAqD,IAAA,QAAA;AAdhE,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,IAAI,GAAG,KAAK,CAAS,CAAC,2EAAC;IACvB,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;IACvC,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;AAExC,IAAA,MAAM,GAAG,MAAM,CAAS,EAAE,6EAAC;AAC3B,IAAA,WAAW,GAAG,MAAM,CAAU,KAAK,kFAAC;AAEnC,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,sFAAC;AAEhF,IAAA,QAAQ,GAA4B,MAAM,KAAK,CAAC;AAChD,IAAA,SAAS,GAAe,MAAM,KAAK,CAAC;IAEpC,WAAA,CAAoB,UAA2C,EAAU,QAAmB,EAAA;QAAxE,IAAA,CAAA,UAAU,GAAV,UAAU;QAA2C,IAAA,CAAA,QAAQ,GAAR,QAAQ;IAAc;IAE/F,eAAe,GAAA;QACb,IAAI,CAAC,eAAe,EAAE;IACxB;IAEA,WAAW,GAAA;;IAEX;IAEQ,eAAe,GAAA;AACrB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AAE9C,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AACf,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACnE;AAEA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,SAAS,EAAE;AAClC,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC7E;AAEA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,SAAS,EAAE;AAClC,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC7E;IACF;AAEA,IAAA,WAAW,CAAC,KAAY,EAAA;AACtB,QAAA,MAAM,KAAK,GAAI,KAAK,CAAC,MAA8B,CAAC,KAAK;AACzD,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IACtB;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;AACnC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,EAAE,eAAe,CAAC;IACpF;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,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC;IAClF;wGAhEW,WAAW,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,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,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,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,aAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,SAAA,EAlBX;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,WAAW,CAAC;AAC1C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EATS,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,8vDAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAqBD,WAAW,EAAA,UAAA,EAAA,CAAA;kBAvBvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,YACzB,EAAE,EAAA,eAAA,EAEK,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,iBAAiB,CAAC;AAC1C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,aAAA,EACc,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,kBAAkB,EAAE,MAAM;AAC1B,wBAAA,oBAAoB,EAAE,aAAa;AACnC,wBAAA,qBAAqB,EAAE,mBAAmB;AAC1C,wBAAA,qBAAqB,EAAE,aAAa;AACpC,wBAAA,YAAY,EAAE,mBAAmB;AACjC,wBAAA,SAAS,EAAE,qBAAqB;AAChC,wBAAA,QAAQ,EAAE,aAAa;AACxB,qBAAA,EAAA,MAAA,EAAA,CAAA,8vDAAA,CAAA,EAAA;;;MCOU,YAAY,CAAA;AACd,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,IAAI,GAAG,KAAK,CAAmB,GAAG,2EAAC;AACnC,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,UAAU,GAAG,KAAK,CAAS,eAAe,iFAAC;AAC3C,IAAA,MAAM,GAAG,KAAK,CAAS,EAAE,6EAAC;AAC1B,IAAA,MAAM,GAAG,KAAK,CAAS,EAAE,6EAAC;IAE3B,OAAO,GAAuB,IAAI;IAClC,WAAW,GAAuB,IAAI;IACtC,aAAa,GAAuB,IAAI;IACxC,gBAAgB,GAA6C,IAAI;AACjE,IAAA,MAAM,GAAG,MAAM,CAAS,EAAE,6EAAC;AAC3B,IAAA,WAAW,GAAG,MAAM,CAAU,KAAK,kFAAC;AAEnC,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,kFAAC;AAC/D,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,sFAAC;AAExE,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;AAC5B,IAAA,UAAU,GAAG,MAAM,EAAC,UAA4B,EAAC;AACjD,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEnC,eAAe,GAAA;QACb,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,YAAY,EAAE;IACrB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AAC9D,YAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE;QACjC;IACF;IAEQ,YAAY,GAAA;;QAElB,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,gBAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;oBACpB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC;gBACpD;qBAAO;oBACL,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC;gBACvD;YACF;QACF,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE;;gBAEhB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;gBACxD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;;AAGxD,gBAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AACf,oBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA,YAAA,EAAe,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,CAAC;gBACpE;YACF;QACF,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;YACH,IAAI,CAAC,2BAA2B,EAAE;QACpC,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B;IACH;IAEQ,SAAS,GAAA;AACf,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AAC3C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa;AAElC,QAAA,IAAI,CAAC,MAAM;YAAE;QAEb,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC;;AAGlD,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AACf,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA,YAAA,EAAe,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,CAAC;QACpE;AACA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC;QACpD;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;QAEvD,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;QAChD,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC;QACvC;;AAGA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC;QAC3C;;QAGA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;;AAG9C,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC;QAC3C;AAEA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB,IAAI,CAAC,iBAAiB,EAAE;QAC1B;IACF;IAEQ,WAAW,CAAC,IAAY,EAAE,IAAyB,EAAA;QACzD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QAEnB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAE,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC;QACrD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;IAChD;AAEQ,IAAA,eAAe,CAAC,MAAmB,EAAA;QACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC5C,QAAA,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI;IACrE;AAEQ,IAAA,mBAAmB,CAAC,WAAoB,EAAA;QAC9C,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QAEnB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,kBAAkB,CAAC;QAC9D,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC;AAC1D,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;IAC7D;IAEQ,iBAAiB,GAAA;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QAEnB,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;QACtD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;QAEvD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACxD,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC;QAC9D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,0BAA0B,CAAC;AACpE,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;AAExE,QAAA,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC,mBAAmB,EAAE;YAC3D,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;AAC9C,SAAA,CAAC;;QAGF,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAE9D,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,aAAa;QAChE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,wBAAwB,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,aAAa,EAAE,MAAM,CAAC;QAE9D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;AACxD,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QAElE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;QAEpD,IAAI,CAAC,2BAA2B,EAAE;IACpC;IAEQ,2BAA2B,GAAA;QACjC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;AAE5C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa;QAC7C,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;gBACtB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;YACnD;iBAAO;gBACL,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;YACnD;QACF;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;QAC3C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;AAC7C,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACnD,QAAA,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;IAC5B;AAEA,IAAA,OAAO,CAAC,KAAY,EAAA;AAClB,QAAA,MAAM,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK;AACtD,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IACtB;AAEA,IAAA,QAAQ,GAAqC,MAAM,KAAK,CAAC;AACzD,IAAA,SAAS,GAAe,MAAM,KAAK,CAAC;AAEpC,IAAA,UAAU,CAAC,KAAsB,EAAA;AAC/B,QAAA,MAAM,eAAe,GAAG,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;AAC1D,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,EAAE,eAAe,CAAC;IACpF;AAEA,IAAA,gBAAgB,CAAC,EAAoC,EAAA;AACnD,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,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC;IAClF;wGApOW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,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,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,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,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,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,aAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,yBAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,SAAA,EAjBZ;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,YAAY,CAAC;AAC3C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EATS,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,grOAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAoBD,YAAY,EAAA,UAAA,EAAA,CAAA;kBAtBxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,YACvB,EAAE,EAAA,eAAA,EAEK,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,kBAAkB,CAAC;AAC3C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,aAAA,EACc,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,SAAS,EAAE,uBAAuB;AAClC,wBAAA,qBAAqB,EAAE,aAAa;AACpC,wBAAA,YAAY,EAAE,YAAY;AAC1B,wBAAA,YAAY,EAAE,mBAAmB;AACjC,wBAAA,SAAS,EAAE,iBAAiB;AAC5B,wBAAA,QAAQ,EAAE,aAAa;AACxB,qBAAA,EAAA,MAAA,EAAA,CAAA,grOAAA,CAAA,EAAA;;;MCfU,kBAAkB,CAAA;AACpB,IAAA,EAAE,GAAG,KAAK,CAAC,QAAQ,wEAAU;IAC7B,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;AAClC,IAAA,IAAI,GAAG,KAAK,CAAgB,GAAG,2EAAC;AAChC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,OAAO;AACL,YAAA,QAAQ,EAAE,IAAI;YACd,CAAC,CAAA,QAAA,EAAW,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE;SACxC;AACH,IAAA,CAAC,8EAAC;AAEF,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,6EAAC;AAEtB,IAAA,QAAQ,GAAyB,MAAM,KAAK,CAAC;AAC7C,IAAA,SAAS,GAAe,MAAM,KAAK,CAAC;AAEpC,IAAA,UAAU,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;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,aAAa,CAAC,KAAY,EAAA;AACxB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAC1D,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtB,IAAI,CAAC,SAAS,EAAE;IAClB;wGAlCW,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,YAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,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,SAAA,EATlB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,kBAAkB,CAAC;AACjD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3BH,ikBAmBA,EAAA,MAAA,EAAA,CAAA,wwHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDDY,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAY/B,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAd9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,WACb,CAAC,WAAW,EAAE,mBAAmB,CAAC,EAAA,SAAA,EAGhC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,wBAAwB,CAAC;AACjD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ikBAAA,EAAA,MAAA,EAAA,CAAA,wwHAAA,CAAA,EAAA;;;MEnBpC,gBAAgB,CAAA;AAClB,IAAA,IAAI,GAAG,KAAK,CAAc,SAAS,2EAAC;AAEpC,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QAC/B,MAAM,SAAS,GAAG,MAAM;AACxB,QAAA,QAAQ,IAAI,CAAC,IAAI,EAAE;AACjB,YAAA,KAAK,QAAQ;gBACX,OAAO,CAAA,EAAG,SAAS,CAAA,aAAA,CAAe;AACpC,YAAA,KAAK,QAAQ;gBACX,OAAO,CAAA,EAAG,SAAS,CAAA,aAAA,CAAe;AACpC,YAAA,KAAK,SAAS;gBACZ,OAAO,CAAA,EAAG,SAAS,CAAA,cAAA,CAAgB;AACrC,YAAA;AACE,gBAAA,OAAO,SAAS;;AAEtB,IAAA,CAAC,8EAAC;wGAfS,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,qMCT7B,sGAKA,EAAA,MAAA,EAAA,CAAA,qyBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDIa,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAN5B,SAAS;+BACE,UAAU,EAAA,eAAA,EAGH,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,sGAAA,EAAA,MAAA,EAAA,CAAA,qyBAAA,CAAA,EAAA;;;MEmBpC,sBAAsB,CAAA;AACxB,IAAA,EAAE,GAAG,KAAK,CAAC,QAAQ,wEAAU;AAC7B,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;AAC/B,IAAA,KAAK,GAAG,KAAK,CAAqB,SAAS,4EAAC;AAC5C,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,IAAI,GAAG,KAAK,CAAoB,SAAS,2EAAC;AAC1C,IAAA,KAAK,GAAG,KAAK,CAAS,MAAM,4EAAC;AAE7B,IAAA,MAAM,GAAG,MAAM,CAAgB,IAAI,6EAAC;AAEpC,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,eAAe,EAAE,IAAI;AACrB,QAAA,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE;AAC5B,QAAA,kBAAkB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AACvC,QAAA,kBAAkB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AACxC,KAAA,CAAC,8EAAC;AAEK,IAAA,QAAQ,GAAmC,MAAM,KAAK,CAAC;AACvD,IAAA,SAAS,GAAe,MAAM,KAAK,CAAC;AAE5C,IAAA,UAAU,CAAC,GAAkB,EAAA;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;IACtB;AAEA,IAAA,gBAAgB,CAAC,EAAgC,EAAA;AAC/C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,OAAO,CAAC,KAAY,EAAA;AAClB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI;AAClC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IACvB;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IACrB;IAEA,MAAM,GAAA;QACJ,IAAI,CAAC,SAAS,EAAE;IAClB;wGAjDW,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,gBAAA,EAAA,MAAA,EAAA,EAAA,EAAA,EAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,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,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,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,SAAA,EATtB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,sBAAsB,CAAC;AACrD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBH,qrCAsCA,uigBDdY,aAAa,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEZ,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAdlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,4BAA4B,CAAC;AACrD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,OAAA,EACQ,CAAC,aAAa,CAAC,EAAA,QAAA,EAAA,qrCAAA,EAAA,MAAA,EAAA,CAAA,++fAAA,CAAA,EAAA;;;MEfb,mBAAmB,CAAA;AACrB,IAAA,EAAE,GAAG,KAAK,CAAC,QAAQ,wEAAU;AAC7B,IAAA,QAAQ,GAAG,KAAK,CAAqB,KAAK,+EAAC;AAC3C,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;IAC3C,OAAO,GAAG,EAAE;AAEH,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,SAAS,EAAE,IAAI;AACf,QAAA,CAAC,CAAA,SAAA,EAAY,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAE,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClD,QAAA,qBAAqB,EAAE,IAAI,CAAC,SAAS,EAAE;AACvC,QAAA,qBAAqB,EAAE,IAAI,CAAC,UAAU,EAAE;AACzC,KAAA,CAAC,8EAAC;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,6kBCThC,+UAeA,EAAA,MAAA,EAAA,CAAA,mzMAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDNa,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;+BACE,aAAa,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+UAAA,EAAA,MAAA,EAAA,CAAA,mzMAAA,CAAA,EAAA;;;MEOpC,mBAAmB,CAAA;IACT,OAAO,GAAG,EAAE;IACxB,eAAe,GAAuB,KAAK;IAC3C,gBAAgB,GAAG,KAAK;IAEzB,UAAU,GAAsB,IAAI;AACpC,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,sBAAsB,GAAG,MAAM,CAAC,sBAAsB,CAAC;AACvD,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAGvC,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE;YAClC;QACF;QAEA,MAAM,MAAM,GAAG,EAAE;AACjB,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC3B,aAAA,mBAAmB,CAAC,IAAI,CAAC,UAAU;AACnC,aAAA,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AAErC,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK,EAAE;AAClC,YAAA,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC;QAC9C;AAAO,aAAA,IAAI,IAAI,CAAC,eAAe,KAAK,QAAQ,EAAE;AAC5C,YAAA,gBAAgB,CAAC,kBAAkB,CAAC,MAAM,CAAC;QAC7C;AAAO,aAAA,IAAI,IAAI,CAAC,eAAe,KAAK,MAAM,EAAE;AAC1C,YAAA,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC;QAC9C;AAAO,aAAA,IAAI,IAAI,CAAC,eAAe,KAAK,OAAO,EAAE;AAC3C,YAAA,gBAAgB,CAAC,kBAAkB,CAAC,MAAM,CAAC;QAC7C;QAEA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACpC,gBAAgB;YAChB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE;AAC3D,SAAA,CAAC;AAEF,QAAA,MAAM,aAAa,GAAG,IAAI,eAAe,CAAC,mBAAmB,CAAC;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC;QAExD,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAE,CAAC;QAC/E,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC;QACrD,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC;AACvD,QAAA,UAAU,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;QACvC,UAAU,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;IAC5C;IAGA,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;QAC1B;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;QAC3B;IACF;IAEQ,YAAY,GAAA;AAClB,QAAA,MAAM,SAAS,GAAkD;AAC/D,YAAA,GAAG,EAAE;AACH,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,QAAQ,EAAE,QAAQ;AACnB,aAAA;AACD,YAAA,MAAM,EAAE;AACN,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,QAAQ,EAAE,KAAK;AAChB,aAAA;AACD,YAAA,IAAI,EAAE;AACJ,gBAAA,OAAO,EAAE,OAAO;AAChB,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,QAAQ,EAAE,QAAQ;AACnB,aAAA;AACD,YAAA,KAAK,EAAE;AACL,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE,QAAQ;AACnB,aAAA;SACF;QAED,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC1C;wGAxFW,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,OAAA,EAAA,CAAA,YAAA,EAAA,SAAA,CAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,YAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,cAAc;AACzB,iBAAA;;sBAEE,KAAK;uBAAC,YAAY;;sBAClB;;sBACA;;sBAOA,YAAY;uBAAC,YAAY;;sBAoCzB,YAAY;uBAAC,YAAY;;;MCnDf,+BAA+B,CAAA;AACjC,IAAA,YAAY,GAAG,KAAK,CAAS,CAAC,mFAAC;AAC/B,IAAA,IAAI,GAAG,KAAK,CAA4B,GAAG,2EAAC;AAC5C,IAAA,SAAS,GAAG,KAAK,CAAS,cAAc,gFAAC;AACzC,IAAA,WAAW,GAAG,KAAK,CAAgB,IAAI,kFAAC;AACxC,IAAA,SAAS,GAAG,KAAK,CAAgB,IAAI,gFAAC;AACtC,IAAA,cAAc,GAAG,KAAK,CAAU,KAAK,qFAAC;AAEtC,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,OAAO,GAAG,CAAC,yBAAyB,CAAC;AAC3C,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC;AACnE,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC;AACnE,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,8EAAC;IAEO,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,sFAAC;wGAf1E,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA/B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,+BAA+B,w4BCT5C,ymCAkCA,EAAA,MAAA,EAAA,CAAA,iiFAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDzBa,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAN3C,SAAS;+BACE,2BAA2B,EAAA,eAAA,EAGpB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ymCAAA,EAAA,MAAA,EAAA,CAAA,iiFAAA,CAAA,EAAA;;;MECpC,uCAAuC,CAAA;AACzC,IAAA,YAAY,GAAG,KAAK,CAAS,CAAC,mFAAC;AAC/B,IAAA,SAAS,GAAG,KAAK,CAAS,cAAc,gFAAC;AACzC,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;wGAH/B,uCAAuC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uCAAuC,+fCRpD,mvBAsBA,EAAA,MAAA,EAAA,CAAA,2xCAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDda,uCAAuC,EAAA,UAAA,EAAA,CAAA;kBANnD,SAAS;+BACE,oCAAoC,EAAA,eAAA,EAG7B,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,mvBAAA,EAAA,MAAA,EAAA,CAAA,2xCAAA,CAAA,EAAA;;;MEapC,mBAAmB,CAAA;AACrB,IAAA,KAAK,GAAG,KAAK,CAAgB,IAAI,4EAAC;AAClC,IAAA,OAAO,GAAG,KAAK,CAAgB,IAAI,8EAAC;AACpC,IAAA,IAAI,GAAG,KAAK,CAAS,QAAQ,2EAAC;AAC9B,IAAA,OAAO,GAAG,KAAK,CAAoB,SAAS,8EAAC;IAC7C,SAAS,GAAG,YAAY,CAAoB,QAAQ,iFAAI,WAAW,EAAE,KAAK,EAAA,CAAG;AAE7E,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,OAAO,GAAG,CAAC,YAAY,CAAC;AAC9B,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,SAAS;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC;AACrE,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,SAAS;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC;AACrE,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC;AAC/D,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC;AACnE,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,8EAAC;wGAdS,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,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,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,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnBhC,qdAcA,EAAA,MAAA,EAAA,CAAA,qqCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDAY,UAAU,8EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAK3B,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;+BACE,aAAa,EAAA,OAAA,EACd,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAGtB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,qdAAA,EAAA,MAAA,EAAA,CAAA,qqCAAA,CAAA,EAAA;AAOM,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,QAAQ,EAAA,EAAA,GAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEf1E,kBAAkB,CAAA;AACpB,IAAA,IAAI,GAAG,KAAK,CAAgB,GAAG,2EAAC;AAEhC,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QACxB,OAAO,CAAC,WAAW,EAAE,IAAI,KAAK,GAAG,GAAG,cAAc,GAAG,EAAE,EAAE,IAAI,KAAK,GAAG,GAAG,cAAc,GAAG,EAAE;aACxF,MAAM,CAAC,OAAO;aACd,IAAI,CAAC,GAAG,CAAC;AACd,IAAA,CAAC,8EAAC;wGARS,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,uMCT/B,oEAGA,EAAA,MAAA,EAAA,CAAA,onBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDMa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;+BACE,YAAY,EAAA,eAAA,EAGL,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,oEAAA,EAAA,MAAA,EAAA,CAAA,onBAAA,CAAA,EAAA;;;AEyBjD,IAAI,GAAG,GAAG,CAAC;MAgBE,uBAAuB,CAAA;AACzB,IAAA,KAAK,GAAG,KAAK,CAAS,cAAc,4EAAC;AACrC,IAAA,eAAe,GAAG,KAAK,CAAgB,uBAAuB,sFAAC;IAC/D,eAAe,GAAG,KAAK,CAAmB,IAAI,uFACrD,SAAS,EAAE,gBAAgB,EAAA,CAC3B;AACO,IAAA,QAAQ,GAAG,KAAK,CAAgB,WAAW,+EAAC;AAC5C,IAAA,IAAI,GAAG,KAAK,CAAqB,GAAG,2EAAC;AACrC,IAAA,WAAW,GAAG,KAAK,CAAgB,IAAI,kFAAC;AACxC,IAAA,cAAc,GAAG,KAAK,CAAS,IAAI,qFAAC;AACpC,IAAA,MAAM,GAAG,KAAK,CAAS,IAAI,6EAAC;AAE5B,IAAA,YAAY,GAAG,KAAK,CAAkB,IAAI,mFAAC;IAE3C,SAAS,GAAG,KAAK,CAA0B;AAClD,QAAA;AACE,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,QAAQ,EAAE,MAAM;AACjB,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,QAAQ,EAAE,MAAM;AACjB,SAAA;AACF,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IAEO,iBAAiB,GAAG,KAAK,CAAmB,IAAI,yFACvD,SAAS,EAAE,gBAAgB,EAAA,CAC3B;IACO,eAAe,GAAG,KAAK,CAAmB,IAAI,uFACrD,SAAS,EAAE,gBAAgB,EAAA,CAC3B;IAEO,QAAQ,GAAG,KAAK,CAAmB,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC1E,QAAQ,GAAG,KAAK,CAAmB,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAE1E,IAAA,OAAO,GAAG,KAAK,CAAiB,IAAI,8EAAC;AACrC,IAAA,YAAY,GAAG,KAAK,CAAgB,IAAI,mFAAC;AAEzC,IAAA,UAAU,GAAG,KAAK,CAAS,qBAAqB,iFAAC;AACjD,IAAA,SAAS,GAAG,KAAK,CAAS,eAAe,gFAAC;AAElC,IAAA,QAAQ,GAAG,MAAM,CAAS,IAAI,+EAAC;AAC/B,IAAA,OAAO,GAAG,MAAM,CAAS,EAAE,8EAAC;IAE5B,GAAG,GAAG,EAAE,GAAG;AACnB,IAAA,QAAQ,GAAG,CAAA,aAAA,EAAgB,IAAI,CAAC,GAAG,EAAE;AACrC,IAAA,SAAS,GAAG,CAAA,WAAA,EAAc,IAAI,CAAC,GAAG,EAAE;AACpC,IAAA,OAAO,GAAG,CAAA,YAAA,EAAe,IAAI,CAAC,GAAG,EAAE;AACnC,IAAA,MAAM,GAAG,CAAA,KAAA,EAAQ,IAAI,CAAC,GAAG,EAAE;AAC3B,IAAA,OAAO,GAAG,CAAA,IAAA,EAAO,IAAI,CAAC,GAAG,EAAE;AAC3B,IAAA,IAAI,GAAG,CAAA,YAAA,EAAe,IAAI,CAAC,GAAG,EAAE;IAEhC,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACrD,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE;AACzC,QAAA,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,EAAE;AACzC,YAAA,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAClD;AAEA,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE;AACxC,QAAA,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,EAAE;AAC7C,YAAA,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACzD;AAEA,QAAA,OAAO,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AACnD,IAAA,CAAC,yFAAC;AAEO,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,0FAAC;AAC1E,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/D,OAAO,QAAQ,GAAG,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,GAAG,EAAE;AACvC,IAAA,CAAC,uFAAC;AACO,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAA,oBAAA,EAAuB,IAAI,CAAC,QAAQ,EAAE,CAAA,IAAA,CAAM,sFAAC;IAE9E,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEvC,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;QACjC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AAC/B,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;QAC7C,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAoB,CAAC;AAC/D,YAAA,OAAO,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE;QACxC;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,EAAE;QACX;AACF,IAAA,CAAC,yFAAC;AAEM,IAAA,sBAAsB,GAAG,QAAQ,CAA0B,MAAK;AACtE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC5B,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,OAAO,IAAI,CAAC,WAAW,EAAiB;AAC1C,IAAA,CAAC,6FAAC;AAEM,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE;AACpC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE;AACvB,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI;AACF,YAAA,OAAO,0BAA0B,CAAC,MAAM,EAAE,OAAO,CAAC;QACpD;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;AACF,IAAA,CAAC,mFAAC;AAEM,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE;AACpC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE;AACvB,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI;AACF,YAAA,OAAO,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC;QAC5C;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;AACF,IAAA,CAAC,mFAAC;AAEF,IAAA,cAAc,CAAC,WAAmB,EAAA;AAChC,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE;AAEvC,QAAA,IAAI;AACF,YAAA,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;AACzD,gBAAA,IAAI,EAAE,QAAQ;AACf,aAAA,CAAC;YACF,OAAO,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK;QACvC;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;AAEA,IAAA,wBAAwB,CAAC,WAAmB,EAAA;AAC1C,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAiB;AAEtD,QAAA,IAAI;AACF,YAAA,OAAO,qBAAqB,CAAC,KAAK,CAAC;QACrC;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,EAAE;QACX;IACF;;AAGA,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QAC1B,MAAM,GAAG,GAAa,EAAE;QACxB,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAC1C,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE;AAAE,YAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AAClE,QAAA,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;AAC1C,IAAA,CAAC,kFAAC;;AAGM,IAAA,WAAW,GAAG,MAAM,CAAU,KAAK,kFAAC;AACpC,IAAA,YAAY,GAAG,MAAM,CAAgB,IAAI,mFAAC;AAElD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACxB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE;AAC/B,QAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;YACrB,OAAO,CAAC,CAAC,QAAQ;QACnB;AAEA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;AACtB,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE;QACnC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE;AAC7B,IAAA,CAAC,gFAAC;AAEF,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,kFAAC;;AAGhE,IAAA,QAAQ;AAChB,IAAA,SAAS;AAET,IAAA,UAAU,CAAC,KAAiC,EAAA;QAC1C,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,OAAO,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAChD;AAEA,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE;QACnC,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,IAAI,QAAQ,KAAK,OAAO,EAAE;YACxB;QACF;AAEA,QAAA,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC5B,YAAA,IAAI;AACF,gBAAA,MAAM,MAAM,GAAG,0BAA0B,CAAC,QAAQ,CAAC;gBACnD,IAAI,MAAM,EAAE;AACV,oBAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,wBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;oBACjD;oBACA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;oBACzC;gBACF;YACF;AAAE,YAAA,MAAM;;YAER;QACF;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC5B;AAEA,IAAA,gBAAgB,CAAC,EAAwC,EAAA;AACvD,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AACA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;;AAGA,IAAA,eAAe,CAAC,IAAY,EAAA;QAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAErC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,QAAA,IAAI,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;AACjC,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,EAAE;AACzC,YAAA,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,EAAE,EAAE;AAChC,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;YAC7B;QACF;QAEA,IAAI,CAAC,UAAU,EAAE;IACnB;AACA,IAAA,cAAc,CAAC,GAAW,EAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AACpC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;AAE3B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,QAAA,IAAI,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;AACjC,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,EAAE;AACzC,YAAA,IAAI,SAAS,KAAK,SAAS,EAAE;AAC3B,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;YAC7B;QACF;QAEA,IAAI,CAAC,UAAU,EAAE;IACnB;IAEQ,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB;QACF;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;QAClC,MAAM,UAAU,GAAG,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;QAEnD,IAAI,CAAC,QAAQ,CAAC;AACZ,YAAA,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE;AACxB,YAAA,MAAM,EAAE,UAAU;AACnB,SAAA,CAAC;IACJ;AAEQ,IAAA,QAAQ,CAAC,KAAa,EAAA;QAC5B,OAAO,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;IAC3C;;;IAIA,mBAAmB,CAAC,OAAgB,EAAE,OAAuB,EAAA;AAC3D,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC;IACxC;AAEA,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACvC,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;gBACjB;YACF;YAEA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE;YACtD,MAAM,MAAM,GAAG,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;AAE5E,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE;AACxD,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;YAC3B;AACF,QAAA,CAAC,CAAC;IACJ;wGA3VW,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,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,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,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,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,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,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,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,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,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,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,SAAA,EARvB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,uBAAuB,CAAC;AACtD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9CH,g0HAmGA,EAAA,MAAA,EAAA,CAAA,is7BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/DY,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,mBAAmB,+BAAE,aAAa,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAY9C,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAdnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,OAAA,EACnB,CAAC,WAAW,EAAE,mBAAmB,EAAE,aAAa,CAAC,EAAA,eAAA,EAGzC,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,6BAA6B,CAAC;AACtD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,g0HAAA,EAAA,MAAA,EAAA,CAAA,is7BAAA,CAAA,EAAA;;;MEPU,mBAAmB,CAAA;IACrB,IAAI,GAAG,KAAK,CAAmB,KAAK,4EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACtE,IAAA,QAAQ,GAAG,KAAK,CAAqB,KAAK,+EAAC;AAC3C,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,kFAAC;AAC/B,IAAA,MAAM,GAAG,KAAK,CAAmB,MAAM,6EAAC;IACxC,QAAQ,GAAG,KAAK,CAAmB,IAAI,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACzE,QAAQ,GAAG,KAAK,CAAmB,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAC1E,IAAA,OAAO,GAAG,KAAK,CAAgB,IAAI,8EAAC;AACpC,IAAA,IAAI,GAAG,KAAK,CAAiB,QAAQ,2EAAC;AACtC,IAAA,cAAc,GAAG,KAAK,CAAS,OAAO,qFAAC;IAEvC,UAAU,GAAG,MAAM,EAAW;IAC9B,MAAM,GAAG,MAAM,EAAQ;IAEvB,UAAU,GAAG,YAAY,CAA0B,UAAU,kFAAI,WAAW,EAAE,KAAK,EAAA,CAAG;AACtF,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,gFAAC;IAElC,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IACzC;AAEA,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QACtB,MAAM,OAAO,GAAG,EAAE;AAClB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AACf,YAAA,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;QACzB;AACA,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACvB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE;AACrB,YAAA,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA,CAAE,CAAC;QAClC;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE;AACpB,YAAA,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA,CAAE,CAAC;QAClC;AACA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,8EAAC;AAEM,IAAA,cAAc,GAAG,MAAM,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC,CAAC;IACnC,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE;IAEnC,UAAU,GAAkB,IAAI;IAChC,SAAS,GAAkB,IAAI;IAC/B,OAAO,GAAG,CAAC;AAEnB,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE;AAC1B,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;AACzB,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE;YAEpC,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;YAE1B,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;gBAC7B;YACF;YAEA,IAAI,YAAY,EAAE;AAChB,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE;gBACzB,MAAM,IAAI,GAAG,GAAG;AAChB,gBAAA,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,MAAK;oBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO;AACzC,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,GAAG,EAAE,IAAI,GAAG,CAAC;AAC/C,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;AAC5B,oBAAA,IAAI,GAAG,IAAI,GAAG,EAAE;wBACd,IAAI,CAAC,YAAY,EAAE;oBACrB;gBACF,CAAC,EAAE,IAAI,CAAsB;YAC/B;iBAAO;AACL,gBAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,CAAsB;YACjF;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;YAChB;QACF;QACA,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;AAC5B,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC;AAC9B,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACxB;AACA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAC5B,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACvB;IACF;wGA7FW,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,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,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,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,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,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,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvChC,opCA4CA,EAAA,MAAA,EAAA,CAAA,izFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjBI,mCAAmC,0HACnC,mBAAmB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,qBAAqB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,mBAAmB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,kBAAkB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,OAAO,2EACP,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAMb,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAf/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAAA,OAAA,EACd;wBACP,mCAAmC;wBACnC,mBAAmB;wBACnB,qBAAqB;wBACrB,mBAAmB;wBACnB,kBAAkB;wBAClB,OAAO;wBACP,sBAAsB;qBACvB,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,opCAAA,EAAA,MAAA,EAAA,CAAA,izFAAA,CAAA,EAAA;AAgBa,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,UAAU,EAAA,EAAA,GAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEtCnF,cAAc,GAAG,IAAI,cAAc,CAAmB,gBAAgB;AAE5E,MAAM,sBAAsB,GAA8B;AAC/D,IAAA,IAAI,EAAE,KAAK;AACX,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,WAAW,EAAE,EAAE;AACf,IAAA,MAAM,EAAE,MAAM;AACd,IAAA,QAAQ,EAAE,IAAI;AACd,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,cAAc,EAAE,OAAO;;;MCrBZ,aAAa,CAAA;AAcK,IAAA,UAAA;AAbZ,IAAA,YAAY,GAAG,IAAI,OAAO,EAAa;AACvC,IAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;AAE1C,IAAA,MAAM,GAAG,MAAM,CAAU,KAAK,6EAAC;AAC/B,IAAA,WAAW,GAAG,MAAM,CAAS,EAAE,kFAAC;AAChC,IAAA,MAAM,GAAG,MAAM,CAAmB,MAAM,6EAAC;AACzC,IAAA,QAAQ,GAAG,MAAM,CAAU,IAAI,+EAAC;AAChC,IAAA,OAAO,GAAG,MAAM,CAAgB,IAAI,8EAAC;AACrC,IAAA,QAAQ,GAAG,MAAM,CAAU,KAAK,+EAAC;AACjC,IAAA,QAAQ,GAAG,MAAM,CAAqB,KAAK,+EAAC;IAE7C,iBAAiB,GAAG,GAAG;AAE/B,IAAA,WAAA,CAA6B,UAAsB,EAAA;QAAtB,IAAA,CAAA,UAAU,GAAV,UAAU;IAAe;IAEtD,IAAI,GAAA;QACF,qBAAqB,CAAC,MAAK;AACzB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACxB,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC9B,QAAA,CAAC,CAAC;IACJ;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QAEtB,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AACjC,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC9B,QAAA,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAC5B;IAEA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;IAEA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;AACD;;MCXY,yBAAyB,CAAA;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC;AAClC,IAAA,MAAM,GAAG,MAAM,CAAmB,cAAc,CAAC;AAE1D,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QACtB,MAAM,OAAO,GAAG,EAAE;AAClB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE;AAC5B,YAAA,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;QACzB;QACA,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE;AACrB,YAAA,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA,CAAE,CAAC;QAClC;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE;AACpB,YAAA,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA,CAAE,CAAC;QAClC;AACA,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,8EAAC;AAEM,IAAA,cAAc,GAAG,MAAM,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC,CAAC;IACnC,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE;IAEnC,UAAU,GAAkB,IAAI;IAChC,SAAS,GAAkB,IAAI;IAC/B,OAAO,GAAG,CAAC;AAEnB,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;YACV,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YACvC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;YACpC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;YAE/C,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;YAE1B,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;gBAC7B;YACF;YAEA,IAAI,YAAY,EAAE;AAChB,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE;gBACzB,MAAM,IAAI,GAAG,GAAG;AAChB,gBAAA,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,MAAK;oBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO;AACzC,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,GAAG,EAAE,IAAI,GAAG,CAAC;AAC/C,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;AAC5B,oBAAA,IAAI,GAAG,IAAI,GAAG,EAAE;AACd,wBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;oBACzB;gBACF,CAAC,EAAE,IAAI,CAAsB;YAC/B;iBAAO;AACL,gBAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,CAAsB;YACrF;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC;AAC9B,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACxB;AACA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAC5B,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACvB;IACF;wGAlEW,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,uBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnCtC,wmCA2CA,EAAA,MAAA,EAAA,CAAA,izFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDpBI,mCAAmC,0HACnC,mBAAmB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,qBAAqB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,mBAAmB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,kBAAkB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,OAAO,2EACP,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAMb,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAfrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,OAAA,EACxB;wBACP,mCAAmC;wBACnC,mBAAmB;wBACnB,qBAAqB;wBACrB,mBAAmB;wBACnB,kBAAkB;wBAClB,OAAO;wBACP,sBAAsB;qBACvB,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wmCAAA,EAAA,MAAA,EAAA,CAAA,izFAAA,CAAA,EAAA;;;AEjCjD;MASa,iBAAiB,CAAA;AACX,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAE5C,IAAA,IAAI,CAAC,MAAwB,EAAA;AAC3B,QAAA,MAAM,YAAY,GAAqB;AACrC,YAAA,GAAG,sBAAsB;AACzB,YAAA,GAAG,MAAM;SACU;AAErB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE;AACvC,QAAA,MAAM,UAAU,GAAG,IAAI,aAAa,CAAC,UAAU,CAAC;QAEhD,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC;QACpD,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,IAAI,MAAM,CAAC;QACpD,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,IAAI,IAAI,CAAC;QACtD,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,IAAI,IAAI,CAAC;QACpD,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,IAAI,KAAK,CAAC;QACvD,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,IAAI,KAAK,CAAC;AAEvD,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,QAAQ;AACrB,YAAA,SAAS,EAAE;AACT,gBAAA,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE;AAChD,gBAAA,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE;AACpD,aAAA;AACF,SAAA,CAAC;QAEF,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,yBAAyB,EAAE,IAAI,EAAE,QAAQ,CAAC;AACtF,QAAA,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC;QAElC,UAAU,CAAC,IAAI,EAAE;AAEjB,QAAA,OAAO,UAAU;IACnB;IAEQ,aAAa,GAAA;AACnB,QAAA,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;AAC/B,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,kBAAkB,EAAE,CAAC,gBAAgB,EAAE;AAC3F,SAAA,CAAC;QAEF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC;wGA3CW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA;;4FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCWrB,mBAAmB,CAAA;IACrB,QAAQ,GAAG,KAAK,CAAmB,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAC1E,IAAA,KAAK,GAAG,KAAK,CAAmB,EAAE,4EAAC;AACnC,IAAA,KAAK,GAAG,KAAK,CAAS,oBAAoB,4EAAC;AAC3C,IAAA,OAAO,GAAG,KAAK,CAAgB,kBAAkB,8EAAC;AAClD,IAAA,OAAO,GAAG,KAAK,CAAS,MAAM,8EAAC;IAE/B,UAAU,GAAG,KAAK,CAAmB,IAAI,kFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IAC3E,WAAW,GAAG,KAAK,CAAmB,KAAK,mFAClD,SAAS,EAAE,gBAAgB,EAAA,CAC3B;AACO,IAAA,WAAW,GAAG,KAAK,CAAgB,aAAa,kFAAC;AACjD,IAAA,YAAY,GAAG,KAAK,CAAgB,qBAAqB,mFAAC;AAC1D,IAAA,gBAAgB,GAAG,KAAK,CAAgB,oBAAoB,uFAAC;IAE7D,cAAc,GAAG,MAAM,EAAW;IAClC,SAAS,GAAG,MAAM,EAAgD;AAElE,IAAA,WAAW,GAAG,QAAQ,CAAC,MAC9B,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,mBAAmB,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kFAClF;IAEQ,qBAAqB,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,UAAU,GAAG,QAAQ,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAE1F,IAAA,UAAU,GAAG,CAAC,CAAiB,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;IAErF,cAAc,GAAA;QACZ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC5C;AAEA,IAAA,WAAW,CAAC,MAAc,EAAE,SAAwB,EAAE,EAAS,EAAA;QAC7D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC1C,IAAK,EAAE,CAAC,aAAmC,EAAE,YAAY,CAAC,MAAM,CAAC,KAAK,GAAG;YAAE,EAAE,CAAC,cAAc,EAAE;IAChG;AAEA,IAAA,UAAU,CAAC,IAAoB,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI;IACxB;wGArCW,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,w8CCnBhC,ysHA2GA,EAAA,MAAA,EAAA,CAAA,su4BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED7FY,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,mFAAE,aAAa,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKhD,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;+BACE,aAAa,EAAA,OAAA,EACd,CAAC,iBAAiB,EAAE,eAAe,EAAE,aAAa,CAAC,EAAA,eAAA,EAC3C,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ysHAAA,EAAA,MAAA,EAAA,CAAA,su4BAAA,CAAA,EAAA;;;MEIpC,4BAA4B,CAAA;AAC9B,IAAA,KAAK,GAAG,KAAK,CAAqB,EAAE,4EAAC;AAErC,IAAA,IAAI,GAAG,KAAK,CAA0B,GAAG,2EAAC;IAC1C,IAAI,GAAG,KAAK,CAAmB,KAAK,4EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACtE,QAAQ,GAAG,KAAK,CAAmB,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAC1E,IAAA,SAAS,GAAG,KAAK,CAAS,mBAAmB,gFAAC;AAE9C,IAAA,aAAa,GAAG,KAAK,CAAS,CAAC,oFAAC;IAChC,MAAM,GAAG,MAAM,EAA6C;AAE5D,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,mBAAmB,EAAE,IAAI;AACzB,QAAA,6BAA6B,EAAE,IAAI,CAAC,QAAQ,EAAE;AAC9C,QAAA,sBAAsB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AAC3C,QAAA,yBAAyB,EAAE,IAAI,CAAC,IAAI,EAAE;AACvC,KAAA,CAAC,8EAAC;IAEM,cAAc,GAAG,CAAC,KAAa,KACtC,QAAQ,CAAC,OAAO;AACd,QAAA,sCAAsC,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ;AAC1F,QAAA,4BAA4B,EAAE,IAAI;AAClC,QAAA,sCAAsC,EAAE,KAAK,KAAK,IAAI,CAAC,aAAa,EAAE;AACvE,KAAA,CAAC,CAAC;AAEY,IAAA,OAAO,GAAG,YAAY,CAAgC,QAAQ,8EAAC;AAEhF,IAAA,QAAQ,CAAC,KAAa,EAAA;AACpB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE;YACpD;QACF;QAEA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;AAChC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9C,cAAc,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9C;AAEQ,IAAA,UAAU,CAAC,KAAa,EAAA;AAC9B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,aAAa;QACtC,GAAG,EAAE,KAAK,EAAE;IACd;wGA1CW,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,+/BCnBzC,0jBAiBA,EAAA,MAAA,EAAA,CAAA,o3EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDEa,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBANxC,SAAS;+BACE,uBAAuB,EAAA,eAAA,EAChB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,0jBAAA,EAAA,MAAA,EAAA,CAAA,o3EAAA,CAAA,EAAA;muBA6BwB,QAAQ,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MErCpE,2BAA2B,CAAA;IAC7B,GAAG,GAAG,SAAS,CAAC,KAAK,2EAAI,IAAI,EAAE,WAAW,EAAA,CAAG;wGAD3C,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,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,KAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,KAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EACE,WAAW,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECRrD,sVAUA,EAAA,MAAA,EAAA,CAAA,wpZAAA,CAAA,EAAA,CAAA;;4FDHa,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBALvC,SAAS;+BACE,sBAAsB,EAAA,QAAA,EAAA,sVAAA,EAAA,MAAA,EAAA,CAAA,wpZAAA,CAAA,EAAA;AAKP,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,KAAK,EAAA,EAAA,GAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEF1C,4BAA4B,CAAA;IAC9B,GAAG,GAAG,SAAS,CAAC,KAAK,2EAAI,IAAI,EAAE,WAAW,EAAA,CAAG;wGAD3C,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,KAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,KAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EACC,WAAW,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECPrD,6DACA,EAAA,CAAA;;4FDKa,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAJxC,SAAS;+BACE,uBAAuB,EAAA,QAAA,EAAA,6DAAA,EAAA;AAIR,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,KAAK,EAAA,EAAA,GAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEE1C,0BAA0B,CAAA;AAC5B,IAAA,IAAI,GAAG,KAAK,CAAuB,IAAI,2EAAC;AACxC,IAAA,IAAI,GAAG,KAAK,CAAC,KAAK,2EAAC;IACnB,KAAK,GAAG,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEvC,IAAA,MAAM,GAAG,YAAY,CAAC,2BAA2B,6EAAC;AAClD,IAAA,OAAO,GAAG,YAAY,CAAC,4BAA4B,8EAAC;wGANlD,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,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,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAKN,2BAA2B,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAC1B,4BAA4B,gEARlD,CAAA,CAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;4FAED,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAJtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,QAAQ,EAAE,CAAA,CAAE;AACb,iBAAA;AAMgC,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,2BAA2B,yFAC1B,4BAA4B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACV9D;;;;;;;;;;;;;;;;;;;;;;AAsBG;MAQU,qBAAqB,CAAA;AAChC;;;;;AAKG;AACM,IAAA,KAAK,GAAG,KAAK,CAAC,KAAK,4EAAC;AAE7B;;;;;AAKG;AACM,IAAA,MAAM,GAAG,KAAK,CAAC,KAAK,6EAAC;AAE9B;;;;;AAKG;AACM,IAAA,UAAU,GAAG,QAAQ,CAAC,OAAO;AACpC,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,kBAAkB,EAAE,IAAI,CAAC,KAAK,EAAE;AACjC,KAAA,CAAC,iFAAC;AAEH;;;;;AAKG;AACM,IAAA,MAAM,GAAG,eAAe,CAAC,0BAA0B,6EAAC;AAE7D;;;;AAIG;AACH,IAAA,MAAM,CAAC,CAA6B,EAAA;AAClC,QAAA,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAU,KAAK,CAAC,CAAC,CAAC;IACpC;AAEA;;;;;;AAMG;IACH,cAAc,CAAC,EAAS,EAAE,CAA6B,EAAA;QACrD,CAAC,CAAC,KAAK,CAAC,GAAG,CAAE,EAAE,CAAC,aAAoC,CAAC,IAAI,CAAC;IAC5D;wGAtDW,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,+VAkCE,0BAA0B,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrE9D,4qEAgEA,EAAA,MAAA,EAAA,CAAA,iknBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDlCY,gBAAgB,oJAAE,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKlC,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;+BACE,eAAe,EAAA,OAAA,EAChB,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,EAAA,eAAA,EAC7B,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,4qEAAA,EAAA,MAAA,EAAA,CAAA,iknBAAA,CAAA,EAAA;oRAsCb,0BAA0B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEpDjD,2BAA2B,CAAA;AAC7B,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AAEjC,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,sBAAsB,EAAE,IAAI;AAC5B,QAAA,8BAA8B,EAAE,IAAI,CAAC,SAAS,EAAE;AACjD,KAAA,CAAC,8EAAC;wGANQ,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,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,QAAA,EAAA,EAAA,EAAA,QAAA,ECjBxC,6XAcA,EAAA,MAAA,EAAA,CAAA,m4BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDAY,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAGlB,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBARvC,SAAS;+BACE,uBAAuB,EAAA,eAAA,EAChB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EAGtC,CAAC,mBAAmB,CAAC,EAAA,aAAA,EACf,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,6XAAA,EAAA,MAAA,EAAA,CAAA,m4BAAA,CAAA,EAAA;;;AEVvC;;;;AAIG;MAQU,yBAAyB,CAAA;AACpC;;AAEG;IACM,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAEhC;;AAEG;AACM,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAuB;AAEtD;;AAEG;IACM,SAAS,GAAG,MAAM,EAAqB;AAEhD;;AAEG;AACM,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MACnC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;QAC1B,IAAI;AACJ,QAAA,OAAO,EAAE;AACP,YAAA,sBAAsB,EAAE,IAAI;AAC5B,YAAA,8BAA8B,EAAE,IAAI,CAAC,UAAU,KAAK,QAAQ;AAC5D,YAAA,gCAAgC,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI;AACzD,SAAA;KACF,CAAC,CAAC,uFACJ;wGA5BU,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,oBAAA,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,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjBtC,y7CA0CA,EAAA,MAAA,EAAA,CAAA,ommBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3BY,iBAAiB,yRAAE,OAAO,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;+BACE,oBAAoB,EAAA,eAAA,EAGb,uBAAuB,CAAC,MAAM,WACtC,CAAC,iBAAiB,EAAE,OAAO,CAAC,EAAA,QAAA,EAAA,y7CAAA,EAAA,MAAA,EAAA,CAAA,ommBAAA,CAAA,EAAA;;;MEX1B,gBAAgB,CAAA;AAIE,IAAA,UAAA;AAHZ,IAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;AAClC,IAAA,YAAY,GAAG,IAAI,OAAO,EAAqB;AAEhE,IAAA,WAAA,CAA6B,UAAsB,EAAA;QAAtB,IAAA,CAAA,UAAU,GAAV,UAAU;AACrC,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7D,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAClD,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;gBAC1B,IAAI,CAAC,KAAK,EAAE;YACd;AACF,QAAA,CAAC,CAAC;;QAGF,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAK;AAC3C,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACxB,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC9B,QAAA,CAAC,CAAC;IACJ;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;IAC9B;AAEA,IAAA,UAAU,CAAC,IAAuB,EAAA;AAChC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE;IACd;IAEA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;IAEA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;AACD;;MC7BY,qBAAqB,GAAG,IAAI,cAAc,CACrD,uBAAuB;AAGlB,MAAM,6BAA6B,GAAgD;AACxF,IAAA,QAAQ,EAAE,OAAO;AACjB,IAAA,WAAW,EAAE,IAAI;;;MCNN,+BAA+B,CAAA;AACjC,IAAA,MAAM,GAAG,MAAM,CAAsB,qBAAqB,CAAC;AACnD,IAAA,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAEtD,IAAA,WAAW,CAAC,IAAuB,EAAA;AACjC,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;IAClC;wGANW,+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,8BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZ5C,0HAKA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDGY,yBAAyB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAIxB,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAN3C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,8BAA8B,WAC/B,CAAC,yBAAyB,CAAC,EAAA,eAAA,EAEnB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,0HAAA,EAAA;;;MEiBpC,gCAAgC,CAAA;AAC1B,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;;AAGnC,IAAA,uBAAuB,GAAG,KAAK,CAAC,QAAQ,6FAAuB;;IAG/D,kBAAkB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;;AAGpC,IAAA,qBAAqB,GAAG,KAAK,CAAwB,OAAO,4FAAC;;IAG7D,SAAS,GAAG,MAAM,EAAqB;IAExC,UAAU,GAA4B,IAAI;IAGlD,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,KAAK,EAAE;QACd;aAAO;YACL,IAAI,CAAC,IAAI,EAAE;QACb;IACF;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB;QACF;AAEA,QAAA,MAAM,MAAM,GAAwB;AAClC,YAAA,GAAG,6BAA6B;AAChC,YAAA,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE;AACrC,YAAA,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE;AAChC,YAAA,QAAQ,EAAE,IAAI,CAAC,qBAAqB,EAAE;SACvC;AAED,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC;AACjE,QAAA,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,UAAU,CAAC;AACnD,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAE5B,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,QAAQ;AACrB,YAAA,SAAS,EAAE;AACT,gBAAA,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE;AACnD,gBAAA,EAAE,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE;AACrD,aAAA;AACF,SAAA,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,+BAA+B,EAAE,IAAI,EAAE,QAAQ,CAAC;AAEnF,QAAA,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;QAEzB,UAAU,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;AAC1C,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3B,QAAA,CAAC,CAAC;AAEF,QAAA,UAAU,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAK;AACtC,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACxB,QAAA,CAAC,CAAC;IACJ;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;IACxB;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,KAAK,EAAE;IACd;AAEQ,IAAA,aAAa,CAAC,QAA+B,EAAA;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;AAE7C,QAAA,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;AAC/B,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,aAAa,EAAE,kCAAkC;YACjD,gBAAgB,EAAE,IAAI,CAAC;AACpB,iBAAA,QAAQ;AACR,iBAAA,mBAAmB,CAAC,IAAI,CAAC,UAAU;iBACnC,aAAa,CAAC,SAAS;iBACvB,QAAQ,CAAC,IAAI;iBACb,kBAAkB,CAAC,CAAC,CAAC;YACxB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE;AACtD,SAAA,CAAC;QAEF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC;AAEQ,IAAA,YAAY,CAAC,QAA+B,EAAA;AAClD,QAAA,MAAM,WAAW,GAAuD;AACtE,YAAA,KAAK,EAAE;AACL,gBAAA,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;gBACvF,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;AACxF,gBAAA,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;AACpF,aAAA;AACD,YAAA,KAAK,EAAE;gBACL,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;AACxF,gBAAA,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;AACxF,aAAA;AACD,YAAA,MAAM,EAAE;gBACN,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;AACnF,gBAAA,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;AACnF,aAAA;AACD,YAAA,KAAK,EAAE;AACL,gBAAA,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;gBAClF,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;AACpF,aAAA;SACF;AAED,QAAA,OAAO,WAAW,CAAC,QAAQ,CAAC;IAC9B;wGAlHW,gCAAgC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAhC,gCAAgC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,UAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,yBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAhC,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAL5C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,2BAA2B;AACrC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,yBAAyB;AACpC,iBAAA;;sBAoBE,YAAY;uBAAC,OAAO;;;MCxBV,oBAAoB,CAAA;AACtB,IAAA,cAAc,GAAG,KAAK,CAAgB,IAAI,qFAAC;AAC3C,IAAA,uBAAuB,GAAG,KAAK,CAAC,UAAU,8FAAC;AAC3C,IAAA,mBAAmB,GAAG,KAAK,CAAC,MAAM,0FAAC;AACnC,IAAA,KAAK,GAAG,KAAK,CAAC,CAAC,4EAAC;AAER,IAAA,SAAS,GAAG,SAAS,CAA0B,SAAS,gFAAC;AAElE,IAAA,OAAO,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,8EAAC;IAC3C,GAAG,GAAG,CAAC;IACP,OAAO,GAAsB,EAAE;IAE/B,GAAG,GAAG,CAAC;AAEN,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,8EAAC;AACxD,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;QACvC,OAAO,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG;AAClC,IAAA,CAAC,8EAAC;IAEM,4BAA4B,GAAA;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa;AAC5C,QAAA,IAAI,CAAC,IAAI;YAAE;QACX,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAkB;QAC3D,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE;AAEtB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC;QAC1D,IAAI,IAAI,GAAG,CAAC;AACZ,QAAA,IAAI,QAAQ,GAAG,MAAM,CAAC,iBAAiB;QACvC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,KAAI;YACzB,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,WAAW,GAAG,CAAC;YAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC;AAChC,YAAA,IAAI,CAAC,GAAG,QAAQ,EAAE;gBAChB,QAAQ,GAAG,CAAC;gBACZ,IAAI,GAAG,CAAC;YACV;AACF,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IACjD;AAEA,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAK;YACnB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa;AAC5C,YAAA,IAAI,CAAC,IAAI;gBAAE;YAEX,MAAM,MAAM,GAAG,MAAK;AAClB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;oBACf,IAAI,EAAE,IAAI,CAAC,UAAU;oBACrB,EAAE,EAAE,IAAI,CAAC,WAAW;oBACpB,EAAE,EAAE,IAAI,CAAC,WAAW;AACrB,iBAAA,CAAC;gBACF,IAAI,CAAC,4BAA4B,EAAE;AACrC,YAAA,CAAC;AAED,YAAA,MAAM,EAAE;YAER,MAAM,QAAQ,GAAG,MAAK;AACpB,gBAAA,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC;AAC9B,gBAAA,IAAI,CAAC,GAAG,GAAG,qBAAqB,CAAC,MAAM,CAAC;AAC1C,YAAA,CAAC;AACD,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAE5D,YAAA,MAAM,QAAQ,GAAG,MAAM,MAAM,EAAE;AAC/B,YAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAE9D,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CACf,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAClD,MAAM,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EACpD,MAAM,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CACrC;AACH,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;IACpC;IAEA,UAAU,GAAA;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa;AAC5C,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAChE;IAEA,MAAM,GAAA;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa;AAC5C,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAC/D;wGAvFW,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,w0BCtBjC,ulCAwCA,EAAA,MAAA,EAAA,CAAA,i+BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDvBY,aAAa,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,kFAAE,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKpD,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;+BACE,cAAc,EAAA,OAAA,EACf,CAAC,aAAa,EAAE,cAAc,EAAE,sBAAsB,CAAC,EAAA,eAAA,EAC/C,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ulCAAA,EAAA,MAAA,EAAA,CAAA,i+BAAA,CAAA,EAAA;ukBAUiB,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEV9D,yBAAyB,CAAA;AAC3B,IAAA,MAAM,GAAG,KAAK,CAAyB,MAAM,6EAAC;AAC9C,IAAA,WAAW,GAAG,KAAK,CAAgB,IAAI,kFAAC;AACxC,IAAA,EAAE,GAAG,KAAK,CAAS,gBAAgB,yEAAC;AAEpC,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,mBAAmB,EAAE,IAAI;QACzB,CAAC,CAAA,mBAAA,EAAsB,IAAI,CAAC,MAAM,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AACvD,KAAA,CAAC,8EAAC;AAEM,IAAA,aAAa,GAA0B,QAAQ,CAAC,MAAK;AAC5D,QAAA,QAAQ,IAAI,CAAC,MAAM,EAAE;AACnB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,mBAAmB;AAC5B,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,qBAAqB;AAC9B,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,mBAAmB;AAC5B,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,YAAY;AACjB,YAAA;AACE,gBAAA,OAAO,kBAAkB;;AAE/B,IAAA,CAAC,oFAAC;wGAvBS,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,oBAAA,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,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,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClBtC,yYAeA,EAAA,MAAA,EAAA,CAAA,wtCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDFY,iBAAiB,yRAAE,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKpC,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;+BACE,oBAAoB,EAAA,OAAA,EACrB,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,EAAA,eAAA,EAG/B,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,yYAAA,EAAA,MAAA,EAAA,CAAA,wtCAAA,CAAA,EAAA;;;MEJpC,eAAe,CAAA;;AAEjB,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;;AAGhC,IAAA,KAAK,GAAG,KAAK,CAAqB,IAAI,4EAAC;;AAGvC,IAAA,KAAK,GAAG,KAAK,CAAgB,IAAI,4EAAC;;AAGlC,IAAA,MAAM,GAAG,KAAK,CAAe,MAAM,6EAAC;;AAGpC,IAAA,WAAW,GAAG,KAAK,CAAgB,IAAI,kFAAC;;AAGxC,IAAA,IAAI,GAAG,KAAK,CAAa,GAAG,2EAAC;AAE7B,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,+EAAC;AAC9C,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,8EAAC;AAE7C,IAAA,WAAW,GAAG,QAAQ,CAAC,OAAO;AACrC,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AAC7B,QAAA,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AAC7B,QAAA,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AAC7B,QAAA,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM;AACrC,QAAA,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,SAAS;AAC3C,QAAA,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,OAAO;AACvC,QAAA,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,SAAS;AAC3C,QAAA,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,SAAS;AAC5C,KAAA,CAAC,kFAAC;AAEc,IAAA,OAAO,GAAuC;AAC7D,QAAA,UAAU,EAAE,eAAe;AAC3B,QAAA,UAAU,EAAE,kBAAkB;AAC9B,QAAA,MAAM,EAAE,MAAM;KACf;AAEQ,IAAA,aAAa,GAAG,QAAQ,CAAuB,MAAK;AAC3D,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;AACnC,IAAA,CAAC,oFAAC;wGA3CS,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,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,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,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,ECZ5B,2zBAmCA,EAAA,MAAA,EAAA,CAAA,s0hBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED5BY,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKhB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,WACV,CAAC,iBAAiB,CAAC,EAAA,eAAA,EACX,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,2zBAAA,EAAA,MAAA,EAAA,CAAA,s0hBAAA,CAAA,EAAA;;;MEApC,0BAA0B,CAAA;AACrC,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;AAChC,IAAA,QAAQ,GAAG,KAAK,CAAS,CAAC,+EAAC;AAC3B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AACzB,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,kFAAC;IAEtB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAE3E,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC3B,QAAA,OAAO,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;AACjC,IAAA,CAAC,mFAAC;AAEO,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;AAC/B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACnD,QAAA,OAAO,CAAC,OAAO,GAAG,GAAG,IAAI,GAAG;AAC9B,IAAA,CAAC,yFAAC;wGAlBS,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,qlBCRvC,6yCA6CA,EAAA,MAAA,EAAA,CAAA,y9GAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDrCa,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBANtC,SAAS;+BACE,qBAAqB,EAAA,eAAA,EACd,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6yCAAA,EAAA,MAAA,EAAA,CAAA,y9GAAA,CAAA,EAAA;;;ME0BpC,sBAAsB,CAAA;AACjC;;;;AAIG;AACM,IAAA,KAAK,GAAG,KAAK,CAAS,CAAC,4EAAC;AAEjC;;;;AAIG;AACM,IAAA,QAAQ,GAAG,KAAK,CAAU,IAAI,+EAAC;AAExC;;;;AAIG;AACM,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;AAExC;;AAEG;AACM,IAAA,IAAI,GAAG,KAAK,CAAoB,GAAG,2EAAC;AAE7C;;AAEG;AACM,IAAA,UAAU,GAAG,KAAK,CAA0B,QAAQ,iFAAC;AAE9D;;;AAGG;AACM,IAAA,IAAI,GAAG,KAAK,CAAgB,IAAI,2EAAC;AAE1C;;AAEG;AACM,IAAA,IAAI,GAAG,KAAK,CAAgB,IAAI,2EAAC;AAE1C;;AAEG;AACM,IAAA,MAAM,GAAG,KAAK,CAAgB,IAAI,6EAAC;;IAInC,QAAQ,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IAEnD,UAAU,GAAG,QAAQ,CAC5B,MACE,IAAI,CAAC,QAAQ,EAAE;QACf,IAAI,CAAC,OAAO,EAAE;AACd,QAAA,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;AACb,QAAA,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,iFAChD;IAEQ,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,kFAAC;AAE5D,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,QAAQ,IAAI,CAAC,YAAY,EAAE,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAE,gFAAC;AAEhF,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,4EAAC;AAE5E,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,aAAa,EAAE,IAAI;AACnB,QAAA,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;AAClC,QAAA,qBAAqB,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE;AACzC,QAAA,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AACrC,QAAA,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AACrC,QAAA,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AACrC,QAAA,uBAAuB,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU;AACzD,QAAA,qBAAqB,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,QAAQ;AACtD,KAAA,CAAC,8EAAC;;AAGc,IAAA,QAAQ,GAAG;AAC1B,QAAA,CAAC,EAAE;AACD,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,aAAa,EAAE,YAAY;AAC3B,YAAA,WAAW,EAAE,UAAU;AACxB,SAAA;AACD,QAAA,CAAC,EAAE;AACD,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,aAAa,EAAE,YAAY;AAC3B,YAAA,WAAW,EAAE,UAAU;AACxB,SAAA;AACD,QAAA,CAAC,EAAE;AACD,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,aAAa,EAAE,YAAY;AAC3B,YAAA,WAAW,EAAE,UAAU;AACxB,SAAA;KACF;;AAIO,IAAA,UAAU,GAAG,MAAM,CAAgB,IAAI,iFAAC;AAEhD;;;;AAIG;AACM,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QACpC,IAAI,IAAI,CAAC,UAAU,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,KAAK,EAAE;QAC1C,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;AAC1C,IAAA,CAAC,mFAAC;AAEM,IAAA,UAAU,CAAC,QAAgB,EAAA;AACjC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;;QAE3B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzD;;AAGA,IAAA,WAAW,CAAC,KAAa,EAAA;QACvB,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC;AAC3C,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC1B;;AAGA,IAAA,eAAe,CAAC,KAAa,EAAA;QAC3B,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACjD;;IAGA,UAAU,GAAA;QACR,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;;AAGA,IAAA,gBAAgB,CAAC,KAAoB,EAAA;QACnC,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;AAEvB,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG;AACrB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC3B,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAE3C,QAAA,IAAI,GAAG,KAAK,YAAY,EAAE;YACxB,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,CAAC;QACtC;AAAO,aAAA,IAAI,GAAG,KAAK,WAAW,EAAE;YAC9B,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;QACpC;aAAO;YACL;QACF;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;QACvB,KAAK,CAAC,cAAc,EAAE;IACxB;;AAIA,IAAA,gBAAgB,CAAC,KAAa,EAAA;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;AACrC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAEnC,IAAI,OAAO,IAAI,SAAS,IAAI,KAAK,GAAG,CAAC,EAAE;AACrC,YAAA,OAAO,OAAO,CAAC,aAAa,CAAC;QAC/B;aAAO,IAAI,UAAU,IAAI,SAAS,IAAI,KAAK,GAAG,GAAG,EAAE;;AAEjD,YAAA,OAAO,OAAO,CAAC,WAAW,CAAC;QAC7B;aAAO;AACL,YAAA,OAAO,OAAO,CAAC,MAAM,CAAC;QACxB;IACF;wGA9KW,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,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,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,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,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,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9BnC,osEAiEA,EAAA,MAAA,EAAA,CAAA,8tEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxCY,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKhB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,WAClB,CAAC,iBAAiB,CAAC,EAAA,eAAA,EACX,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,osEAAA,EAAA,MAAA,EAAA,CAAA,8tEAAA,CAAA,EAAA;;;AEpBjD;;;AAGG;MAQU,oBAAoB,CAAA;AAC/B;;AAEG;AACM,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAwB;AAEvD;;;AAGG;AACM,IAAA,aAAa,GAAG,KAAK,CAAgB,IAAI,oFAAC;AAEnD;;AAEG;AACM,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;AAEhC;;AAEG;AACM,IAAA,SAAS,GAAG,KAAK,CAAS,MAAM,gFAAC;IAEjC,WAAW,GAAG,QAAQ,CAAC,MAC9B,CAAC,kBAAkB,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,4BAA4B,GAAG,EAAE;SACrE,MAAM,CAAC,OAAO;AACd,SAAA,IAAI,CAAC,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACb;AAED,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK;IACvC;IAEA,WAAW,CAAC,KAAa,EAAE,KAAY,EAAA;AACrC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK,EAAE;AAClC,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B;AAEA,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAA6D;AAClF,QAAA,IAAI,MAAM,IAAI,MAAM,YAAY,iBAAiB,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;YACxF,KAAK,CAAC,cAAc,EAAE;QACxB;IACF;wGAzCW,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,wpBCjBjC,ghEA2DA,EAAA,MAAA,EAAA,CAAA,8tFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED5CY,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,kFAAE,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,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAE5C,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;+BACE,mBAAmB,EAAA,eAAA,EAGZ,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,iBAAiB,EAAE,cAAc,EAAE,UAAU,CAAC,EAAA,QAAA,EAAA,ghEAAA,EAAA,MAAA,EAAA,CAAA,8tFAAA,CAAA,EAAA;;;MEF7C,yBAAyB,CAAA;AACpC;;AAEG;AACM,IAAA,KAAK,GAAG,KAAK,CAAyB,EAAE,4EAAC;AAElD;;AAEG;AACM,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;AAEhC;;AAEG;AACM,IAAA,aAAa,GAAG,KAAK,CAAgB,IAAI,oFAAC;AAEnD;;AAEG;AACM,IAAA,SAAS,GAAG,QAAQ,CAAuB,MAClD,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AAC1B,QAAA,GAAG,IAAI;QACP,IAAI,EAAE,IAAI,CAAC,OAAO,GAAG,mBAAmB,GAAG,SAAS;KACrD,CAAC,CAAC,gFACJ;wGAxBU,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,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,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,aAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECbtC,mMAMA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDKY,oBAAoB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEnB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,mBAGd,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,oBAAoB,CAAC,EAAA,QAAA,EAAA,mMAAA,EAAA;;;MEApB,yBAAyB,CAAA;AACpC;;AAEG;AACM,IAAA,WAAW,GAAG,KAAK,CAAS,CAAC,kFAAC;AAEvC;;AAEG;AACM,IAAA,KAAK,GAAG,KAAK,CAAyB,EAAE,4EAAC;AAElD;;AAEG;AACM,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;AACxC,IAAA,CAAC,+EAAC;AAEF;;AAEG;IACM,UAAU,GAAG,QAAQ,CAAC,MAC7B,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM;QAC1B,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE;QAClC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE;KACnC,CAAC,CAAC,iFACJ;wGA7BU,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,oBAAA,EAAA,MAAA,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,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,ECXtC,sqCAkCA,EAAA,MAAA,EAAA,CAAA,07EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDzBY,OAAO,2EAAE,cAAc,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEtB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;+BACE,oBAAoB,EAAA,eAAA,EAGb,uBAAuB,CAAC,MAAM,WACtC,CAAC,OAAO,EAAE,cAAc,CAAC,EAAA,QAAA,EAAA,sqCAAA,EAAA,MAAA,EAAA,CAAA,07EAAA,CAAA,EAAA;;;AELpC,IAAI,OAAO,GAAG,CAAC;MASF,0BAA0B,CAAA;AACrC;;;;;AAKG;IACM,WAAW,GAAG,KAAK,CAAS,CAAA,YAAA,EAAe,EAAE,OAAO,CAAA,CAAE,kFAAC;AAEhE;;AAEG;AACM,IAAA,WAAW,GAAG,KAAK,CAAS,CAAC,kFAAC;AAEvC;;AAEG;AACM,IAAA,KAAK,GAAG,KAAK,CAA0B,EAAE,4EAAC;AAEnD;;AAEG;AACM,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;AACxC,IAAA,CAAC,+EAAC;AAEF;;AAEG;AACM,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,mFAAC;AAEhF;;AAEG;IACM,UAAU,GAAG,QAAQ,CAAC,MAC7B,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM;AAC1B,QAAA,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE;AACzD,QAAA,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;KAC3D,CAAC,CAAC,iFACJ;AAED;;;AAGG;IACH,MAAM,CAAC,IAA2B,EAAE,CAAS,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,EAAE,IAAI,CAAA,EAAG,IAAI,CAAC,WAAW,EAAE,CAAA,MAAA,EAAS,CAAC,CAAA,CAAE;IACrD;wGAlDW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,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,QAAA,EAAA,EAAA,EAAA,QAAA,ECbvC,klDA8CA,EAAA,MAAA,EAAA,CAAA,8tFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDnCY,OAAO,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEN,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAPtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,mBAGd,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,OAAO,CAAC,EAAA,QAAA,EAAA,klDAAA,EAAA,MAAA,EAAA,CAAA,8tFAAA,CAAA,EAAA;;;AEHpB;;;;;;AAMG;MAQU,4BAA4B,CAAA;AACvC;;AAEG;AACH,IAAA,EAAE,GAAG,KAAK,CAAS,oBAAoB,yEAAC;AAExC;;AAEG;AACH,IAAA,IAAI,GAAG,KAAK,CAA0B,OAAO,2EAAC;AAE9C;;AAEG;AACH,IAAA,SAAS,GAAG,KAAK,CAAU,IAAI,gFAAC;AAEhC;;AAEG;AACH,IAAA,UAAU,GAAG,KAAK,CAAS,QAAQ,iFAAC;AAEpC;;AAEG;AACH,IAAA,YAAY,GAAG,KAAK,CAAS,UAAU,mFAAC;AAExC;;AAEG;AACH,IAAA,QAAQ,GAAG,KAAK,CAAS,MAAM,+EAAC;AAEhC;;AAEG;AACH,IAAA,YAAY,GAAG,KAAK,CAAS,UAAU,mFAAC;AAExC;;AAEG;AACH,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,mFAAC;AAEpC;;AAEG;IACH,MAAM,GAAG,MAAM,EAAQ;AAEvB;;AAEG;IACH,QAAQ,GAAG,MAAM,EAAQ;AAEzB;;AAEG;IACH,IAAI,GAAG,MAAM,EAAQ;AAErB;;AAEG;IACH,QAAQ,GAAG,MAAM,EAAQ;IAEzB,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;IACtB;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;IAClB;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;IACtB;AAEA;;AAEG;AACH,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,EAAE,EAAE,CAAA,OAAA,CAAS,qFAAC;AACtD,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,EAAE,EAAE,CAAA,YAAA,CAAc,yFAAC;AAC/D,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,EAAE,EAAE,CAAA,SAAA,CAAW,uFAAC;AAC1D,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,EAAE,EAAE,CAAA,cAAA,CAAgB,2FAAC;AACnE,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,EAAE,EAAE,CAAA,KAAA,CAAO,mFAAC;AAClD,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,EAAE,EAAE,CAAA,UAAA,CAAY,uFAAC;AAC3D,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,EAAE,EAAE,CAAA,SAAA,CAAW,uFAAC;AAC1D,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,EAAE,EAAE,CAAA,cAAA,CAAgB,2FAAC;wGAvFxD,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,wBAAA,EAAA,MAAA,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,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,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,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,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,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtBzC,quFA0FA,EAAA,MAAA,EAAA,CAAA,ywgBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtEY,WAAW,+EAAE,WAAW,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEvB,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAPxC,SAAS;+BACE,wBAAwB,EAAA,eAAA,EAGjB,uBAAuB,CAAC,MAAM,WACtC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAA,QAAA,EAAA,quFAAA,EAAA,MAAA,EAAA,CAAA,ywgBAAA,CAAA,EAAA;;;MEsBxB,sBAAsB,CAAA;AACxB,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;AAChC,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,6EAAC;AAC9B,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAClC,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,mFAAC;AACpC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAClC,IAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,yFAAC;IAC1C,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAwB;IACtC,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC7B,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC3B,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAiC;IAC9C,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA6B;IAC/C,gBAAgB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAClC,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAgB;AAC5B,IAAA,SAAS,GAAG,KAAK,CAAS,CAAC,gFAAC;IAE5B,IAAI,GAAG,MAAM,EAAQ;IACrB,MAAM,GAAG,MAAM,EAAQ;IACvB,IAAI,GAAG,MAAM,EAAQ;IACrB,YAAY,GAAG,MAAM,EAAQ;IAC7B,UAAU,GAAG,MAAM,EAAQ;IAC3B,WAAW,GAAG,MAAM,EAAuB;IAC3C,gBAAgB,GAAG,MAAM,EAA6B;IACtD,eAAe,GAAG,MAAM,EAAU;AAElC,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,gBAAgB,EAAE,IAAI;AACtB,QAAA,6BAA6B,EAAE,IAAI,CAAC,MAAM,EAAE;AAC7C,KAAA,CAAC,8EAAC;AAEM,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,QAAQ,oFAAC;AAChE,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,mFAAC;AAC1D,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,SAAS,0FAAC;AAC5E,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,SAAS,6FAAC;AAE/E,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,2FAAC;AACxE,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,qFAAC;IACpE,cAAc,GAAG,QAAQ,CAChC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC5E;AAEQ,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;AAC1C,IAAA,CAAC,mFAAC;AAEO,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;AACpC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;QACpC,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE;QACtC;AACA,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,UAAU,CAAC;QAC3D,OAAO,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE;AACrD,IAAA,CAAC,qFAAC;IAEF,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;IAClB;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;IAClB;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7B;IAEA,eAAe,GAAA;AACb,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAa;QACjD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC;IAC3C;AAEA,IAAA,mBAAmB,CAAC,KAAsB,EAAA;AACxC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;IACnC;AAEA,IAAA,iBAAiB,CAAC,KAAa,EAAA;AAC7B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;IAClC;wGA5FW,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,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,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,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,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,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,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,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,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,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1CnC,isHAqHA,EAAA,MAAA,EAAA,CAAA,m/EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED7FI,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,eAAe,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,gBAAgB,gKAChB,WAAW,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,YAAY,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,MAAM,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,cAAc,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,QAAQ,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAGR,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAEnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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;;4FAIF,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAxBlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,eAAA,EAGV,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,sBAAsB;wBACtB,eAAe;wBACf,kBAAkB;wBAClB,uBAAuB;wBACvB,gBAAgB;wBAChB,WAAW;wBACX,YAAY;wBACZ,MAAM;wBACN,cAAc;wBACd,QAAQ;wBACR,sBAAsB;wBACtB,eAAe;wBACf,mBAAmB;wBACnB,kBAAkB;wBAClB,WAAW;wBACX,gBAAgB;AACjB,qBAAA,EAAA,QAAA,EAAA,isHAAA,EAAA,MAAA,EAAA,CAAA,m/EAAA,CAAA,EAAA;;;ME7BU,gBAAgB,CAAA;AAClB,IAAA,UAAU,GAAG,KAAK,CAAoB,SAAS,iFAAC;AAChD,IAAA,UAAU,GAAG,KAAK,CAAC,KAAK,iFAAC;AACzB,IAAA,WAAW,GAAG,KAAK,CAAC,KAAK,kFAAC;AAE1B,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,SAAS,EAAE,IAAI;AACf,QAAA,CAAC,CAAA,SAAA,EAAY,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,SAAS;AAClE,QAAA,mBAAmB,EAAE,IAAI,CAAC,UAAU,EAAE;AACvC,KAAA,CAAC,8EAAC;wGATQ,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,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,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECX7B,mqBAuBA,EAAA,MAAA,EAAA,CAAA,+04BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjBY,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKf,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,WACX,CAAC,gBAAgB,CAAC,EAAA,eAAA,EAGV,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,mqBAAA,EAAA,MAAA,EAAA,CAAA,+04BAAA,CAAA,EAAA;;;MEqBpC,0BAA0B,CAAA;AAC5B,IAAA,UAAU,GAAG,KAAK,CAA8B,SAAS,iFAAC;AAC1D,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;AACvB,IAAA,IAAI,GAAG,KAAK,CAAS,mBAAmB,2EAAC;AACzC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AACzB,IAAA,OAAO,GAAG,KAAK,CAAC,KAAK,8EAAC;AACtB,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;AACvB,IAAA,qBAAqB,GAAG,KAAK,CAA+B,KAAK,4FAAC;AAClE,IAAA,aAAa,GAAG,KAAK,CAAuB,OAAO,oFAAC;AACpD,IAAA,SAAS,GAAG,KAAK,CAAwB,UAAU,gFAAC;AAE5C,IAAA,UAAU,GAAG,MAAM,CAAmB,EAAE,iFAAC;AACzC,IAAA,kBAAkB,GAAG,MAAM,CAAC,KAAK,yFAAC;AAC3C,IAAA,iBAAiB,GAAe,MAAK,EAAE,CAAC;AACxC,IAAA,gBAAgB,GAAsC,MAAK,EAAE,CAAC;AAEtE,IAAA,WAAA,GAAA;;;QAGE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE;AACnC,YAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAC9B,gBAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACrB,oBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC;gBACnC;qBAAO,IAAI,YAAY,EAAE;oBACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnC;YACF;AACF,QAAA,CAAC,CAAC;IACJ;AAEmB,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,KAAK,UAAU,iFAAC;AAC5D,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,KAAK,OAAO,8EAAC;AAEtD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AAC3C,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI;QACnC;QACA,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE;AAC3C,IAAA,CAAC,gFAAC;AAEiB,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AACzC,QAAA,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,qBAAqB,CAAC;AAE9C,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,CAAA,SAAA,EAAY,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE,CAAC;QAC9E,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC;QAClD,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC;QAClD,IAAI,IAAI,CAAC,SAAS,EAAE;AAAE,YAAA,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC;QAEnD,GAAG,CAAC,IAAI,CAAC,CAAA,eAAA,EAAkB,IAAI,CAAC,qBAAqB,EAAE,CAAA,CAAE,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,CAAA,eAAA,EAAkB,IAAI,CAAC,aAAa,EAAE,CAAA,CAAE,CAAC;AAElD,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AACtB,IAAA,CAAC,8EAAC;;AAGF,IAAA,UAAU,CAAC,KAAuB,EAAA;AAChC,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAC5B;AAEA,IAAA,gBAAgB,CAAC,EAAqC,EAAA;AACpD,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;IAC5B;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;IAC7B;AAEA,IAAA,YAAY,CAAC,KAAY,EAAA;AACvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;AAE/C,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;AACnC,YAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC;QACvC;aAAO;YACL,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;AACjC,YAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC;QACrC;QAEA,IAAI,CAAC,iBAAiB,EAAE;IAC1B;wGAjFW,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,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,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,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,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,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,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,EC5BH,27BAiCA,EAAA,MAAA,EAAA,CAAA,y+lCAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDHa,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAbtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,eAAA,EACd,uBAAuB,CAAC,MAAM,EAAA,SAAA,EAGpC;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,27BAAA,EAAA,MAAA,EAAA,CAAA,y+lCAAA,CAAA,EAAA;;;MEdU,0BAA0B,CAAA;AAC5B,IAAA,WAAW,GAAG,KAAK,CAA2B,WAAW,kFAAC;AAC1D,IAAA,EAAE,GAAG,KAAK,CAAS,CAAC,yEAAC;AACrB,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;AACxB,IAAA,SAAS,GAAG,CAAA,aAAA,EAAgB,IAAI,CAAC,EAAE,EAAE,EAAE;AAEvC,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,WAAW,yFAAC;AACvE,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,oFAAC;AAC7D,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,sFAAC;IAEjE,MAAM,GAAG,MAAK;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACjC,IAAA,CAAC;AAEQ,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,qBAAqB,CAAC;AAE9C,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAC9B,GAAG,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,IAAI,CAAC,WAAW,EAAE,CAAA,CAAE,CAAC;QACpD;AAEA,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AACtB,IAAA,CAAC,gFAAC;wGAtBS,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,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,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECdvC,+uDA0DA,EAAA,MAAA,EAAA,CAAA,0y4BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED9CY,gBAAgB,oJAAE,kBAAkB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAE1E,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAPtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,eAAA,EACd,uBAAuB,CAAC,MAAM,EAAA,OAAA,EAGtC,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,+uDAAA,EAAA,MAAA,EAAA,CAAA,0y4BAAA,CAAA,EAAA;;;MEC3E,aAAa,GAAG,IAAI,cAAc,CAAkB,eAAe;MACnE,WAAW,GAAG,IAAI,cAAc,CAAU,aAAa;AAE7D,MAAM,qBAAqB,GAA6B;AAC7D,IAAA,QAAQ,EAAE,OAAO;AACjB,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,IAAI,EAAE,KAAK;CACZ;;MCfY,YAAY,CAAA;AAeM,IAAA,UAAA;AAdZ,IAAA,YAAY,GAAG,IAAI,OAAO,EAAiB;AAC3C,IAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;AAClC,IAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;AAE1C,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,6EAAC;AACtB,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,4EAAC;AAClB,IAAA,YAAY,GAAG,MAAM,CAAC,EAAE,mFAAC;AACzB,IAAA,QAAQ,GAAG,MAAM,CAAoB,OAAO,+EAAC;AAC7C,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;AACxB,IAAA,IAAI,GAAG,MAAM,CAAC,KAAK,2EAAC;AACpB,IAAA,UAAU,GAAG,MAAM,CAAqB,SAAS,iFAAC;IAEnD,iBAAiB,GAAG,GAAG;AAE/B,IAAA,WAAA,CAA6B,UAAsB,EAAA;QAAtB,IAAA,CAAA,UAAU,GAAV,UAAU;IAAe;IAEtD,IAAI,GAAA;QACF,qBAAqB,CAAC,MAAK;AACzB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACxB,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC9B,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,KAAK,CAAC,MAAU,EAAA;AACd,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QAEtB,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC9B,QAAA,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAC5B;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;IAEA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;IAEA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;IAEA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;AACD;;MC9BY,wBAAwB,CAAA;AAC1B,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAChC,IAAA,MAAM,GAAG,MAAM,CAAkB,aAAa,CAAC;AAE/C,IAAA,YAAY,GAAG,SAAS,CAAC,eAAe,mFAAC;IAElD,SAAS,GAA6B,IAAI;IAElC,YAAY,GAAiC,IAAI;AAEhD,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;AAClC,QAAA,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;AAC9C,QAAA,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,OAAO;AACnF,KAAA,CAAC,8EAAC;AAEM,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;QACzC,OAAO,KAAK,GAAG,CAAA,kBAAA,EAAqB,KAAK,CAAA,CAAE,GAAG,mBAAmB;AACnE,IAAA,CAAC,oFAAC;IAEO,SAAS,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEjF,IAAA,eAAe,CAAI,SAAkB,EAAA;AACnC,QAAA,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,SAAS,CAAC;AAC7C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;QAElC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC;QACnD;QAEA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC;QACxD,OAAO,IAAI,CAAC,YAA+B;IAC7C;AAEA,IAAA,cAAc,CAAC,GAAsB,EAAA;AACnC,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG;IACtB;AAEA,IAAA,IAAI,KAAU;IAEd,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;IAC5B;AAEA,IAAA,eAAe,CAAC,KAAiB,EAAA;QAC/B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;IAGA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;AAC3B,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;QACxB;IACF;wGAxDW,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,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAID,eAAe,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7BnD,snDA4DA,EAAA,MAAA,EAAA,CAAA,2wFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxCY,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,oJAAE,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAK9E,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,OAAA,EACvB,CAAC,sBAAsB,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAA,eAAA,EAGzE,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,snDAAA,EAAA,MAAA,EAAA,CAAA,2wFAAA,CAAA,EAAA;8FAMb,eAAe,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA;sBA+ChD,YAAY;uBAAC,gBAAgB;;;ME/DnB,gBAAgB,CAAA;AACV,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAE5C,IAAI,CACF,SAAkB,EAClB,MAA0B,EAAA;AAE1B,QAAA,MAAM,YAAY,GAAG;AACnB,YAAA,GAAG,qBAAqB;AACxB,YAAA,GAAG,MAAM;SACY;AAEvB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE;AACvC,QAAA,MAAM,SAAS,GAAG,IAAI,YAAY,CAAI,UAAU,CAAC;QAEjD,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC;QACvC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,YAAY,IAAI,EAAE,CAAC;QAC3D,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,IAAI,OAAO,CAAC;QACxD,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,IAAI,KAAK,CAAC;QACtD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,KAAK,CAAC;QAC9C,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC;AAEjD,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,QAAQ;AACrB,YAAA,SAAS,EAAE;AACT,gBAAA,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE;AAC9C,gBAAA,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE;gBAClD,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,IAAI,IAAI,IAAI,EAAE;AAC9D,aAAA;AACF,SAAA,CAAC;QAEF,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,wBAAwB,EAAE,IAAI,EAAE,QAAQ,CAAC;QAErF,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC;AACvD,QAAA,MAAM,iBAAiB,GAAG,YAAY,CAAC,QAAQ;;QAG/C,qBAAqB,CAAC,MAAK;;;AAGzB,YAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;AACpC,gBAAA,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AAChF,aAAA,CAAC;YAEF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC;YAClE,iBAAiB,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;YAEhD,SAAS,CAAC,IAAI,EAAE;AAClB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,SAAS;IAClB;IAEQ,aAAa,GAAA;AACnB,QAAA,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;YAC/B,WAAW,EAAE,KAAK;AAClB,YAAA,UAAU,EAAE,yBAAyB;YACrC,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE;YAClD,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE;AACtD,SAAA,CAAC;QAEF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC;wGAhEW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA;;4FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCLrB,wBAAwB,CAAA;AAClB,IAAA,GAAG,GAAG,MAAM,EAAC,WAAiB,EAAC;AAC/B,IAAA,SAAS,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAE7D,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAK;YACnB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;AACzC,QAAA,CAAC,CAAC;IACJ;wGARW,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,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAJpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCkBY,kBAAkB,CAAA;AACpB,IAAA,IAAI,GAAG,KAAK,CAAU,KAAK,2EAAC;AAC5B,IAAA,QAAQ,GAAG,KAAK,CAAoB,OAAO,+EAAC;AAC5C,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,IAAI,GAAG,KAAK,CAAU,KAAK,2EAAC;AAC5B,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;IAChC,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;IAC1C,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAE5B,UAAU,GAAG,MAAM,EAAW;IAC9B,SAAS,GAAG,MAAM,EAAQ;IAE1B,SAAS,GAAG,YAAY,CAAoB,QAAQ,iFAAI,WAAW,EAAE,KAAK,EAAA,CAAG;IAE7E,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,6EAAC;AAE5B,IAAA,OAAO,GAAG,QAAQ,CAAC,OAAO;AACjC,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE;AACxB,QAAA,mBAAmB,EAAE,IAAI,CAAC,QAAQ,EAAE;AACpC,QAAA,CAAC,CAAA,WAAA,EAAc,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,OAAO;AAC/D,KAAA,CAAC,8EAAC;AAEM,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;QAC/B,OAAO,KAAK,GAAG,CAAA,kBAAA,EAAqB,KAAK,CAAA,CAAE,GAAG,mBAAmB;AACnE,IAAA,CAAC,oFAAC;IAEO,SAAS,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEvE,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAC9B,QAAA,CAAC,CAAC;IACJ;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACvB;AAEA,IAAA,IAAI,KAAI;IAGR,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,CAAC,KAAK,EAAE;QACd;IACF;AAEA,IAAA,eAAe,CAAC,KAAiB,EAAA;QAC/B,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,KAAK,EAAE;IACd;wGAxDW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,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,IAAA,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,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxB/B,ulDAiEA,EAAA,MAAA,EAAA,CAAA,2wFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED9CY,sBAAsB,gLAAE,WAAW,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAK7D,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,OAAA,EACb,CAAC,sBAAsB,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAGxD,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ulDAAA,EAAA,MAAA,EAAA,CAAA,2wFAAA,CAAA,EAAA;AAcM,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,QAAQ,EAAA,EAAA,GAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA;sBAkCpF,YAAY;uBAAC,gBAAgB;;;MEhDnB,mBAAmB,CAAA;AACrB,IAAA,UAAU,GAAG,KAAK,CAAuB,SAAS,iFAAC;AACnD,IAAA,QAAQ,GAAG,KAAK,CAAqB,QAAQ,+EAAC;AAC9C,IAAA,IAAI,GAAG,KAAK,CAAiB,GAAG,2EAAC;AACjC,IAAA,OAAO,GAAG,KAAK,CAAU,IAAI,8EAAC;AAC9B,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;IAChC,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IACvB,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC7B,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAC7B,IAAA,IAAI,GAAG,KAAK,CAAU,KAAK,2EAAC;IAE5B,UAAU,GAAG,MAAM,EAAQ;IAEpC,SAAS,GAAG,YAAY,CAAoB,QAAQ,iFAAI,WAAW,EAAE,KAAK,EAAA,CAAG;AAEpE,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;QAE9B,OAAO;AACL,YAAA,YAAY,EAAE,IAAI;YAClB,qBAAqB,EAAE,UAAU,KAAK,SAAS;AAC/C,YAAA,CAAC,CAAA,YAAA,EAAe,QAAQ,CAAA,CAAE,GAAG,IAAI;AACjC,YAAA,CAAC,CAAA,YAAA,EAAe,IAAI,CAAA,CAAE,GAAG,IAAI;YAC7B,wBAAwB,EAAE,CAAC,OAAO;SACnC;AACH,IAAA,CAAC,+EAAC;IAEF,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;wGAhCW,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,+2CCtBhC,u5BAkCA,EAAA,MAAA,EAAA,CAAA,ozLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDlBY,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,2EAAE,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAMhD,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAR/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAAA,OAAA,EACd,CAAC,gBAAgB,EAAE,OAAO,EAAE,sBAAsB,CAAC,EAAA,eAAA,EAG3C,uBAAuB,CAAC,MAAM,YACrC,YAAY,EAAA,QAAA,EAAA,u5BAAA,EAAA,MAAA,EAAA,CAAA,ozLAAA,CAAA,EAAA;AAesB,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,QAAQ,EAAA,EAAA,GAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEjBjE,cAAc,GAAG,IAAI,cAAc,CAAgB,gBAAgB;MACnE,YAAY,GAAG,IAAI,cAAc,CAAU,cAAc;AAE/D,MAAM,sBAAsB,GAAyC;AAC1E,IAAA,UAAU,EAAE,SAAS;AACrB,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,QAAQ,EAAE,KAAK;CAChB;;MCxBY,UAAU,CAAA;AAIQ,IAAA,UAAA;AAHZ,IAAA,YAAY,GAAG,IAAI,OAAO,EAAiB;IACpD,OAAO,GAAG,KAAK;AAEvB,IAAA,WAAA,CAA6B,UAAsB,EAAA;QAAtB,IAAA,CAAA,UAAU,GAAV,UAAU;AACrC,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7D,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAClD,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;gBAC1B,IAAI,CAAC,KAAK,EAAE;YACd;AACF,QAAA,CAAC,CAAC;;QAGF,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAK;AAC3C,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACjB,gBAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AACjC,gBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;YAC9B;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,KAAK,CAAC,MAAU,EAAA;QACd,IAAI,IAAI,CAAC,OAAO;YAAE;AAClB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC5B,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;IAC3B;IAEA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;AACD;;MCMY,yBAAyB,CAAA;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,MAAM,GAAG,MAAM,CAAgB,cAAc,CAAC;AACtC,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAEvC,IAAA,YAAY,GAAG,SAAS,CAAC,eAAe,mFAAC;AAEzC,IAAA,SAAS,GAAG,MAAM,CAA2B,IAAI,gFAAC;AAE3D,IAAA,cAAc,CAAC,GAAsB,EAAA;AACnC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AACvB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;wGAZW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAKF,eAAe,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA7BvC;;;;;;;;;;;;;;;;;;;;;AAqBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAtBS,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAyBrD,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBA3BrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,uBAAuB;AACjC,oBAAA,OAAO,EAAE,CAAC,mBAAmB,EAAE,eAAe,EAAE,gBAAgB,CAAC;AACjE,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;AAqBT,EAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAChD,iBAAA;8FAMmC,eAAe,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MCZtC,0BAA0B,CAAA;AACpB,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;AAG/B,IAAA,iBAAiB,GAAG,KAAK,CAAuB,IAAI,wFAAC;;AAGrD,IAAA,kBAAkB,GAAG,KAAK,CAAqB,OAAO,yFAAC;;IAGvD,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC9B,kBAAkB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AACpC,IAAA,iBAAiB,GAAG,KAAK,CAA8B,SAAS,wFAAC;AACjE,IAAA,eAAe,GAAG,KAAK,CAAqB,QAAQ,sFAAC;AACrD,IAAA,WAAW,GAAG,KAAK,CAAwB,GAAG,kFAAC;AAC/C,IAAA,cAAc,GAAG,KAAK,CAAU,IAAI,qFAAC;AACrC,IAAA,eAAe,GAAG,KAAK,CAAU,KAAK,sFAAC;IACvC,kBAAkB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IACpC,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAW;;AAG9B,IAAA,iBAAiB,GAAG,KAAK,CAAS,GAAG,wFAAC;;IAGtC,aAAa,GAAG,MAAM,EAAW;IAElC,UAAU,GAAsB,IAAI;IACpC,UAAU,GAAsB,IAAI;;IAGpC,cAAc,GAAyC,IAAI;IAC3D,eAAe,GAAyC,IAAI;IAC5D,wBAAwB,GAAwB,IAAI;IACpD,wBAAwB,GAAwB,IAAI;IAE5D,QAAQ,GAAA;;IAER;;;;IAMA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,KAAK,OAAO;YAAE;AAC3C,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,KAAK,EAAE;QACd;aAAO;YACL,IAAI,CAAC,IAAI,EAAE;QACb;IACF;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,KAAK,OAAO;YAAE;QAC3C,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,IAAI,CAAC,UAAU;YAAE;AACrB,QAAA,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAK;AACpC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;YAC1B,IAAI,CAAC,IAAI,EAAE;AACb,QAAA,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC9B;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,KAAK,OAAO;YAAE;QAC3C,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,kBAAkB,EAAE;IAC3B;;;;IAMA,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,IAAI,CAAC,KAAK,EAAE;QACd;aAAO;YACL,IAAI,CAAC,IAAI,EAAE;QACb;IACF;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB;QACF;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,KAAK,OAAO;AAErD,QAAA,MAAM,MAAM,GAAkB;AAC5B,YAAA,GAAG,sBAAsB;AACzB,YAAA,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE;AAC1B,YAAA,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE;AACtC,YAAA,UAAU,EAAE,IAAI,CAAC,iBAAiB,EAAE;AACpC,YAAA,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE;AAChC,YAAA,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;AACxB,YAAA,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE;AAC9B,YAAA,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE;AAChC,YAAA,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE;AACtC,YAAA,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;SACzB;AAED,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,IAAI,QAAQ,EAAE,OAAO,CAAC;AAC3E,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAC5B,QAAA,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC;AAC7C,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAE5B,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,QAAQ;AACrB,YAAA,SAAS,EAAE;AACT,gBAAA,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;AAC7C,gBAAA,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE;gBAC7C,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE;AACzD,aAAA;AACF,SAAA,CAAC;QAEF,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,yBAAyB,EAAE,IAAI,EAAE,QAAQ,CAAC;QAEtF,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC;AACvD,QAAA,MAAM,iBAAiB,GAAG,YAAY,CAAC,QAAQ;;AAG/C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE;QAC1C,IAAI,SAAS,EAAE;YACb,qBAAqB,CAAC,MAAK;AACzB,gBAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;AACpC,oBAAA,MAAM,EAAE,QAAQ;oBAChB,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AACjF,iBAAA,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC;gBAClE,iBAAiB,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;AAClD,YAAA,CAAC,CAAC;QACJ;;QAGA,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC;QAC9C;QAEA,UAAU,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;AAC5C,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;YAC/B,IAAI,CAAC,2BAA2B,EAAE;AAClC,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACxB,QAAA,CAAC,CAAC;IACJ;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;IACxB;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,2BAA2B,EAAE;QAClC,IAAI,CAAC,KAAK,EAAE;IACd;;;;IAMQ,kBAAkB,GAAA;QACxB,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC,MAAK;AACrC,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;YAC3B,IAAI,CAAC,KAAK,EAAE;AACd,QAAA,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC9B;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE;AACjC,YAAA,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;AAClC,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;QAC7B;IACF;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE;AAChC,YAAA,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;AACjC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;IACF;AAEQ,IAAA,2BAA2B,CAAC,UAAsB,EAAA;AACxD,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,cAAc;AACtC,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;AACjC,YAAA,IAAI,CAAC,wBAAwB,GAAG,MAAK;gBACnC,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,CAAC;AACD,YAAA,IAAI,CAAC,wBAAwB,GAAG,MAAK;AACnC,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAClD,YAAA,CAAC;YACD,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,wBAAwB,CAAC;YAClE,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,wBAAwB,CAAC;AACpE,QAAA,CAAC,CAAC;IACJ;IAEQ,2BAA2B,GAAA;QACjC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE;AACrD,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc;AAC3C,YAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE;gBACjC,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,wBAAwB,CAAC;YACvE;AACA,YAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE;gBACjC,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,wBAAwB,CAAC;YACvE;QACF;AACA,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI;AACpC,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI;IACtC;;;;IAMQ,aAAa,CAAC,QAA4B,EAAE,SAAkB,EAAA;QACpE,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;AAE7C,QAAA,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;YAC/B,WAAW,EAAE,CAAC,SAAS;YACvB,aAAa,EAAE,SAAS,GAAG,EAAE,GAAG,kCAAkC;YAClE,gBAAgB,EAAE,IAAI,CAAC;AACpB,iBAAA,QAAQ;AACR,iBAAA,mBAAmB,CAAC,IAAI,CAAC,UAAU;iBACnC,aAAa,CAAC,SAAS;iBACvB,QAAQ,CAAC,IAAI;iBACb,kBAAkB,CAAC,CAAC,CAAC;YACxB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE;AACtD,SAAA,CAAC;QAEF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC;AAEQ,IAAA,YAAY,CAAC,QAA4B,EAAA;AAC/C,QAAA,MAAM,WAAW,GAAoD;AACnE,YAAA,MAAM,EAAE;AACN,gBAAA,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;gBACzF,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;AAC3F,aAAA;AACD,YAAA,GAAG,EAAE;gBACH,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;AAC1F,gBAAA,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;AAC1F,aAAA;AACD,YAAA,IAAI,EAAE;gBACJ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;AACzF,gBAAA,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;AACzF,aAAA;AACD,YAAA,KAAK,EAAE;AACL,gBAAA,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;gBACxF,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;AAC1F,aAAA;SACF;AAED,QAAA,OAAO,WAAW,CAAC,QAAQ,CAAC;IAC9B;wGArQW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,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,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,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,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,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,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,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,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,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,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBATtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,cAAc,EAAE,oBAAoB;AACpC,wBAAA,cAAc,EAAE,oBAAoB;AACrC,qBAAA;AACF,iBAAA;;;MCpBY,cAAc,CAAA;AACR,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAE5C;;AAEG;AACH,IAAA,IAAI,CACF,SAAkB,EAClB,MAAgC,EAChC,MAAwB,EAAA;AAExB,QAAA,MAAM,YAAY,GAAG;AACnB,YAAA,GAAG,sBAAsB;AACzB,YAAA,GAAG,MAAM;SACU;AAErB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,IAAI,QAAQ,CAAC;AAChF,QAAA,MAAM,UAAU,GAAG,IAAI,UAAU,CAAI,UAAU,CAAC;AAEhD,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,QAAQ;AACrB,YAAA,SAAS,EAAE;AACT,gBAAA,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;AAC7C,gBAAA,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE;gBACnD,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC,IAAI,IAAI,IAAI,EAAE;AAC/D,aAAA;AACF,SAAA,CAAC;QAEF,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,yBAAyB,EAAE,IAAI,EAAE,QAAQ,CAAC;QAEtF,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC;AACvD,QAAA,MAAM,iBAAiB,GAAG,YAAY,CAAC,QAAQ;QAE/C,qBAAqB,CAAC,MAAK;AACzB,YAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;AACpC,gBAAA,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AACjF,aAAA,CAAC;YAEF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC;YAClE,iBAAiB,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;AAClD,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,UAAU;IACnB;IAEQ,aAAa,CACnB,MAAgC,EAChC,QAA4B,EAAA;QAE5B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;AAE7C,QAAA,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;AAC/B,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,aAAa,EAAE,kCAAkC;YACjD,gBAAgB,EAAE,IAAI,CAAC;AACpB,iBAAA,QAAQ;iBACR,mBAAmB,CAAC,MAAM;iBAC1B,aAAa,CAAC,SAAS;iBACvB,QAAQ,CAAC,IAAI;iBACb,kBAAkB,CAAC,CAAC,CAAC;YACxB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE;AAC3D,SAAA,CAAC;QAEF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC;AAEQ,IAAA,YAAY,CAAC,QAA4B,EAAA;AAC/C,QAAA,MAAM,WAAW,GAAoD;AACnE,YAAA,MAAM,EAAE;AACN,gBAAA,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;gBACzF,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;AAC3F,aAAA;AACD,YAAA,GAAG,EAAE;gBACH,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;AAC1F,gBAAA,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;AAC1F,aAAA;AACD,YAAA,IAAI,EAAE;gBACJ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;AACzF,gBAAA,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;AACzF,aAAA;AACD,YAAA,KAAK,EAAE;AACL,gBAAA,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE;gBACxF,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;AAC1F,aAAA;SACF;AAED,QAAA,OAAO,WAAW,CAAC,QAAQ,CAAC;IAC9B;wGAzFW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cADD,MAAM,EAAA,CAAA;;4FACnB,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCNrB,yBAAyB,CAAA;AACnB,IAAA,GAAG,GAAG,MAAM,EAAC,WAAiB,EAAC;AAC/B,IAAA,SAAS,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAE9D,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAK;YACnB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;AACzC,QAAA,CAAC,CAAC;IACJ;wGARW,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,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAJrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;ACND;;MCYa,+BAA+B,CAAA;;AAEjC,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;;AAGhC,IAAA,MAAM,GAAG,KAAK,CAAS,CAAC,6EAAC;;AAGzB,IAAA,MAAM,GAAG,KAAK,CAA+B,OAAO,6EAAC;;AAGrD,IAAA,KAAK,GAAG,KAAK,CAAU,KAAK,4EAAC;;AAG7B,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;;AAGlC,IAAA,UAAU,GAAG,KAAK,CAAS,OAAO,iFAAC;;AAGnC,IAAA,WAAW,GAAG,KAAK,CAAS,QAAQ,kFAAC;;IAGrC,SAAS,GAAG,MAAM,EAAU;;IAG5B,WAAW,GAAG,MAAM,EAAgC;;AAGpD,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,iFAAC;;IAG9E,WAAW,GAAG,QAAQ,CAAC,MAC9B,IAAI,CAAC,MAAM,EAAE,KAAK,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACnE;AAED,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5B;IAEA,aAAa,GAAA;QACX,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACtC;wGA3CW,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA/B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,+BAA+B,sjCCZ5C,2yCAgDA,EAAA,MAAA,EAAA,CAAA,ggCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtCY,kBAAkB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,iFAAE,YAAY,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAE9C,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAP3C,SAAS;+BACE,0BAA0B,EAAA,eAAA,EAGnB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,kBAAkB,EAAE,aAAa,EAAE,YAAY,CAAC,EAAA,QAAA,EAAA,2yCAAA,EAAA,MAAA,EAAA,CAAA,ggCAAA,CAAA,EAAA;;;AEF5D,MAAM,oBAAoB,GAAG,GAAG;MAGnB,gBAAgB,CAAA;;AAElB,IAAA,UAAU,GAAG,MAAM,CAAM,EAAE,iFAAC;AAC5B,IAAA,UAAU,GAAG,MAAM,CAAS,CAAC,iFAAC;;AAG9B,IAAA,IAAI,GAAG,MAAM,CAAsB,QAAQ,2EAAC;;AAG5C,IAAA,UAAU,GAAG,MAAM,CAAa,QAAQ,iFAAC;;AAGzC,IAAA,eAAe,GAAG,MAAM,CAAkB,YAAY,sFAAC;;AAGvD,IAAA,UAAU,GAAG,MAAM,CAAiB,EAAE,iFAAC;AACvC,IAAA,YAAY,GAAG,MAAM,CAAqB,EAAE,mFAAC;;AAG7C,IAAA,WAAW,GAAG,MAAM,CAAY,EAAE,kFAAC;;AAGnC,IAAA,YAAY,GAAG,MAAM,CAAe,EAAE,mFAAC;AACvC,IAAA,cAAc,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,qFAAC;;AAGxD;;;AAGG;IACM,WAAW,GAAG,MAAM,CAAc,EAAE,UAAU,EAAE,EAAE,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAG9D;AACoD;AAC3C,IAAA,iBAAiB,GAAG,MAAM,CAAU,IAAI,wFAAC;AACzC,IAAA,SAAS,GAAG,MAAM,CAAS,CAAC,gFAAC;AAC7B,IAAA,QAAQ,GAAG,MAAM,CAAS,EAAE,+EAAC;AAC7B,IAAA,eAAe,GAAG,MAAM,CAAS,CAAC,sFAAC;;AAGnC,IAAA,UAAU,GAAG,MAAM,CAAS,CAAC,iFAAC;AAC9B,IAAA,SAAS,GAAG,MAAM,CAAS,CAAC,gFAAC;AAC7B,IAAA,mBAAmB,GAAG,MAAM,CAAS,CAAC,0FAAC;AACvC,IAAA,oBAAoB,GAAG,MAAM,CAAS,CAAC,2FAAC;AACxC,IAAA,uBAAuB,GAAG,MAAM,CAAS,CAAC,8FAAC;;AAG3C,IAAA,8BAA8B,GAAG,MAAM,CAAU,KAAK,qGAAC;AACvD,IAAA,kBAAkB,GAAG,MAAM,CAAiC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,yFAAC;;;AAIjF,IAAA,eAAe,GAAG,MAAM,CAAiC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,sFAAC;;AAE9E,IAAA,eAAe,GAAG,MAAM,CAAS,CAAC,sFAAC;;AAEnC,IAAA,kBAAkB,GAAG,MAAM,CAAS,CAAC,yFAAC;;AAEtC,IAAA,eAAe,GAAG,MAAM,CAAS,CAAC,sFAAC;;AAGnC,IAAA,SAAS,GAAG,MAAM,CAAU,KAAK,gFAAC;AAClC,IAAA,SAAS,GAAG,MAAM,CAAS,EAAE,gFAAC;AAC9B,IAAA,OAAO,GAAG,MAAM,CAAc,SAAS,8EAAC;;AAGxC,IAAA,cAAc,GAAG,MAAM,CAAe,IAAI,GAAG,EAAE,qFAAC;AAChD,IAAA,cAAc,GAAG,MAAM,CAAe,IAAI,GAAG,EAAE,qFAAC;AAChD,IAAA,aAAa,GAAG,MAAM,CAA0B,MAAM,oFAAC;;AAGvD,IAAA,WAAW,GAAG,MAAM,CAAmB,IAAI,kFAAC;AAC5C,IAAA,YAAY,GAAG,MAAM,CAAmB,IAAI,mFAAC;AAC7C,IAAA,SAAS,GAAG,MAAM,CAA8C,IAAI,gFAAC;AACrE,IAAA,UAAU,GAAG,MAAM,CAAU,KAAK,iFAAC;AACnC,IAAA,WAAW,GAAG,MAAM,CAA8B,IAAI,kFAAC;;AAGvD,IAAA,SAAS,GAAG,MAAM,CAAU,KAAK,gFAAC;AAClC,IAAA,UAAU,GAAG,MAAM,CAAmB,IAAI,iFAAC;AAC3C,IAAA,UAAU,GAAG,MAAM,CAAmB,IAAI,iFAAC;;AAG3C,IAAA,SAAS,GAAG,MAAM,CAA8C,IAAI,gFAAC;;AAGrE,IAAA,cAAc,GAAG,MAAM,CAAe,IAAI,GAAG,EAAE,qFAAC;AAChD,IAAA,UAAU,GAAG,MAAM,CAAS,IAAI,iFAAC;;AAGjC,IAAA,yBAAyB,GAAG,MAAM,CAAU,IAAI,gGAAC;;AAGjD,IAAA,mBAAmB,GAAG,MAAM,CAA4B,MAAM,0FAAC;;AAG/D,IAAA,cAAc,GAAG,MAAM,CAAgB,IAAI,qFAAC;AAC5C,IAAA,kBAAkB,GAAG,MAAM,CAAgB,IAAI,yFAAC;;IAGhD,aAAa,GAAG,MAAM,CAAgB;AAC7C,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,aAAa,EAAE,SAAS;AACxB,QAAA,UAAU,EAAE,SAAS;AACrB,QAAA,eAAe,EAAE,IAAI;AACtB,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEF;;AAEwE;AAC/D,IAAA,uBAAuB,GAAG,MAAM,CAAU,KAAK,8FAAC;;AAGhD,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY;aAC3B,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO;AAC3B,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;AACpC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC;AAC3D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAC9C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC;QAC1D,OAAO,CAAC,GAAG,UAAU,EAAE,GAAG,QAAQ,EAAE,GAAG,WAAW,CAAC;AACrD,IAAA,CAAC,qFAAC;;IAGO,iBAAiB,GAAG,QAAQ,CAAC,MACpC,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC1D;IAEQ,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IAEhF,kBAAkB,GAAG,QAAQ,CAAC,MACrC,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACxD;AAEQ,IAAA,eAAe,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,sFACrE;AAEQ,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MACnC,IAAI,CAAC,kBAAkB,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,uFACtE;AAED;;;;;AAKG;AACM,IAAA,2BAA2B,GAAG,QAAQ,CAAC,MAAK;AACnD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACrC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,IAAI,CAAC,MAAM,CAAC;QAC1C,IAAI,GAAG,GAAG,CAAC;AACX,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG;AACZ,YAAA,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY;QAC7B;AACA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,kGAAC;AAEF;;;;AAIG;AACM,IAAA,4BAA4B,GAAG,QAAQ,CAAC,MAAK;AACpD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE;QACtC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,IAAI,CAAC,MAAM,CAAC;QAC1C,IAAI,GAAG,GAAG,CAAC;AACX,QAAA,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACzC,YAAA,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG;AACZ,YAAA,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY;QAC7B;AACA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,mGAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAChC,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,oFACnE;AAED;;;;;AAKG;AACH;;;AAGG;AACM,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AAC5C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,EAAE;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,WAAW;AAChD,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,GAAG;QACxB,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM;AACvD,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,GAAG,eAAe;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM;AAC3C,QAAA,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,KAAK;AAAE,YAAA,OAAO,GAAG;QACvD,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC;AACvC,YAAA,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,CAAC,CAAC;SACxC;AACH,IAAA,CAAC,2FAAC;AAEO,IAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAK;AAC/C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,8BAA8B,EAAE;AAAE,YAAA,OAAO,GAAG;QACtD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,oBAAoB,EAAE;QAClD,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM;AAAE,YAAA,OAAO,GAAG;QAChD,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;AAC9B,IAAA,CAAC,8FAAC;AAEO,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,8BAA8B,EAAE;AAAE,YAAA,OAAO,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC,KAAK;AAC/C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE;QACnC,IAAI,CAAC,GAAG,CAAC;AACT,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;AAAE,YAAA,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY;AAC5E,QAAA,OAAO,CAAC;AACV,IAAA,CAAC,0FAAC;AAEO,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,8BAA8B,EAAE;AAAE,YAAA,OAAO,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAC3C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE;QACnC,IAAI,CAAC,GAAG,CAAC;AACT,QAAA,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;AAAE,YAAA,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY;AACjE,QAAA,OAAO,CAAC;AACV,IAAA,CAAC,2FAAC;;AAGO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAwB;QAC3C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACnC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;QACzB;AACA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,mFAAC;;IAGO,iBAAiB,GAAG,QAAQ,CAAC,MACpC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACvD;;AAGQ,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;QAC3C,OAAO,IAAI,CAAC,cAAc;aACvB,GAAG,CAAC,CAAC,GAAG,KAAK,CAAA,EAAG,GAAG,CAAC,YAAY,CAAA,EAAA,CAAI;aACpC,IAAI,CAAC,GAAG,CAAC;AACd,IAAA,CAAC,0FAAC;;AAGO,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;QACzC,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;AAC9E,IAAA,CAAC,wFAAC;;AAGO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM;AACrF,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AACxD,IAAA,CAAC,iFAAC;;AAGO,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,8EAAC;;AAG/E,IAAA,WAAW,CAAC,IAAoB,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CACnB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,MAAM;YACxB,KAAK,EAAE,GAAG,CAAC,KAAK;AAChB,YAAA,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AACpC,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,KAAK;AAC9B,YAAA,IAAI,EAAE,IAAqB;AAC3B,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI;AAC1B,YAAA,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,KAAK;SAC1C,CAAC,CAAC,CACJ;IACH;;IAGA,iBAAiB,CAAC,KAAa,EAAE,OAAkC,EAAA;AACjE,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,KAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,KAAK,CAAC,KAAK,KAAK,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,CAClF;IACH;AAEQ,IAAA,YAAY,CAAC,GAAiB,EAAA;AACpC,QAAA,IAAI,GAAG,CAAC,KAAK,EAAE;YACb,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,oBAAoB;QACxD;AACA,QAAA,OAAO,oBAAoB;IAC7B;wGAtSW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAhB,gBAAgB,EAAA,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B;;;MCJY,UAAU,CAAA;AACJ,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;IAEtE,UAAU,CAAC,KAAa,EAAE,WAAoB,EAAA;QAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AAC7C,QAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;AAE5D,QAAA,IAAI,aAA4B;QAChC,IAAI,CAAC,QAAQ,EAAE;YACb,aAAa,GAAG,KAAK;QACvB;AAAO,aAAA,IAAI,QAAQ,CAAC,SAAS,KAAK,KAAK,EAAE;YACvC,aAAa,GAAG,MAAM;QACxB;aAAO;YACL,aAAa,GAAG,IAAI;QACtB;AAEA,QAAA,IAAI,QAAmB;QACvB,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,aAAa,KAAK,IAAI,EAAE;AAC1B,gBAAA,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;YAC1D;iBAAO,IAAI,QAAQ,EAAE;AACnB,gBAAA,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAC5B,CAAC,CAAC,KAAK,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,aAAc,EAAE,GAAG,CAAC,CAC5D;YACH;iBAAO;AACL,gBAAA,QAAQ,GAAG,CAAC,GAAG,YAAY,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;YAClG;QACF;aAAO;YACL,QAAQ,GAAG,aAAa,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE;QACpF;QAEA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;AACpC,QAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;IACpC;IAEA,OAAO,CAAC,KAAa,EAAE,SAAwB,EAAA;QAC7C,MAAM,QAAQ,GAAc;cACxB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;cAClC,EAAE;QACN,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;AACpC,QAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;IACpC;IAEA,SAAS,GAAA;QACP,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AAC9B,QAAA,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAC9B;AAEA,IAAA,QAAQ,CAAC,IAAS,EAAA;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACtC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QAEnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAExC,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AAC7B,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACxB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;AAClC,gBAAA,IAAI,GAAG,EAAE,cAAc,EAAE;oBACvB,MAAM,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;oBACvC,IAAI,MAAM,KAAK,CAAC;AAAE,wBAAA,OAAO,IAAI,CAAC,SAAS,KAAK,KAAK,GAAG,MAAM,GAAG,CAAC,MAAM;oBACpE;gBACF;AAEA,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;AAC9C,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;gBAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC;gBAC9C,IAAI,MAAM,KAAK,CAAC;AAAE,oBAAA,OAAO,IAAI,CAAC,SAAS,KAAK,KAAK,GAAG,MAAM,GAAG,CAAC,MAAM;YACtE;AACA,YAAA,OAAO,CAAC;AACV,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,mBAAmB,CAAC,KAAgB,EAAA;AAC1C,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,KACpC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;YAC1D,OAAO;AACL,gBAAA,GAAG,KAAK;AACR,gBAAA,IAAI,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;AAChC,gBAAA,SAAS,EAAE,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;aACnD;QACH,CAAC,CAAC,CACH;IACH;AAEQ,IAAA,QAAQ,CAAC,GAAM,EAAE,KAAa,EAAE,GAA2C,EAAA;QACjF,IAAI,GAAG,EAAE,WAAW;AAAE,YAAA,OAAO,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC;AACjD,QAAA,OAAQ,GAA+B,CAAC,KAAK,CAAC;IAChD;IAEQ,cAAc,CAAC,CAAU,EAAE,CAAU,EAAA;AAC3C,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;AAAE,YAAA,OAAO,CAAC;QACpC,IAAI,CAAC,IAAI,IAAI;YAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,IAAI;AAAE,YAAA,OAAO,CAAC;QACvB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AAClD,YAAA,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;QAC3B;QACA,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;YAClD,OAAO,CAAC,GAAG,CAAC;QACd;AACA,QAAA,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3C;wGArGW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAV,UAAU,EAAA,CAAA;;4FAAV,UAAU,EAAA,UAAA,EAAA,CAAA;kBADtB;;;ACLD;;;;;AAKG;AAmGH;;;;;;;AAOG;MACmB,mBAAmB,CAAA;AAGxC;AAgBD;;;AAGG;AACI,MAAM,iBAAiB,GAA6C;AACzE,IAAA,IAAI,EAAE;QACJ,UAAU;QACV,aAAa;QACb,QAAQ;QACR,WAAW;QACX,YAAY;QACZ,UAAU;QACV,OAAO;QACP,UAAU;AACX,KAAA;AACD,IAAA,MAAM,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC;AACzF,IAAA,IAAI,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC;IACvF,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC;AACzC,IAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC;AACxC,IAAA,MAAM,EAAE,EAAE;;AAGL,MAAM,yBAAyB,GAA2C;AAC/E,IAAA,IAAI,EAAE,UAAU;AAChB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,GAAG,EAAE,IAAI;AACT,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,MAAM,EAAE,QAAQ;;AAGlB;AACO,MAAM,eAAe,GAAmC;AAC7D,IAAA,QAAQ,EAAE,UAAU;AACpB,IAAA,WAAW,EAAE,kBAAkB;AAC/B,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,SAAS,EAAE,gBAAgB;AAC3B,IAAA,UAAU,EAAE,aAAa;AACzB,IAAA,QAAQ,EAAE,WAAW;AACrB,IAAA,EAAE,EAAE,GAAG;AACP,IAAA,GAAG,EAAE,GAAG;AACR,IAAA,EAAE,EAAE,GAAG;AACP,IAAA,GAAG,EAAE,GAAG;AACR,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,EAAE,EAAE,IAAI;AACR,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,KAAK,EAAE,UAAU;AACjB,IAAA,QAAQ,EAAE,cAAc;;AAG1B;AACO,MAAM,mBAAmB,GAAgC,IAAI,GAAG,CAAiB;IACtF,OAAO;IACP,UAAU;AACX,CAAA;AAED;AACO,MAAM,eAAe,GAAgC,IAAI,GAAG,CAAiB,CAAC,SAAS,CAAC;AAE/F;SACgB,mBAAmB,GAAA;AACjC,IAAA,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAE;AACpF;AAEA;AACM,SAAU,mBAAmB,CAAC,SAA0B,EAAA;IAC5D,IAAI,CAAC,SAAS,CAAC,KAAK;AAAE,QAAA,OAAO,KAAK;AAClC,IAAA,IAAI,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAO,IAAI;IAC5D,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,KAAK;AAC1C,IAAA,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;AAAE,QAAA,OAAO,KAAK;IAC/C,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;AAC3C,QAAA,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,KAAK,EAAE;AAAE,YAAA,OAAO,KAAK;IACrD;AACA,IAAA,OAAO,IAAI;AACb;;MCnLa,YAAY,CAAA;AACN,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;;AAGrD,IAAA,UAAU,GAAG,MAAM,CAAqB,IAAI,iFAAC;AAErD,IAAA,UAAU,GAA8B,QAAQ,CACvD,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,iFAC1C;AAEQ,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,GAAG,CAAC,uFAAC;AAE/D,IAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;;;;;AAOjD,IAAA,QAAQ,CAAC,KAAkB,EAAE,MAAA,GAA6B,SAAS,EAAA;AACjE,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;IAC3B;AAEA,IAAA,YAAY,CAAC,SAA0B,EAAA;AACrC,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACpC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC;AACzC,SAAA,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC;IAC/B;IAEA,eAAe,CAAC,EAAU,EAAE,KAA+B,EAAA;QACzD,IAAI,OAAO,GAA2B,IAAI;AAC1C,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACpC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACjC,gBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE;AAAE,oBAAA,OAAO,CAAC;gBACzB,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE;gBAC9E,OAAO,GAAG,IAAI;AACd,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;AACH,SAAA,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,QAAA,IAAI,OAAO;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC7C;AAEA,IAAA,eAAe,CAAC,EAAU,EAAA;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI;AACpF,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;AACpC,YAAA,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AACpD,SAAA,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;IAChC;IAEA,iBAAiB,CAAC,SAAiB,EAAE,OAAe,EAAA;QAClD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;YAClC,IAAI,SAAS,KAAK,OAAO;AAAE,gBAAA,OAAO,CAAC;YACnC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;AAC9B,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;AACxC,YAAA,IAAI,CAAC,IAAI;AAAE,gBAAA,OAAO,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC;AAC7B,YAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE;AAC7B,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC;IAC9B;IAEA,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE;AACtD,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC;IAC5B;;AAGA,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU;AAClD,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;AACrD,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAAE;AACpC,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC;IAC9B;AAEA;;;;AAIG;IACH,wBAAwB,GAAA;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3E,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAAE;AACpC,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC;IAC9B;;;;AAMA;;;AAGG;AACH,IAAA,UAAU,CAAC,IAAS,EAAA;AAClB,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,QAAQ;AAAE,YAAA,OAAO,IAAI;QAErD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AACxC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAC9D,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CACxC;AACD,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QAExC,MAAM,QAAQ,GAA2B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AAC9D,YAAA,IAAI,EAAE,CAAC;YACP,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YACxB,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC7C,SAAA,CAAC,CAAC;AAEH,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AACzB,YAAA,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC1C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC9C,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,KAAK,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI,IAAI,MAAM;YAChF;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;IAEQ,UAAU,CAAC,SAA0B,EAAE,GAA6B,EAAA;AAC1E,QAAA,IAAI,iBAAiB,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE;AACvC,YAAA,MAAM,EAAE,GAAG,GAAG,EAAE,gBAAgB;AAChC,YAAA,OAAO;AACL,kBAAE,EAAE,CAAC,SAAS,CAAC,KAAK;AACpB,kBAAE,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;QACnE;AACA,QAAA,OAAO,mBAAmB,CAAC,SAAS,CAAC;IACvC;IAEQ,QAAQ,CAAC,GAAM,EAAE,IAA0B,EAAA;AACjD,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC1B,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe;AACpC,YAAA,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI;QAC7C;AACA,QAAA,OAAO,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC;IACtD;;;;;AAOA,IAAA,OAAO,CAAC,SAA0B,EAAA;AAChC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC;QAC1D,MAAM,GAAG,GAAG,GAAG,EAAE,UAAU,IAAI,SAAS,CAAC,KAAK;AAC9C,QAAA,MAAM,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ;QAEpE,IAAI,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;AAC/C,YAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,EAAE,EAAE;QACvB;AACA,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;QACrD,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;AAC3C,YAAA,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC;YACpD,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,GAAA,EAAM,EAAE,CAAA,CAAE;QACxC;AACA,QAAA,OAAO,GAAG,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,KAAK,EAAE;IAChC;;AAGA,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,OAAO,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChE;AAEA;;;;;;;;AAQG;IACH,yBAAyB,GAAA;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACpC,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAC5E;AAEA,IAAA,cAAc,CAAC,GAAiB,EAAA;AAC9B,QAAA,IAAI,GAAG,CAAC,eAAe,EAAE;YACvB,OAAO;gBACL,KAAK,EAAE,GAAG,CAAC,KAAK;AAChB,gBAAA,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,KAAK;AACvC,gBAAA,UAAU,EAAE,QAAQ;AACpB,gBAAA,SAAS,EAAE,EAAE;AACb,gBAAA,eAAe,EAAE,QAAQ;gBACzB,eAAe,EAAE,GAAG,CAAC,eAAe;gBACpC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;aACvC;QACH;AACA,QAAA,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC;AACnC,QAAA,MAAM,SAAS,GACb,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,eAAe,CAAC,MAAM,GAAG;cAChD,GAAG,CAAC;AACN,cAAE,iBAAiB,CAAC,IAAI,CAAC;QAC7B,MAAM,SAAS,GAAG,GAAG,CAAC,qBAAqB,IAAI,yBAAyB,CAAC,IAAI,CAAC;QAC9E,OAAO;YACL,KAAK,EAAE,GAAG,CAAC,KAAK;AAChB,YAAA,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,KAAK;AACvC,YAAA,UAAU,EAAE,IAAI;YAChB,SAAS;AACT,YAAA,eAAe,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC;AACzE,YAAA,OAAO,EAAE,GAAG,CAAC,aAAa,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC;SACvF;IACH;;AAGA,IAAA,aAAa,CACX,KAAa,EACb,OAAgB,EAChB,YAAsC,EAAE,EAAA;AAExC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;AAChD,QAAA,MAAM,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI;QACxD,OAAO;YACL,EAAE,EAAE,mBAAmB,EAAE;YACzB,UAAU,EAAE,OAAO,GAAG,KAAK,GAAG,KAAK;YACnC,KAAK;AACL,YAAA,QAAQ,EAAE,UAAU,EAAE,eAAe,IAAI,UAAU;AACnD,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,GAAG,SAAS;SACb;IACH;;;;IAMQ,MAAM,CAAC,MAA0B,EAAE,SAAiC,EAAA;AAC1E,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AAClB,YAAA,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE;YAClE,SAAS;YACT,MAAM;AACP,SAAA,CAAC;IACJ;wGAxPW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAZ,YAAY,EAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB;;AA4PD;AACA;AACA;AAEA,SAAS,iBAAiB,CAAI,GAA6B,EAAA;AACzD,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,MAAM;IACvB,IAAI,GAAG,CAAC,UAAU;QAAE,OAAO,GAAG,CAAC,UAAU;AACzC,IAAA,QAAQ,GAAG,CAAC,UAAU;AACpB,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,QAAQ;AACjB,QAAA,KAAK,MAAM;AACT,YAAA,OAAO,MAAM;AACf,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,KAAK;AACd,QAAA,KAAK,UAAU;AACf,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,SAAS;AAClB,QAAA;AACE,YAAA,OAAO,MAAM;;AAEnB;AAEA,SAAS,QAAQ,CACf,GAAM,EACN,SAA0B,EAC1B,GAA6B,EAC7B,IAAoB,EAAA;AAEpB,IAAA,MAAM,GAAG,GAAG,GAAG,EAAE;AACf,UAAE,GAAG,CAAC,WAAW,CAAC,GAAG;AACrB,UAAG,GAA+B,CAAC,SAAS,CAAC,KAAK,CAAC;AAErD,IAAA,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC;AACxD,IAAA,IAAI,CAAC,SAAS;AAAE,QAAA,OAAO,IAAI;IAC3B,OAAO,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC;AACxC;AAEA,SAAS,WAAW,CAAI,KAAc,EAAE,GAA6B,EAAA;AACnE,IAAA,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;AAAE,QAAA,OAAO,EAAE;AAC5C,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACxB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE;AACA,IAAA,OAAO,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC;AACvC;AAEA,SAAS,kBAAkB,CAAI,KAAc,EAAE,GAA6B,EAAA;AAC1E,IAAA,IAAI,GAAG,EAAE,aAAa,EAAE;QACtB,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5E,QAAA,IAAI,GAAG;AAAE,YAAA,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACnC;AACA,IAAA,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB;AAEA,SAAS,oBAAoB,CAC3B,IAAS,EACT,GAAiB,EACjB,IAAoB,EAAA;IAEpB,IAAI,IAAI,KAAK,KAAK;AAAE,QAAA,OAAO,SAAS;AACpC,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;IAC9B,MAAM,GAAG,GAAwC,EAAE;AACnD,IAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;QACtB,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAI,GAA+B,CAAC,GAAG,CAAC,KAAK,CAAC;QAC9F,IAAI,CAAC,IAAI,IAAI;YAAE;AACf,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC;AACrB,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE;AACnB,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACb,QAAA,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAClC,QAAA,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;YAAE;IACzB;AACA,IAAA,OAAO,GAAG;AACZ;AAEA;AACA;AACA;AAEA,MAAM,YAAY,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAC9C,MAAM,CAAC,IAAI,IAAI,EAAE;AACd,KAAA,WAAW;KACX,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAEhD,MAAM,eAAe,GAAc,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;AAEtE,MAAM,UAAU,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAC5C,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;AAExE,MAAM,aAAa,GAAc,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;AAElE,MAAM,cAAc,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAChD,MAAM,CAAC,IAAI,IAAI,EAAE;AACd,KAAA,WAAW;KACX,UAAU,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAElD,MAAM,YAAY,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAC9C,MAAM,CAAC,IAAI,IAAI,EAAE;AACd,KAAA,WAAW;KACX,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAEhD,MAAM,KAAK,GAAc,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,EAAE;AAC9D,MAAM,QAAQ,GAAc,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAExE,MAAM,SAAS,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC;AAC9E,MAAM,YAAY,GAAc,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;AAChE,MAAM,KAAK,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;AACxE,MAAM,MAAM,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;AAC1E,MAAM,KAAK,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;AACxE,MAAM,MAAM,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;AAC1E,MAAM,UAAU,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAI;AACzD,IAAA,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;AACrB,IAAA,OAAO,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC;AACjF,MAAM,aAAa,GAAc,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;AAClE,MAAM,MAAM,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;AAC3E,MAAM,OAAO,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC;AAC7E,MAAM,MAAM,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;AAC3E,MAAM,OAAO,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC;AAC7E,MAAM,WAAW,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAI;AAC1D,IAAA,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;AACtB,IAAA,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;AACnD,CAAC;AAED,MAAM,KAAK,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAI;AAC3C,IAAA,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;AAClD,IAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI;AACjC,IAAA,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC;AACD,MAAM,QAAQ,GAAc,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAExD,MAAM,UAAU,GAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAI;AAChD,IAAA,MAAM,QAAQ,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,CAAC;AAClE,IAAA,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC;IAC7D,OAAO,QAAQ,KAAK,MAAM;AAC5B,CAAC;AAED,SAAS,KAAK,CAAC,CAAU,EAAA;AACvB,IAAA,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAC/C,IAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;AACrC;AAEA,SAAS,MAAM,CAAC,CAAU,EAAA;IACxB,IAAI,CAAC,YAAY,IAAI;AAAE,QAAA,OAAO,CAAC,CAAC,OAAO,EAAE;IACzC,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,QAAA,OAAO,CAAC;AACnC,IAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5B,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,GAAG;IAC/C;AACA,IAAA,OAAO,GAAG;AACZ;AAEA,MAAM,UAAU,GAAuE;AACrF,IAAA,IAAI,EAAE;AACJ,QAAA,QAAQ,EAAE,YAAY;AACtB,QAAA,WAAW,EAAE,eAAe;AAC5B,QAAA,MAAM,EAAE,UAAU;AAClB,QAAA,SAAS,EAAE,aAAa;AACxB,QAAA,UAAU,EAAE,cAAc;AAC1B,QAAA,QAAQ,EAAE,YAAY;QACtB,KAAK;QACL,QAAQ;AACT,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,SAAS,EAAE,YAAY;AACvB,QAAA,EAAE,EAAE,KAAK;AACT,QAAA,GAAG,EAAE,MAAM;AACX,QAAA,EAAE,EAAE,KAAK;AACT,QAAA,GAAG,EAAE,MAAM;AACX,QAAA,OAAO,EAAE,UAAU;QACnB,KAAK;QACL,QAAQ;AACT,KAAA;AACD,IAAA,IAAI,EAAE;AACJ,QAAA,MAAM,EAAE,UAAU;AAClB,QAAA,SAAS,EAAE,aAAa;AACxB,QAAA,EAAE,EAAE,MAAM;AACV,QAAA,GAAG,EAAE,OAAO;AACZ,QAAA,EAAE,EAAE,MAAM;AACV,QAAA,GAAG,EAAE,OAAO;AACZ,QAAA,OAAO,EAAE,WAAW;QACpB,KAAK;QACL,QAAQ;AACT,KAAA;AACD,IAAA,GAAG,EAAE;AACH,QAAA,EAAE,EAAE,KAAK;AACT,QAAA,KAAK,EAAE,QAAQ;QACf,KAAK;QACL,QAAQ;AACT,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,MAAM,EAAE,UAAU;QAClB,KAAK;QACL,QAAQ;AACT,KAAA;;AAED,IAAA,MAAM,EAAE,EAAE;CACX;;MCrdY,WAAW,CAAA;AACL,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AAEtE,IAAA,QAAQ,CAAC,KAAa,EAAA;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AACzC,QAAA,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;YAAE;QAC5C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QAC/E,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B;AAEA,IAAA,WAAW,CAAC,MAAoB,EAAA;QAC9B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;IACrC;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI,EAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E;AAEA,IAAA,iBAAiB,CAAC,QAAgB,EAAA;QAChC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AACvC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AACtB,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACvB;iBAAO;AACL,gBAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YACpB;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,eAAe,CAAC,QAAgB,EAAA;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClD;AAEA,IAAA,SAAS,CAAC,IAAS,EAAA;QACjB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAC9C,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;AAExC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;AACpE,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;IACvC;IAEQ,WAAW,CACjB,IAAS,EACT,OAAqB,EACrB,KAAa,EACb,MAA0B,EAC1B,SAAiB,EAAA;AAEjB,QAAA,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;AAEtC,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AAC5B,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AAE7B,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAe;AACrC,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,YAAA,MAAM,QAAQ,GAAG,GAAG,EAAE;AACpB,kBAAE,GAAG,CAAC,WAAW,CAAC,GAAG;AACrB,kBAAG,GAA+B,CAAC,KAAK,CAAC;YAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;AAClC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,gBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5B;QAEA,MAAM,MAAM,GAAkB,EAAE;QAChC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,EAAE;YAClC,MAAM,QAAQ,GAAG,SAAS,GAAG,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,KAAK,IAAI,KAAK,CAAA,CAAE,GAAG,GAAG,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;AACnF,YAAA,MAAM,YAAY,GAAG,GAAG,EAAE;kBACtB,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;kBACjC,KAAK;AAET,YAAA,MAAM,QAAQ,GAAgB;AAC5B,gBAAA,IAAI,EAAE,OAAO;gBACb,KAAK;gBACL,KAAK;gBACL,YAAY,EAAE,GAAG,GAAG,EAAE,UAAU,IAAI,KAAK,CAAA,EAAA,EAAK,YAAY,CAAA,CAAE;gBAC5D,KAAK;gBACL,KAAK,EAAE,IAAI,CAAC,MAAM;gBAClB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACnD,QAAQ;AACR,gBAAA,QAAQ,EAAE,EAAE;gBACZ,MAAM;aACP;YAED,IAAI,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE;AAC9B,gBAAA,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC;YACpF;iBAAO;AACL,gBAAA,QAAQ,CAAC,QAAQ,GAAG,IAAI;YAC1B;AAEA,YAAA,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;QACvB;;AAGA,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,KAAK,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;YACnB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5B,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;AACzB,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;AACzB,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AAChC,gBAAA,OAAO,CAAC,IAAI,GAAG,IAAI,IAAI,OAAO;YAChC;YACA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,OAAO;AAC3C,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,aAAa,CAAC,MAAqB,EAAA;QACzC,MAAM,MAAM,GAAoB,EAAE;QAClC,IAAI,SAAS,GAAG,CAAC;AAEjB,QAAA,MAAM,OAAO,GAAG,CAAC,SAAwB,KAAU;AACjD,YAAA,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE;gBAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAErC,gBAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,oBAAA,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CACvC,CAAC,CAAC,KAAuB,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC,IAAK,CAAiB,CAAC,IAAI,KAAK,OAAO,CACnH;AACD,oBAAA,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CACrC,CAAC,CAAC,KAAa,EAAE,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC,IAAK,CAAiB,CAAC,IAAI,KAAK,OAAO,CAAC,CAC5G;AAED,oBAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;wBAC1B,OAAO,CAAC,WAAW,CAAC;oBACtB;AAEA,oBAAA,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE;wBAC5B,MAAM,CAAC,IAAI,CAAC;AACV,4BAAA,IAAI,EAAE,MAAM;4BACZ,IAAI;4BACJ,KAAK,EAAE,SAAS,EAAE;AAClB,4BAAA,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC;AACvB,yBAAA,CAAC;oBACJ;gBACF;YACF;AACF,QAAA,CAAC;QAED,OAAO,CAAC,MAAM,CAAC;AACf,QAAA,OAAO,MAAM;IACf;wGAvJW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAX,WAAW,EAAA,CAAA;;4FAAX,WAAW,EAAA,UAAA,EAAA,CAAA;kBADvB;;;MCGY,UAAU,CAAA;AACJ,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AACrD,IAAA,UAAU,GAAG,MAAM,CAAgB,UAAU,CAAC;AAC9C,IAAA,YAAY,GAAG,MAAM,CAAkB,YAAY,CAAC;AACpD,IAAA,WAAW,GAAG,MAAM,CAAiB,WAAW,CAAC;AAElE;;;AAGG;AACM,IAAA,UAAU,GAAG,QAAQ,CAAM,MAAK;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACpC,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,QAAQ;AAAE,YAAA,OAAO,IAAI;QAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;AACvC,IAAA,CAAC,iFAAC;AAEF;;;AAGG;AACM,IAAA,YAAY,GAAG,QAAQ,CAAM,MAAK;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,QAAQ;AAAE,YAAA,OAAO,IAAI;QAC/C,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;AAC3C,IAAA,CAAC,mFAAC;AAEF;;;;;AAKG;AACM,IAAA,aAAa,GAAG,QAAQ,CAAM,MAAK;AAC1C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;AAChC,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,QAAQ;AAAE,YAAA,OAAO,IAAI;AAC/C,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,iBAAiB;AAAE,YAAA,OAAO,IAAI;;;AAGnE,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;AAAE,YAAA,OAAO,IAAI;QAEhD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACtC,QAAA,MAAM,KAAK,GAAG,SAAS,GAAG,QAAQ;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAC;AAC5C,IAAA,CAAC,oFAAC;AAEF;;;;AAIG;AACM,IAAA,WAAW,GAAG,QAAQ,CAAkB,MAAK;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAE3C,QAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YACxB,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACzD;QAEA,MAAM,IAAI,GAAoB,EAAE;QAChC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,iBAAiB;AAE3E,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,WAAW,GAAG,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC;AAC7F,YAAA,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC1E;AAEA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,kFAAC;AAEF;;AAEG;AACM,IAAA,kBAAkB,GAAG,QAAQ,CAAS,MAAK;AAClD,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,QAAQ;AAAE,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AAClE,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM;AACnC,IAAA,CAAC,yFAAC;AAEF;;;;;AAKG;AACH,IAAA,yBAAyB,CAAC,YAAoB,EAAA;AAC5C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC;AAC3E,QAAA,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,CAAC,CAAC;AAC1C,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAClD;wGAzFW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAV,UAAU,EAAA,CAAA;;4FAAV,UAAU,EAAA,UAAA,EAAA,CAAA;kBADtB;;;ACHD,MAAM,gBAAgB,GAAG,EAAE;MAGd,kBAAkB,CAAA;AACZ,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AACrD,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAEhC,QAAQ,GAAG,KAAK;IAChB,WAAW,GAAkB,IAAI;IACjC,MAAM,GAAG,CAAC;IACV,UAAU,GAAG,CAAC;IACd,WAAW,GAAG,KAAK;AAEV,IAAA,WAAW,GAAG,CAAC,KAAiB,KAAU;QACzD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE;QACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;AAC5C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,QAAQ,GAAG,QAAQ;AACrD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;QAC3D,MAAM,GAAG,GAAG,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,gBAAgB;QACzE,MAAM,GAAG,GAAG,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,QAAQ;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC;AACtE,QAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;AAC5E,IAAA,CAAC;IAEgB,SAAS,GAAG,MAAW;QACtC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;QACrB,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;QAC3D,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;QACvD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;QAC/B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AACrC,IAAA,CAAC;IAED,WAAW,CAAC,KAAa,EAAE,KAAiB,EAAA;QAC1C,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;AACzE,QAAA,IAAI,CAAC,QAAQ;YAAE;AAEf,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;AAC3B,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,YAAY;QACvC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,KAAK,KAAK;QAE5C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY;QACzC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;AAEvC,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;YACjC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;YACxD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;AACtD,QAAA,CAAC,CAAC;IACJ;IAEA,cAAc,CAAC,KAAa,EAAE,aAAqB,EAAA;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;QACzE,OAAO;YACL,KAAK;YACL,aAAa;AACb,YAAA,QAAQ,EAAE,QAAQ,EAAE,YAAY,IAAI,aAAa;SAClD;IACH;wGA3DW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAlB,kBAAkB,EAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;ACND;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;AA4GH;AAEA;;;AAGG;AACG,SAAU,oBAAoB,CAAC,KAAa,EAAA;IAChD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;AAAE,QAAA,OAAO,EAAE;IACpD,IAAI,GAAG,GAAG,EAAE;IACZ,IAAI,CAAC,GAAG,KAAK;IACb,OAAO,IAAI,EAAE;AACX,QAAA,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE;QAClB,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG;QACzC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC;YAAE;IACb;AACA,IAAA,OAAO,GAAG;AACZ;AAEA;;;AAGG;AACG,SAAU,oBAAoB,CAAC,OAAe,EAAA;AAClD,IAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC;AACT,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AAClC,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI;AAC1D,QAAA,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC;QACvC,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC;IAC3B;IACA,OAAO,CAAC,GAAG,CAAC;AACd;AAEA;AAEA;AACA,MAAM,aAAa,GAAG,0BAA0B;AAEhD;AACM,SAAU,WAAW,CAAC,KAAa,EAAA;AACvC,IAAA,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;IAC3C,OAAO,CAAA,CAAA,EAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA,CAAA,CAAG;AACzC;AAEA;AAEA;;;;AAIG;AACG,SAAU,WAAW,CAAC,GAAkB,EAAE,UAA6B,EAAA;IAC3E,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACzC,IAAI,GAAG,GAAG,CAAC;AAAE,QAAA,OAAO,OAAO;IAC3B,IAAI,GAAG,CAAC,OAAO;AAAE,QAAA,OAAO,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,GAAG;AACxC,IAAA,MAAM,GAAG,GAAG,oBAAoB,CAAC,GAAG,CAAC;AACrC,IAAA,OAAO,CAAA,EAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAA,EAAG,GAAG,CAAC,MAAM,GAAG,GAAG,GAAG,EAAE,CAAA,EAAG,GAAG,CAAC,GAAG,EAAE;AAC7E;AAEA;;;;;AAKG;AACG,SAAU,iBAAiB,CAAC,GAAkB,EAAA;AAClD,IAAA,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;IAC3C,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,CAAA,YAAA,EAAe,KAAK,CAAA,GAAA,CAAK;AACjD,IAAA,OAAO,eAAe,KAAK,CAAA,OAAA,EAAU,GAAG,CAAC,GAAG,IAAI;AAClD;;AC3MA;;;;;;;;;;;;;;;AAeG;AAcH;;;;;AAKG;AACH,MAAM,YAAY,GAChB,uEAAuE;AAEnE,SAAU,gBAAgB,CAAC,MAAc,EAAE,OAAqB,EAAA;IACpE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO;AAClD,IAAA,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC;AAAE,QAAA,OAAO,MAAM;AAEnD,IAAA,OAAO,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,QAAgB,EAAE,MAAc,EAAE,IAAwB,KAAI;QACzG,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AAC1C,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;QAC1B,MAAM,QAAQ,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK;QAChD,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK;QAE9C,IAAI,SAAS,GAAG,KAAK;AACrB,QAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,CAAC,EAAE;YAC/B,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC;YACrC,IAAI,GAAG,GAAG,CAAC;AAAE,gBAAA,OAAO,OAAO;AAC3B,YAAA,MAAM,OAAO,GAAG,GAAG,GAAG,QAAQ;AAC9B,YAAA,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC;YACrC,IAAI,SAAS,KAAK,SAAS;AAAE,gBAAA,OAAO,OAAO;YAC3C,SAAS,GAAG,SAAS;QACvB;QAEA,IAAI,OAAO,GAAG,GAAG;AACjB,QAAA,IAAI,CAAC,MAAM,IAAI,QAAQ,KAAK,CAAC,EAAE;AAC7B,YAAA,OAAO,GAAG,GAAG,GAAG,QAAQ;YACxB,IAAI,OAAO,GAAG,CAAC;AAAE,gBAAA,OAAO,OAAO;QACjC;AAEA,QAAA,MAAM,OAAO,GAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;;;AAGnF,QAAA,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC;AACvC,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QACrC,MAAM,QAAQ,GAAG,QAAQ,IAAI,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,GAAG,IAAI;AACpE,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA,EAAA,EAAK,QAAQ,IAAI;AAC9C,IAAA,CAAC,CAAC;;;;AAKF,IAAA,KAAK,WAAW;AAClB;;ACvEO,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC;AAS9C;;;;AAIG;MAEU,eAAe,CAAA;AACT,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AACrD,IAAA,UAAU,GAAG,MAAM,CAAgB,UAAU,CAAC;;AAGtD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,+EAAC;AAE1D;;;;AAIG;AACK,IAAA,yBAAyB,CAAC,KAAgB,EAAA;QAChD,MAAM,GAAG,GAAa,EAAE;QACxB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACrD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAC3D,IAAI,MAAM,IAAI,CAAC;AAAE,gBAAA,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QACnC;AACA,QAAA,OAAO,GAAG;IACZ;AAEA;;;;;AAKG;AACK,IAAA,uBAAuB,CAAC,KAAgB,EAAA;QAC9C,MAAM,GAAG,GAA0C,EAAE;QACrD,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACrD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAC3D,IAAI,MAAM,IAAI,CAAC;AAAE,gBAAA,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC3D;AACA,QAAA,OAAO,GAAG;IACZ;AAEA;;;;;AAKG;AACK,IAAA,cAAc,CAAC,KAAc,EAAE,YAAqB,EAAE,QAAgB,EAAE,QAAgB,EAAA;AAC9F,QAAA,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,KAAK;QAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;QAC3C,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,KAAK;AACpD,QAAA,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AAClE,QAAA,OAAO,gBAAgB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IACpE;AAEA,IAAA,OAAO,CAAC,KAAgB,EAAA;QACtB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;IACjC;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC;;AAGA,IAAA,QAAQ,CAAC,KAAgB,EAAA;QACvB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG;AAAE,YAAA,OAAO,EAAE;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,MAAM,OAAO,GAAwB,EAAE;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;AAChD,QAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,EAAE;QAC9B,MAAM,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI;QAEjC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACpC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;YACzB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;AACxC,YAAA,IAAI,CAAC,SAAS;AAAE,gBAAA,OAAO,OAAO;AAE9B,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,gBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;oBAAE;gBAC7B,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAA6B;gBACxE,IAAI,OAAO,GAAG,KAAK;gBACnB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;gBAChD,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;oBACrD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK;AAC5B,oBAAA,IAAI,CAAC,KAAK;wBAAE;oBACZ,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;oBAC7B,IAAI,CAAC,GAAG,EAAE,QAAQ;wBAAE;AACpB,oBAAA,MAAM,WAAW,GAAG,GAAG,CAAC;AACtB,0BAAE,GAAG,CAAC,WAAW,CAAC,SAAS;AAC3B,0BAAG,SAAqC,CAAC,KAAK,CAAC;AACjD,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,GAAG,CAAC,YAAY,KAAK,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AACxF,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC9E,IAAI,OAAO,KAAK,UAAU;wBAAE;oBAC5B,MAAM,MAAM,GAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAA6B,CAAC,KAAK,CAAC;oBACzE,IAAI,MAAM,KAAK,OAAO;wBAAE;AACxB,oBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO;AACxB,oBAAA,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;oBACxE,OAAO,GAAG,IAAI;gBAChB;AACA,gBAAA,IAAI,OAAO;AAAE,oBAAA,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,OAAY;YACpD;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,OAAO;IAChB;;AAGA,IAAA,SAAS,CAAC,KAAgB,EAAA;QACxB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG;AAAE,YAAA,OAAO,EAAE;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AACxC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK;AAChD,QAAA,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,EAAE;QAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;AACzC,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,EAAE;QACzB,MAAM,OAAO,GAAwB,EAAE;QAEvC,MAAM,aAAa,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACpC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;AACzB,YAAA,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE;AACrC,gBAAA,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC;AAC9B,gBAAA,IAAI,CAAC,GAAG;oBAAE;AACV,gBAAA,MAAM,WAAW,GAAG,SAAS,CAAC;AAC5B,sBAAE,SAAS,CAAC,WAAW,CAAC,GAAG;AAC3B,sBAAG,GAA+B,CAAC,WAAW,CAAC;AACjD,gBAAA,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,EAA6B;gBACrD,IAAI,OAAO,GAAG,KAAK;gBACnB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;oBACzD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK;AAC5B,oBAAA,IAAI,CAAC,KAAK;wBAAE;oBACZ,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;oBAC7B,IAAI,CAAC,GAAG,EAAE,QAAQ;wBAAE;oBACpB,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG;AACpC,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,GAAG,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC;AACxF,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC;oBAC3D,IAAI,OAAO,KAAK,UAAU;wBAAE;AAC5B,oBAAA,MAAM,MAAM,GAAI,GAA+B,CAAC,KAAK,CAAC;oBACtD,IAAI,MAAM,KAAK,OAAO;wBAAE;AACxB,oBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO;AACxB,oBAAA,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;oBACpE,OAAO,GAAG,IAAI;gBAChB;AACA,gBAAA,IAAI,OAAO;AAAE,oBAAA,OAAO,CAAC,SAAS,CAAC,GAAG,OAAY;YAChD;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,OAAO;IAChB;;IAGA,aAAa,CAAC,KAAgB,EAAE,KAAc,EAAA;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,MAAM,OAAO,GAAwB,EAAE;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC;QAE3D,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACpC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;AACzB,YAAA,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE;AACrC,gBAAA,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC;AAC9B,gBAAA,IAAI,CAAC,GAAG;oBAAE;AACV,gBAAA,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,EAA6B;gBACrD,IAAI,OAAO,GAAG,KAAK;gBACnB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;oBACrD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK;AAC5B,oBAAA,IAAI,CAAC,KAAK;wBAAE;oBACZ,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;oBAC7B,IAAI,CAAC,GAAG,EAAE,QAAQ;wBAAE;AACpB,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;oBACzD,IAAI,OAAO,KAAK,UAAU;wBAAE;AAC5B,oBAAA,MAAM,MAAM,GAAI,GAA+B,CAAC,KAAK,CAAC;oBACtD,IAAI,MAAM,KAAK,OAAO;wBAAE;AACxB,oBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO;AACxB,oBAAA,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;oBACpE,OAAO,GAAG,IAAI;gBAChB;AACA,gBAAA,IAAI,OAAO;AAAE,oBAAA,OAAO,CAAC,SAAS,CAAC,GAAG,OAAY;YAChD;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,OAAO;IAChB;;AAGA,IAAA,UAAU,CAAC,KAAgB,EAAA;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,MAAM,OAAO,GAAwB,EAAE;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC;QAE3D,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACpC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;AACzB,YAAA,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE;AACrC,gBAAA,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC;AAC9B,gBAAA,IAAI,CAAC,GAAG;oBAAE;AACV,gBAAA,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,EAA6B;gBACrD,IAAI,OAAO,GAAG,KAAK;gBACnB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;oBACrD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK;AAC5B,oBAAA,IAAI,CAAC,KAAK;wBAAE;oBACZ,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;oBAC7B,IAAI,CAAC,GAAG,EAAE,QAAQ;wBAAE;AACpB,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC;oBACxD,IAAI,OAAO,KAAK,UAAU;wBAAE;AAC5B,oBAAA,MAAM,MAAM,GAAI,GAA+B,CAAC,KAAK,CAAC;oBACtD,IAAI,MAAM,KAAK,OAAO;wBAAE;AACxB,oBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO;AACxB,oBAAA,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;oBACpE,OAAO,GAAG,IAAI;gBAChB;AACA,gBAAA,IAAI,OAAO;AAAE,oBAAA,OAAO,CAAC,SAAS,CAAC,GAAG,OAAY;YAChD;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,OAAO;IAChB;;IAGA,UAAU,CAAC,KAAgB,EAAE,SAAqB,EAAA;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,OAAO,GAAwB,EAAE;QAEvC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACpC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;AACzB,YAAA,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE;gBAC5C,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE;gBAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,gBAAgB,CAAC;gBAC7E,IAAI,SAAS,GAAG,CAAC;oBAAE;AACnB,gBAAA,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC;AAC9B,gBAAA,IAAI,CAAC,GAAG;oBAAE;AACV,gBAAA,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,EAA6B;gBACrD,IAAI,OAAO,GAAG,KAAK;AACnB,gBAAA,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE;oBAChD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE;AACtC,oBAAA,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM;wBAAE;oBAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK;AACpC,oBAAA,IAAI,CAAC,KAAK;wBAAE;AACZ,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;oBACrE,IAAI,OAAO,KAAK,UAAU;wBAAE;AAC5B,oBAAA,MAAM,MAAM,GAAI,GAA+B,CAAC,KAAK,CAAC;oBACtD,IAAI,MAAM,KAAK,OAAO;wBAAE;AACxB,oBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO;AACxB,oBAAA,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;oBACpE,OAAO,GAAG,IAAI;gBAChB;AACA,gBAAA,IAAI,OAAO;AAAE,oBAAA,OAAO,CAAC,SAAS,CAAC,GAAG,OAAY;YAChD;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,OAAO;IAChB;AAEA;;;AAGG;IACH,YAAY,CAAC,OAA4B,EAAE,SAA6B,EAAA;AACtE,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE;QAC1B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACpC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;;AAEzB,YAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+B;AACpD,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,gBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;AAC7C,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;gBACjB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC;YAClC;YACA,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,KAAK,EAAE;AAC1C,gBAAA,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;AAC7B,gBAAA,IAAI,CAAC,GAAG;oBAAE;AACV,gBAAA,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,EAA6B;AACrD,gBAAA,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE;oBAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK;gBAC/E;AACA,gBAAA,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAY;YAClC;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;IACJ;AAEA;;;;AAIG;AACH,IAAA,iBAAiB,CAAC,KAAa,EAAE,QAAiB,EAAE,GAAM,EAAA;AACxD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;QAChD,IAAI,CAAC,GAAG,EAAE,QAAQ;AAAE,YAAA,OAAO,UAAU;AAErC,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU;AAEjC,QAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;AACrB,YAAA,IAAI,UAAmB;YACvB,QAAQ,UAAU;AAChB,gBAAA,KAAK,QAAQ;oBACX,UAAU,GAAG,IAAI;oBACjB;AACF,gBAAA,KAAK,UAAU;oBACb,UAAU,GAAG,KAAK;oBAClB;AACF,gBAAA;oBACE,UAAU,GAAG,EAAE;;AAEnB,YAAA,IAAI,GAAG,CAAC,mBAAmB,EAAE;gBAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,GAAG,CAAC;AACvD,gBAAA,IAAI,MAAM,KAAK,KAAK,IAAI,OAAO,MAAM,KAAK,QAAQ;AAAE,oBAAA,OAAO,UAAU;YACvE;AACA,YAAA,OAAO,UAAU;QACnB;QAEA,IAAI,KAAK,GAAY,QAAQ;AAE7B,QAAA,IAAI,UAAU,KAAK,QAAQ,EAAE;AAC3B,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC5B,IAAI,KAAK,CAAC,GAAG,CAAC;AAAE,gBAAA,OAAO,UAAU;YACjC,KAAK,GAAG,GAAG;QACb;AAAO,aAAA,IAAI,UAAU,KAAK,UAAU,EAAE;YACpC,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,IAAI,EAAE;gBAC5C,KAAK,GAAG,IAAI;YACd;iBAAO,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,KAAK,EAAE;gBACrD,KAAK,GAAG,KAAK;YACf;iBAAO;AACL,gBAAA,OAAO,UAAU;YACnB;QACF;aAAO,IACL,CAAC,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ;AACnD,YAAA,GAAG,CAAC,iBAAiB,EAAE,MAAM,EAC7B;;;;YAIA,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACjE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAAE,gBAAA,OAAO,UAAU;YAC1D,KAAK,GAAG,QAAQ;QAClB;AAEA,QAAA,IAAI,GAAG,CAAC,mBAAmB,EAAE;YAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC;AAClD,YAAA,IAAI,MAAM,KAAK,KAAK,IAAI,OAAO,MAAM,KAAK,QAAQ;AAAE,gBAAA,OAAO,UAAU;QACvE;AAEA,QAAA,OAAO,KAAK;IACd;;AAGA,IAAA,UAAU,CAAC,KAAgB,EAAA;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,MAAM,MAAM,GAAe,EAAE;QAE7B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;AACrD,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,YAAA,IAAI,CAAC,GAAG;gBAAE;YACV,MAAM,SAAS,GAAa,EAAE;YAC9B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;gBACrD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK;gBAC5B,IAAI,CAAC,KAAK,EAAE;AACV,oBAAA,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClB;gBACF;gBACA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,gBAAA,MAAM,GAAG,GAAG,GAAG,EAAE;AACf,sBAAE,GAAG,CAAC,WAAW,CAAC,GAAG;AACrB,sBAAG,GAA+B,CAAC,KAAK,CAAC;AAC3C,gBAAA,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAChD;AACA,YAAA,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QACxB;AACA,QAAA,OAAO,MAAM;IACf;AAEA;;;;AAIG;IACH,QAAQ,CACN,GAAW,EACX,GAAW,EAAA;QAEX,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AAClC,QAAA,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;AACrF,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AACnD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AACnD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AACnD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AACnD,QAAA,IAAI,GAAG,GAAG,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,GAAG,GAAG,MAAM,EAAE;YAChE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;QAC7E;QACA,OAAO;YACL,GAAG,EAAE,GAAG,KAAK,MAAM;YACnB,KAAK,EAAE,GAAG,KAAK,MAAM;YACrB,MAAM,EAAE,GAAG,KAAK,MAAM;YACtB,IAAI,EAAE,GAAG,KAAK,MAAM;AACpB,YAAA,GAAG,EAAE,IAAI;SACV;IACH;wGAhZW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAf,eAAe,EAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;ACTD,MAAM,WAAW,GAAG,EAAE;AACtB,MAAM,cAAc,GAAG,mBAAmB;MAG7B,aAAa,CAAA;AACP,IAAA,SAAS,GAAG,MAAM,CAAqB,eAAe,CAAC;AAEvD,IAAA,IAAI,GAAG,MAAM,CAAc,EAAE,2EAAC;AAC9B,IAAA,MAAM,GAAG,MAAM,CAAc,EAAE,6EAAC;IACzC,UAAU,GAAkB,IAAI;AAE/B,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,8EAAC;AAChD,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC,8EAAC;AAE3D;;;AAGG;AACH,IAAA,MAAM,CAAC,MAAqB,EAAA;AAC1B,QAAA,IAAI,CAAC,UAAU,GAAG,MAAM,GAAG,CAAA,EAAG,cAAc,CAAA,EAAG,MAAM,CAAA,CAAE,GAAG,IAAI;AAC9D,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACjB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB;QACF;QACA,IAAI,CAAC,OAAO,EAAE;IAChB;;IAGA,MAAM,CAAC,IAAmB,EAAE,OAA4B,EAAA;AACtD,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE;AAC1B,QAAA,MAAM,EAAE,GAAc,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;QAC9D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAI;YACzB,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,IAAI;AACjF,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,EAAE;IAChB;IAEA,IAAI,GAAA;AACF,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE;AACzB,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QACnC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;AACjD,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,EAAE;AACd,QAAA,OAAO,EAAE;IACX;IAEA,IAAI,GAAA;AACF,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;AAC3B,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QACnC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;AAChD,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE;AACd,QAAA,OAAO,EAAE;IACX;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACjB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI;AACF,gBAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;YAC1C;AAAE,YAAA,MAAM;;YAER;QACF;IACF;IAEQ,OAAO,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;AACtB,QAAA,IAAI;AACF,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;AAC7B,gBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACjB,gBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACtB,aAAA,CAAC;YACF,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;QAChD;AAAE,QAAA,MAAM;;QAER;IACF;IAEQ,OAAO,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;AACtB,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;YACjD,IAAI,CAAC,GAAG,EAAE;AACR,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACjB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB;YACF;YACA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiD;YAC9E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;QACpE;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACjB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB;IACF;wGAnGW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAb,aAAa,EAAA,CAAA;;4FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB;;;ACdD;;;;;;;;;;;;AAYG;AAgHH;AACA;AACA;AAEA;AACO,MAAM,aAAa,GAAG;AAC3B,IAAA,MAAM,CAAC,KAAa,EAAA;AAClB,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IAC/F,CAAC;AACD,IAAA,MAAM,CAAC,KAAa,EAAA;AAClB,QAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;IAClC,CAAC;AACD,IAAA,OAAO,CAAC,KAAc,EAAA;AACpB,QAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;IACnC,CAAC;IACD,KAAK,GAAA;AACH,QAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;IAC1B,CAAC;AACD,IAAA,KAAK,CAAC,KAAmB,EAAA;AACvB,QAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;IACjC,CAAC;;AAGH;AACM,SAAU,QAAQ,CAAC,CAAe,EAAA;AACtC,IAAA,QAAQ,CAAC,CAAC,IAAI;AACZ,QAAA,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC,KAAK;AAChB,QAAA,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC;AACxB,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,CAAC;QACV,KAAK,QAAQ,EAAE;YACb,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;YAC9B,IAAI,OAAO,KAAK,EAAE;AAAE,gBAAA,OAAO,CAAC;AAC5B,YAAA,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS;QAC3C;AACA,QAAA,KAAK,OAAO;YACV,OAAO,CAAC,CAAC,KAAK;;AAEpB;AAEA;AACM,SAAU,aAAa,CAAC,CAAe,EAAA;AAC3C,IAAA,QAAQ,CAAC,CAAC,IAAI;AACZ,QAAA,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC,KAAK;AAChB,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AACxB,QAAA,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,KAAK,GAAG,MAAM,GAAG,OAAO;AACnC,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,EAAE;AACX,QAAA,KAAK,OAAO;YACV,OAAO,CAAC,CAAC,KAAK;;AAEpB;AAEA;AACM,SAAU,SAAS,CAAC,CAAe,EAAA;AACvC,IAAA,QAAQ,CAAC,CAAC,IAAI;AACZ,QAAA,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,KAAK;AAChB,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC;AACtB,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,KAAK;QACd,KAAK,QAAQ,EAAE;YACb,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE;YAC/B,IAAI,CAAC,KAAK,MAAM;AAAE,gBAAA,OAAO,IAAI;YAC7B,IAAI,CAAC,KAAK,OAAO;AAAE,gBAAA,OAAO,KAAK;AAC/B,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,KAAK,OAAO;YACV,OAAO,CAAC,CAAC,KAAK;;AAEpB;AAEA;AACM,SAAU,UAAU,CAAC,MAA+B,EAAA;AACxD,IAAA,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;AACtB,QAAA,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,CAAC,CAAC,KAAK;IACxC;AACA,IAAA,OAAO,IAAI;AACb;;ACjNA;;;;;;;;;;;;;;;;;;AAkBG;MAIU,UAAU,CAAA;;AAEJ,IAAA,OAAO,GAAG,IAAI,GAAG,EAAyB;;AAE1C,IAAA,OAAO,GAAG,IAAI,GAAG,EAAyB;;IAG3D,eAAe,CAAC,IAAa,EAAE,IAAuB,EAAA;AACpD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACvB,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW;AAC/B,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;YACpB,IAAI,CAAC,KAAK,IAAI;AAAE,gBAAA,SAAS;AACzB,YAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACX,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,EAAE;AACT,gBAAA,IAAI,GAAG,IAAI,GAAG,EAAE;gBAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;YAC3B;AACA,YAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAChB;AACA,QAAA,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;IACjD;;AAGA,IAAA,MAAM,CAAC,IAAa,EAAA;AAClB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACzC,IAAI,UAAU,EAAE;AACd,YAAA,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE;AAC5B,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC;gBACnC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC;AAAE,oBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;YACjE;AACA,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QAC3B;IACF;;AAGA,IAAA,cAAc,CAAC,IAAa,EAAA;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS;IAC5C;;AAGA,IAAA,YAAY,CAAC,IAAa,EAAA;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS;IAC5C;AAEA;;;;AAIG;AACH,IAAA,WAAW,CAAC,KAAc,EAAA;;AAExB,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE;AACvC,YAAA,OAAO,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACzB;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B;AACnD,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB;QAC1C,MAAM,KAAK,GAAsD,EAAE;AAEnE,QAAA,MAAM,QAAQ,GAAG,CAAC,IAAa,KAAU;AACvC,YAAA,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;AAC5E,QAAA,CAAC;QAED,QAAQ,CAAC,KAAK,CAAC;AAEf,QAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACvB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACnC,YAAA,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;YAC5C,IAAI,IAAI,EAAE;gBACR,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;gBAC7B,KAAK,CAAC,GAAG,EAAE;gBACX;YACF;YACA,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE;;;gBAG9B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAU,CAAC,GAAG,CAAC,CAAC;AACvC,gBAAA,IAAI,MAAM,GAAwB,GAAG,CAAC,IAAI;AAC1C,gBAAA,OAAO,MAAM,IAAI,MAAM,KAAK,GAAG,EAAE;AAC/B,oBAAA,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AACnB,oBAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC7B;AACA,gBAAA,OAAO,OAAO;YAChB;YACA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBACpB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC;gBACzB,QAAQ,CAAC,GAAG,CAAC;YACf;QACF;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;;;;;AAMG;AACH,IAAA,QAAQ,CAAC,KAAwB,EAAA;;AAE/B,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAW;QACpC,MAAM,KAAK,GAAc,EAAE;AAC3B,QAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;YACrB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;AACrB,gBAAA,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAChB,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACf;QACF;AACA,QAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAG;AACzB,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE;gBACrD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACvB,oBAAA,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,oBAAA,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;gBACjB;YACF;QACF;;AAGA,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB;QAC3C,KAAK,MAAM,IAAI,IAAI,SAAS;AAAE,YAAA,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACnD,QAAA,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE;AAC5B,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE;AACrD,gBAAA,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACtB,oBAAA,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnD;YACF;QACF;QACA,MAAM,KAAK,GAAc,EAAE;QAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,QAAQ,EAAE;YAClC,IAAI,GAAG,KAAK,CAAC;AAAE,gBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACjC;QACA,MAAM,OAAO,GAAc,EAAE;AAC7B,QAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAG;AAC3B,YAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAClB,YAAA,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE;AAC3D,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;oBAAE;AAC/B,gBAAA,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AAClD,gBAAA,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC;gBAChC,IAAI,OAAO,KAAK,CAAC;AAAE,oBAAA,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAC1C;QACF;;;QAIA,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE;AACnC,YAAA,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE;AAC5B,gBAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,oBAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACjD;QACF;AACA,QAAA,OAAO,OAAO;IAChB;;IAGA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;IACtB;AAEQ,IAAA,YAAY,CAAC,IAAa,EAAA;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;AAClC,YAAA,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;AAClB,YAAA,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;AAAE,gBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;QACvD;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;IAC3B;AACD;AAED,MAAM,SAAS,GAAyB,IAAI,GAAG,EAAE;;ACtMjD;;;;;;;;;;;;;;;;AAgBG;AAcH;;;;AAIG;SACa,QAAQ,CACtB,GAAe,EACf,SAAkC,EAClC,GAAuB,EAAA;AAEvB,IAAA,IAAI;QACF,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC;;AAEvC,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;AAChE,QAAA,OAAO,CAAC;IACV;IAAE,OAAO,GAAG,EAAE;AACZ,QAAA,IAAI,GAAG,YAAY,SAAS,EAAE;YAC5B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE;QAC3C;QACA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;IAC5C;AACF;AAOA,MAAM,SAAU,SAAQ,KAAK,CAAA;AACN,IAAA,IAAA;AAArB,IAAA,WAAA,CAAqB,IAAkB,EAAA;QACrC,KAAK,CAAC,IAAI,CAAC;QADQ,IAAA,CAAA,IAAI,GAAJ,IAAI;IAEzB;AACD;AAED,SAAS,IAAI,CAAC,IAAkB,EAAA;AAC9B,IAAA,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC;AAC3B;AAEA,SAAS,QAAQ,CACf,IAAgB,EAChB,SAAkC,EAClC,GAAuB,EAAA;AAEvB,IAAA,QAAQ,IAAI,CAAC,IAAI;AACf,QAAA,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AAC9C,QAAA,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AAC9C,QAAA,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AAC/C,QAAA,KAAK,KAAK;YACR,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;AACvC,QAAA,KAAK,OAAO;YACV,OAAO,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;AACzC,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;AACnE,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,UAAU,CACf,IAAI,CAAC,EAAE,EACP,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,EACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,CACrC;AACH,QAAA,KAAK,MAAM;AACT,YAAA,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC;;AAE3D;AAEA,SAAS,UAAU,CAAC,QAAiC,EAAE,GAAuB,EAAA;IAC5E,IAAI,CAAC,QAAQ,EAAE;;;;QAIb,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IAC1C;AACA,IAAA,OAAO,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;AACtD;AAEA,SAAS,YAAY,CACnB,QAA4D,EAC5D,GAAuB,EAAA;AAEvB,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC;IACnC,MAAM,GAAG,GAAmB,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;AACtD,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,QAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC;QAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IAC9E;AACA,IAAA,OAAO,GAAG;AACZ;AAEA;AAEA,SAAS,SAAS,CAAC,EAAa,EAAE,OAAmB,EAAA;AACnD,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;AACtE,IAAA,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;AAAE,QAAA,OAAO,OAAO;AAC5C,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC3B,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE;IAC7D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;AACvD;AAEA;AAEA,SAAS,UAAU,CAAC,EAAY,EAAE,IAAgB,EAAE,KAAiB,EAAA;AACnE,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;IAC5C;IACA,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACrC,IAAA,IAAI,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE;IAE7C,QAAQ,EAAE;AACR,QAAA,KAAK,GAAG;AACR,QAAA,KAAK,GAAG;AACR,QAAA,KAAK,GAAG;AACR,QAAA,KAAK,GAAG;AACR,QAAA,KAAK,GAAG;YACN,OAAO,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC;AAC/B,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;AAC5B,QAAA,KAAK,GAAG;AACR,QAAA,KAAK,IAAI;AACT,QAAA,KAAK,GAAG;AACR,QAAA,KAAK,GAAG;AACR,QAAA,KAAK,IAAI;AACT,QAAA,KAAK,IAAI;YACP,OAAO,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC;;AAErC;AAEA,SAAS,KAAK,CAAC,EAA+B,EAAE,CAAe,EAAE,CAAe,EAAA;AAC9E,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IACrB,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE;AAC7D,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IACrB,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE;AAE7D,IAAA,IAAI,MAAc;IAClB,QAAQ,EAAE;AACR,QAAA,KAAK,GAAG;AACN,YAAA,MAAM,GAAG,CAAC,GAAG,CAAC;YACd;AACF,QAAA,KAAK,GAAG;AACN,YAAA,MAAM,GAAG,CAAC,GAAG,CAAC;YACd;AACF,QAAA,KAAK,GAAG;AACN,YAAA,MAAM,GAAG,CAAC,GAAG,CAAC;YACd;AACF,QAAA,KAAK,GAAG;YACN,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;AACvD,YAAA,MAAM,GAAG,CAAC,GAAG,CAAC;YACd;AACF,QAAA,KAAK,GAAG;YACN,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YACvB;;AAEJ,IAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IACtE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;AAC1C;AAEA,SAAS,MAAM,CAAC,CAAe,EAAE,CAAe,EAAA;AAC9C,IAAA,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE;AAC7D,IAAA,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE;IAC7D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE;AACzC;AAEA,SAAS,OAAO,CACd,EAAwC,EACxC,CAAe,EACf,CAAe,EAAA;IAEf,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;AAC5D,IAAA,IAAI,MAAe;IACnB,QAAQ,EAAE;AACR,QAAA,KAAK,GAAG;AACN,YAAA,MAAM,GAAG,GAAG,KAAK,CAAC;YAClB;AACF,QAAA,KAAK,IAAI;AACP,YAAA,MAAM,GAAG,GAAG,KAAK,CAAC;YAClB;AACF,QAAA,KAAK,GAAG;AACN,YAAA,MAAM,GAAG,GAAG,GAAG,CAAC;YAChB;AACF,QAAA,KAAK,GAAG;AACN,YAAA,MAAM,GAAG,GAAG,GAAG,CAAC;YAChB;AACF,QAAA,KAAK,IAAI;AACP,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB;AACF,QAAA,KAAK,IAAI;AACP,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC;YACjB;;IAEJ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;AAC3C;AAEA;;;;;;;;;;AAUG;AACH,SAAS,aAAa,CAAC,CAAe,EAAE,CAAe,EAAA;IACrD,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;AAAE,QAAA,OAAO,IAAI;AAEzD,IAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;AACzB,IAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;IACzB,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,GAAG,KAAK;AAEzC,IAAA,QAAQ,CAAC,CAAC,IAAI;QACZ,KAAK,QAAQ,EAAE;YACb,MAAM,EAAE,GAAG,CAA8C;AACzD,YAAA,OAAO,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;QAC/D;QACA,KAAK,QAAQ,EAAE;YACb,MAAM,EAAE,GAAG,CAA8C;YACzD,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE;YAChC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE;YACjC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC;QACzC;QACA,KAAK,SAAS,EAAE;YACd,MAAM,EAAE,GAAG,CAA+C;AAC1D,YAAA,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC;AAC1B,YAAA,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC;YAC3B,OAAO,EAAE,GAAG,EAAE;QAChB;AACA,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,CAAC;;;AAGZ,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,QAAQ,CAAC,CAAe,EAAA;AAC/B,IAAA,QAAQ,CAAC,CAAC,IAAI;AACZ,QAAA,KAAK,OAAO;AACZ,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,CAAC;AACV,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,CAAC;AACV,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,CAAC;AACV,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,CAAC;;AAEd;AAEA;AAEA,SAAS,QAAQ,CACf,IAAY,EACZ,OAA8B,EAC9B,SAAkC,EAClC,GAAuB,EAAA;AAEvB,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;AAC5B,IAAA,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE;IAEpD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;;IAGnE,MAAM,IAAI,GAAmB,EAAE;AAC/B,IAAA,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;AACvB,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACpB,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;AAClE,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB;aAAO;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACd;IACF;;AAGA,IAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;QAC1C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;IACzC;;;AAIA,IAAA,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,EAAE;AACvC,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,GAAG;YAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE;IAC/C;AAEA,IAAA,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;IACjC;IAAE,OAAO,GAAG,EAAE;QACZ,IAAI,GAAG,YAAY,SAAS;YAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE;QACvE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;IAC5C;AACF;AAEA,SAAS,YAAY,CAAC,KAAuB,EAAE,MAAc,EAAA;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,KAAK,MAAM;IACtD,IAAI,KAAK,KAAK,UAAU;AAAE,QAAA,OAAO,IAAI;AACrC,IAAA,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK;AACxB,IAAA,OAAO,MAAM,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG;AACvC;AAIA;;;;AAIG;AACH,SAAS,4BAA4B,CAAC,IAAY,EAAA;IAChD,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI;AAC9D;;ACtVA;;;;;;;;;AASG;AAcH;AAEA,SAAS,cAAc,CAAC,IAAoB,EAAA;IAC1C,MAAM,GAAG,GAAa,EAAE;AACxB,IAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;;AAEpB,QAAA,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;YAAE;AACxB,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QACrB,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,CAAC;AACnC,QAAA,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACb;AACA,IAAA,OAAO,GAAG;AACZ;AAEA,SAAS,YAAY,CAAC,EAAgB,EAAA;AACpC,IAAA,MAAM,CAAC,GAAG,EAAE,EAAE;AACd,IAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;UACpB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;UAC1B,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;AACvC;AAEA;AAEA,MAAM,GAAG,GAAwB;AAC/B,IAAA,KAAK,EAAE,UAAU;AACjB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,8BAA8B;AACzC,QAAA,OAAO,EAAE,6DAA6D;AACvE,KAAA;AACD,IAAA,QAAQ,CAAC,IAAI,EAAA;AACX,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;QACjC,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;QAC9D,OAAO,YAAY,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC;CACF;AAED,MAAM,OAAO,GAAwB;AACnC,IAAA,KAAK,EAAE,UAAU;AACjB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,kCAAkC;AAC7C,QAAA,OAAO,EAAE,4DAA4D;AACtE,KAAA;AACD,IAAA,QAAQ,CAAC,IAAI,EAAA;AACX,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;QACjC,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9D,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,OAAO,YAAY,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC;CACF;AAED,MAAM,OAAO,GAAwB;AACnC,IAAA,KAAK,EAAE,UAAU;AACjB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,kCAAkC;AAC7C,QAAA,OAAO,EAAE,2CAA2C;AACrD,KAAA;AACD,IAAA,QAAQ,CAAC,IAAI,EAAA;AACX,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;QACjC,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9D,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;QAC5D,OAAO,YAAY,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1E,CAAC;CACF;AAED,MAAM,GAAG,GAAwB;AAC/B,IAAA,KAAK,EAAE,UAAU;AACjB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,8BAA8B;AACzC,QAAA,OAAO,EAAE,0CAA0C;AACpD,KAAA;AACD,IAAA,QAAQ,CAAC,IAAI,EAAA;AACX,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;QACjC,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9D,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AACrD,QAAA,OAAO,YAAY,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,GAAG,GAAwB;AAC/B,IAAA,KAAK,EAAE,UAAU;AACjB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,8BAA8B;AACzC,QAAA,OAAO,EAAE,0CAA0C;AACpD,KAAA;AACD,IAAA,QAAQ,CAAC,IAAI,EAAA;AACX,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;QACjC,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9D,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AACrD,QAAA,OAAO,YAAY,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9C,CAAC;CACF;AAED;AACA,MAAM,KAAK,GAAwB;AACjC,IAAA,KAAK,EAAE,UAAU;AACjB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,gCAAgC;AAC3C,QAAA,OAAO,EAAE,qEAAqE;AAC/E,KAAA;AACD,IAAA,QAAQ,CAAC,IAAI,EAAA;QACX,IAAI,CAAC,GAAG,CAAC;AACT,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;AAAE,gBAAA,CAAC,EAAE;AACvB,iBAAA,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9B,gBAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;AAAE,oBAAA,CAAC,EAAE;YAClC;QACF;AACA,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAChC,CAAC;CACF;AAED;AACA,MAAM,MAAM,GAAwB;AAClC,IAAA,KAAK,EAAE,UAAU;AACjB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,iCAAiC;AAC5C,QAAA,OAAO,EAAE,sCAAsC;AAChD,KAAA;AACD,IAAA,QAAQ,CAAC,IAAI,EAAA;QACX,IAAI,CAAC,GAAG,CAAC;QACT,KAAK,MAAM,CAAC,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;AAAE,gBAAA,CAAC,EAAE;AACjD,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAChC,CAAC;CACF;AAED,MAAM,KAAK,GAAwB;AACjC,IAAA,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AACb,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,4BAA4B;AACvC,QAAA,OAAO,EAAE,mEAAmE;AAC7E,KAAA;AACD,IAAA,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAA;AACtB,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;QACzB,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,QAAA,MAAM,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;QACvC,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AAC9B,QAAA,OAAO,YAAY,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;IAC5D,CAAC;CACF;AAED,MAAM,GAAG,GAAwB;AAC/B,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,aAAa;AACxB,QAAA,OAAO,EAAE,6BAA6B;AACvC,KAAA;IACD,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAA;AACd,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;QACzB,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,QAAA,OAAO,YAAY,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;CACF;AAED,MAAM,GAAG,GAAwB;AAC/B,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,0BAA0B;AACrC,QAAA,OAAO,EAAE,uDAAuD;AACjE,KAAA;AACD,IAAA,QAAQ,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAA;AAC1B,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC5B,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC3B,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;;AAElD,QAAA,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,KAAK,GAAwB;AACjC,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,uBAAuB;AAClC,QAAA,OAAO,EAAE,sCAAsC;AAChD,KAAA;AACD,IAAA,QAAQ,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAA;AACvB,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;QACxB,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,QAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC5B,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,QAAA,OAAO,YAAY,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;CACF;AAED;AAEA,MAAM,EAAE,GAAwB;AAC9B,IAAA,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AACb,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,mCAAmC;AAC9C,QAAA,OAAO,EAAE,iEAAiE;AAC3E,KAAA;AACD,IAAA,QAAQ,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAA;AAClC,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;AAAE,YAAA,OAAO,IAAI;AACtC,QAAA,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC;QACzB,IAAI,OAAO,CAAC,KAAK,SAAS;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACzD,QAAA,IAAI,CAAC;AAAE,YAAA,OAAO,QAAQ;QACtB,OAAO,SAAS,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC;IAClD,CAAC;CACF;AAED,MAAM,GAAG,GAAwB;AAC/B,IAAA,KAAK,EAAE,UAAU;AACjB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,8BAA8B;AACzC,QAAA,OAAO,EAAE,oDAAoD;AAC9D,KAAA;AACD,IAAA,QAAQ,CAAC,IAAI,EAAA;AACX,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;AAC5D,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;AAAE,gBAAA,OAAO,CAAC;AAChC,YAAA,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,KAAK,SAAS;AAAE,gBAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACzD,YAAA,IAAI,CAAC,CAAC;AAAE,gBAAA,OAAO,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC;QAC7C;AACA,QAAA,OAAO,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;IACpC,CAAC;CACF;AAED,MAAM,EAAE,GAAwB;AAC9B,IAAA,KAAK,EAAE,UAAU;AACjB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,6BAA6B;AACxC,QAAA,OAAO,EAAE,mDAAmD;AAC7D,KAAA;AACD,IAAA,QAAQ,CAAC,IAAI,EAAA;AACX,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;AAC5D,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;AAAE,gBAAA,OAAO,CAAC;AAChC,YAAA,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,KAAK,SAAS;AAAE,gBAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACzD,YAAA,IAAI,CAAC;AAAE,gBAAA,OAAO,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;QAC3C;AACA,QAAA,OAAO,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC;IACrC,CAAC;CACF;AAED,MAAM,GAAG,GAAwB;AAC/B,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,aAAa;AACxB,QAAA,OAAO,EAAE,qBAAqB;AAC/B,KAAA;IACD,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAA;AACV,QAAA,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;AAAE,YAAA,OAAO,CAAC;AAChC,QAAA,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;QACtB,IAAI,OAAO,CAAC,KAAK,SAAS;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACzD,QAAA,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;CACF;AAED;AACA,MAAM,OAAO,GAAwB;AACnC,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,mCAAmC;AAC9C,QAAA,OAAO,EAAE,qEAAqE;AAC/E,KAAA;AACD,IAAA,QAAQ,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAA;AACzB,QAAA,OAAO,MAAM,CAAC,IAAI,KAAK,OAAO,GAAG,QAAQ,GAAG,MAAM;IACpD,CAAC;CACF;AAED;AACA,MAAM,GAAG,GAAwB;AAC/B,IAAA,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;AACf,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,4CAA4C;AACvD,QAAA,OAAO,EAAE,2DAA2D;AACrE,KAAA;AACD,IAAA,QAAQ,CAAC,IAAI,EAAA;AACX,QAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;AAC7D,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;AACvC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;AACpB,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;AAAE,gBAAA,OAAO,IAAI;AACtC,YAAA,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC;YACzB,IAAI,OAAO,CAAC,KAAK,SAAS;AAAE,gBAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACzD,YAAA,IAAI,CAAC;AAAE,gBAAA,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3B;AACA,QAAA,OAAO,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;IACpC,CAAC;CACF;AAED;AAEA,MAAM,MAAM,GAAwB;AAClC,IAAA,KAAK,EAAE,UAAU;AACjB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,+BAA+B;AAC1C,QAAA,OAAO,EAAE,mDAAmD;AAC7D,KAAA;AACD,IAAA,QAAQ,CAAC,IAAI,EAAA;AACX,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,GAAG;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC;QACxC,IAAI,GAAG,GAAG,EAAE;AACZ,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;AACpB,YAAA,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;YAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,gBAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;YACxD,GAAG,IAAI,CAAC;QACV;AACA,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;IAClC,CAAC;CACF;AAED,MAAM,GAAG,GAAwB;AAC/B,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,YAAY;AACvB,QAAA,OAAO,EAAE,kCAAkC;AAC5C,KAAA;IACD,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAA;AACV,QAAA,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACvC,CAAC;CACF;AAED,MAAM,KAAK,GAAwB;AACjC,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,cAAc;AACzB,QAAA,OAAO,EAAE,oCAAoC;AAC9C,KAAA;IACD,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAA;AACV,QAAA,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,KAAK,GAAwB;AACjC,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,cAAc;AACzB,QAAA,OAAO,EAAE,oCAAoC;AAC9C,KAAA;IACD,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAA;AACV,QAAA,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,IAAI,GAAwB;AAChC,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,aAAa;AACxB,QAAA,OAAO,EAAE,+DAA+D;AACzE,KAAA;IACD,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAA;AACV,QAAA,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5D,CAAC;CACF;AAED,MAAM,IAAI,GAAwB;AAChC,IAAA,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AACb,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,uBAAuB;AAClC,QAAA,OAAO,EAAE,mDAAmD;AAC7D,KAAA;AACD,IAAA,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAA;AACjB,QAAA,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,QAAA,MAAM,CAAC,GAAG,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;QACrC,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;AAChD,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;CACF;AAED,MAAM,KAAK,GAAwB;AACjC,IAAA,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AACb,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,wBAAwB;AACnC,QAAA,OAAO,EAAE,mDAAmD;AAC7D,KAAA;AACD,IAAA,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAA;AACjB,QAAA,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,QAAA,MAAM,CAAC,GAAG,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;QACrC,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1B,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;CACF;AAED,MAAM,GAAG,GAAwB;AAC/B,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,6BAA6B;AACxC,QAAA,OAAO,EAAE,mEAAmE;AAC7E,KAAA;AACD,IAAA,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAA;AAC/B,QAAA,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAChC,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;AAChE,QAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC;QAClC,IAAI,OAAO,MAAM,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;AAClE,QAAA,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;QAClE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;QACvC,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACjF,CAAC;CACF;AAED,MAAM,UAAU,GAAwB;AACtC,IAAA,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AACb,IAAA,IAAI,EAAE;AACJ,QAAA,SAAS,EAAE,wDAAwD;AACnE,QAAA,OAAO,EAAE,yEAAyE;AACnF,KAAA;IACD,QAAQ,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC,EAAA;AACpD,QAAA,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC;QACnC,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9D,QAAA,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC;QACnC,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9D,QAAA,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC;QACzC,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC;AACpE,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5C,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7D;AACA,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC;QAC1C,IAAI,OAAO,UAAU,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;QAC1E,IAAI,UAAU,GAAG,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;AACzD,QAAA,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;YACnC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC;YACjC,IAAI,GAAG,KAAK,CAAC,CAAC;AAAE,gBAAA,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;QACnD;QACA,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3F,CAAC;CACF;AAED;AAEA;;;;;;;AAOG;AACI,MAAM,yBAAyB,GAA4B,MAAM,CAAC,MAAM,CAAC;;IAE9E,GAAG;IACH,OAAO;IACP,OAAO;IACP,GAAG;IACH,GAAG;IACH,KAAK;IACL,MAAM;IACN,KAAK;IACL,GAAG;IACH,GAAG;IACH,KAAK;;IAEL,EAAE;IACF,GAAG;IACH,EAAE;IACF,GAAG;IACH,OAAO;IACP,GAAG;;IAEH,MAAM;IACN,GAAG;IACH,KAAK;IACL,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,GAAG;IACH,UAAU;AACX,CAAA;;ACjgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCG;AAiBG,MAAO,iBAAkB,SAAQ,KAAK,CAAA;AAI/B,IAAA,QAAA;AAHX,IAAA,WAAA,CACE,OAAe;;IAEN,QAAgB,EAAA;QAEzB,KAAK,CAAC,OAAO,CAAC;QAFL,IAAA,CAAA,QAAQ,GAAR,QAAQ;AAGjB,QAAA,IAAI,CAAC,IAAI,GAAG,mBAAmB;IACjC;AACD;AAsBD;AAEA;;;;AAIG;SACa,YAAY,CAAC,MAAc,EAAE,UAAwB,EAAE,EAAA;AACrE,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI;AACrC,IAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,GAAG;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM;IAC9D,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC;AACrD,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,EAAE;AACpC,IAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;AACpB,IAAA,OAAO,GAAG;AACZ;AAEA;AAEA,SAAS,QAAQ,CAAC,MAAc,EAAE,MAAoB,EAAA;IACpD,MAAM,MAAM,GAAY,EAAE;AAC1B,IAAA,MAAM,YAAY,GAAG,MAAM,KAAK,IAAI,GAAG,GAAG,GAAG,GAAG;IAChD,IAAI,CAAC,GAAG,CAAC;AACT,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM;AAEzB,IAAA,OAAO,CAAC,GAAG,GAAG,EAAE;AACd,QAAA,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;AAEpB,QAAA,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE;AAC3D,YAAA,CAAC,EAAE;YACH;QACF;AAEA,QAAA,IAAI,EAAE,KAAK,GAAG,EAAE;AACd,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACxD,YAAA,CAAC,EAAE;YACH;QACF;AACA,QAAA,IAAI,EAAE,KAAK,GAAG,EAAE;AACd,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACxD,YAAA,CAAC,EAAE;YACH;QACF;AACA,QAAA,IAAI,EAAE,KAAK,YAAY,EAAE;AACvB,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AAChE,YAAA,CAAC,EAAE;YACH;QACF;AACA,QAAA,IAAI,EAAE,KAAK,GAAG,EAAE;AACd,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACvD,YAAA,CAAC,EAAE;YACH;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;AACtC,QAAA,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE;AAC5D,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YACxD,CAAC,IAAI,CAAC;YACN;QACF;AACA,QAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AAC5B,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACnD,YAAA,CAAC,EAAE;YACH;QACF;AAEA,QAAA,IAAI,EAAE,KAAK,GAAG,EAAE;YACd,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1C,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACjE,YAAA,CAAC,GAAG,MAAM,CAAC,GAAG;YACd;QACF;QAEA,IAAIA,SAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAIA,SAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE;YAC/D,MAAM,KAAK,GAAG,CAAC;AACf,YAAA,IAAI,OAAO,GAAG,EAAE,KAAK,GAAG;YACxB,IAAI,OAAO,GAAG,KAAK;AACnB,YAAA,CAAC,EAAE;AACH,YAAA,OAAO,CAAC,GAAG,GAAG,EAAE;AACd,gBAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AACnB,gBAAA,IAAIA,SAAO,CAAC,CAAC,CAAC,EAAE;AACd,oBAAA,CAAC,EAAE;oBACH;gBACF;gBACA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE;oBACrC,OAAO,GAAG,IAAI;AACd,oBAAA,CAAC,EAAE;oBACH;gBACF;AACA,gBAAA,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE;oBACxC,OAAO,GAAG,IAAI;AACd,oBAAA,CAAC,EAAE;AACH,oBAAA,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;AAAE,wBAAA,CAAC,EAAE;oBAC/C;gBACF;gBACA;YACF;YACA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YAC/E;QACF;QAEA,IAAIC,SAAO,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE;YAC7B,MAAM,KAAK,GAAG,CAAC;AACf,YAAA,OAAO,CAAC,GAAG,GAAG,KAAKA,SAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAID,SAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE;AACtG,gBAAA,CAAC,EAAE;YACL;YACA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AACpC,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE;YACjC,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE;AACzC,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YAC9D;iBAAO;AACL,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YACxD;YACA;QACF;QAEA,MAAM,IAAI,iBAAiB,CAAC,CAAA,sBAAA,EAAyB,EAAE,CAAA,CAAA,CAAG,EAAE,CAAC,CAAC;IAChE;AAEA,IAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AACtD,IAAA,OAAO,MAAM;AACf;AAEA;AACA,SAAS,gBAAgB,CAAC,MAAc,EAAE,KAAa,EAAA;AACrD,IAAA,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC;IACjB,IAAI,KAAK,GAAG,EAAE;AACd,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM;AACzB,IAAA,OAAO,CAAC,GAAG,GAAG,EAAE;AACd,QAAA,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;YACrB,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;gBACzB,KAAK,IAAI,GAAG;gBACZ,CAAC,IAAI,CAAC;gBACN;YACF;YACA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE;QAC9B;AACA,QAAA,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC;AAClB,QAAA,CAAC,EAAE;IACL;AACA,IAAA,MAAM,IAAI,iBAAiB,CAAC,6BAA6B,EAAE,KAAK,CAAC;AACnE;AAEA,SAASA,SAAO,CAAC,EAAU,EAAA;AACzB,IAAA,OAAO,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG;AAC/B;AAEA,SAASC,SAAO,CAAC,EAAU,EAAA;AACzB,IAAA,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC;AAC7D;AAEA;AAEA,MAAM,gBAAgB,CAAA;AAKD,IAAA,MAAA;AACA,IAAA,QAAA;IALX,MAAM,GAAG,CAAC;IACV,KAAK,GAAG,CAAC;IAEjB,WAAA,CACmB,MAAe,EACf,QAAgB,EAAA;QADhB,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,QAAQ,GAAR,QAAQ;IACxB;IAEH,eAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IACnD;AAEA,IAAA,MAAM,CAAC,IAAe,EAAA;AACpB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE;AACvB,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE;AACrB,YAAA,MAAM,IAAI,iBAAiB,CAAC,YAAY,IAAI,CAAA,MAAA,EAAS,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC,QAAQ,CAAC;QAC/F;QACA,IAAI,CAAC,MAAM,EAAE;AACb,QAAA,OAAO,GAAG;IACZ;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC7B,OAAO,IAAI,EAAE;AACX,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;YACxB,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI;gBAAE;YACzF,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;AAChC,YAAA,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QAC5C;AACA,QAAA,OAAO,IAAI;IACb;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;AAC/B,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE;YAC5B,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;AAClC,YAAA,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;QACjD;AACA,QAAA,OAAO,IAAI;IACb;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,mBAAmB,EAAE;QACrC,OAAO,IAAI,EAAE;AACX,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AACxB,YAAA,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;gBAAE;YAC9B,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,EAAE;AACxC,YAAA,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QAC5C;AACA,QAAA,OAAO,IAAI;IACb;IAEQ,mBAAmB,GAAA;AACzB,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;QAC5B,OAAO,IAAI,EAAE;AACX,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AACxB,YAAA,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;gBAAE;YAC9B,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;AAC/B,YAAA,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QAC5C;AACA,QAAA,OAAO,IAAI;IACb;;IAGQ,UAAU,GAAA;AAChB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE;YACzB,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;AAC/B,YAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE;QACjD;AACA,QAAA,OAAO,IAAI;IACb;IAEQ,UAAU,GAAA;AAChB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;QACxB,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE;YAC5B,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAa,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE;QACzE;AACA,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE;IAC5B;IAEQ,YAAY,GAAA;AAClB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE;AACvB,QAAA,QAAQ,GAAG,CAAC,IAAI;AACd,YAAA,KAAK,QAAQ;gBACX,IAAI,CAAC,MAAM,EAAE;AACb,gBAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACrD,YAAA,KAAK,QAAQ;gBACX,IAAI,CAAC,MAAM,EAAE;gBACb,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;AAC7C,YAAA,KAAK,MAAM;gBACT,IAAI,CAAC,MAAM,EAAE;AACb,gBAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,MAAM,EAAE;AACzD,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,IAAI,CAAC,oBAAoB,EAAE;YACpC,KAAK,QAAQ,EAAE;gBACb,IAAI,CAAC,MAAM,EAAE;AACb,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;AACrB,gBAAA,OAAO,KAAK;YACd;AACA,YAAA;AACE,gBAAA,MAAM,IAAI,iBAAiB,CAAC,CAAA,kBAAA,EAAqB,GAAG,CAAC,KAAK,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC,QAAQ,CAAC;;IAElF;AAEA;;;AAGG;IACK,oBAAoB,GAAA;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE;AACvC,QAAA,IAAI,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE;YACpD,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC;YAClD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE;gBAChC,IAAI,CAAC,MAAM,EAAE;gBACb,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AACrC,gBAAA,IAAI,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE;oBAC3E,MAAM,IAAI,iBAAiB,CAAC,oCAAoC,EAAE,QAAQ,CAAC,QAAQ,CAAC;gBACtF;gBACA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACxD,gBAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE;YACnD;AACA,YAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE;QAC7B;;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QACrB,MAAM,IAAI,GAAiB,EAAE;QAC7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE;YACjC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE;gBACnC,IAAI,CAAC,MAAM,EAAE;gBACb,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACnC;QACF;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;IAC5C;AAEA;;;;;AAKG;AACK,IAAA,iBAAiB,CAAC,QAAgB,EAAA;AACxC,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAErB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACrC,IAAI,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE;YAC7C,MAAM,IAAI,iBAAiB,CAAC,+BAA+B,EAAE,QAAQ,CAAC,QAAQ,CAAC;QACjF;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;AACtC,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;;QAGrB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE;YACjC,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,KAAK,QAAQ;YACb,OAAO;gBACL,KAAK,EAAE,QAAQ,CAAC,KAAK;AACrB,gBAAA,GAAG,EAAE,CAAC;AACN,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,OAAO,EAAE,IAAI;aACd;QACH;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACrC,IAAI,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE;YAC1C,MAAM,IAAI,iBAAiB,CAAC,4BAA4B,EAAE,QAAQ,CAAC,QAAQ,CAAC;QAC9E;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;AACpC,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAErB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;YAC9D,MAAM,IAAI,iBAAiB,CAAC,gCAAgC,EAAE,MAAM,CAAC,QAAQ,CAAC;QAChF;QAEA,IAAI,QAAQ,GAAG,KAAK;QACpB,IAAI,MAAM,GAAG,KAAK;QAClB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE;YAChC,IAAI,CAAC,MAAM,EAAE;YACb,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;AACrC,YAAA,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK;AAC1B,YAAA,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,EAAE,EAAE;gBACnE,MAAM,IAAI,iBAAiB,CACzB,CAAA,0BAAA,EAA6B,IAAI,CAAA,iCAAA,CAAmC,EACpE,OAAO,CAAC,QAAQ,CACjB;YACH;YACA,QAAQ,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK;YAC1C,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK;QAC1C;AAEA,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;AAErB,QAAA,KAAK,QAAQ;AACb,QAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;IACzD;IAEQ,IAAI,GAAA;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;IACjC;IAEQ,MAAM,GAAA;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;AACpC,QAAA,IAAI,GAAG,EAAE,IAAI,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;QACnC,OAAO,GAAG,CAAC,KAAiB;IAC9B;AAEQ,IAAA,OAAO,CAAI,EAAW,EAAA;QAC5B,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,YAAA,MAAM,IAAI,iBAAiB,CAAC,CAAA,2BAAA,EAA8B,IAAI,CAAC,QAAQ,CAAA,CAAA,CAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC;QACnG;AACA,QAAA,IAAI;YACF,OAAO,EAAE,EAAE;QACb;gBAAU;YACR,IAAI,CAAC,KAAK,EAAE;QACd;IACF;AACD;;AC5dD;;;;;;;;;;;;;;;;;AAiBG;AAmCH;AAEA;AACM,SAAU,sBAAsB,CACpC,GAAkB,EAClB,GAAqB,EAAA;IAErB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,SAAS;AACrD,IAAA,IAAI,GAAG,CAAC,OAAO,EAAE;AACf,QAAA,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS;AAAE,YAAA,OAAO,SAAS;AACpD,QAAA,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;IACtD;AACA,IAAA,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IACrC,IAAI,KAAK,KAAK,SAAS;AAAE,QAAA,OAAO,SAAS;IACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;AACpC;AAEA;;;;AAIG;SACa,gBAAgB,CAC9B,KAAoB,EACpB,GAAkB,EAClB,GAAqB,EAAA;AAErB,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AAChD,IAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;;;;IAK5C,IAAI,KAAK,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE;AAChC,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY;QAC9B,IAAI,QAAQ,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,SAAS,CAAC;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;QACxC,MAAM,GAAG,GAAgC,EAAE;AAC3C,QAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3B,YAAA,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;QAChD;AACA,QAAA,OAAO,GAAG;IACZ;AACA,IAAA,IAAI,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO;QAAE,OAAO,CAAC,SAAS,CAAC;AAErD,IAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;AAC1C,IAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;IAC1C,IAAI,QAAQ,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE;AAC9B,QAAA,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC;AAC/B,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,SAAS,CAAC;IACvD;IACA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;IAExC,MAAM,GAAG,GAAgC,EAAE;AAC3C,IAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/B,QAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;QACvE;IACF;AACA,IAAA,OAAO,GAAG;AACZ;AAEA;;;;AAIG;AACG,SAAU,UAAU,CAAC,GAAe,EAAE,GAAqB,EAAA;AAC/D,IAAA,QAAQ,GAAG,CAAC,IAAI;AACd,QAAA,KAAK,KAAK;YACR,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;AACtF,QAAA,KAAK,OAAO;YACV,OAAO;AACL,gBAAA,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,GAAG,EAAE,GAAG,CAAC,GAAG;AACZ,gBAAA,QAAQ,EAAE,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;aACpD;AACH,QAAA,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;AAC7E,QAAA,KAAK,QAAQ;YACX,OAAO;AACL,gBAAA,IAAI,EAAE,QAAQ;gBACd,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;gBAC/B,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;aAClC;AACH,QAAA,KAAK,MAAM;YACT,OAAO;AACL,gBAAA,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,GAAG,CAAC,IAAI;AACd,gBAAA,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC9C;AACH,QAAA;AACE,YAAA,OAAO,GAAG;;AAEhB;AAEA;AACM,SAAU,WAAW,CACzB,IAAiB,EACjB,GAAqB,EAAA;AAErB,IAAA,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;IAC1C,IAAI,GAAG,GAAG,CAAC;AAAE,QAAA,OAAO,SAAS;AAC7B,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/C,IAAI,QAAQ,GAAG,CAAC;AAAE,QAAA,OAAO,SAAS;IAClC,OAAO,CAAA,EAAG,oBAAoB,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAA,CAAE;AACtD;AAEA;AAEA;;;;AAIG;AACH,MAAM,SAAS,GAAG,0BAA0B;AAE5C;;;;AAIG;AACH,MAAM,mBAAmB,GAAG,eAAe;AAE3C;;;;;;;;;;;;;;;;;AAiBG;AACG,SAAU,YAAY,CAAC,MAAc,EAAE,GAAqB,EAAA;;;;;IAKhE,MAAM,eAAe,GACnB,GAAG,CAAC,YAAY,KAAK,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;;;IAI5E,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM,EAAE,CAAC,IAAI,KACtD,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,MAAM,EAAE,QAAgB,KAAI;QAC7D,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,OAAO;QAClD,OAAO,CAAA,YAAA,EAAe,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA,GAAA,CAAK;IACzD,CAAC,CAAC,CACH;;;;AAKD,IAAA,OAAO,qBAAqB,CAAC,YAAY,EAAE,CAAC,IAAI,KAC9C,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAc,EAAE,OAAe,EAAE,MAAc,EAAE,MAAc,EAAE,MAAc,EAAE,IAAY,KAAI;QAC/H,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,KAAK;;QAEhE,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG;AAAE,YAAA,OAAO,KAAK;AACrD,QAAA,MAAM,GAAG,GAAG,oBAAoB,CAAC,OAAO,CAAC;QACzC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;AAC7B,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;AAC1B,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;AAAE,YAAA,OAAO,OAAO;AAC9D,QAAA,MAAM,UAAU,GAAG,MAAM,KAAK,GAAG;AACjC,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,GAAG;;;;QAI/B,IACE,eAAe,IAAI,CAAC;YACpB,GAAG,KAAK,eAAe,GAAG,CAAC;AAC3B,YAAA,CAAC,QAAQ;YACT,CAAC,UAAU,EACX;AACA,YAAA,OAAO,0BAA0B,CAAC;gBAChC,KAAK;AACL,gBAAA,GAAG,EAAE,CAAC;AACN,gBAAA,QAAQ,EAAE,KAAK;AACf,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,OAAO,EAAE,IAAI;AACd,aAAA,CAAC;QACJ;AACA,QAAA,MAAM,GAAG,GAAkB;YACzB,KAAK;YACL,GAAG;AACH,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,MAAM,EAAE,QAAQ;SACjB;AACD,QAAA,OAAO,0BAA0B,CAAC,GAAG,CAAC;IACxC,CAAC,CAAC,CACH;AACH;AAEA;;;;;;;;;;;;;;;;AAgBG;AACG,SAAU,YAAY,CAAC,MAAc,EAAE,GAAqB,EAAA;IAChE,IAAI,GAAG,GAAG,MAAM;;;;IAIhB,MAAM,OAAO,GACX,GAAG,CAAC,YAAY,KAAK,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;;;;;IAM/E,MAAM,WAAW,GAAG,oCAAoC;AACxD,IAAA,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,QAAgB,KAAI;QAC1D,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AAC1C,QAAA,IAAI,OAAO,IAAI,CAAC,EAAE;YAChB,OAAO,WAAW,CAChB,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EACvD,GAAG,CAAC,MAAM,CACX;QACH;QACA,OAAO,WAAW,CAChB,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAChE,GAAG,CAAC,MAAM,CACX;AACH,IAAA,CAAC,CAAC;;;IAGF,MAAM,EAAE,GAAG,uEAAuE;AAClF,IAAA,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,QAAgB,EAAE,MAAc,EAAE,IAAwB,KAAI;QAC3F,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;AAC1C,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;QAC1B,MAAM,QAAQ,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK;QAChD,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK;AAC9C,QAAA,OAAO,WAAW,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC;AAClE,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,GAAG;AACZ;AAEA;;;AAGG;AACG,SAAU,0BAA0B,CAAC,GAAkB,EAAA;AAC3D,IAAA,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC;;;IAGnC,IAAI,GAAG,CAAC,OAAO;AAAE,QAAA,OAAO,IAAI;IAC5B,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,MAAM;AAAE,QAAA,OAAO,IAAI;IAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI;;AAE5E,IAAA,OAAO,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA,EAAA,EAAK,IAAI,IAAI;AAC1C;AAEA;AAEA;;;;AAIG;AACH,SAAS,qBAAqB,CAAC,MAAc,EAAE,EAA6B,EAAA;IAC1E,MAAM,GAAG,GAAa,EAAE;IACxB,IAAI,CAAC,GAAG,CAAC;IACT,IAAI,UAAU,GAAG,CAAC;AAClB,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM;AACzB,IAAA,OAAO,CAAC,GAAG,GAAG,EAAE;AACd,QAAA,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AACrB,YAAA,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,CAAC;AAClB,YAAA,CAAC,EAAE;AACH,YAAA,OAAO,CAAC,GAAG,GAAG,EAAE;AACd,gBAAA,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;oBACrB,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;wBACzB,CAAC,IAAI,CAAC;wBACN;oBACF;AACA,oBAAA,CAAC,EAAE;oBACH;gBACF;AACA,gBAAA,CAAC,EAAE;YACL;AACA,YAAA,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACnC,UAAU,GAAG,CAAC;YACd;QACF;AACA,QAAA,CAAC,EAAE;IACL;AACA,IAAA,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;AACtC,IAAA,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AACrB;AAEA;;;;AAIG;AACH,SAAS,kBAAkB,CAAC,MAAc,EAAE,MAAc,EAAE,MAAc,EAAA;IACxE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;AACrC,IAAA,IAAI,MAAM,KAAK,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;AAAE,QAAA,OAAO,IAAI;AACnF,IAAA,IAAI,KAAK,KAAK,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;AAAE,QAAA,OAAO,IAAI;AAC/E,IAAA,OAAO,KAAK;AACd;AAEA,SAAS,UAAU,CAAC,EAAU,EAAA;IAC5B,QACE,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG;AACvB,SAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC;SACvB,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC;AAE5B;AAEA;;;AAGG;AACG,SAAU,mBAAmB,CAAC,KAAa,EAAA;AAC/C,IAAA,OAAO,WAAW,CAAC,KAAK,CAAC;AAC3B;;AC5YA;;;;;;;;;;;;;;;;;;AAkBG;AAkCH,SAAS,OAAO,CAAC,IAAiB,EAAA;IAChC,OAAO,CAAA,EAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAA,CAAE;AACtC;AAEA,SAAS,YAAY,CAAC,GAAW,EAAA;IAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;IAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;IAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;AAChC,IAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;AACzB;MAGa,aAAa,CAAA;AACP,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AAErD,IAAA,KAAK,GAAG,IAAI,GAAG,EAAqB;AACpC,IAAA,GAAG,GAAG,IAAI,UAAU,EAAE;;AAGtB,IAAA,YAAY,GAAG,MAAM,CAAoC,IAAI,GAAG,EAAE,mFAAC;;IAG5E,SAAS,GAA4B,yBAAyB;;IAG9D,MAAM,GAAgB,IAAI;;;AAKzB,IAAA,MAAM,GAA8C,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;;AAGlF,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG,CAAC,oFAAC;AAE/D;;;;;AAKG;AACM,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;;;AAG3C,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,uBAAuB,EAAE;AAAE,YAAA,OAAO,IAAI;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,WAAW;AACtD,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;AAC1B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK;AAC7D,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;AACxB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,YAAY,KAAK,IAAI;AACpE,IAAA,CAAC,0FAAC;;;AAKF,IAAA,YAAY,CAAC,SAAkC,EAAA;AAC7C,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;IAC5B;AAEA;AACoE;IACpE,YAAY,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;IACvB;AAEA,IAAA,SAAS,CAAC,MAAmB,EAAA;AAC3B,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;IACtB;;AAIA,IAAA,UAAU,CAAC,IAAiB,EAAA;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC;;AAGA,IAAA,UAAU,CAAC,IAAiB,EAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO;IAC/C;;AAGA,IAAA,OAAO,CAAC,IAAiB,EAAA;AACvB,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC;AAEA;;;;AAIG;AACH,IAAA,cAAc,CAAC,IAAiB,EAAA;AAC9B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC3C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,SAAS;AAC5B,QAAA,OAAO,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvE;;AAIA;;;;AAIG;IACH,GAAG,CAAC,IAAiB,EAAE,UAAkB,EAAA;AACvC,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;AACzB,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE;AACjC,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,CAAA,CAAA,EAAI,OAAO,EAAE;;;;QAIlE,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC;AAE1C,QAAA,IAAI,GAAe;AACnB,QAAA,IAAI;AACF,YAAA,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACrD;QAAE,OAAO,GAAG,EAAE;YACZ,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,iBAAiB,GAAG,SAAS,GAAG,SAAS,CAAC;QAC/F;AAEA,QAAA,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;;AAG1B,QAAA,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC;;;;;AAMnC,QAAA,MAAM,KAAK,GAAc,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,EAAE;QAC/E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;;;AAI1B,QAAA,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,KAAK,CAAC,KAAK;IACpB;;AAGA,IAAA,MAAM,CAAC,IAAiB,EAAA;AACtB,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;;;AAGtB,QAAA,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AAClD,QAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;AACpB,QAAA,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;QAC/B,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA;;;;AAIG;AACH,IAAA,UAAU,CAAC,IAAiB,EAAA;AAC1B,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;AACzB,QAAA,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AAClD,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE;AAC7B,QAAA,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;IACjC;;IAGA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAClB,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;QAChB,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA;;;;;;;;;;;;;;AAcG;AACH,IAAA,cAAc,CAAC,YAAwC,EAAA;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AAEpC,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU;AAClC,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,MAAM,CAAC,GAAG,GAA8B;AACxC,YAAA,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAgC;AACvD,YAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;gBAAE;YAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;AAClC,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;oBAAE;AAC1B,gBAAA,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC;AACpB,gBAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE;AACjE,gBAAA,MAAM,GAAG,GAAG,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,EAAE;AAC/B,gBAAA,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;gBACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACpC,gBAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,GAAG;oBAAE;gBAC1C,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC;YACjC;QACF;;AAGA,QAAA,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE;AACxC,YAAA,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE;YACvB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;QACtE;IACF;AAEA;;;;AAIG;IACH,OAAO,GAAA;QACL,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE;AACrC,YAAA,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;;AAE5C,YAAA,KAA6B,CAAC,GAAG,GAAG,UAAU,CAC7C,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAC/C,GAAG,CACJ;AACD,YAAA,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvD;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C;;AAIQ,IAAA,gBAAgB,CAAC,YAA8B,EAAA;;;;;QAKrD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;AAC3C,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACvC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;YACjD,MAAM,CAAC,GAAG,GAA8B;AACxC,YAAA,OAAQ,CAAC,CAAC,OAAO,CAAiC,IAAI,EAAE;AAC1D,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE;IACzC;AAEQ,IAAA,UAAU,CAAC,GAAW,EAAE,MAAc,EAAE,KAAmB,EAAA;QACjE,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;;QAExC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;AAClB,YAAA,OAAO,EAAE,MAAM;YACf,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE;YACrC,KAAK;AACN,SAAA,CAAC;QACF,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,OAAO,KAAK;IACd;AAEA;;;;;AAKG;AACK,IAAA,cAAc,CAAC,KAAe,EAAA;AACpC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YACtB,IAAI,CAAC,YAAY,EAAE;YACnB;QACF;QACA,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;AACtC,QAAA,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACjC,YAAA,IAAI,CAAC,KAAK;gBAAE;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC;YACvC,IAAI,KAAK,EAAE;AACT,gBAAA,KAAK,CAAC,KAAK,GAAG,UAAU;gBACxB;YACF;YACA,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC9E;QACA,IAAI,CAAC,YAAY,EAAE;IACrB;AAEQ,IAAA,eAAe,CAAC,OAAe,EAAA;QACrC,OAAO;AACL,YAAA,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;SAChD;IACH;;AAGQ,IAAA,UAAU,CAAC,IAAiB,EAAA;AAClC,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACnC,QAAA,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC,KAAK;AACjC,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;IACnC;AAEQ,IAAA,eAAe,CAAC,IAAiB,EAAA;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACvC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC;AACd,aAAA,UAAU;AACV,aAAA,IAAI,CAAC,CAAC,CAAC,KAAM,CAA6B,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC;AACtE,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,aAAa,CAAC,KAAK,EAAE;QACtC,MAAM,GAAG,GAAI,GAA+B,CAAC,IAAI,CAAC,KAAK,CAAC;AACxD,QAAA,OAAO,aAAa,CAAC,GAAG,CAAC;IAC3B;IAEQ,YAAY,GAAA;;;;AAIlB,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAwB;QAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE;YACrC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC;QAC5B;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;wGAzTW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAb,aAAa,EAAA,CAAA;;4FAAb,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB;;AA6TD;AAEA;AACA,SAAS,WAAW,CAAC,GAAe,EAAA;AAClC,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU;AAC7B,IAAA,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;AACf,IAAA,OAAO,GAAG;AACZ;AAEA,SAAS,KAAK,CAAC,IAAgB,EAAE,GAAgB,EAAA;AAC/C,IAAA,QAAQ,IAAI,CAAC,IAAI;AACf,QAAA,KAAK,KAAK;YACR,IAAI,IAAI,CAAC,QAAQ;gBAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClD;AACF,QAAA,KAAK,OAAO;AACV,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ;AAAE,oBAAA,IAAI,CAAC;wBAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC3D;YACA;AACF,QAAA,KAAK,OAAO;AACV,YAAA,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC;YACxB;AACF,QAAA,KAAK,QAAQ;AACX,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC;AACrB,YAAA,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;YACtB;AACF,QAAA,KAAK,MAAM;AACT,YAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI;AAAE,gBAAA,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YACxC;AACF,QAAA;YACE;;AAEN;AAEA;AACA,SAAS,aAAa,CAAC,GAAY,EAAA;AACjC,IAAA,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;AAAE,QAAA,OAAO,aAAa,CAAC,KAAK,EAAE;IACnE,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;IAC7D,IAAI,OAAO,GAAG,KAAK,SAAS;AAAE,QAAA,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC;IAC/D,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;;IAE7D,OAAO,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1C;AAEA,SAAS,mBAAmB,CAAC,MAAc,EAAE,MAAmB,EAAA;AAC9D,IAAA,IAAI;QACF,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC;IACzC;AAAE,IAAA,MAAM;QACN,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;IAC7C;AACF;;MCpaa,gBAAgB,CAAA;AACV,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AACrD,IAAA,OAAO,GAAG,MAAM,CAAmB,aAAa,CAAC;AACjD,IAAA,UAAU,GAAG,MAAM,CAAgB,UAAU,CAAC;;AAE9C,IAAA,aAAa,GAAG,MAAM,CAA0B,aAAa,EAAE;AAC9E,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;IAEF,SAAS,CAAC,QAAgB,EAAE,KAAa,EAAA;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,GAAG,EAAE,QAAQ;YAAE;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;QAChF,IAAI,QAAQ,GAAG,CAAC;YAAE;QAElB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,QAAQ,CAAC;QACvE,MAAM,GAAG,GAAG,WAAW,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,GAAG,SAAS;AAC/E,QAAA,IAAI,CAAC,GAAG;YAAE;QAEV,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAI,GAA+B,CAAC,KAAK,CAAC;;;QAG9F,IAAI,UAAU,GAAY,KAAK;QAC/B,IAAI,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,EAAE;YAC1C,MAAM,KAAK,GAAI,GAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAGzD;YACb,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;AACzC,gBAAA,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBAC9D,IAAI,EAAE,KAAK,SAAS;oBAAE,UAAU,GAAG,EAAE;YACvC;QACF;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC;YAC3B,WAAW,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE;AAC7C,YAAA,aAAa,EAAE,KAAK;YACpB,UAAU;AACV,YAAA,eAAe,EAAE,IAAI;AACtB,SAAA,CAAC;IACJ;AAEA;;;;;AAKG;AACH,IAAA,iBAAiB,CAAC,QAAgB,EAAE,KAAa,EAAE,IAAY,EAAA;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,GAAG,EAAE,QAAQ;YAAE;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;QAChF,IAAI,QAAQ,GAAG,CAAC;YAAE;QAElB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,QAAQ,CAAC;QACvE,MAAM,GAAG,GAAG,WAAW,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,GAAG,SAAS;AAC/E,QAAA,IAAI,CAAC,GAAG;YAAE;AAEV,QAAA,MAAM,YAAY,GAAG,GAAG,CAAC;AACvB,cAAE,GAAG,CAAC,WAAW,CAAC,GAAG;AACrB,cAAG,GAA+B,CAAC,KAAK,CAAC;AAC3C,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,YAAY,CAAC;QAEhF,IAAI,UAAU,GAAY,IAAI;QAC9B,QAAQ,UAAU;YAChB,KAAK,QAAQ,EAAE;AACb,gBAAA,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;AACtB,gBAAA,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;gBACrC;YACF;AACA,YAAA,KAAK,UAAU;;;gBAGb,UAAU,GAAG,IAAI;gBACjB;AACF,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,MAAM;;gBAET,UAAU,GAAG,EAAE;gBACf;AACF,YAAA;gBACE,UAAU,GAAG,IAAI;;AAGrB,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC;YAC3B,WAAW,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE;AAC7C,YAAA,aAAa,EAAE,YAAY;YAC3B,UAAU;AACV,YAAA,eAAe,EAAE,IAAI;AACtB,SAAA,CAAC;IACJ;AAEA,IAAA,WAAW,CAAC,KAAc,EAAA;QACxB,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE;IAEA,UAAU,GAAA;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;QAC5C,IAAI,CAAC,SAAS,CAAC,WAAW;AAAE,YAAA,OAAO,IAAI;AAEvC,QAAA,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,WAAW;QAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,KAAK;AAC1C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;AAEvB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;QAChD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,QAAQ,CAAC;QACvE,IAAI,WAAW,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;QAChC,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC;AAC9C,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;;AAGrB,QAAA,IAAI,GAAG,EAAE,mBAAmB,EAAE;AAC5B,YAAA,MAAM,MAAM,GAAG,GAAG,CAAC,mBAAmB,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC;AACjE,YAAA,IAAI,MAAM,KAAK,KAAK,EAAE;AACpB,gBAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;AACtC,oBAAA,GAAG,CAAC;AACJ,oBAAA,eAAe,EAAE,eAAe;AACjC,iBAAA,CAAC,CAAC;AACH,gBAAA,OAAO,IAAI;YACb;AACA,YAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,gBAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;AACtC,oBAAA,GAAG,CAAC;AACJ,oBAAA,eAAe,EAAE,MAAM;AACxB,iBAAA,CAAC,CAAC;AACH,gBAAA,OAAO,IAAI;YACb;QACF;;;;AAKA,QAAA,MAAM,gBAAgB,GACpB,GAAG,EAAE,YAAY,KAAK,IAAI;AAC1B,YAAA,OAAO,SAAS,CAAC,UAAU,KAAK,QAAQ;YACxC,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG;cAC3C,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU;AAC5C,cAAE,SAAS,CAAC,UAAU;;;QAI1B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACpC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;AACzB,YAAA,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,GAAG,gBAAgB,EAAO;AAClF,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;;QAEF,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC;;;;;AAM1C,QAAA,IAAI,CAAC,mBAAmB,CACtB,GAAG,EAAE,YAAY,KAAK,IAAI,EAC1B,GAAG,EACH,KAAK,EACL,gBAAgB,EAChB,SAAS,CAAC,aAAa,CACxB;AAED,QAAA,MAAM,KAAK,GAAqB;YAC9B,GAAG;AACH,YAAA,QAAQ,EAAE,WAAW;YACrB,KAAK;YACL,QAAQ,EAAE,SAAS,CAAC,aAAa;AACjC,YAAA,QAAQ,EAAE,gBAAgB;SAC3B;QAED,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,EAAE;AACrC,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE;AAC1B,gBAAA,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;AAChF,aAAA,CAAC;QACJ;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC;AAC3B,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,aAAa,EAAE,SAAS;AACxB,YAAA,UAAU,EAAE,SAAS;AACrB,YAAA,eAAe,EAAE,IAAI;AACtB,SAAA,CAAC;AAEF,QAAA,OAAO,KAAK;IACd;IAEA,UAAU,GAAA;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;QAC5C,IAAI,CAAC,SAAS,CAAC,WAAW;AAAE,YAAA,OAAO,IAAI;AAEvC,QAAA,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,WAAW;AAC9D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK;AAE1D,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC;AAC3B,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,aAAa,EAAE,SAAS;AACxB,YAAA,UAAU,EAAE,SAAS;AACrB,YAAA,eAAe,EAAE,IAAI;AACtB,SAAA,CAAC;AAEF,QAAA,OAAO,KAAK,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,CAAC,aAAa,EAAE,GAAG,IAAI;IACnF;IAEA,SAAS,CAAC,QAAgB,EAAE,QAAgB,EAAA;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAC5C,QAAA,OAAO,SAAS,CAAC,WAAW,EAAE,GAAG,KAAK,QAAQ,IAAI,SAAS,CAAC,WAAW,EAAE,GAAG,KAAK,QAAQ;IAC3F;AAEA;;;;AAIG;AACK,IAAA,gBAAgB,CAAC,KAAa,EAAA;AACpC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;YACjD,MAAM,CAAC,GAAG,GAA8B;YACxC,OAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAiC,IAAI,EAAE;AAC1E,QAAA,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;QAC9D,OAAO,YAAY,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAChD;IAEA,iBAAiB,CAAC,KAAa,EAAE,KAAc,EAAA;AAC7C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;QAChD,IAAI,GAAG,EAAE,UAAU;YAAE,OAAO,GAAG,CAAC,UAAU;;AAG1C,QAAA,IAAI,GAAG,EAAE,iBAAiB,EAAE,MAAM;AAAE,YAAA,OAAO,QAAQ;QACnD,IAAI,OAAO,KAAK,KAAK,SAAS;AAAE,YAAA,OAAO,UAAU;QACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,QAAQ;QAC9C,IAAI,KAAK,YAAY,IAAI;AAAE,YAAA,OAAO,MAAM;AACxC,QAAA,OAAO,MAAM;IACf;AAEA;;;;;;;AAOG;IACK,mBAAmB,CACzB,YAAqB,EACrB,GAAM,EACN,KAAa,EACb,QAAiB,EACjB,QAAiB,EAAA;AAEjB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa;AACjC,QAAA,IAAI,CAAC,MAAM;YAAE;QAEb,MAAM,KAAK,GAAI,GAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAGzD;QACb,IAAI,KAAK,KAAK,SAAS;YAAE;AACzB,QAAA,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;QAE7B,MAAM,SAAS,GAAG,CAAC,CAAU,KAC3B,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;AAExD,QAAA,IAAI,YAAY,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE;AACvC,YAAA,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC5B;AAAO,aAAA,IAAI,YAAY,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;AACtE,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QACrB;AAEA,QAAA,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;IACzB;wGAjRW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAhB,gBAAgB,EAAA,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B;;;MCHY,kBAAkB,CAAA;AACZ,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AACrD,IAAA,MAAM,GAAG,MAAM,CAAgB,UAAU,CAAC;AAElD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,kFAAC;AACzD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,kFAAC;AAClE;;;;;AAKG;AACM,IAAA,cAAc,GAAG,MAAM,CAAW,IAAI,qFAAC;AAEvC,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AACvC,QAAA,IAAI,IAAI,KAAK,KAAK,EAAE;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM;YACvE,OAAO,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI;QACjD;QACA,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI;AACzC,IAAA,CAAC,4EAAC;AAEO,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;AAC5C,QAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AACjE,IAAA,CAAC,wFAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;AAC5C,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AACvC,QAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AACzD,IAAA,CAAC,oFAAC;AAEO,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;AAC5C,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;QAC7E,OAAO,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,QAAQ,CAAC,MAAM;AAC3D,IAAA,CAAC,sFAAC;AAEF;;;;;AAKG;AACH,IAAA,mBAAmB,CAAC,MAAS,EAAA;AAC3B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;QACpC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;AACtB,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;YAC/B;QACF;QACA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;QAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;QACvC,IAAI,SAAS,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE;;AAE/B,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;AACtB,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;YAC/B;QACF;QACA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AACvC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE;AACjC,gBAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;QACF,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,MAAM,EAAE;YACzC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;QACtC;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;IACjC;AAEA,IAAA,SAAS,CAAC,GAAM,EAAA;QACd,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAEvC,QAAA,IAAI,IAAI,KAAK,KAAK,EAAE;YAClB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAI;AAC5C,gBAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC;AAC9B,gBAAA,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AAChB,oBAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjB;qBAAO;AACL,oBAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACd;AACA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;QACJ;aAAO;YACL,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AACvC,gBAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,gBAAA,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AAChB,oBAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjB;qBAAO;AACL,oBAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACd;AACA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;QACtF;IACF;AAEA,IAAA,aAAa,CAAC,GAAM,EAAA;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AACvC,QAAA,IAAI,IAAI,KAAK,KAAK,EAAE;AAClB,YAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C;QACA,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC5C;IAEA,aAAa,GAAA;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAEvC,QAAA,IAAI,IAAI,KAAK,KAAK,EAAE;;YAElB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAI;AAC5C,gBAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC;AAC9B,gBAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;oBAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACjC;AACA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;QACJ;aAAO;YACL,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AACvC,gBAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,gBAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;oBAC1B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC9B;AACA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;QACtC;IACF;IAEA,SAAS,GAAA;QACP,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;IACrC;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;IACtC;IAEA,YAAY,GAAA;QACV,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAEvC,QAAA,IAAI,IAAI,KAAK,KAAK,EAAE;YAClB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAI;AAC5C,gBAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC;AAC9B,gBAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;oBAC1B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC9B;AACA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;QACJ;aAAO;YACL,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AACvC,gBAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,gBAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;oBAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACjC;AACA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;YACF,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE;gBAC1C,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;YACtC;QACF;IACF;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;YACxB,IAAI,CAAC,YAAY,EAAE;QACrB;aAAO;YACL,IAAI,CAAC,aAAa,EAAE;QACtB;IACF;IAEA,iBAAiB,GAAA;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAEvC,QAAA,IAAI,IAAI,KAAK,KAAK,EAAE;;YAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;YAC5C,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAChF,OAAO;AACL,gBAAA,WAAW,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC1D,gBAAA,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACjC,YAAY;gBACZ,IAAI;gBACJ,KAAK,EAAE,YAAY,CAAC,MAAM;aAC3B;QACH;;QAGA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,OAAO;AACL,YAAA,WAAW,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC1D,YAAA,WAAW,EAAE,EAAE;YACf,YAAY;YACZ,IAAI;YACJ,KAAK,EAAE,YAAY,CAAC,MAAM;SAC3B;IACH;AAEA,IAAA,QAAQ,CAAC,GAAM,EAAA;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,IAAI;QAC/C,MAAM,CAAC,GAAG,GAA8B;AACxC,QAAA,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG;IAC/C;wGA5NW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAlB,kBAAkB,EAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B;;;MCAY,mBAAmB,CAAA;AACb,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AAEtE,IAAA,SAAS,CAAC,GAAW,EAAE,GAAW,EAAE,SAA+B,OAAO,EAAA;QACxE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;AAClC,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACxC,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAClC;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAClC;IAEA,aAAa,CAAC,GAAW,EAAE,GAAW,EAAA;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;QACxC,OAAO,OAAO,EAAE,GAAG,KAAK,GAAG,IAAI,OAAO,EAAE,GAAG,KAAK,GAAG;IACrD;IAEA,aAAa,CAAC,GAAW,EAAE,GAAW,EAAA;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QACpC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC;QACrC;AACA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACvD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACvD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACvD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACvD,QAAA,OAAO,GAAG,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM;IACzE;IAEA,WAAW,CAAC,KAAmC,EAAE,GAAiC,EAAA;AAChF,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAClC;IAEA,mBAAmB,CAAC,GAAW,EAAE,GAAW,EAAA;AAC1C,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;QACpE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;IAEA,WAAW,CAAC,GAAW,EAAE,GAAW,EAAA;AAClC,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;YAAE;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACpC,QAAA,IAAI,CAAC,KAAK;YAAE;QACZ,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IACrE;IAEA,iBAAiB,GAAA;QACf,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAClC;IAEA,MAAM,GAAA;QACJ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpB;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IACnB;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpB;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IACnB;;IAIA,cAAc,GAAA;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC;IAC5C;IAEA,YAAY,GAAA;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;QACrD,IAAI,MAAM,GAAG,CAAC;YAAE;QAChB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC;IACxF;IAEA,eAAe,GAAA;AACb,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;QAChE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,EAAE,UAAU,CAAC;IAC1C;IAEA,aAAa,GAAA;AACX,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AAChE,QAAA,MAAM,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AACzE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;QACrD,IAAI,MAAM,GAAG,CAAC;YAAE;AAChB,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC;IAChF;AAEA;;;;;AAKG;AACH,IAAA,UAAU,CAAC,SAA2C,EAAA;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AACtD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;QACrD,IAAI,MAAM,GAAG,CAAC;YAAE;AAEhB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AAC/D,QAAA,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG;AACrB,QAAA,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG;;AAGrB,QAAA,IAAI,OAAO,GAAG,GAAG,GAAG,IAAI;AACxB,QAAA,IAAI,OAAO,GAAG,GAAG,GAAG,IAAI;AACxB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;YAClD,IAAI,WAAW,EAAE;;AAEf,gBAAA,IAAI,CAAC,MAAM;oBAAE;gBACb,GAAG,GAAG,OAAO;gBACb,GAAG,GAAG,OAAO;YACf;iBAAO;;gBAEL,IAAI,MAAM,EAAE;oBACV,GAAG,GAAG,OAAO;oBACb,GAAG,GAAG,OAAO;oBACb;gBACF;gBACA,GAAG,GAAG,OAAO;gBACb,GAAG,GAAG,OAAO;YACf;YACA,OAAO,IAAI,IAAI;YACf,OAAO,IAAI,IAAI;QACjB;QAEA,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC;IACtC;AAEA,IAAA,QAAQ,CAAC,SAAwB,EAAA;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,SAAS,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACjE,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACtB;;IAIA,aAAa,CAAC,IAAY,EAAE,IAAY,EAAA;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACpC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;QACrD,IAAI,MAAM,GAAG,CAAC;YAAE;AAEhB,QAAA,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,OAAO;AAC9C,QAAA,MAAM,MAAM,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AACxE,YAAA,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;SAC1D;AACD,QAAA,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,OAAO;AAC3C,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAClD;IAEA,qBAAqB,GAAA;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACpC,QAAA,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,OAAO;AACrC,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACxF;IAEA,mBAAmB,GAAA;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;QACrD,IAAI,MAAM,GAAG,CAAC;YAAE;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACpC,QAAA,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,OAAO;AACrC,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;IAC7F;IAEA,sBAAsB,GAAA;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACpC,QAAA,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,OAAO;QACrC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACzE;IAEA,oBAAoB,GAAA;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;QACrD,IAAI,MAAM,GAAG,CAAC;YAAE;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACpC,QAAA,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,OAAO;QACrC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;IAC5E;AAEA,IAAA,qBAAqB,CAAC,SAA2C,EAAA;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACpC,QAAA,MAAM,MAAM,GAAG,KAAK,EAAE,KAAK,IAAI,OAAO;AACtC,QAAA,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,IAAI,OAAO;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC;AAChD,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAC1D;AAEA,IAAA,iBAAiB,CAAC,SAAwB,EAAA;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,SAAS,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACjE,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7B;;AAIA,IAAA,SAAS,CAAC,GAAW,EAAA;AACnB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;QACrD,IAAI,MAAM,GAAG,CAAC;YAAE;AAChB,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;AACtC,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;AACvB,YAAA,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE;AACtB,YAAA,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE;AAC1B,SAAA,CAAC;IACJ;AAEA,IAAA,YAAY,CAAC,GAAW,EAAA;AACtB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;AACtC,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;YACvB,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE;YACjC,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE;AAC9B,SAAA,CAAC;IACJ;IAEA,SAAS,GAAA;AACP,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;QACrD,IAAI,MAAM,GAAG,CAAC;YAAE;AAChB,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;AACtC,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;YACvB,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE;YACpC,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE;AACtC,SAAA,CAAC;IACJ;;IAIQ,UAAU,GAAA;AAChB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AAC5D,QAAA,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AACjE,QAAA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE;IACvB;IAEQ,WAAW,GAAA;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE;QAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;AACxD,QAAA,IAAI,cAAc,GAAG,CAAC,EAAE;AACtB,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;QAC5D;;QAEA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE;AAEQ,IAAA,eAAe,CAAC,GAAqC,EAAA;QAC3D,QAAQ,GAAG;AACT,YAAA,KAAK,IAAI;gBACP,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;AAC9B,YAAA,KAAK,MAAM;gBACT,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;AAC7B,YAAA,KAAK,MAAM;gBACT,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;AAC9B,YAAA,KAAK,OAAO;gBACV,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;;IAEjC;AAEQ,IAAA,QAAQ,CACd,GAAW,EACX,GAAW,EACX,MAAsC,EACtC,MAAc,EAAA;AAEd,QAAA,OAAO,GAAG,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM;IAC9E;IAEQ,YAAY,CAAC,GAAW,EAAE,GAAW,EAAA;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK;AAC9B,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC;AACzB,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;AAC1B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;AAChD,QAAA,MAAM,KAAK,GAAG,GAAG,EAAE;AACjB,cAAE,GAAG,CAAC,WAAW,CAAC,OAAO;AACzB,cAAG,OAAmC,CAAC,KAAK,CAAC;QAC/C,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;IAC9D;IAEQ,mBAAmB,CAAC,GAAW,EAAE,MAAc,EAAA;AACrD,QAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAChC,YAAA,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;AAAE,gBAAA,OAAO,CAAC;QACzC;AACA,QAAA,OAAO,MAAM;IACf;IAEQ,YAAY,CAClB,IAAkC,EAClC,SAA2C,EAAA;AAE3C,QAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;AACtD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;QACrD,IAAI,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;AAE3B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;AACzD,QAAA,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG;AAClB,QAAA,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG;AAClB,QAAA,IAAI,OAAO,GAAG,GAAG,GAAG,IAAI;AACxB,QAAA,IAAI,OAAO,GAAG,GAAG,GAAG,IAAI;AACxB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;YAClD,IAAI,WAAW,EAAE;AACf,gBAAA,IAAI,CAAC,MAAM;oBAAE;YACf;iBAAO,IAAI,MAAM,EAAE;gBACjB,GAAG,GAAG,OAAO;gBACb,GAAG,GAAG,OAAO;gBACb;YACF;YACA,GAAG,GAAG,OAAO;YACb,GAAG,GAAG,OAAO;YACb,OAAO,IAAI,IAAI;YACf,OAAO,IAAI,IAAI;QACjB;AACA,QAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE;IACrB;IAEA,sBAAsB,GAAA;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;AACxC,QAAA,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC;AACzB,QAAA,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG;QAErB,OAAO,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE;AAC3C,YAAA,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE;gBACtB,GAAG,GAAG,CAAC;AACP,gBAAA,GAAG,EAAE;YACP;YACA,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM;gBAAE;YAE3C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;AACjE,YAAA,IAAI,GAAG,EAAE,QAAQ,EAAE;AACjB,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;gBACxB;YACF;AACA,YAAA,GAAG,EAAE;QACP;IACF;;IAIA,SAAS,CAAC,GAAW,EAAE,GAAW,EAAA;AAChC,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACvC,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC;AAEA;;;;AAIG;IACH,UAAU,CAAC,GAAW,EAAE,GAAW,EAAA;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YAAE;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACtC,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;AACvC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;AACvC,QAAA,IAAI,IAAI,IAAI,IAAI,EAAE;AAChB,YAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;QACrD;aAAO;AACL,YAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QACrD;IACF;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AAAE,YAAA,OAAO,IAAI;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QACtC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;AACnC,QAAA,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;AACvE,QAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;IAC3B;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;IAEA,iBAAiB,CAAC,GAAW,EAAE,GAAW,EAAA;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACtC,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;QACpC,IAAI,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QAE3D,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG;QAC1C,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,GAAG,KAAK,MAAM,CAAC,GAAG;AAAE,gBAAA,OAAO,KAAK;AACpC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC/C,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC/C,YAAA,OAAO,GAAG,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM;QACvC;;;;AAKA,QAAA,IAAI,GAAG,KAAK,MAAM,CAAC,GAAG;AAAE,YAAA,OAAO,KAAK;AACpC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC/C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC/C,QAAA,IAAI,GAAG,GAAG,MAAM,IAAI,GAAG,GAAG,MAAM;AAAE,YAAA,OAAO,KAAK;AAC9C,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;IAC7E;AAEA;;;;;AAKG;IACH,uBAAuB,CAAC,GAAW,EAAE,GAAW,EAAA;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACtC,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AACpC,QAAA,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG;AAAE,YAAA,OAAO,KAAK;QAExE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG;AAC1C,QAAA,IAAI,QAAQ;YAAE,OAAO,KAAK,CAAC;AAE3B,QAAA,IAAI,GAAG,KAAK,MAAM,CAAC,GAAG;AAAE,YAAA,OAAO,KAAK;AACpC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC/C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC/C,QAAA,IAAI,GAAG,GAAG,MAAM,IAAI,GAAG,GAAG,MAAM;AAAE,YAAA,OAAO,KAAK;;AAE9C,QAAA,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;IAC/E;AAEQ,IAAA,aAAa,CAAC,QAAgB,EAAA;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;AACxC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC/B,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,KAAK;AAC3B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;AACzD,QAAA,OAAO,GAAG,EAAE,QAAQ,KAAK,IAAI;IAC/B;AAEA;;;AAGG;AACK,IAAA,gBAAgB,CAAC,QAAgB,EAAA;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;AACxC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC/B,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,MAAM;AAC5B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;AACzD,QAAA,OAAO,GAAG,EAAE,UAAU,IAAI,MAAM;IAClC;AAEA;;;;AAIG;IACK,mBAAmB,CAAC,SAAiB,EAAE,SAAiB,EAAA;AAC9D,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;IAC9E;IAEQ,MAAM,CAAC,IAAY,EAAE,IAAY,EAAA;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,OAAO;YAAE;;AAGd,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AAChE,QAAA,MAAM,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AACzE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QAEhE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC;IAC5C;IAEA,kBAAkB,GAAA;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QACpC,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,YAAA,IAAI,CAAC,OAAO;AAAE,gBAAA,OAAO,IAAI;YACzB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;QACzC;QACA,OAAO;AACL,YAAA,KAAK,EAAE;AACL,gBAAA,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7C,gBAAA,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAC9C,aAAA;AACD,YAAA,GAAG,EAAE;AACH,gBAAA,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7C,gBAAA,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAC9C,aAAA;SACF;IACH;wGAhhBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAnB,mBAAmB,EAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B;;;MCCY,oBAAoB,CAAA;AACd,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;;AAG7D,IAAA,UAAU,GAAG,MAAM,CAAyB,IAAI,GAAG,EAAE,iFAAC;;AAGtD,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,iFAAC;;AAG5D,IAAA,WAAW,CAAC,IAAS,EAAA;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AACxC,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqB;AAE3C,QAAA,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;AACzD,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC1B,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,EAAE;gBACjC,IAAI,CAAC,GAAG,CAAC,aAAa;oBAAE;AACxB,gBAAA,MAAM,KAAK,GAAI,GAA+B,CAAC,KAAK,CAAC;gBACrD,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC;gBAC3C,IAAI,KAAK,EAAE;oBACT,MAAM,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,EAAE,KAAK,CAAC;gBAC3C;YACF;QACF;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;IAC7B;;AAGA,IAAA,YAAY,CAAC,QAAgB,EAAE,KAAa,EAAE,KAAc,EAAE,GAAM,EAAA;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE;;AAEvB,YAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC;YACrC;QACF;QAEA,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC;AAC3C,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,EAAE;QAElC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AAC7B,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;YACzB,IAAI,KAAK,EAAE;AACT,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;YACtB;iBAAO;AACL,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAClB;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;;IAGA,YAAY,CAAC,QAAgB,EAAE,KAAa,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,IAAI,KAAK,CAAA,CAAE,CAAC,IAAI,IAAI;IAC9D;;IAGA,YAAY,CAAC,QAAgB,EAAE,KAAa,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAC;IACtD;;IAGA,QAAQ,GAAA;QACN,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IAChC;IAEQ,eAAe,CAAC,QAAgB,EAAE,KAAa,EAAA;AACrD,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,EAAE;QAClC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC9B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AAC7B,gBAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAChB,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;QACJ;IACF;wGA7EW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAApB,oBAAoB,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;;MCmBY,cAAc,CAAA;AACR,IAAA,aAAa,GAAG,MAAM,CAAyB,mBAAmB,CAAC;AACnE,IAAA,UAAU,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AAC1D,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;IAE9D,OAAO,GAA2B,IAAI;AAE9C,IAAA,eAAe,CAAC,OAAwB,EAAA;AACtC,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;IACxB;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;;;QAGhC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,WAAW,KAAK,IAAI;YAAE;QAErD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,OAAO;YAAE;QAEd,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE;YACjC,KAAK,CAAC,cAAc,EAAE;QACxB;IACF;;IAGQ,QAAQ,CAAC,KAAoB,EAAE,OAAqC,EAAA;QAC1E,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;AAC1C,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ;AAC5B,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM;AACxB,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG;;QAGrB,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE;AACzB,YAAA,QAAQ,GAAG,CAAC,WAAW,EAAE;AACvB,gBAAA,KAAK,GAAG;AACN,oBAAA,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;AACpB,oBAAA,OAAO,IAAI;AACb,gBAAA,KAAK,GAAG;AACN,oBAAA,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE;AACrB,oBAAA,OAAO,IAAI;AACb,gBAAA,KAAK,GAAG;AACN,oBAAA,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;AACnB,oBAAA,OAAO,IAAI;AACb,gBAAA,KAAK,GAAG;AACN,oBAAA,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;AACpB,oBAAA,OAAO,IAAI;AACb,gBAAA,KAAK,GAAG;AACN,oBAAA,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;AACpB,oBAAA,OAAO,IAAI;AACb,gBAAA,KAAK,GAAG;AACN,oBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;AAC9B,oBAAA,OAAO,IAAI;AACb,gBAAA,KAAK,GAAG;AACN,oBAAA,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE;AACxB,oBAAA,OAAO,IAAI;AACb,gBAAA,KAAK,GAAG;AACN,oBAAA,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE;AACzB,oBAAA,OAAO,IAAI;;QAEjB;AACA,QAAA,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;AACrD,YAAA,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;AACpB,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,IAAI,GAAG,KAAK,GAAG,EAAE;AACf,YAAA,IAAI,GAAG,IAAI,KAAK,EAAE;AAChB,gBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;AAC9B,gBAAA,OAAO,IAAI;YACb;YACA,IAAI,GAAG,EAAE;gBACP,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;AAC5C,gBAAA,OAAO,IAAI;YACb;YACA,IAAI,KAAK,EAAE;gBACT,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;AACzC,gBAAA,OAAO,IAAI;YACb;QACF;;QAGA,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,WAAW,EAAE;AAC3C,YAAA,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE;AAC3B,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,YAAY,EAAE;AAC3F,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QAC9C;;AAGA,QAAA,IAAI,GAAG,KAAK,MAAM,EAAE;YAClB,IAAI,GAAG,IAAI,KAAK;AAAE,gBAAA,IAAI,CAAC,aAAa,CAAC,sBAAsB,EAAE;AACxD,iBAAA,IAAI,GAAG;AAAE,gBAAA,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE;AAC7C,iBAAA,IAAI,KAAK;AAAE,gBAAA,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE;;AACrD,gBAAA,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE;AACxC,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,GAAG,KAAK,KAAK,EAAE;YACjB,IAAI,GAAG,IAAI,KAAK;AAAE,gBAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE;AACtD,iBAAA,IAAI,GAAG;AAAE,gBAAA,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE;AAC3C,iBAAA,IAAI,KAAK;AAAE,gBAAA,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE;;AACnD,gBAAA,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;AACtC,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,GAAG,KAAK,QAAQ,EAAE;AACpB,YAAA,IAAI,KAAK;AAAE,gBAAA,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC;;AAChD,gBAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;AACtC,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,GAAG,KAAK,UAAU,EAAE;AACtB,YAAA,IAAI,KAAK;AAAE,gBAAA,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,MAAM,CAAC;;AAClD,gBAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;AACxC,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,IAAI,GAAG,KAAK,KAAK,EAAE;AACjB,YAAA,IAAI,KAAK;AAAE,gBAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;;AACnC,gBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;AACnC,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,GAAG,KAAK,OAAO,EAAE;AACnB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;YACpD,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS;AACtE,YAAA,IAAI,GAAG,EAAE,QAAQ,EAAE;AACjB,gBAAA,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AACjD,gBAAA,OAAO,IAAI;YACb;AACA,YAAA,IAAI,KAAK;AAAE,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;;AACjC,gBAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;AAClC,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,GAAG,KAAK,IAAI,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AACjD,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,GAAG,KAAK,QAAQ,EAAE;AACpB,YAAA,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;AAC/B,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;AAC9C,YAAA,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;AACtD,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,KAAK;IACd;IAEQ,WAAW,CACjB,GAAyD,EACzD,IAAsC,EAAA;AAEtC,QAAA,MAAM,GAAG,GAAG,GAAG,KAAK,SAAS,GAAG,IAAI,GAAG,GAAG,KAAK,WAAW,GAAG,MAAM,GAAG,GAAG,KAAK,WAAW,GAAG,MAAM,GAAG,OAAO;QAE5G,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE;AAC1B,YAAA,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,GAAG,CAAC;AAC7C,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC;AAClC,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,MAAM,IAAI,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC;YACvD,MAAM,IAAI,GAAG,GAAG,KAAK,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,KAAK,OAAO,GAAG,CAAC,GAAG,CAAC;YAC1D,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;AAC5C,YAAA,OAAO,IAAI;QACb;QAEA,QAAQ,GAAG;AACT,YAAA,KAAK,IAAI;AACP,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;gBAC3B;AACF,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;gBAC7B;AACF,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;gBAC7B;AACF,YAAA,KAAK,OAAO;AACV,gBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;gBAC9B;;AAEJ,QAAA,OAAO,IAAI;IACb;AAEA;;;;AAIG;AACK,IAAA,cAAc,CAAC,KAAoB,EAAA;QACzC,IAAI,KAAK,CAAC,WAAW;AAAE,YAAA,OAAO,KAAK;AACnC,QAAA,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;;QAExC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AACpC,QAAA,OAAO,IAAI,IAAI,EAAE,IAAI,IAAI,KAAK,GAAG;IACnC;wGA1MW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAd,cAAc,EAAA,CAAA;;4FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B;;;MClBY,mBAAmB,CAAA;AACb,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;IAEtE,OAAO,CAAC,aAAqB,EAAE,QAAgB,EAAA;QAC7C,IAAI,aAAa,KAAK,QAAQ;YAAE;QAEhC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,KAAI;AACxC,YAAA,MAAM,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC;AAC7B,YAAA,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;YAClD,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC;YACpC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACtD,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;IACH,eAAe,CAAC,iBAAyB,EAAE,gBAAwB,EAAA;QACjE,IAAI,iBAAiB,KAAK,gBAAgB;YAAE;QAE5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;AAC5D,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AAC/C,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAEjD,MAAM,SAAS,GAAG,QAAQ,CAAC,iBAAiB,CAAC,EAAE,KAAK;QACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC,EAAE,KAAK;AACnD,QAAA,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS;YAAE;AAE9B,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;AACjE,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;QACjE,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,UAAU,KAAK,CAAC,CAAC;YAAE;AAE5C,QAAA,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC;IACtC;wGAnCW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAnB,mBAAmB,EAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B;;;ACAD,MAAM,WAAW,GAAG,GAAG;AACvB,MAAM,8BAA8B,GAAG,EAAE;MAG5B,6BAA6B,CAAA;AACvB,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;;AAG9D,IAAA,OAAO,GAAa,CAAC,CAAC,CAAC;AAE/B,IAAA,WAAA,GAAA;QACE,MAAM,CACJ,MAAK;;AAEH,YAAA,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,EAAE;YAC3D,IAAI,CAAC,cAAc,EAAE;YAErB,IAAI,CAAC,OAAO,EAAE;gBACZ,IAAI,CAAC,SAAS,EAAE;gBAChB;YACF;;;;;;YAOA,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;gBACxC,IAAI,CAAC,SAAS,EAAE;gBAChB;YACF;AAEA,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;AAC3E,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;IACH;;IAGA,QAAQ,CAAC,UAAkB,EAAE,aAAqB,EAAA;;;;;AAKhD,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,IAAI;YAAE;QAE1C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,aAAa,CAAC;AACjD,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,8BAA8B,EAAE;YAAE;AAClD,QAAA,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,CAAC;IAC3C;IAEA,cAAc,GAAA;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;QACzC,MAAM,IAAI,GAAG,IAAI,KAAK,CAAS,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACX,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY;QAC9C;AACA,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACpE;IAEQ,SAAS,CAAC,UAAkB,EAAE,aAAqB,EAAA;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,MAAM;AACjD,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;AACf,YAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;YACnB;QACF;QACA,IAAI,KAAK,GAAG,8BAA8B,IAAI,aAAa,IAAI,CAAC,EAAE;AAChE,YAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC;YACvB;QACF;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;AACvD,QAAA,MAAM,OAAO,GAAG,UAAU,GAAG,aAAa,GAAG,WAAW;QAExD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;AACzC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7D;;AAGQ,IAAA,WAAW,CAAC,CAAS,EAAA;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;QAC5B,IAAI,EAAE,GAAG,CAAC;AACV,QAAA,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;AAC3B,QAAA,OAAO,EAAE,GAAG,EAAE,EAAE;YACd,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC;AAC/B,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,EAAE,GAAG,GAAG;;AAC1B,gBAAA,EAAE,GAAG,GAAG,GAAG,CAAC;QACnB;AACA,QAAA,OAAO,EAAE;IACX;IAEQ,SAAS,GAAA;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,MAAM;AACjD,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC;IACzB;IAEQ,QAAQ,CAAC,KAAa,EAAE,GAAW,EAAA;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE;QAC/C,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,GAAG,KAAK,GAAG;YAAE;AACpD,QAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACnD;wGArGW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAA7B,6BAA6B,EAAA,CAAA;;4FAA7B,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBADzC;;;ACDD;AACA,MAAM,cAAc,GAAG,CAAC;AAExB;AACA,MAAM,gBAAgB,GAAG,EAAE;AAE3B;AACA,MAAM,iBAAiB,GAAG,EAAE;MAGf,gBAAgB,CAAA;AACV,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAChC,IAAA,aAAa,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC3C,IAAA,cAAc,GAAG,MAAM,CAAC,6BAA6B,CAAC;;IAG/D,OAAO,GAAG,KAAK;IACf,MAAM,GAAG,CAAC;IACV,MAAM,GAAG,CAAC;IACV,kBAAkB,GAAG,CAAC,CAAC;IACvB,gBAAgB,GAAuB,IAAI;;IAG3C,MAAM,GAAG,KAAK;IACd,aAAa,GAAG,CAAC,CAAC;IAClB,SAAS,GAAuB,IAAI;IACpC,OAAO,GAAuB,IAAI;IAClC,YAAY,GAAG,CAAC;IAChB,YAAY,GAAG,CAAC;;IAGhB,UAAU,GAAuB,IAAI;;IAGrC,QAAQ,GAAuB,IAAI;IACnC,eAAe,GAAkB,IAAI;AACrC,IAAA,mBAAmB,GAAG,CAAC,CAAC;AAExB,IAAA,aAAa,GAAG,CAAC,CAAa,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACtD,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE;;IAG5C,SAAS,GAAmE,IAAI;AAEhF;;;;AAIG;AACH,IAAA,SAAS,CAAC,KAAiB,EAAE,WAAmB,EAAE,SAAsB,EAAA;AACtE,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;AAC3B,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;AAC3B,QAAA,IAAI,CAAC,kBAAkB,GAAG,WAAW;AACrC,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;AAEjC,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;YACjC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC;YAC1D,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC;AACxD,QAAA,CAAC,CAAC;IACJ;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAClB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,kBAAkB;AAC5C,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,gBAAgB;QAEtC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU;QACvC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;QAEvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;AACzC,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;AAC5B,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;AACnB,gBAAA,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC;AAC/D,YAAA,CAAC,CAAC;QACJ;QAEA,IAAI,CAAC,WAAW,EAAE;IACpB;IAEQ,WAAW,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AACrB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,wBAAwB,EAAE;;;AAGnD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,KAAK;AAC/E,QAAA,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;AAC1C,QAAA,IAAI,CAAC,UAAU;YAAE;AAEjB,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,qBAAqB,EAAE;;;;;AAM/C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC;QAClE,MAAM,KAAK,GAAG,SAAS,EAAE,YAAY,IAAI,IAAI,CAAC,KAAK;;;AAInD,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;QAC5D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG;QAE1C,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAgB;AACvD,QAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG;;AAEb,WAAA,EAAA,IAAI,CAAC,GAAG,CAAA;AACP,YAAA,EAAA,IAAI,CAAC,IAAI,CAAA;eACR,KAAK,CAAA;AACJ,cAAA,EAAA,IAAI,CAAC,MAAM,CAAA;;;;;;;;;KAStB;AACD,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAChC,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AAEpB,QAAA,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK;IAClC;IAEQ,SAAS,CAAC,OAAe,EAAE,OAAe,EAAA;QAChD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AACnB,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,OAAO,GAAG,IAAI,CAAC,YAAY,IAAI;AAC5D,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,OAAO,GAAG,IAAI,CAAC,YAAY,IAAI;IAC7D;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AACrB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACrB;AACA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,wBAAwB,EAAE;AAC7C,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,gBAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE;YACzB;QACF;IACF;AAEA;;AAE2D;IACnD,wBAAwB,GAAA;QAC9B,IAAI,CAAC,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,EAAE;AAC9B,QAAA,OAAO,KAAK,CAAC,IAAI,CACf,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAC7B,0DAA0D,CAC3D,CACF;IACH;AAEQ,IAAA,WAAW,CAAC,KAAiB,EAAA;QACnC,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;YACtC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;AACtC,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc;gBAAE;YAClD,IAAI,CAAC,YAAY,EAAE;QACrB;QAEA,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QAErC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;AAC5C,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;AAEpC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,wBAAwB,EAAE;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,KAAK;AAC1D,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO;;;;;;QAO7B,IAAI,SAAS,GAAkB,IAAI;AACnC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE;YACnD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;AAEvC,YAAA,IAAI,OAAO,GAAG,IAAI,EAAE;AAClB,gBAAA,SAAS,GAAG,UAAU,GAAG,CAAC;gBAC1B;YACF;QACF;;AAGA,QAAA,IAAI,SAAS,KAAK,IAAI,EAAE;AACtB,YAAA,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC,MAAM;QAC7C;;AAGA,QAAA,IAAI,SAAS,KAAK,IAAI,CAAC,aAAa,IAAI,SAAS,KAAK,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE;YAC5E,SAAS,GAAG,IAAI;QAClB;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE;AAC/C,QAAA,IAAI,OAAO,KAAK,SAAS,EAAE;AACzB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;gBACnB,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;AAC9C,YAAA,CAAC,CAAC;QACJ;;AAGA,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC;IAC7C;IAEQ,SAAS,GAAA;QACf,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC;QAC7D,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC;AAEzD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,IAAI,CAAC,OAAO,EAAE;YACd;QACF;QAEA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;QAC/B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;QACnC,IAAI,CAAC,WAAW,EAAE;AAElB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE;;;;;;AAO/C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;AAC9B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;YACnB,IAAI,QAAQ,EAAE;gBACZ,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC9C,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC1D;YACA,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACzC,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,OAAO,EAAE;AAEd,QAAA,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,GAAG,CAAC,EAAE;;;AAGtE,YAAA,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,CAAC,GAAG,OAAO;AAC7D,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;gBACnB,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC;gBACxD,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,WAAW,CAAC;AACxC,YAAA,CAAC,CAAC;QACJ;IACF;;IAIQ,cAAc,CAAC,SAAwB,EAAE,WAA0B,EAAA;AACzE,QAAA,IAAI,SAAS,KAAK,IAAI,EAAE;YACtB,IAAI,CAAC,cAAc,EAAE;YACrB;QACF;;QAGA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,KAAK;AAC1D,QAAA,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU;;AAG7C,QAAA,IAAI,KAAa;QACjB,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,GAAG,WAAW,CAAC,MAAM,EAAE;YAC9D,MAAM,IAAI,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,qBAAqB,EAAE;AAChE,YAAA,KAAK,GAAG,IAAI,CAAC,IAAI;QACnB;AAAO,aAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;AACjC,YAAA,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,qBAAqB,EAAE;AACxE,YAAA,KAAK,GAAG,IAAI,CAAC,KAAK;QACpB;aAAO;YACL,IAAI,CAAC,cAAc,EAAE;YACrB;QACF;;;QAIA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC;AACjD,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,EAAE;AAE7C,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC/C,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;OAO/B;YACD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;QAC5C;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,KAAK,GAAG,CAAC,CAAA,EAAA,CAAI;AAC7C,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAC,GAAG,CAAA,EAAA,CAAI;AAC/C,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,QAAQ,CAAC,MAAM,CAAA,EAAA,CAAI;IACvD;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;AACxB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACxB;IACF;;IAIQ,iBAAiB,GAAA;QACvB,IAAI,CAAC,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI;;;;;QAKhC,OAAQ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAwB,IAAI,IAAI;IACpF;AAEQ,IAAA,gBAAgB,CAAC,OAAe,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE;QAC1C;QACA,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;QAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE;AAClD,QAAA,MAAM,YAAY,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI;AACxC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,GAAG,OAAO;AAE1C,QAAA,IAAI,YAAY,GAAG,gBAAgB,EAAE;AACnC,YAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC/B;AAAO,aAAA,IAAI,aAAa,GAAG,gBAAgB,EAAE;AAC3C,YAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC;QAC9B;aAAO;AACL,YAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC;QAC9B;AAEA,QAAA,IAAI,IAAI,CAAC,mBAAmB,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE;YACnE,IAAI,CAAC,eAAe,EAAE;QACxB;AAAO,aAAA,IAAI,IAAI,CAAC,mBAAmB,KAAK,CAAC,EAAE;YACzC,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;IAEQ,eAAe,GAAA;QACrB,MAAM,IAAI,GAAG,MAAK;YAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,mBAAmB,KAAK,CAAC,EAAE;gBACpD,IAAI,CAAC,cAAc,EAAE;gBACrB;YACF;YACA,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC,mBAAmB,GAAG,iBAAiB;AACxE,YAAA,IAAI,CAAC,eAAe,GAAG,qBAAqB,CAAC,IAAI,CAAC;AACpD,QAAA,CAAC;AACD,QAAA,IAAI,CAAC,eAAe,GAAG,qBAAqB,CAAC,IAAI,CAAC;IACpD;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE;AACjC,YAAA,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC;AAC1C,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;QAC7B;AACA,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC;IAC9B;IAEQ,OAAO,GAAA;QACb,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,QAAA,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;wGAhXW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAhB,gBAAgB,EAAA,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B;;;MCVY,mBAAmB,CAAA;AACb,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AAE7D,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,GAAG,CAAC,sFAAC;AAE/E,IAAA,SAAS,CAAC,KAAc,EAAA;QACtB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AACvC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AACnB,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACpB;iBAAO;AACL,gBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YACjB;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,SAAS,CAAC,KAAc,EAAA;QACtB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AACvC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACf,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,WAAW,CAAC,KAAc,EAAA;QACxB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AACvC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AAClB,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IAC1C;AAEA,IAAA,aAAa,CAAC,KAAc,EAAA;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;IAC/C;wGAvCW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAnB,mBAAmB,EAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B;;;MCiBY,sBAAsB,CAAA;AAChB,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AAEtE,IAAA,IAAI,CAAC,UAAkB,EAAA;AACrB,QAAA,MAAM,SAAS,GAAuB;AACpC,YAAA,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;gBAC/C,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,MAAM,EAAE,GAAG,CAAC,MAAM;AACnB,aAAA,CAAC,CAAC;AACH,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AAC/B,YAAA,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,KAAI;gBAC7D,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS;AACjC,gBAAA,KAAK,EAAE;AACP,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;SACH;AAED,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC7D;AAAE,QAAA,MAAM;;QAER;IACF;AAEA,IAAA,OAAO,CAAC,UAAkB,EAAA;AACxB,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;AAC5C,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,KAAK;YAEtB,MAAM,SAAS,GAAuB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACrD,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM;AAAE,gBAAA,OAAO,KAAK;YAE5C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,aAAa,KAAI;AAC/C,gBAAA,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;oBAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;AAClE,oBAAA,IAAI,CAAC,KAAK;AAAE,wBAAA,OAAO,GAAG;oBACtB,OAAO;AACL,wBAAA,GAAG,GAAG;wBACN,YAAY,EAAE,KAAK,CAAC,YAAY;wBAChC,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;qBACrB;AACH,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;AAEF,YAAA,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE;gBAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC;AAC3C,gBAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,KACpC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;oBACf,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC;AAClE,oBAAA,OAAO;AACL,0BAAE;AACE,4BAAA,GAAG,CAAC;4BACJ,IAAI,EAAE,OAAO,CAAC,SAA0B;4BACxC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;AAC5C;AACH,0BAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAqB,EAAE,SAAS,EAAE,IAAI,EAAE;gBAC5D,CAAC,CAAC,CACH;YACH;AAEA,YAAA,IAAI,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE;AAC7B,gBAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;oBACzB,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;AAChF,iBAAA,CAAC;YACJ;AAEA,YAAA,OAAO,IAAI;QACb;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;AAEA,IAAA,KAAK,CAAC,UAAkB,EAAA;AACtB,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC;QACrC;AAAE,QAAA,MAAM;;QAER;IACF;wGAnFW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAtB,sBAAsB,EAAA,CAAA;;4FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC;;;MCRY,YAAY,CAAA;AACN,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AAEtE,IAAA,SAAS,CAAC,IAAS,EAAE,OAAA,GAAyB,EAAE,EAAA;AAC9C,QAAA,MAAM,EACJ,QAAQ,GAAG,QAAQ,EACnB,SAAS,GAAG,GAAG,EACf,cAAc,GAAG,IAAI,EACrB,OAAO,GACR,GAAG,OAAO;QAEX,MAAM,cAAc,GAAG;cACnB,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;AACrE,cAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QAE/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,MAAM,KAAK,GAAa,EAAE;QAE1B,IAAI,cAAc,EAAE;YAClB,MAAM,SAAS,GAAG;iBACf,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,UAAU,IAAI,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC;iBAC3F,IAAI,CAAC,SAAS,CAAC;AAClB,YAAA,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;QACvB;AAEA,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;gBACxC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AACjC,gBAAA,IAAI,KAAc;AAClB,gBAAA,IAAI,GAAG,EAAE,WAAW,EAAE;AACpB,oBAAA,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC;gBAC9B;qBAAO;AACL,oBAAA,KAAK,GAAI,GAA+B,CAAC,GAAG,CAAC,KAAK,CAAC;gBACrD;AACA,gBAAA,IAAI,GAAG,EAAE,cAAc,EAAE;AACvB,oBAAA,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC;gBACvE;AACA,gBAAA,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC;AAC5D,YAAA,CAAC,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC;QAEA,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,YAAY,CAAC,CAAA,EAAG,QAAQ,CAAA,IAAA,CAAM,EAAE,UAAU,EAAE,yBAAyB,CAAC;IAC7E;AAEA,IAAA,UAAU,CAAC,IAAS,EAAE,OAAA,GAAqD,EAAE,EAAA;QAC3E,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO;QAEhD,MAAM,cAAc,GAAG;cACnB,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;AACrE,cAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;AAE/B,QAAA,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QAExC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;YAClC,MAAM,GAAG,GAA4B,EAAE;AACvC,YAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;gBAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,gBAAA,IAAI,GAAG,EAAE,WAAW,EAAE;oBACpB,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC;gBACnC;qBAAO;oBACL,GAAG,CAAC,KAAK,CAAC,GAAI,GAA+B,CAAC,KAAK,CAAC;gBACtD;YACF;AACA,YAAA,OAAO,GAAG;AACZ,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,YAAY,CAAC,CAAA,EAAG,QAAQ,CAAA,KAAA,CAAO,EAAE,WAAW,EAAE,iCAAiC,CAAC;IACvF;IAEQ,cAAc,CAAC,KAAa,EAAE,SAAiB,EAAA;QACrD,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAC5E,OAAO,CAAA,CAAA,EAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA,CAAA,CAAG;QACzC;AACA,QAAA,OAAO,KAAK;IACd;AAEQ,IAAA,YAAY,CAAC,QAAgB,EAAE,OAAe,EAAE,QAAgB,EAAA;AACtE,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACxC,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG;AACf,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC3B,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AAC/B,QAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;IAC1B;wGA3FW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAZ,YAAY,EAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB;;;MCUY,UAAU,CAAA;AACJ,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AAEtE,IAAA,OAAO,CACL,IAAS,EACT,MAAsB,EACtB,aAA0B,EAC1B,OAAe,EAAA;QAEf,MAAM,IAAI,GAAwB,EAAE;QACpC,IAAI,KAAK,GAAG,CAAC;QAEb,MAAM,IAAI,GAAG,CAAC,KAAU,EAAE,KAAa,EAAE,SAAiB,KAAU;AAClE,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACxB,MAAM,MAAM,GAAG,IAA+B;gBAC9C,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;AAC3C,gBAAA,MAAM,OAAO,GAAG,SAAS,GAAG,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,GAAG,EAAE;gBACrD,MAAM,QAAQ,GAAI,MAAM,CAAC,MAAM,CAAC,aAAa,CAAqB,IAAI,EAAE;AACxE,gBAAA,MAAM,WAAW,GAAG,MAAM,CAAC;sBACvB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;AACzC,sBAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACvB,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;gBAE3C,IAAI,CAAC,IAAI,CAAC;AACR,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,IAAI,EAAE,IAAI;oBACV,KAAK,EAAE,KAAK,EAAE;oBACd,KAAK;oBACL,WAAW;oBACX,QAAQ;oBACR,OAAO;AACR,iBAAA,CAAC;AAEF,gBAAA,IAAI,WAAW,IAAI,QAAQ,EAAE;oBAC3B,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC;gBACpC;YACF;AACF,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;AACjB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,UAAU,CAAC,OAAe,EAAA;QACxB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AACvC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AACrB,gBAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YACtB;iBAAO;AACL,gBAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YACnB;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,SAAS,CAAC,IAAS,EAAE,MAAsB,EAAE,OAAe,EAAA;AAC1D,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;AAE9B,QAAA,MAAM,IAAI,GAAG,CAAC,KAAU,EAAE,SAAiB,KAAU;AACnD,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACxB,MAAM,MAAM,GAAG,IAA+B;gBAC9C,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACxC,gBAAA,MAAM,OAAO,GAAG,SAAS,GAAG,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,GAAG,EAAE;gBACrD,MAAM,QAAQ,GAAI,MAAM,CAAC,MAAM,CAAC,aAAa,CAAqB,IAAI,EAAE;AACxE,gBAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACvB,oBAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;AACjB,oBAAA,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;gBACzB;YACF;AACF,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACd,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAoB,CAAC;IACrD;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IAC1C;wGA7EW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAV,UAAU,EAAA,CAAA;;4FAAV,UAAU,EAAA,UAAA,EAAA,CAAA;kBADtB;;;ACfD,MAAM,WAAW,GAAG,GAAG;AACvB,MAAM,yBAAyB,GAAG,GAAG;AACrC,MAAM,oBAAoB,GAAG,GAAG;AAEhC;;;;;;;;;;;;;;;;;AAiBG;MAEU,2BAA2B,CAAA;AACrB,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAChC,IAAA,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGpC,IAAA,OAAO,GAAa,CAAC,CAAC,CAAC;;AAEd,IAAA,WAAW,GAAG,IAAI,GAAG,EAAkB;AAExD,IAAA,WAAA,GAAA;;QAEE,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AACzB,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;YAC3B,IAAI,CAAC,cAAc,EAAE;AACvB,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;AACjC,YAAA,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;YAC5B,IAAI,CAAC,SAAS,EAAE;AAClB,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;IACH;AAEA;;AAEmD;IACnD,QAAQ,CAAC,SAAiB,EAAE,cAAsB,EAAA;AAChD,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;QAC7E,IAAI,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,cAAc,EAAE;YACxD,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC,cAAc,CAAC;QACrD;IACF;;AAGA,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpE;AAEA,IAAA,UAAU,CAAC,aAAqB,EAAE,EAAe,EAAE,EAAkB,EAAA;AACnE,QAAA,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;AACb,QAAA,EAA+C,CAAC,aAAa,GAAG,aAAa;IAChF;AAEA,IAAA,aAAa,CAAC,OAA8B,EAAA;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QACnC,IAAI,OAAO,GAAG,KAAK;QACnB,IAAI,YAAY,GAAG,CAAC;AACpB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;AAE7D,QAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,YAAA,MAAM,EAAE,GAAG,KAAK,CAAC,MAAkD;AACnE,YAAA,MAAM,GAAG,GAAG,EAAE,CAAC,aAAa;YAC5B,IAAI,GAAG,KAAK,SAAS;gBAAE;AACvB,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC,YAAY;AACvE,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;AAC1C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3C,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG;gBAAE;AACnC,YAAA,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI;YAC1B,IAAI,KAAK,KAAK,CAAC;AAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;;gBACxC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;YACrC,OAAO,GAAG,IAAI;YACd,IAAI,GAAG,GAAG,YAAY;gBAAE,YAAY,IAAI,KAAK;QAC/C;AAEA,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,YAAY,KAAK,CAAC,EAAE;AACtB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,YAAY,CAAC;YAC/D,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC;IACF;AAEA,IAAA,aAAa,CAAC,aAAqB,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC;YAAE;QACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,EAAE,yBAAyB,CAAC;IAChE;IAEQ,cAAc,GAAA;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QACnC,MAAM,IAAI,GAAG,IAAI,KAAK,CAAS,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACX,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/D;AACA,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;AACxC,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,KAAK;YAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;IACnF;IAEQ,SAAS,GAAA;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,MAAM;AAC9C,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3B;QACF;QAEA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;;;;QAIxC,IAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;QACtD,IAAI,cAAc,IAAI,CAAC;YAAE,cAAc,GAAG,oBAAoB;AAE9D,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;AACtD,QAAA,MAAM,OAAO,GAAG,SAAS,GAAG,cAAc,GAAG,WAAW;AACxD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AACtD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;QACpC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5E;;AAGQ,IAAA,WAAW,CAAC,CAAS,EAAA;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;QAC5B,IAAI,EAAE,GAAG,CAAC;AACV,QAAA,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;AAC3B,QAAA,OAAO,EAAE,GAAG,EAAE,EAAE;YACd,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC;AAC/B,YAAA,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,EAAE,GAAG,GAAG;;AAC1B,gBAAA,EAAE,GAAG,GAAG,GAAG,CAAC;QACnB;AACA,QAAA,OAAO,EAAE;IACX;AAEQ,IAAA,UAAU,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,MAAc,EAAA;QACxE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;AACxC,QAAA,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE;AAC1C,YAAA,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAChD;AACA,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,GAAG;YAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7E,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,MAAM;YAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC;IAC3F;AAEA,IAAA,oBAAoB,CAAC,KAAa,EAAA;QAChC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7B;wGApJW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAA3B,2BAA2B,EAAA,CAAA;;4FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBADvC;;;MCtBY,gBAAgB,CAAA;AACV,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AAE7D,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,iFAAC;AAEpD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,kFAAC;AAEpD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC;AAC3D,IAAA,CAAC,gFAAC;AAEO,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC;AAC9E,IAAA,CAAC,8EAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,kFAAC;IAE1D,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,iFAAC;AAEpE,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK;AAC3B,cAAE,IAAI,CAAC,KAAK,CAAC,UAAU;cACrB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM;AACpC,IAAA,CAAC,oFAAC;AAEF,IAAA,QAAQ,CAAC,SAAiB,EAAA;QACxB,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;QACrD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;IACrC;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C;IACF;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;AACvB,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C;IACF;AAEA,IAAA,WAAW,CAAC,IAAY,EAAA;QACtB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B;wGA9CW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAhB,gBAAgB,EAAA,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B;;;ACCD,MAAM,wBAAwB,GAAG,GAAG;MAGvB,oBAAoB,CAAA;AACd,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AACrD,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAEhC,cAAc,GAAwB,IAAI;IAC1C,aAAa,GAAuB,IAAI;IACxC,gBAAgB,GAA4C,IAAI;AAE/D,IAAA,eAAe,GAAG,MAAM,CAAS,wBAAwB,sFAAC;AAE1D,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,8EAAC;AAE9C,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,iBAAiB,+EAAC;IAEtF,MAAM,CACJ,aAA0B,EAC1B,UAA0C,EAAA;QAE1C,IAAI,CAAC,MAAM,EAAE;AACb,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa;AAClC,QAAA,IAAI,CAAC,gBAAgB,GAAG,UAAU;QAElC,MAAM,QAAQ,GAAG,MAAW;YAC1B,IAAI,CAAC,mBAAmB,EAAE;AAC5B,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;AACjC,YAAA,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACvE,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,cAAc,GAAG,MAAW;AAC/B,YAAA,aAAa,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACvD,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;IAChD;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;AACA,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;IAC9B;IAEQ,mBAAmB,GAAA;QACzB,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE;AACnD,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE;AACtB,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YAAE;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;AAErB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa;AAC7B,QAAA,MAAM,kBAAkB,GAAG,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,YAAY;AAE3E,QAAA,IAAI,kBAAkB,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AAChD,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;gBACnB,IAAI,CAAC,gBAAiB,CAAC;oBACrB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM;AACtC,oBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AAC7B,iBAAA,CAAC;AACJ,YAAA,CAAC,CAAC;QACJ;IACF;AAEA;;;AAGG;AACH,IAAA,KAAK,CAAC,UAA0C,EAAA;AAC9C,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,CAAC;QAClC;AACA,QAAA,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;IACzD;wGA3EW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAApB,oBAAoB,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;;ACND;;;;;;;;;;;AAWG;AAEI,MAAM,wBAAwB,GAAG,CAAC;MAE5B,iBAAiB,CAAA;AACX,IAAA,KAAK,GAAG,IAAI,GAAG,EAAkB;IAC1C,QAAQ,GAAG,CAAC;;AAGpB,IAAA,QAAQ,CAAC,GAAW,EAAA;QAClB,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAC9B,IAAI,IAAI,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI;AACnC,QAAA,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,wBAAwB;QAC/C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC;QACzB,IAAI,CAAC,QAAQ,EAAE;AACf,QAAA,OAAO,IAAI;IACb;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAClB,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;IACnB;AACD;AAED;AACM,SAAU,eAAe,CAAC,KAAa,EAAA;AAC3C,IAAA,OAAO,CAAA,yBAAA,EAA4B,KAAK,GAAG,wBAAwB,GAAG;AACxE;;ACtCA;;;;;;;;;;;;;;;;AAgBG;AA0BH,SAAS,OAAO,CAAC,IAAiB,EAAA;IAChC,OAAO,CAAA,EAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAA,CAAE;AACtC;MAGa,0BAA0B,CAAA;AACpB,IAAA,OAAO,GAAG,IAAI,iBAAiB,EAAE;AAEjC,IAAA,gBAAgB,GAAG,MAAM,CAA0B,EAAE,uFAAC;AACtD,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,qFAAC;AAC9B,IAAA,gBAAgB,GAAG,MAAM,CAAC,KAAK,uFAAC;AAChC,IAAA,oBAAoB,GAAG,MAAM,CAAC,KAAK,2FAAC;AAE5C,IAAA,UAAU,GAAoC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;AACzF;;;AAGiE;AACxD,IAAA,QAAQ,GAAoB,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;AACrE;;AAEgC;AACvB,IAAA,UAAU,GAAoB,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;AACzE;AACqE;AAC5D,IAAA,cAAc,GAAoB,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE;;AAGxE,IAAA,WAAW,GAAwC,QAAQ,CAAC,MAAK;AACxE,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB;QACrC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;AACvC,YAAA,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE;AAC1B,gBAAA,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;YAClC;QACF;AACA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,kFAAC;IAEM,WAAW,GAAuB,IAAI;AAE9C;;;;;;;;;;;AAWG;IACH,QAAQ,CAAC,OAAoB,EAAE,OAAgC,EAAA;AAC7D,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO;AAC1B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC;IACtD;;IAGA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;IACtB;;AAGA,IAAA,QAAQ,CAAC,GAAW,EAAA;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QACxC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE;IAClD;;AAGA,IAAA,aAAa,CAAC,IAA6B,EAAA;AACzC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;;IAIA,QAAQ,CAAC,IAAiB,EAAE,IAA2B,EAAA;QACrD,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACxC;IACA,cAAc,CAAC,IAAiB,EAAE,IAA2B,EAAA;AAC3D,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC;IAC9C;AACA,IAAA,eAAe,CAAC,GAAgB,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAAE;AAClC,QAAA,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,GAAG,CAAC;IACxC;IACA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAAE;AAClC,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,QAAA,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE;IACrC;wGA3FW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAA1B,0BAA0B,EAAA,CAAA;;4FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBADtC;;;MChCY,gBAAgB,CAAA;AAClB,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;IAChC,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC5B,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IACvB,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC1B,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IAC1B,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAEtB,IAAA,QAAQ,GAAG,KAAK,CAAU,IAAI,+EAAC;AAC/B,IAAA,SAAS,GAAG,KAAK,CAAU,IAAI,gFAAC;AAChC,IAAA,WAAW,GAAG,KAAK,CAAU,IAAI,kFAAC;AAClC,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAClC,IAAA,UAAU,GAAG,KAAK,CAA6B,SAAS,iFAAC;AACzD,IAAA,eAAe,GAAG,KAAK,CAA+B,SAAS,sFAAC;AAChE,IAAA,qBAAqB,GAAG,KAAK,CAA6B,SAAS,4FAAC;AACpE,IAAA,aAAa,GAAG,KAAK,CAAkD,SAAS,oFAAC;AACjF,IAAA,eAAe,GAAG,KAAK,CAAwC,SAAS,sFAAC;AACzE,IAAA,gBAAgB,GAAG,KAAK,CAAgD,SAAS,uFAAC;AAClF,IAAA,eAAe,GAAG,KAAK,CAA8D,SAAS,sFAAC;AAC/F,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,OAAO,GAAG,KAAK,CAAU,IAAI,8EAAC;AAC9B,IAAA,QAAQ,GAAG,KAAK,CAAU,IAAI,+EAAC;AAC/B,IAAA,SAAS,GAAG,KAAK,CAAU,IAAI,gFAAC;AAChC,IAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,yFAAC;AACnD;;;;;AAKG;AACM,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,mFAAC;AAEpC,IAAA,MAAM,GAAG,KAAK,CAAyB,IAAI,6EAAC;IAC5C,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAkB;IACpC,iBAAiB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAqB;IAC9C,aAAa,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAE3B;IAEM,iBAAiB,GAAG,KAAK,CAA8B,IAAI,yFAAI,KAAK,EAAE,cAAc,EAAA,CAAG;IACvF,iBAAiB,GAAG,KAAK,CAA8B,IAAI,yFAAI,KAAK,EAAE,cAAc,EAAA,CAAG;IACvF,mBAAmB,GAAG,KAAK,CAA8B,IAAI,2FACpE,KAAK,EAAE,gBAAgB,EAAA,CACvB;AACO,IAAA,mBAAmB,GAAG,YAAY,CAAuB,MAAM,0FAAC;AAChE,IAAA,mBAAmB,GAAG,YAAY,CAAuB,MAAM,0FAAC;AAChE,IAAA,qBAAqB,GAAG,YAAY,CAAuB,QAAQ,4FAAC;IAE7E,WAAW,GAAA;QACT,OAAO;AACL,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACjB,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;AAC3B,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;AAC/B,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;AAC3B,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;AAC3B,YAAA,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE;AAC7C,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACrB,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE;YAC3C,YAAY,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,mBAAmB,EAAE;YACpE,YAAY,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,mBAAmB,EAAE;YACpE,cAAc,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC1E,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;AACvC,YAAA,qBAAqB,EAAE,IAAI,CAAC,qBAAqB,EAAE;AACnD,YAAA,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;AACnC,YAAA,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;AACvC,YAAA,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE;AACzC,YAAA,eAAe,EAAE,IAAI,CAAC,eAAe,EAAqC;AAC1E,YAAA,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;AACnC,YAAA,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE;SAClC;IACH;wGAnFW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,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,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,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,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,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,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,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,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,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,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,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,uBAAA,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,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAChC,iBAAA;srGA8CmE,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CACN,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CACJ,QAAQ,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MCtDjE,iBAAiB,CAAA;IACnB,IAAI,GAAG,KAAK,CAAkB,KAAK,4EAAI,KAAK,EAAE,mBAAmB,EAAA,CAAG;AACpE,IAAA,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;wGAF5B,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAChC,iBAAA;;;ACOD;;;;;;;;;;;;;;;;;;AAkBG;MAIU,eAAe,CAAA;IACjB,IAAI,GAAG,KAAK,CAAgB,SAAS,4EAAI,KAAK,EAAE,iBAAiB,EAAA,CAAG;AACpE,IAAA,QAAQ,GAAG,MAAM,CAAgC,WAAW,CAAC;wGAF3D,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC9B,iBAAA;;;AC7BD;;;;;;;;AAQG;MAQU,0BAA0B,CAAA;AAC5B,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAiB;AACtC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AACzB,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,kFAAC;AACxC;;;AAGG;AACM,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,kFAAC;IAE/B,MAAM,GAAG,MAAM,EAAQ;AAEb,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QAC/C,IAAI,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,KAAK,EAAE;AACrC,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,YAAY,GAAG,qBAAqB,GAAG,oBAAoB;AACpF,IAAA,CAAC,oFAAC;AAEiB,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;QACrD,IAAI,IAAI,CAAC,WAAW,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,WAAW,EAAE;AACjD,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK;AACrB,cAAE;cACA,oCAAoC;AAC1C,IAAA,CAAC,0FAAC;wGAtBS,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,2nBCrBvC,mpBAwBA,EAAA,MAAA,EAAA,CAAA,omBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDPY,QAAQ,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,4EAAE,kBAAkB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAIrC,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAPtC,SAAS;+BACE,sBAAsB,EAAA,eAAA,EACf,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EAAA,QAAA,EAAA,mpBAAA,EAAA,MAAA,EAAA,CAAA,omBAAA,CAAA,EAAA;;;AEFnD;;;;;;;;;AASG;MAEU,4BAA4B,CAAA;AAC9B,IAAA,aAAa,GAAG,KAAK,CAAC,QAAQ,mFAA6B;AAC3D,IAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,+EAAmB;IAC7C,eAAe,GAAG,MAAM,EAAe;AAE/B,IAAA,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACvC,IAAA,GAAG;AACH,IAAA,GAAG;AAEX,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE;YAC5B,IAAI,CAAC,QAAQ,EAAE;AACf,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACzD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAc,KACpE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAC7B;QACH;AACA,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QAClD;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,QAAQ,EAAE;IACjB;IAEQ,QAAQ,GAAA;AACd,QAAA,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE;AACvB,QAAA,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE;AACnB,QAAA,IAAI,CAAC,GAAG,GAAG,SAAS;AACpB,QAAA,IAAI,CAAC,GAAG,GAAG,SAAS;IACtB;wGA/BW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,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,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBADxC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA,EAAE,QAAQ,EAAE,uBAAuB,EAAE,UAAU,EAAE,IAAI,EAAE;;;MC0BrD,6BAA6B,CAAA;AAC/B,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAe;AACrC,IAAA,gBAAgB,GAAG,KAAK,CAAC,QAAQ,sFAA4B;AAC7D,IAAA,SAAS,GAAG,KAAK,CAAkB,MAAM,gFAAC;;AAE1C,IAAA,YAAY,GAAG,KAAK,CAAU,IAAI,mFAAC;AAC5C;;;;AAIG;AACM,IAAA,YAAY,GAAG,KAAK,CAAgB,IAAI,mFAAC;IAEzC,WAAW,GAAG,MAAM,EAAe;;AAGnC,IAAA,KAAK,GAAG,MAAM,CAAoB,EAAE,4EAAC;AAE9C,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;YACV,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU;;;AAGxC,YAAA,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7C,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE;AACvC,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;YACxE;AACF,QAAA,CAAC,CAAC;IACJ;AAES,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,MAAM,CAAC,GAAG,IAAI,GAAG,EAAkC;AACnD,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE;YAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAC1D,QAAA,OAAO,CAAC;AACV,IAAA,CAAC,kFAAC;IAEO,cAAc,GAAG,eAAe;;;;IAMzC,YAAY,GAAA;AACV,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACpC,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE;;AAEvB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;QACrC,MAAM,MAAM,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;AAChF,QAAA,MAAM,SAAS,GAAoB;YACjC,EAAE,EAAE,mBAAmB,EAAE;AACzB,YAAA,UAAU,EAAE,KAAK;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,MAAM,CAAC,eAAe;AAChC,YAAA,KAAK,EAAE,EAAE;SACV;AACD,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE;IACf;AAEA,IAAA,eAAe,CAAC,EAAU,EAAA;QACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,EAAE;IACf;IAEA,kBAAkB,CAAC,EAAU,EAAE,UAA4B,EAAA;AACzD,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,MAAM,EAAE;IACf;IAEA,aAAa,CAAC,EAAU,EAAE,KAAa,EAAA;;;QAGrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AACrD,QAAA,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK;YAAE;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KACrB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KACT,CAAC,CAAC,EAAE,KAAK;AACP,cAAE;AACE,gBAAA,GAAG,CAAC;gBACJ,KAAK;AACL,gBAAA,QAAQ,EAAE,GAAG,EAAE,eAAe,IAAI,CAAC,CAAC,QAAQ;AAC5C,gBAAA,KAAK,EAAE,EAAE;AACV;AACH,cAAE,CAAC,CACN,CACF;QACD,IAAI,CAAC,MAAM,EAAE;IACf;IAEA,gBAAgB,CAAC,EAAU,EAAE,QAAwB,EAAA;QACnD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KACrB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KACT,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAC9E,CACF;QACD,IAAI,CAAC,MAAM,EAAE;IACf;IAEA,aAAa,CAAC,EAAU,EAAE,KAA6C,EAAA;QACrE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KACrB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KACT,CAAC,CAAC,EAAE,KAAK;AACP,cAAE;AACE,gBAAA,GAAG,CAAC;gBACJ,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE;AAChC;AACH,cAAE,CAAC,CACN,CACF;QACD,IAAI,CAAC,MAAM,EAAE;IACf;IAEA,gBAAgB,CAAC,EAAU,EAAE,KAAY,EAAA;AACvC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA2B;QAChD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;QACrE,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3C;AAEA,IAAA,MAAM,CAAC,KAAqC,EAAA;QAC1C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACzB,YAAA,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;YACtB,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;AAC9D,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,EAAE;IACf;;;;AAMA,IAAA,UAAU,CAAC,EAAkB,EAAA;AAC3B,QAAA,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;IACrC;AAEA,IAAA,UAAU,CAAC,EAAkB,EAAA;AAC3B,QAAA,OAAO,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;IAChC;AAEA,IAAA,oBAAoB,CAAC,SAA0B,EAAA;AAC7C,QAAA,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK;AAC/B,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,OAAO,EAAE;AACpC,QAAA,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB;IAEA,kBAAkB,CAAC,SAA0B,EAAE,KAAc,EAAA;AAC3D,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrE;IAEA,YAAY,CAAC,EAAkB,EAAE,IAAY,EAAA;QAC3C,IAAI,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,QAAQ;QACtC,IAAI,IAAI,KAAK,MAAM;AAAE,YAAA,OAAO,MAAM;AAClC,QAAA,OAAO,MAAM;IACf;;;;IAMQ,MAAM,GAAA;AACZ,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,YAAA,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACvE,SAAA,CAAC;IACJ;wGArKW,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,qzBCnD1C,4zKAuJA,EAAA,MAAA,EAAA,CAAA,6qDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjHI,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,WAAW,shBACX,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,kBAAkB,qKAClB,4BAA4B,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC5B,MAAM,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,OAAO,2EACP,SAAS,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKA,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAjBzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAAA,eAAA,EAClB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,WAAW;wBACX,WAAW;wBACX,OAAO;wBACP,aAAa;wBACb,kBAAkB;wBAClB,4BAA4B;wBAC5B,MAAM;wBACN,OAAO;wBACP,SAAS;AACV,qBAAA,EAAA,QAAA,EAAA,4zKAAA,EAAA,MAAA,EAAA,CAAA,6qDAAA,CAAA,EAAA;;AA4KH,SAAS,aAAa,CACpB,EAAkB,EAClB,QAAkC,EAAA;AAElC,IAAA,IAAI,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;AAAE,QAAA,OAAO,EAAE;AAC1C,IAAA,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;AACzB,QAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE;IACzE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE;AACxC;AAEA,SAAS,eAAe,CAAC,CAAoB,EAAE,CAAoB,EAAA;AACjE,IAAA,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;AAAE,QAAA,OAAO,KAAK;AACvC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACjC,QAAA,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACf,QAAA,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACf,QAAA,IACE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;AACf,YAAA,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,UAAU;AAC/B,YAAA,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK;AACrB,YAAA,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,QAAQ;YAC3B,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK;YACjC,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,EACrC;AACA,YAAA,OAAO,KAAK;QACd;IACF;AACA,IAAA,OAAO,IAAI;AACb;;AE/OA;;;;;;AAMG;MAKU,6BAA6B,CAAA;AACvB,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,IAAI,GAAG,MAAM,EAAC,UAAuB,EAAC;AACtC,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC3B,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAwB;IAEjF,UAAU,GAAsB,IAAI;IACpC,YAAY,GAAuD,IAAI;;AAG/E,IAAA,IAAI,CAAC,OAMJ,EAAA;QACC,IAAI,IAAI,CAAC,UAAU;YAAE;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE;AAElB,QAAA,MAAM,SAAS,GAAwB;AACrC,YAAA,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;AACvF,YAAA,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;YACnF,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;SACzF;AAED,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC3B,aAAA,QAAQ;AACR,aAAA,mBAAmB,CAAC,IAAI,CAAC,IAAI;aAC7B,aAAa,CAAC,SAAS;aACvB,QAAQ,CAAC,IAAI;aACb,kBAAkB,CAAC,CAAC,CAAC;AAExB,QAAA,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;AAC/B,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,aAAa,EAAE,kCAAkC;AACjD,YAAA,UAAU,EAAE,yBAAyB;YACrC,gBAAgB;YAChB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE;AAC3D,SAAA,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;AAC9C,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;;AAG5B,QAAA,MAAM,WAAW,GACf,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK;AACvD,cAAE,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACpE,cAAE,OAAO,CAAC,KAAK;AAEnB,QAAA,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,6BAA6B,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;QACtF,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;AAEzC,QAAA,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;QACtC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC,OAAO,CAAC;AACrD,QAAA,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;AACrC,QAAA,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC;QACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;QAE3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAiB,KAAI;AAC3D,YAAA,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;AAC/B,YAAA,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AACxB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,YAAY,GAAG,OAAO;AAE3B,QAAA,UAAU,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACxD,UAAU,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAC7C,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;gBAAE,IAAI,CAAC,KAAK,EAAE;AAC1C,QAAA,CAAC,CAAC;IACJ;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;;;AAGxB,QAAA,IAAI,CAAC,MAAM,EAAE,wBAAwB,EAAE;IACzC;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,KAAK,EAAE;IACd;wGApFW,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,QAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAA7B,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAJzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,QAAQ,EAAE,sBAAsB;AACjC,iBAAA;;;MC+BY,0BAA0B,CAAA;AACpB,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAChC,IAAA,YAAY,GAAG,MAAM,CAAkB,YAAY,CAAC;;IAEpD,aAAa,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEjE,IAAA,WAAW,GAAG,KAAK,CAAC,QAAQ,iFAAoB;AAChD,IAAA,GAAG,GAAG,KAAK,CAAC,QAAQ,yEAAgB;AACpC,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,6EAAC;AAC9B,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AACjC,IAAA,WAAW,GAAG,KAAK,CAAU,KAAK,kFAAC;;AAEnC,IAAA,YAAY,GAAG,KAAK,CAA0B,IAAI,mFAAC;;AAEnD,IAAA,YAAY,GAAG,KAAK,CAAS,CAAC,mFAAC;;AAE/B,IAAA,UAAU,GAAG,KAAK,CAA0B,IAAI,iFAAC;AAEvC,IAAA,aAAa,GAAG,SAAS,CAAC,6BAA6B,oFAAC;;AAGlE,IAAA,eAAe,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,sFACjF;;AAGQ,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;AAChF,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,iBAAiB;QACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5E,OAAO,CAAA,EAAG,QAAQ,CAAC,MAAM,UAAU,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE;AACjF,IAAA,CAAC,oFAAC;AAEO,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACtB,OAAO,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE;AAC7D,IAAA,CAAC,uFAAC;IAEO,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,iFAAC;IAErF,SAAS,GAAG,MAAM,EAA2C;IAC7D,UAAU,GAAG,MAAM,EAAmD;IACtE,WAAW,GAAG,MAAM,EAAc;AAElC,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;AAC7B,QAAA,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK;AAC1D,IAAA,CAAC,4EAAC;AAEF;;;;;AAKG;AACM,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;QAC3E,IAAI,GAAG,GAAG,CAAC;AAAE,YAAA,OAAO,EAAE;AACtB,QAAA,OAAO,oBAAoB,CAAC,GAAG,CAAC;AAClC,IAAA,CAAC,mFAAC;AAEF;;;;AAIG;AACM,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;QACxC,OAAO,IAAI,CAAC,aAAa,EAAE,mBAAmB,EAAE,IAAI,KAAK;AAC3D,IAAA,CAAC,uFAAC;AAEO,IAAA,SAAS,GAAG,QAAQ,CAAsB,MAAK;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK;AACtC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;AACzE,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE;QAExB,MAAM,KAAK,GAAwB,EAAE;AAErC,QAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK,EAAE;AAC1B,YAAA,KAAK,CAAC,IAAI,CACR,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,EAC1D,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,CAC9D;QACH;AAEA,QAAA,IAAI,GAAG,CAAC,UAAU,EAAE;YAClB,KAAK,CAAC,IAAI,CAAC;AACT,gBAAA,EAAE,EAAE,eAAe;AACnB,gBAAA,KAAK,EAAE,uBAAuB;AAC9B,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;AAC1B,aAAA,CAAC;QACJ;AAEA,QAAA,IAAI,GAAG,CAAC,SAAS,EAAE;YACjB,KAAK,CAAC,IAAI,CAAC;AACT,gBAAA,EAAE,EAAE,cAAc;AAClB,gBAAA,KAAK,EAAE,sBAAsB;gBAC7B,OAAO,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;AAC7C,aAAA,CAAC;QACJ;AAEA,QAAA,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,EAAE;AAC3B,YAAA,IAAI,QAAQ,CAAC,MAAM,EAAE;gBACnB,KAAK,CAAC,IAAI,CAAC;AACT,oBAAA,EAAE,EAAE,iBAAiB;AACrB,oBAAA,KAAK,EAAE,cAAc;AACrB,oBAAA,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;AAC1B,iBAAA,CAAC;YACJ;iBAAO;gBACL,KAAK,CAAC,IAAI,CAAC;AACT,oBAAA,EAAE,EAAE,oBAAoB;AACxB,oBAAA,KAAK,EAAE,UAAU;AACjB,oBAAA,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;AAC1B,iBAAA,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC;AACT,oBAAA,EAAE,EAAE,qBAAqB;AACzB,oBAAA,KAAK,EAAE,WAAW;AACnB,iBAAA,CAAC;YACJ;QACF;AAEA,QAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK,EAAE;YAC1B,KAAK,CAAC,IAAI,CAAC;AACT,gBAAA,EAAE,EAAE,aAAa;AACjB,gBAAA,KAAK,EAAE,aAAa;AACpB,gBAAA,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;AAC1B,aAAA,CAAC;QACJ;AAEA,QAAA,OAAO,KAAK;AACd,IAAA,CAAC,gFAAC;AAEF,IAAA,aAAa,CAAC,KAAiB,EAAA;QAC7B,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,KAAK,KAAK,EAAE;AACjC,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAClB,gBAAA,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK;gBAC/B,WAAW,EAAE,KAAK,CAAC,QAAQ;AAC5B,aAAA,CAAC;QACJ;IACF;AAEA,IAAA,eAAe,CAAC,IAAuB,EAAA;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK;AACtC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAwB;;;;;;;AAQ9C,QAAA,IAAI,QAAQ,KAAK,eAAe,EAAE;AAChC,YAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAC7B;QACF;QAEA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC3C;AAEQ,IAAA,iBAAiB,CAAC,SAAiB,EAAA;;;;;QAKzC,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;AACpC,YAAA,IAAI,CAAC,OAAO;gBAAE;YACd,OAAO,CAAC,IAAI,CAAC;AACX,gBAAA,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;AACtD,gBAAA,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC7D,SAAS;AACT,gBAAA,QAAQ,EAAE,CAAC,IAAiB,KAAI;oBAC9B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;gBAC7C,CAAC;AACF,aAAA,CAAC;QACJ,CAAC,EAAE,CAAC,CAAC;IACP;wGAlLW,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,sBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,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,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,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,YAAA,EAAA,wCAAA,EAAA,gBAAA,EAAA,mDAAA,EAAA,oBAAA,EAAA,4DAAA,EAAA,gBAAA,EAAA,oCAAA,EAAA,eAAA,EAAA,qDAAA,EAAA,gBAAA,EAAA,sDAAA,EAAA,cAAA,EAAA,2BAAA,EAAA,uCAAA,EAAA,cAAA,EAAA,0CAAA,EAAA,eAAA,EAAA,qCAAA,EAAA,yBAAA,EAAA,+CAAA,EAAA,2BAAA,EAAA,gDAAA,EAAA,4BAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAkBQ,6BAA6B,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClE5E,omDA8CA,iuFDtBI,aAAa,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,WAAW,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,UAAU,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,QAAQ,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,gCAAgC,yNAChC,6BAA6B,EAAA,QAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAmBpB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBA5BtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,eAAA,EACf,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,aAAa;wBACb,WAAW;wBACX,UAAU;wBACV,QAAQ;wBACR,gCAAgC;wBAChC,6BAA6B;qBAC9B,EAAA,IAAA,EACK;AACJ,wBAAA,cAAc,EAAE,oCAAoC;AACpD,wBAAA,kBAAkB,EAAE,mDAAmD;AACvE,wBAAA,sBAAsB,EAAE,4DAA4D;AACpF,wBAAA,kBAAkB,EAAE,kCAAkC;AACtD,wBAAA,iBAAiB,EAAE,mDAAmD;AACtE,wBAAA,kBAAkB,EAAE,oDAAoD;AACxE,wBAAA,gBAAgB,EAAE,2BAA2B;AAC7C,wBAAA,yCAAyC,EAAE,cAAc;AACzD,wBAAA,4CAA4C,EAAE,eAAe;AAC7D,wBAAA,uCAAuC,EAAE,yBAAyB;AAClE,wBAAA,iDAAiD,EAAE,yBAAyB;AAC5E,wBAAA,kDAAkD,EAAE,0BAA0B;AAC/E,qBAAA,EAAA,QAAA,EAAA,omDAAA,EAAA,MAAA,EAAA,CAAA,yqFAAA,CAAA,EAAA;i3BAsB4C,6BAA6B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEhEtE,SAAU,eAAe,CAAI,MAAc,EAAE,GAAkB,EAAA;AACnE,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE;AACxB,QAAA,OAAO,SAAS,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE;IACtC;AACA,IAAA,OAAO,CAAA,KAAA,EAAQ,GAAG,CAAC,KAAK,EAAE;AAC5B;AAEM,SAAU,YAAY,CAAC,MAAc,EAAE,GAAsB,EAAA;IACjE,OAAO,GAAG,CAAC,KAAK;AAClB;;MCoBa,sBAAsB,CAAA;AACd,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAChC,IAAA,YAAY,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC3C,IAAA,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACnC,YAAY,GAAG,YAAY;AAErC,IAAA,YAAY,GAAG,SAAS,CAA0B,cAAc,mFAAC;AACjE,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,mFAAC;AACpC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAClC,IAAA,WAAW,GAAG,KAAK,CAAU,KAAK,kFAAC;IAEnC,SAAS,GAAG,MAAM,EAA2C;IAC7D,UAAU,GAAG,MAAM,EAAmD;IACtE,WAAW,GAAG,MAAM,EAAwC;IAC5D,eAAe,GAAG,MAAM,EAAQ;IAChC,aAAa,GAAG,MAAM,EAAmD;AAElF,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,KAAI;AACzC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AACtE,QAAA,CAAC;IACH;AAEmB,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;QAClD,IAAI,CAAC,GAAG,CAAC;QACT,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE,CAAC,IAAI,EAAE;QAC9B,IAAI,IAAI,CAAC,YAAY,EAAE;YAAE,CAAC,IAAI,EAAE;AAChC,QAAA,OAAO,CAAC;AACV,IAAA,CAAC,uFAAC;AAEiB,IAAA,WAAW,GAAG,QAAQ,CACvC,MAAM,IAAI,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,kFAC/D;AAEkB,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;AAC3F,IAAA,CAAC,mFAAC;AAEF,IAAA,iBAAiB,CAAC,KAAa,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,cAAc,IAAI,IAAI;IACrE;AAEA,IAAA,gBAAgB,CAAC,KAAY,EAAA;QAC3B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;IAC7B;IAEA,WAAW,CAAC,KAAiB,EAAE,aAAqB,EAAA;AAClD,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE;AACzB,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;AACxB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,IACE,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC;AAClD,YAAA,MAAM,CAAC,OAAO,CAAC,iCAAiC,CAAC;YAEjD;AAEF,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,QAAA,IAAI,CAAC,MAAM;YAAE;AAEb,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC;IACvE;wGA9DW,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,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,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,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/BnC,imMAkKA,EAAA,MAAA,EAAA,CAAA,qkDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1IY,0BAA0B,0OAAE,oBAAoB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAO9E,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAVlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,eAAA,EACV,uBAAuB,CAAC,MAAM,WACtC,CAAC,0BAA0B,EAAE,oBAAoB,EAAE,WAAW,EAAE,gBAAgB,CAAC,EAAA,IAAA,EACpF;AACJ,wBAAA,sBAAsB,EAAE,eAAe;AACxC,qBAAA,EAAA,QAAA,EAAA,imMAAA,EAAA,MAAA,EAAA,CAAA,qkDAAA,CAAA,EAAA;oGAU0D,cAAc,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AErC3E;;;;;;;;;;;;;;;;;;AAkBG;SA0Ca,qBAAqB,CACnC,MAAc,EACd,UAAiC,EAAE,EAAA;AAEnC,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI;AACrC,IAAA,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE;AAC3C,IAAA,MAAM,YAAY,GAAG,MAAM,KAAK,IAAI,GAAG,GAAG,GAAG,GAAG;IAChD,MAAM,GAAG,GAAyB,EAAE;AACpC,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM;IACzB,IAAI,CAAC,GAAG,CAAC;AAET,IAAA,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;QACrB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACrD,CAAC,GAAG,CAAC;IACP;AAEA,IAAA,OAAO,CAAC,GAAG,GAAG,EAAE;AACd,QAAA,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;AAEpB,QAAA,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,KAAK,GAAG,CAAC;YACf,OACE,CAAC,GAAG,GAAG;AACP,iBAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EACrF;AACA,gBAAA,CAAC,EAAE;YACL;YACA,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YACrE;QACF;AAEA,QAAA,IAAI,EAAE,KAAK,GAAG,EAAE;YACd,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7D,YAAA,CAAC,EAAE;YACH;QACF;AACA,QAAA,IAAI,EAAE,KAAK,GAAG,EAAE;YACd,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7D,YAAA,CAAC,EAAE;YACH;QACF;AACA,QAAA,IAAI,EAAE,KAAK,GAAG,EAAE;YACd,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5D,YAAA,CAAC,EAAE;YACH;QACF;AACA,QAAA,IAAI,EAAE,KAAK,YAAY,EAAE;YACvB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AACrE,YAAA,CAAC,EAAE;YACH;QACF;AAEA,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;AAClC,QAAA,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;YAChD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,CAAC,IAAI,CAAC;YACN;QACF;AACA,QAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YAC5B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AACxD,YAAA,CAAC,EAAE;YACH;QACF;AAEA,QAAA,IAAI,EAAE,KAAK,GAAG,EAAE;YACd,MAAM,KAAK,GAAG,CAAC;AACf,YAAA,CAAC,EAAE;AACH,YAAA,OAAO,CAAC,GAAG,GAAG,EAAE;AACd,gBAAA,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;oBACrB,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;wBACzB,CAAC,IAAI,CAAC;wBACN;oBACF;AACA,oBAAA,CAAC,EAAE;oBACH;gBACF;AACA,gBAAA,CAAC,EAAE;YACL;YACA,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YACzE;QACF;;;;;AAMA,QAAA,IAAI,EAAE,KAAK,GAAG,EAAE;YACd,MAAM,KAAK,GAAG,CAAC;AACf,YAAA,CAAC,EAAE;YACH,OAAO,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;AAAE,gBAAA,CAAC,EAAE;AACxC,YAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG;AACxB,YAAA,IAAI,QAAQ;AAAE,gBAAA,CAAC,EAAE;YACjB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1D,YAAA,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;YACrD,GAAG,CAAC,IAAI,CAAC;AACP,gBAAA,IAAI,EAAE,KAAK;gBACX,IAAI;gBACJ,KAAK;AACL,gBAAA,GAAG,EAAE,CAAC;AACN,gBAAA,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE;AACtE,aAAA,CAAC;YACF;QACF;;;QAIA,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,UAAU,CAAC;QACjD,IAAI,QAAQ,EAAE;YACZ,GAAG,CAAC,IAAI,CAAC;AACP,gBAAA,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC;AACnC,gBAAA,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,GAAG,EAAE,QAAQ,CAAC,GAAG;AAClB,aAAA,CAAC;AACF,YAAA,CAAC,GAAG,QAAQ,CAAC,GAAG;YAChB;QACF;QAEA,IAAI,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE;YAC/D,MAAM,KAAK,GAAG,CAAC;AACf,YAAA,IAAI,OAAO,GAAG,EAAE,KAAK,GAAG;YACxB,IAAI,OAAO,GAAG,KAAK;AACnB,YAAA,CAAC,EAAE;AACH,YAAA,OAAO,CAAC,GAAG,GAAG,EAAE;AACd,gBAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AACnB,gBAAA,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE;AACd,oBAAA,CAAC,EAAE;oBACH;gBACF;gBACA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE;oBACrC,OAAO,GAAG,IAAI;AACd,oBAAA,CAAC,EAAE;oBACH;gBACF;AACA,gBAAA,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE;oBACxC,OAAO,GAAG,IAAI;AACd,oBAAA,CAAC,EAAE;AACH,oBAAA,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;AAAE,wBAAA,CAAC,EAAE;oBAC/C;gBACF;gBACA;YACF;YACA,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YACzE;QACF;QAEA,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE;YAC7B,MAAM,KAAK,GAAG,CAAC;YACf,OACE,CAAC,GAAG,GAAG;AACP,iBAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,EACpF;AACA,gBAAA,CAAC,EAAE;YACL;YACA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AACnC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;YAChC,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE;AACzC,gBAAA,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;gBAC/C;YACF;YACA,IAAI,CAAC,GAAG,CAAC;AACT,YAAA,OAAO,CAAC,GAAG,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAAE,gBAAA,CAAC,EAAE;YAChE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;YAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YAC9D;QACF;QAEA,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7D,QAAA,CAAC,EAAE;IACL;AAEA,IAAA,OAAO,GAAG;AACZ;AAOA;;;;;AAKG;AACH,SAAS,SAAS,CAChB,MAAc,EACd,GAAW,EACX,UAA6B,EAAA;AAE7B,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM;IACzB,IAAI,CAAC,GAAG,GAAG;IACX,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;AAClC,IAAA,IAAI,QAAQ;AAAE,QAAA,CAAC,EAAE;IAEjB,MAAM,YAAY,GAAG,CAAC;IACtB,OAAO,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAAE,QAAA,CAAC,EAAE;IACzC,IAAI,CAAC,KAAK,YAAY;AAAE,QAAA,OAAO,IAAI;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;AAChC,IAAA,MAAM,oBAAoB,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;IAC/C,IAAI,CAAC,GAAG,oBAAoB;IAC5B,OAAO,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAAE,QAAA,CAAC,EAAE;IACzC,IAAI,CAAC,KAAK,oBAAoB;AAAE,QAAA,OAAO,IAAI;;;AAI3C,IAAA,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;AAAE,QAAA,OAAO,IAAI;IAElC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC;AACpD,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;AAAE,QAAA,OAAO,IAAI;AACjD,IAAA,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC;IAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE;IAEtC,OAAO;AACL,QAAA,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;KACtC;AACH;AAEA,SAAS,OAAO,CAAC,EAAU,EAAA;AACzB,IAAA,OAAO,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG;AAC/B;AACA,SAAS,OAAO,CAAC,EAAU,EAAA;AACzB,IAAA,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,CAAC;AAC7D;AAEA;AAEA;;;;AAIG;AACG,SAAU,YAAY,CAC1B,MAAqC,EACrC,KAAa,EAAA;AAEb,IAAA,KAAK,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE;AACjD,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;QACrB,IAAI,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,GAAG;AAAE,YAAA,OAAO,CAAC;IAClD;AACA,IAAA,OAAO,IAAI;AACb;AAEA;;;AAGG;AACG,SAAU,yBAAyB,CACvC,MAAqC,EACrC,KAAa,EAAA;IAEb,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC;AACvC,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,IAAI;AACrB,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;AAAE,QAAA,OAAO,IAAI;AACjF,IAAA,IAAI,KAAK,KAAK,GAAG,CAAC,GAAG;AAAE,QAAA,OAAO,IAAI;IAClC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE;AACrE;AAWA;;;;AAIG;AACG,SAAU,sBAAsB,CAAC,MAAqC,EAAA;IAC1E,MAAM,GAAG,GAAqB,EAAE;AAChC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACtC,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG;YAAE;QAChC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AAC3B,QAAA,IAAI,IAAI,EAAE,IAAI,KAAK,OAAO,IAAI,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,GAAG,EAAE;YAChE,GAAG,CAAC,IAAI,CAAC;gBACP,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;gBACrC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;AACxB,gBAAA,OAAO,EAAE,IAAI;AACd,aAAA,CAAC;YACF,CAAC,IAAI,CAAC;YACN;QACF;QACA,GAAG,CAAC,IAAI,CAAC;YACP,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI,EAAE,CAAC,CAAC,IAAI;AACZ,YAAA,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AACb,YAAA,OAAO,EAAE,KAAK;AACf,SAAA,CAAC;IACJ;AACA,IAAA,OAAO,GAAG;AACZ;;AC7WA;;;;;;;;;;;;;AAaG;AA6BG,SAAU,yBAAyB,CACvC,MAAqC,EACrC,KAAa,EACb,QAAiC,EACjC,OAAA,GAAqC,EAAE,EAAA;AAEvC,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC;IAEhC,MAAM,KAAK,GAAG,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC;IACtD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,EAAE;IAElD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;IAEnC,MAAM,MAAM,GAAa,EAAE;IAC3B,MAAM,QAAQ,GAAa,EAAE;AAC7B,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;AAChC,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACnB;AAAO,aAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;AACrC,YAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QACrB;IACF;IACA,MAAM,CAAC,IAAI,EAAE;IACb,QAAQ,CAAC,IAAI,EAAE;IAEf,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,QAAQ,CAAC;AACvC,IAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI;QACjC,OAAO;AACL,YAAA,IAAI,EAAE,UAAU;YAChB,IAAI;AACJ,YAAA,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE;AAChC,YAAA,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE;AAC5B,YAAA,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK;AAC/B,YAAA,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG;YAC3B,MAAM,EAAE,KAAK,CAAC,MAAM;SACO;AAC/B,IAAA,CAAC,CAAC;AACJ;AAEA;;;AAGG;AACG,SAAU,uBAAuB,CAAC,UAA6B,EAAA;AACnE,IAAA,OAAO,CAAA,EAAG,UAAU,CAAC,IAAI,GAAG;AAC9B;;ACzFA;;;;;;;;;;;;;;;AAeG;MA6DU,6BAA6B,CAAA;AACvB,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAChC,IAAA,SAAS,GAAG,MAAM,CAAC,0BAA0B,CAAC;AAC9C,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AAC9B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEvC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AACzB,IAAA,MAAM,GAAG,KAAK,CAAc,IAAI,6EAAC;AAC1C;;;;AAIG;AACM,IAAA,WAAW,GAAG,KAAK,CAAqB,IAAI,kFAAC;AACtD;;;;;AAKG;AACM,IAAA,eAAe,GAAG,KAAK,CAAU,KAAK,sFAAC;IAEvC,WAAW,GAAG,MAAM,EAAU;IAC9B,MAAM,GAAG,MAAM,EAAQ;IACvB,MAAM,GAAG,MAAM,EAAQ;AAEvB,IAAA,OAAO,GAAG,SAAS,CAAC,QAAQ,CAA+B,OAAO,CAAC;AACnE,IAAA,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC;AAErC,IAAA,KAAK,GAAG,MAAM,CAAS,CAAC,4EAAC;IAEzB,UAAU,GAAG,QAAQ,CAAC,MACrC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAChD;AAEgB,IAAA,MAAM,GAAG,QAAQ,CAAC,MACjC,qBAAqB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE;AAClC,QAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACrB,QAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC9B,KAAA,CAAC,6EACH;AAEgB,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,gFAAC;;;IAKzE,WAAW,GAAG,QAAQ,CAAsB,MACnD,yBAAyB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACnF;;AAGQ,IAAA,aAAa,GAAG,MAAM,CAAC,CAAC,oFAAC;AAElC;AACyD;AACxC,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,qFAAC;AAE/C;AACoE;AACnD,IAAA,YAAY,GAAG,MAAM,CAAgB,IAAI,mFAAC;AAE3D;AACsC;IAC7B,SAAS,GAAG,QAAQ,CAC3B,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC9D;AAED;AACqD;AAC5C,IAAA,cAAc,GAAwB;AAC7C,QAAA,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;QACvF,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;KACzF;AAEQ,IAAA,eAAe,GAAG,QAAQ,CAAmB,MAAK;AACzD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;AACxB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;QAC7B,MAAM,IAAI,GAAqB,EAAE;QACjC,IAAI,MAAM,GAAG,CAAC;AACd,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,EAAE;gBACpB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC9D;AACA,YAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,YAAA,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC1C,YAAA,MAAM,GAAG,CAAC,CAAC,GAAG;QAChB;AACA,QAAA,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE;AACvB,YAAA,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACrD;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,sFAAC;AAEF,IAAA,WAAA,GAAA;;;;QAIE,MAAM,CAAC,MAAK;YACV,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM;AACtC,YAAA,IAAI,IAAI,KAAK,CAAC,EAAE;AACd,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB;YACF;AACA,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;YAChC,IAAI,GAAG,IAAI,IAAI;AAAE,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5C,QAAA,CAAC,CAAC;;;;;QAMF,iBAAiB,CAAC,MAAK;AACrB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;YAClC,IAAI,MAAM,KAAK,IAAI;gBAAE;YACrB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa;AACvC,YAAA,EAAE,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC;AACpC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,EAAE;YACnC,MAAM,UAAU,GAAmB,EAAE;AACrC,YAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;gBACpB,MAAM,KAAK,GAAkB,EAAE;AAC/B,gBAAA,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;oBACpC,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AAC9D,wBAAA,IAAI,IAAI;AAAE,4BAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC5B;gBACF;qBAAO;AACL,oBAAA,MAAM,IAAI,GAAG,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;AACnD,oBAAA,IAAI,IAAI;AAAE,wBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC5B;AACA,gBAAA,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;gBACzD,UAAU,CAAC,IAAI,CAAC;oBACd,GAAG,EAAE,CAAC,CAAC,IAAI;oBACX,KAAK;oBACL,UAAU,EAAE,CAAC,CAAC,KAAK;oBACnB,QAAQ,EAAE,CAAC,CAAC,GAAG;AACf,oBAAA,UAAU,EAAE,KAAK;oBACjB,MAAM;AACP,iBAAA,CAAC;YACJ;AACA,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC;AAC1C,QAAA,CAAC,CAAC;QAEF,eAAe,CAAC,MAAK;;;;;AAKnB,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CACrB;AACE,gBAAA,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC;AACzD,gBAAA,cAAc,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC;gBACrE,eAAe,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC;AACzD,gBAAA,eAAe,EAAE,MAAM,IAAI,CAAC,qBAAqB,EAAE;aACpD,EACD,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CACtC;YACD,IAAI,CAAC,KAAK,EAAE;AACd,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;IAC9D;IAEA,KAAK,GAAA;QACH,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa;QACvC,EAAE,CAAC,KAAK,EAAE;AACV,QAAA,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM;AAC3B,QAAA,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;IACrB;AAEA,IAAA,OAAO,CAAC,KAAY,EAAA;AAClB,QAAA,MAAM,EAAE,GAAG,KAAK,CAAC,MAA0B;AAC3C,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;;;AAGpD,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;IACjC;AAEA,IAAA,YAAY,CAAC,KAAY,EAAA;AACvB,QAAA,MAAM,EAAE,GAAG,KAAK,CAAC,MAA0B;QAC3C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,IAAI,CAAC,CAAC;IACxC;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAA;AAC5B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAE7B,QAAA,IAAI,IAAI,KAAK,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,EAAE;YAClE,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM;AACtC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;AAChC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK,WAAW,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,IAAI,IAAI;AACnF,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAC5B;QACF;AAEA,QAAA,IAAI,IAAI,KAAK,KAAK,CAAC,GAAG,KAAK,KAAK,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE;YAC1D,KAAK,CAAC,cAAc,EAAE;;;YAGtB,KAAK,CAAC,eAAe,EAAE;YACvB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3C;QACF;;;QAIA,IAAI,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAClC,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;YACvB,IAAI,CAAC,UAAU,EAAE;YACjB;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YACzB,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAClB;QACF;AACA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAC1B,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAClB;QACF;IACF;;;IAKA,qBAAqB,CAAC,KAAiB,EAAE,KAAa,EAAA;;QAEpD,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;IAC9B;AAEA,IAAA,sBAAsB,CAAC,KAAa,EAAA;AAClC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;IAC/B;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/B;AAEQ,IAAA,gBAAgB,CAAC,KAAa,EAAA;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,KAAK;YAAE;QACZ,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa;AACvC,QAAA,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC;QAC7C,MAAM,IAAI,GACR,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;AACnF,QAAA,EAAE,CAAC,KAAK,GAAG,IAAI;QACf,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM;AAChD,QAAA,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B,EAAE,CAAC,KAAK,EAAE;;AAEV,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9B;;IAIQ,UAAU,GAAkB,IAAI;IAChC,OAAO,GAAkB,IAAI;IAC7B,aAAa,GAAuB,IAAI;IACxC,YAAY,GAAG,KAAK;IAEpB,cAAc,CAAC,IAAiB,EAAE,IAA2B,EAAA;AACnE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;AAChD,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,SAAS,EAAE;IAClB;IAEQ,oBAAoB,CAAC,IAAiB,EAAE,IAA2B,EAAA;AACzE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;AAChD,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AACjD,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;AACjB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ;IACnC;AAEA;;;;;AAKG;AACK,IAAA,iBAAiB,CAAC,IAAY,EAAA;QACpC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa;QACvC,MAAM,QAAQ,GAAG,EAAE,CAAC,cAAc,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM;AACrD,QAAA,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,IAAI,QAAQ;;QAE1C,IAAI,QAAQ,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;AAEzE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,QAAQ,IAAI,CAAC,CAAC,GAAG,EAAE;AAC5C,gBAAA,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC;YAChD;QACF;QACA,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;IAClD;AAEQ,IAAA,qBAAqB,CAAC,GAAgB,EAAA;AAC5C,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;AAC9E,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC;AACvE,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC;AACtD,QAAA,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;YAAE;QAC5B,MAAM,QAAQ,GACZ,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK;AAClF,QAAA,MAAM,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,OAAO,EAAE;AAC7D,QAAA,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;AACrE,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;IACnB;IAEQ,qBAAqB,GAAA;QAC3B,IAAI,CAAC,SAAS,EAAE;IAClB;IAEQ,SAAS,GAAA;AACf,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;IAC3B;IAEQ,SAAS,CAAC,IAAiB,EAAE,QAAiB,EAAA;AACpD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;QAChC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QACzC,IAAI,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,EAAE;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACvC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC;AACnB,aAAA,UAAU;AACV,aAAA,SAAS,CAAC,CAAC,CAAC,KAAM,CAA6B,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC;QAC3E,IAAI,QAAQ,GAAG,CAAC;AAAE,YAAA,OAAO,EAAE;AAC3B,QAAA,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC;AAC5C,QAAA,MAAM,GAAG,GAAG,QAAQ,GAAG,CAAC;;;AAGxB,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,GAAG,EAAE;AACzC,QAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,GAAG,EAAE;IAC3B;AAEQ,IAAA,YAAY,CAAC,IAAY,EAAE,EAAU,EAAE,IAAY,EAAA;QACzD,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa;QACvC,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;AAChE,QAAA,EAAE,CAAC,KAAK,GAAG,IAAI;AACf,QAAA,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM;AAChC,QAAA,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B,EAAE,CAAC,KAAK,EAAE;;;;;;AAMV,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE;IACzC;IAEQ,gBAAgB,GAAA;AACtB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;YAC/C,MAAM,GAAG,GAAG,CAA4B;YACxC,OAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAiC,IAAI,EAAE;AAC5E,QAAA,CAAC,CAAC;QACF,OAAO;AACL,YAAA,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE;YACzB,MAAM;AACN,YAAA,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE;SAClC;IACH;AAEA;;;AAGG;IACK,YAAY,GAAA;AAClB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,KAAK;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,WAAW;AACpD,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,SAAS;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACvC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAwC;AACrF,QAAA,MAAM,KAAK,GAAG,GAAG,GAAG,OAAO,CAAC;AAC5B,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,SAAS;IACnF;AAEA,IAAA,QAAQ,CAAC,KAAY,EAAA;;;AAGnB,QAAA,MAAM,EAAE,GAAG,KAAK,CAAC,MAA0B;AAC3C,QAAA,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,aAAa,CACxE,mCAAmC,CACpC,IAAI,IAAI,CAAuB;AAChC,QAAA,IAAI,OAAO;AAAE,YAAA,OAAO,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU;IACjD;wGAtZW,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,00BA2BH,gBAAgB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvGvD,sjFA4EA,EAAA,MAAA,EAAA,CAAA,srEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDNY,mBAAmB,qkCAAE,gBAAgB,EAAA,QAAA,EAAA,4DAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAMpC,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBATzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAAA,UAAA,EACvB,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAC/B,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,sjFAAA,EAAA,MAAA,EAAA,CAAA,srEAAA,CAAA,EAAA;AA8B+B,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,OAAO,oFACtC,gBAAgB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ME9C1C,oBAAoB,CAAA;AACd,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACrC,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,IAAA,gBAAgB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAC/C,IAAA,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC;AACnC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;IAE/B,aAAa,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzD,YAAY,GAAG,MAAM,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACrE,IAAA,KAAK,GAAG,MAAM,EAAC,UAAuB,EAAC;AAExD,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;gBACpB,IAAI,CAAC,WAAW,EAAE;YACpB;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,WAAW,GAAA;;QAEjB,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa;;;;YAInC,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBAAE;YAC7B,MAAM,SAAS,GAAuB,EAAE,CAAC,aAAa,CAAC,yBAAyB,CAAC;YACjF,IAAI,SAAS,EAAE;gBACb,SAAS,CAAC,KAAK,EAAE;AACjB,gBAAA,IAAI,SAAS,YAAY,gBAAgB,EAAE;oBACzC,SAAS,CAAC,MAAM,EAAE;gBACpB;gBACA;YACF;;YAEA,MAAM,OAAO,GAA6B,EAAE,CAAC,aAAa,CACxD,gDAAgD,CACjD;YACD,IAAI,OAAO,EAAE;gBACX,OAAO,CAAC,KAAK,EAAE;gBACf,OAAO,CAAC,KAAK,EAAE;YACjB;AACF,QAAA,CAAC,CAAC;IACJ;AAES,IAAA,GAAG,GAAG,KAAK,CAAC,QAAQ,yEAAK;AACzB,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAU;AACnC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAU;AACnC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAoB;AAC7C,IAAA,GAAG,GAAG,KAAK,CAAC,QAAQ,yEAAgB;AACpC,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,6EAAC;AAC9B,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AAC1C;AACiC;AACxB,IAAA,YAAY,GAAG,KAAK,CAA0B,IAAI,mFAAC;AAC5D;AAC+B;AACtB,IAAA,YAAY,GAAG,KAAK,CAAS,CAAC,mFAAC;AACxC;AACwE;AAC/D,IAAA,UAAU,GAAG,KAAK,CAA0B,IAAI,iFAAC;AAEjD,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACtB,OAAO,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE;AAC7D,IAAA,CAAC,uFAAC;IAEO,UAAU,GAAG,MAAM,EAAQ;IAC3B,UAAU,GAAG,MAAM,EAAQ;IAEpC,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;AAES,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,IAAI,IAAI,mFAAC;AAC9D,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,IAAI,IAAI,mFAAC;AAC9D,IAAA,aAAa,GAAG,CAAC,KAAc,KAAW,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC;IAC5E,YAAY,GAAG,MAAY,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AAE1D;;;AAGG;AACc,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;QAC3C,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,aAAa;AAAE,YAAA,OAAO,IAAI;AAChE,QAAA,MAAM,KAAK,GAAI,IAAI,CAAC,GAAG,EAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;AAC9E,QAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;AACtD,QAAA,OAAO,EAAE,KAAK,EAAE,KAAwB,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE;AACrE,IAAA,CAAC,kFAAC;AAEF;;;AAGG;AACM,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa;AAAE,YAAA,OAAO,IAAI;;QAE7C,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;QACvC,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAA,CAAE;QACzC,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI;AAC7B,IAAA,CAAC,mFAAC;AAEO,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;AAC7B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;;;;AAIpB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE;QAC9B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AAC3B,YAAA,OAAO,gBAAgB,CAAC,EAAE,CAAC;QAC7B;QACA,IAAI,CAAC,CAAC,WAAW;YAAE,OAAO,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACnD,OAAQ,IAAI,CAAC,GAAG,EAA8B,CAAC,CAAC,CAAC,KAAK,CAAC;AACzD,IAAA,CAAC,4EAAC;AAEO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;AACpB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE;QAC9B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AAC3B,YAAA,OAAO,qBAAqB,CAAC,EAAE,CAAC;QAClC;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;QACxB,IAAI,CAAC,CAAC,cAAc;YAAE,OAAO,CAAC,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;AAC9D,QAAA,OAAO,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;AACvC,IAAA,CAAC,mFAAC;;AAGO,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACvC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE;AAC9B,QAAA,OAAO,EAAE,EAAE,IAAI,KAAK,OAAO;AAC7B,IAAA,CAAC,sFAAC;AAEF;;;;AAIG;AACM,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY;AAAE,YAAA,OAAO,KAAK;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AAAE,YAAA,OAAO,KAAK;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU;AACzC,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;AACvE,IAAA,CAAC,uFAAC;AAEF;;;;AAIG;AACM,IAAA,iBAAiB,GAAG,QAAQ,CAAgB,MAAK;QACxD,IAAI,CAAC,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,IAAI;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AAAE,YAAA,OAAO,IAAI;AAC9C,QAAA,MAAM,KAAK,GAAI,IAAI,CAAC,GAAG,EAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;AAC9E,QAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;QACtD,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAA,EAAG,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAA,CAAE,CAAC,IAAI,IAAI;AACpF,IAAA,CAAC,wFAAC;AAEO,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,gFAAC;AAEtD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AACpE,IAAA,CAAC,gFAAC;AAEO,IAAA,UAAU,GAAG,QAAQ,CAAiB,MAAK;AAClD,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AAC1E,IAAA,CAAC,iFAAC;AAEO,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AACjF,IAAA,CAAC,gFAAC;AAEO,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;QACjC,QACE,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAEjG,IAAA,CAAC,gFAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AACrF,IAAA,CAAC,oFAAC;AAEO,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;AAC3C,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC3F,IAAA,CAAC,0FAAC;IAEO,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEpF,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;;;;AAIjC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9E,IAAI,WAAW,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;AAChC,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;AAC1E,IAAA,CAAC,gFAAC;AAEF,IAAA,WAAW,CAAC,KAAiB,EAAA;;QAE3B,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,yBAAyB,EAAE;YAAE;AAC/D,QAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;YAClB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YACxC,IAAI,OAAO,EAAE;AACX,gBAAA,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,OAAO,EAAE;AAC5C,oBAAA,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE;AACpB,oBAAA,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE;AACrB,iBAAA,CAAC;YACJ;iBAAO;AACL,gBAAA,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChF;YACA,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,OAAO,EAAE;gBAChD,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC;YAC7C;YACA;QACF;;;IAIF;AAEA,IAAA,WAAW,CAAC,KAAiB,EAAA;;;;AAI3B,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;;;AAGxD,YAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;AACrB,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACxB;iBAAO;AACL,gBAAA,MAAM,KAAK,GAAI,IAAI,CAAC,GAAG,EAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBAC9E,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;oBACzC,KAAK,CAAC,cAAc,EAAE;oBACtB,KAAK,CAAC,eAAe,EAAE;AACvB,oBAAA,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,KAAwB,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE;AACzE,oBAAA,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACtE;gBACA;YACF;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;YAClB,KAAK,CAAC,cAAc,EAAE;YACtB;QACF;;;AAIA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB;QACF;;QAGA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAC5C,QAAA,IAAI,SAAS,CAAC,WAAW,EAAE;AACzB,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;QACxB;AACA,QAAA,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;AAGpE,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE;AAC1C,YAAA,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9E,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,OAAO,EAAE;gBAChD,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC;YAC7C;QACF;QAEA,KAAK,CAAC,cAAc,EAAE;;AAEtB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,aAA4B;QAClD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAuB;QAC3D,IAAI,EAAE,KAAK,EAAE;IACf;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE,EAAE;AACvC,YAAA,MAAM,KAAK,GAAI,IAAI,CAAC,GAAG,EAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAC9E,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;AACzC,gBAAA,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC;AAChC,oBAAA,KAAK,EAAE,KAAwB;AAC/B,oBAAA,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK;AACxB,iBAAA,CAAC;YACJ;YACA;QACF;AACA,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE;AAC1B,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvE;AAAO,aAAA,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE;AAC5E,YAAA,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxE;IACF;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ;YAAE;;;QAG1B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,WAAW;QACtD,IAAI,OAAO,KAAK,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,EAAE,IAAI,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE;AACnF,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;QACxB;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;IAC9D;AAEA,IAAA,aAAa,CAAC,KAAY,EAAA;AACxB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;AAC/C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;QACpC,MAAM,KAAK,GAAG,UAAU,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK;AAC3E,QAAA,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC;IACpC;AAEA,IAAA,cAAc,CAAC,KAAY,EAAA;AACzB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA2B;QAChD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3C;AAEA,IAAA,gBAAgB,CAAC,KAAY,EAAA;AAC3B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;QAC/C,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7C;AAEA,IAAA,YAAY,CAAC,KAAoB,EAAA;AAC/B,QAAA,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC;IACpC;AAEA,IAAA,qBAAqB,CAAC,KAAiB,EAAA;QACrC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACtE;AAEA,IAAA,YAAY,CAAC,KAAiB,EAAA;AAC5B,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,aAA4B;AACpD,QAAA,MAAM,aAAa,GAAG,KAAK,CAAC,aAA4B;;AAExD,QAAA,IAAI,aAAa,IAAI,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC;YAAE;;;AAGxD,QAAA,IAAI,aAAa,YAAY,WAAW,EAAE;YACxC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,wBAAwB,CAAC;AAC/D,YAAA,IAAI,OAAO;gBAAE;QACf;;;;;;;QAOA,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;gBAAE;AACvB,YAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa;YACrC,IAAI,MAAM,YAAY,IAAI,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE;AAC1D,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AACxB,QAAA,CAAC,CAAC;IACJ;wGAnWW,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,kjECzDjC,ogIAqHA,EAAA,MAAA,EAAA,CAAA,g7KAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDpFI,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,WAAA,EAAA,IAAA,EACX,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,oBAAoB,gJACpB,sBAAsB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,aAAa,iFACb,6BAA6B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,aAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAiBpB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBA5BhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,eAAA,EACR,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,gBAAgB;wBAChB,WAAW;wBACX,kBAAkB;wBAClB,oBAAoB;wBACpB,sBAAsB;wBACtB,mBAAmB;wBACnB,aAAa;wBACb,6BAA6B;qBAC9B,EAAA,IAAA,EACK;AACJ,wBAAA,cAAc,EAAE,oCAAoC;AACpD,wBAAA,kBAAkB,EAAE,gDAAgD;AACpE,wBAAA,sBAAsB,EAAE,yDAAyD;AACjF,wBAAA,kBAAkB,EAAE,kCAAkC;AACtD,wBAAA,iBAAiB,EAAE,mDAAmD;AACtE,wBAAA,kBAAkB,EAAE,oDAAoD;AACxE,wBAAA,gBAAgB,EAAE,2BAA2B;AAC7C,wBAAA,2BAA2B,EAAE,yBAAyB;AACtD,wBAAA,qCAAqC,EAAE,yBAAyB;AAChE,wBAAA,sCAAsC,EAAE,0BAA0B;AACnE,qBAAA,EAAA,QAAA,EAAA,ogIAAA,EAAA,MAAA,EAAA,CAAA,g7KAAA,CAAA,EAAA;;AA0WH;AAEA;;;;AAIG;AACH,SAAS,gBAAgB,CAAC,CAAe,EAAA;AACvC,IAAA,QAAQ,CAAC,CAAC,IAAI;AACZ,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,KAAK;AAChB,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,EAAE;AACX,QAAA,KAAK,OAAO;YACV,OAAO,CAAC,CAAC,KAAK;;AAEpB;AAEA;AACA,SAAS,qBAAqB,CAAC,CAAe,EAAA;AAC5C,IAAA,QAAQ,CAAC,CAAC,IAAI;AACZ,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC;AACrC,QAAA,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC,KAAK;AAChB,QAAA,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,KAAK,GAAG,MAAM,GAAG,OAAO;AACnC,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,EAAE;AACX,QAAA,KAAK,OAAO;YACV,OAAO,CAAC,CAAC,KAAK;;AAEpB;AAEA;;;;;AAKG;AACH,SAAS,mBAAmB,CAAC,KAAa,EAAA;AACxC,IAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC;AAC5E,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9C;;ME/aa,mBAAmB,CAAA;AACX,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAClC,IAAA,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACrC,IAAA,YAAY,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACzC,IAAA,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC9C,IAAA,KAAK,GAAG,MAAM,EAAC,UAAuB,EAAC;IACrC,YAAY,GAAG,YAAY;AAErC,IAAA,GAAG,GAAG,KAAK,CAAC,QAAQ,yEAAK;AACzB,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAU;AACnC,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,mFAAC;AACpC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;IAElC,QAAQ,GAAG,MAAM,EAMtB;IACK,cAAc,GAAG,MAAM,EAA+D;IACtF,kBAAkB,GAAG,MAAM,EAAQ;AAEnC,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,iFAAC;AAExE,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAA6B;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACvC,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC;AAC1B,QAAA,OAAO,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,KAAK,CAAC;AAC1E,IAAA,CAAC,iFAAC;AAEF;AACwC;AACrB,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;QAClD,IAAI,CAAC,GAAG,CAAC;QACT,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE,CAAC,IAAI,EAAE;QAC9B,IAAI,IAAI,CAAC,YAAY,EAAE;YAAE,CAAC,IAAI,EAAE;AAChC,QAAA,OAAO,CAAC;AACV,IAAA,CAAC,uFAAC;AAEF,IAAA,aAAa,CAAC,KAAY,EAAA;QACxB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAA6B;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACvC,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC;AAC1B,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC;QACxC;IACF;AAEA,IAAA,eAAe,CAAC,KAAiB,EAAA;QAC/B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;YACjE,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACnD;aAAO;YACL,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACvC,YAAA,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAClD;AACA,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE;IAChC;IAEA,YAAY,GAAA;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;QAC1C,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChB,KAA0F,CAC3F;QACH;QACA,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,aAA4B;YAClD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAuB;YAC3D,IAAI,EAAE,KAAK,EAAE;AACf,QAAA,CAAC,CAAC;IACJ;IAEA,YAAY,GAAA;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;QAC1C,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;QACjC;IACF;wGAjFW,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,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,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,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,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7BhC,03GA2GA,EAAA,MAAA,EAAA,CAAA,uhCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDrFY,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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;;4FAOrF,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAV/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,mBACP,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,oBAAoB,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,WAAW,CAAC,EAAA,IAAA,EAC3F;AACJ,wBAAA,uBAAuB,EAAE,YAAY;AACtC,qBAAA,EAAA,QAAA,EAAA,03GAAA,EAAA,MAAA,EAAA,CAAA,uhCAAA,CAAA,EAAA;;;MEbU,wBAAwB,CAAA;AAChB,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAE1C,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAe;IACxC,YAAY,GAAG,MAAM,EAAU;AAE/B,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK;AACnC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;AAChD,QAAA,OAAO,GAAG,EAAE,UAAU,IAAI,KAAK;AACjC,IAAA,CAAC,iFAAC;AAEO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;QAClC,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;AAC5C,IAAA,CAAC,iFAAC;wGAdS,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,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,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZrC,+kBAkBA,EAAA,MAAA,EAAA,CAAA,opCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDVY,cAAc,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAIb,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,mBACb,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,cAAc,CAAC,EAAA,QAAA,EAAA,+kBAAA,EAAA,MAAA,EAAA,CAAA,opCAAA,CAAA,EAAA;;;MEEd,yBAAyB,CAAA;AAC3B,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAK;AAC1B,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAU;AACnC,IAAA,cAAc,GAAG,KAAK,CAA8B,IAAI,qFAAC;wGAHvD,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,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,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,ECVtC,yTAUA,EAAA,MAAA,EAAA,CAAA,mbAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDJY,gBAAgB,+IAAE,QAAQ,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAIzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;+BACE,qBAAqB,EAAA,eAAA,EACd,uBAAuB,CAAC,MAAM,WACtC,CAAC,gBAAgB,EAAE,QAAQ,CAAC,EAAA,QAAA,EAAA,yTAAA,EAAA,MAAA,EAAA,CAAA,mbAAA,CAAA,EAAA;;;ME8H1B,2BAA2B,CAAA;AACnB,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAE1C,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,mFAAC;AACpC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAExB,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;QAClD,IAAI,CAAC,GAAG,CAAC;QACT,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE,CAAC,IAAI,EAAE;QAC9B,IAAI,IAAI,CAAC,YAAY,EAAE;YAAE,CAAC,IAAI,EAAE;AAChC,QAAA,OAAO,CAAC;AACV,IAAA,CAAC,uFAAC;wGAXS,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,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,QAAA,EAAA,EAAA,EAAA,QAAA,EA9H5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+iCAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FA4EU,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAjIvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,eAAA,EAChB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,+iCAAA,CAAA,EAAA;;;MCzBU,oBAAoB,CAAA;AACZ,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAChC,IAAA,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;AAC7B,IAAA,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC9C,IAAA,cAAc,GAAG,MAAM,CAAC,2BAA2B,CAAC;AAE5D,IAAA,aAAa,GAAG,SAAS,CAA0B,eAAe,oFAAC;IAC3D,MAAM,GAAG,YAAY,CAAC,OAAO,8EAAI,IAAI,EAAE,UAAU,EAAA,CAAG;AAE5D,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,mFAAC;AACpC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAClC,IAAA,cAAc,GAAG,KAAK,CAA8B,IAAI,qFAAC;IAEzD,QAAQ,GAAG,MAAM,EAAiB;IAClC,cAAc,GAAG,MAAM,EAAuB;IAC9C,kBAAkB,GAAG,MAAM,EAAQ;IACnC,WAAW,GAAG,MAAM,EAAU;AAEvC;;AAEuD;AACpC,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;QAClD,IAAI,CAAC,GAAG,CAAC;QACT,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE,CAAC,IAAI,EAAE;QAC9B,IAAI,IAAI,CAAC,YAAY,EAAE;YAAE,CAAC,IAAI,EAAE;AAChC,QAAA,OAAO,CAAC;AACV,IAAA,CAAC,uFAAC;;AAGiB,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC9C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;QACjD,OAAO,IAAI,KAAK,CAAS,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AAC1D,IAAA,CAAC,mFAAC;;AAGiB,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AAChD,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;QACnD,IAAI,GAAG,IAAI,KAAK;AAAE,YAAA,OAAO,EAAc;QACvC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,GAAG,GAAG,KAAK,CAAC;AAC1C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;AAAE,YAAA,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;AACvD,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,qFAAC;AAEQ,IAAA,aAAa,CAAC,IAAa,EAAA;QACnC,MAAM,GAAG,GAAG,IAA+B;QAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;AAC1C,QAAA,OAAO,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1E;IAEQ,cAAc,GAA0B,IAAI;AAEpD,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAK;YACnB,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAC/C,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,CAC3C;AACH,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;;;;AAIV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE;AAC1B,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc;AAC9B,YAAA,IAAI,CAAC,EAAE;gBAAE;YACT,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;YAC1C,EAAE,CAAC,UAAU,EAAE;YACf,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,KAAI;AACtB,gBAAA,MAAM,EAAE,GAAI,GAA+B,CAAC,aAAa;AACzD,gBAAA,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;AACzD,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;wGAxEW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,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,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,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAOyB,UAAU,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtCpE,21DAwDA,EAAA,MAAA,EAAA,CAAA,oLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED7BY,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,UAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,gBAAA,EAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,wBAAwB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,2BAA2B,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAIpG,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,eAAA,EACR,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,mBAAmB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,2BAA2B,CAAC,EAAA,QAAA,EAAA,21DAAA,EAAA,MAAA,EAAA,CAAA,oLAAA,CAAA,EAAA;AAUpD,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,eAAe,mEACpC,OAAO,EAAA,EAAA,GAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEvBzD,sBAAsB,CAAA;AACd,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAChC,IAAA,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;AAErC,IAAA,eAAe,GAAG,KAAK,CAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,sFAAC;IAEpD,UAAU,GAAG,MAAM,EAAa;AAEhC,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,yFAAC;AAElE,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AAC3C,YAAA,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;AAClB,YAAA,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC;AACpB,SAAA,CAAC,CAAC;AACL,IAAA,CAAC,4FAAC;AAEO,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AAC1C,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM;AACnD,YAAA,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AACnB,YAAA,KAAK,EAAE,CAAC;AACT,SAAA,CAAC,CAAC;AACL,IAAA,CAAC,wFAAC;AAEO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;AAC9C,QAAA,MAAM,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,CAAC;AACtC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,QAAQ,EAAE,KAAK,CAAC;AACvD,QAAA,OAAO,GAAG,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,IAAA,EAAO,KAAK,QAAQ;AAC5C,IAAA,CAAC,iFAAC;AAEF,IAAA,YAAY,CAAC,YAAoB,EAAA;QAC/B,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;QACtC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AACxC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACnB,YAAA,SAAS,EAAE,YAAY;YACvB,QAAQ;YACR,iBAAiB;AACjB,YAAA,gBAAgB,EAAE,QAAQ;AAC3B,SAAA,CAAC;IACJ;AAEA,IAAA,gBAAgB,CAAC,KAAY,EAAA;AAC3B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA2B;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QACpC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;QAC9C,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QAChD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AACxC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACnB,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,QAAQ,EAAE,OAAO;YACjB,iBAAiB;YACjB,gBAAgB;AACjB,SAAA,CAAC;IACJ;wGA7DW,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,oRCfnC,wqBAwBA,EAAA,MAAA,EAAA,CAAA,mdAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDbY,sBAAsB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,SAAA,EAAA,SAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,qJAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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;;4FAItD,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;+BACE,iBAAiB,EAAA,eAAA,EACV,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,sBAAsB,EAAE,kBAAkB,EAAE,WAAW,CAAC,EAAA,QAAA,EAAA,wqBAAA,EAAA,MAAA,EAAA,CAAA,mdAAA,CAAA,EAAA;;;MEcvD,gCAAgC,CAAA;wGAAhC,gCAAgC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gCAAgC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAlBjC;;;;AAIT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,8MAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EALS,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAmBjB,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAtB5C,SAAS;+BACE,4BAA4B,EAAA,eAAA,EACrB,uBAAuB,CAAC,MAAM,WACtC,CAAC,kBAAkB,CAAC,EAAA,QAAA,EACnB;;;;AAIT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,8MAAA,CAAA,EAAA;;;MCMU,4BAA4B,CAAA;AACtB,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAChC,IAAA,aAAa,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC3C,IAAA,YAAY,GAAG,MAAM,CAAC,kBAAkB,CAAC;IAEjD,SAAS,GAAG,MAAM,EAAQ;IAC1B,SAAS,GAAG,MAAM,EAAQ;IAC1B,UAAU,GAAG,MAAM,EAAQ;IAC3B,WAAW,GAAG,MAAM,EAAQ;IAC5B,WAAW,GAAG,MAAM,EAAQ;AAE5B,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE;AAC7C,QAAA,IAAI,IAAI,KAAK,MAAM,EAAE;AACnB,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE;QAC9C;AACA,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;YACpB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE;AACrD,YAAA,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,CAAC;AACpB,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AAChD,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AAChD,YAAA,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI;YACzB,OAAO,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC;QAC9B;AACA,QAAA,OAAO,CAAC;AACV,IAAA,CAAC,oFAAC;AAEO,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE;QAC7C,IAAI,IAAI,KAAK,MAAM;AAAE,YAAA,OAAO,eAAe;QAC3C,IAAI,IAAI,KAAK,OAAO;AAAE,YAAA,OAAO,gBAAgB;AAC7C,QAAA,OAAO,UAAU;AACnB,IAAA,CAAC,qFAAC;IAEF,OAAO,GAAA;QACL,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE;AAC7C,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;AACpB,YAAA,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;YAC/B,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;QAC5C;AAAO,aAAA,IAAI,IAAI,KAAK,MAAM,EAAE;AAC1B,YAAA,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;;YAEhC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;gBACnC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;YAC5C;QACF;IACF;wGA9CW,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,iOCjBzC,+vCAuBA,EAAA,MAAA,EAAA,CAAA,svCAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDNa,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBANxC,SAAS;+BACE,wBAAwB,EAAA,eAAA,EACjB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+vCAAA,EAAA,MAAA,EAAA,CAAA,svCAAA,CAAA,EAAA;;;AEajD,MAAM,eAAe,GAAG;AACtB,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;AACjC,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;AACrC,IAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;CAClC;AAED,MAAM,cAAc,GAAgC;AAClD,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,KAAK,EAAE,OAAO;CACf;MAoBY,2BAA2B,CAAA;AACrB,IAAA,SAAS,GAAG,MAAM,CAAmC,YAAY,CAAC;AAClE,IAAA,IAAI,GAAG,MAAM,CAAmB,WAAW,CAAC;AAEpD,IAAA,MAAM,GAAG,MAAM,CAAiB,MAAM,6EAAC;IACvC,YAAY,GAAG,MAAM,CAAc,IAAI,CAAC,IAAI,CAAC,OAAO,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IACrD,YAAY,GAAG,MAAM,CAAgB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAC9E,IAAA,WAAW,GAAG,MAAM,CAAC,EAAE,kFAAC;IAExB,cAAc,GAAG,eAAe;AAEhC,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,mFAAC;AAElE,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;AAChC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM;AACpD,QAAA,OAAO,GAAG,OAAO,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,YAAY;AAC9C,IAAA,CAAC,mFAAC;AAEO,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;QACvC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE;AAC1C,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,YAAY,EAAE;QAClC,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClF,IAAA,CAAC,sFAAC;;IAGe,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAEjF,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAK;AAC1C,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AACnB,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,IAAI,CAAC,MAAsB,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QACvB,QAAQ,MAAM;AACZ,YAAA,KAAK,MAAM;gBACT,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;gBACpC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC9B;AACF,YAAA,KAAK,SAAS;gBACZ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC;gBACxC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC7B;AACF,YAAA,KAAK,SAAS;gBACZ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC;gBAC3C,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC7B;;IAEN;IAEA,cAAc,CAAC,KAAa,EAAE,OAAgB,EAAA;AAC5C,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,KAC5B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CACtE;IACH;AAEA,IAAA,YAAY,CAAC,KAAiC,EAAA;AAC5C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;QACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,KAAK;QACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK;AACnD,QAAA,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;YAAE;QAE5B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AAChC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;AACzB,YAAA,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;AAC/D,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC;YAC3D,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE;AAC9B,gBAAA,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC;YAC1C;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,aAAa,CAAC,KAAY,EAAA;QACxB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;IAChE;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACjF;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChF;IAEA,KAAK,GAAA;AACH,QAAA,MAAM,MAAM,GAAuB;AACjC,YAAA,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE;AAC5B,YAAA,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM;gBAC1C,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,OAAO,EAAE,CAAC,CAAC,OAAO;AAClB,gBAAA,KAAK,EAAE,CAAC;AACT,aAAA,CAAC,CAAC;SACJ;AACD,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;IAC9B;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACjE,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1B;wGA1GW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxDxC,g6EAiEA,EAAA,MAAA,EAAA,CAAA,k8FAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvBI,WAAW,+VACX,WAAW,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,aAAa,+FACb,kBAAkB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,kBAAkB,sJAClB,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,cAAc,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,MAAM,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKG,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAlBvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAAA,eAAA,EACnB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,WAAW;wBACX,WAAW;wBACX,OAAO;wBACP,aAAa;wBACb,kBAAkB;wBAClB,wBAAwB;wBACxB,kBAAkB;wBAClB,kBAAkB;wBAClB,cAAc;wBACd,MAAM;AACP,qBAAA,EAAA,QAAA,EAAA,g6EAAA,EAAA,MAAA,EAAA,CAAA,k8FAAA,CAAA,EAAA;;;MEfU,wBAAwB,CAAA;AAClB,IAAA,SAAS,GAAG,MAAM,CAAkC,YAAY,CAAC;AACjE,IAAA,IAAI,GAAG,MAAM,CAAkB,WAAW,CAAC;AAEnD,IAAA,YAAY,GAAG,MAAM,CAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;QAC3E,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,YAAA,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,KAAK,CAAC,KAAK;YAC1C,aAAa,EAAE,KAAK,CAAC,aAAa;SACnC;IACH,CAAC,CAAC,mFACH;AAEgB,IAAA,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB;AAEjD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;QACjC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC/D,IAAA,CAAC,gFAAC;AAEF,IAAA,MAAM,CAAC,KAAoC,EAAA;QACzC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,KAAI;AACjC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;YAC1B,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;AACjE,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;IACJ;IAEA,qBAAqB,CAAC,KAAa,EAAE,KAAY,EAAA;AAC/C,QAAA,MAAM,KAAK,GAAI,KAAK,CAAC,MAA4B,CAAC,KAAuB;AACzE,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,KAC7B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,CACjF;IACH;AAEA,IAAA,QAAQ,CAAC,KAAa,EAAA;AACpB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;AAC5D,QAAA,IAAI,CAAC,GAAG;YAAE;QACV,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK;AAClC,YAAA,GAAG,KAAK;AACR,YAAA,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE;AACvE,SAAA,CAAC;IACJ;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;QACvB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAC7E;IAEA,KAAK,GAAA;AACH,QAAA,MAAM,MAAM,GAAsB;AAChC,YAAA,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;SAC7F;AACD,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;IAC9B;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3B;wGA3DW,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,iFCrCrC,04DAwDA,EAAA,MAAA,EAAA,CAAA,q0EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/BI,WAAW,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,kBAAkB,qKAClB,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,MAAM,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACN,OAAO,2EACP,SAAS,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKA,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAhBpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,eAAA,EAChB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,WAAW;wBACX,OAAO;wBACP,aAAa;wBACb,kBAAkB;wBAClB,wBAAwB;wBACxB,MAAM;wBACN,OAAO;wBACP,SAAS;AACV,qBAAA,EAAA,QAAA,EAAA,04DAAA,EAAA,MAAA,EAAA,CAAA,q0EAAA,CAAA,EAAA;;;AEPH,MAAM,eAAe,GAAoB;AACvC,IAAA;AACE,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,4BAA4B,EAAE;AACxD,YAAA,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,mCAAmC,EAAE;AACrE,YAAA,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,yBAAyB,EAAE;AACxD,YAAA,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,6BAA6B,EAAE;AACnE,YAAA,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,4BAA4B,EAAE;AAClE,YAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,+BAA+B,EAAE;AACnE,YAAA,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,sBAAsB,EAAE;AAC/D,SAAA;AACF,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,kBAAkB,EAAE;AACrD,YAAA,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,+BAA+B,EAAE;AACzE,YAAA,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,oCAAoC,EAAE;AAC3E,YAAA,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,mCAAmC,EAAE;AACjF,YAAA,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,oBAAoB,EAAE;AAC9D,YAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,mBAAmB,EAAE;AAChD,YAAA,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,uBAAuB,EAAE;AAC1D,YAAA,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,yBAAyB,EAAE;AAC5D,SAAA;AACF,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,mBAAmB,EAAE;AAClD,YAAA,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,qCAAqC,EAAE;AAC3E,YAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB,EAAE;AAC9C,YAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAC/C,YAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC/D,YAAA,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC3D,YAAA,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,gCAAgC,EAAE;AACjE,YAAA,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,oCAAoC,EAAE;AAC5E,SAAA;AACF,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,eAAe;AACtB,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE;AAC3C,YAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,wBAAwB,EAAE;AACrD,YAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,EAAE;AAC5D,YAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iCAAiC,EAAE;AAC9D,YAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,qCAAqC,EAAE;AACnE,SAAA;AACF,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,KAAK,EAAE;AACL,YAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,EAAE;AAC7C,YAAA,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE;AAC9C,YAAA,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,uBAAuB,EAAE;AAC7D,SAAA;AACF,KAAA;CACF;MASY,oCAAoC,CAAA;AAC9B,IAAA,SAAS,GAAG,MAAM,CAAqB,YAAY,CAAC;IAE5D,MAAM,GAAoB,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM;QACjE,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,QAAA,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;YAChC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAC5B,SAAA,CAAC,CAAC;AACJ,KAAA,CAAC,CAAC;IAEH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;wGAdW,oCAAoC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oCAAoC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5FjD,20BAyBA,EAAA,MAAA,EAAA,CAAA,wyCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED+DY,kBAAkB,qKAAE,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAI3C,oCAAoC,EAAA,UAAA,EAAA,CAAA;kBAPhD,SAAS;+BACE,oCAAoC,EAAA,eAAA,EAC7B,uBAAuB,CAAC,MAAM,WACtC,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,EAAA,QAAA,EAAA,20BAAA,EAAA,MAAA,EAAA,CAAA,wyCAAA,CAAA,EAAA;;;AE5DzD,MAAM,cAAc,GAAG,CAAC,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAU;AAE9E,MAAM,YAAY,GAA8D;AAC9E,IAAA,GAAG,EAAE,cAAc;AACnB,IAAA,OAAO,EAAE,cAAc;AACvB,IAAA,OAAO,EAAE,cAAc;AACvB,IAAA,GAAG,EAAE,cAAc;AACnB,IAAA,GAAG,EAAE,cAAc;AACnB,IAAA,KAAK,EAAE,cAAc;AACrB,IAAA,MAAM,EAAE,cAAc;AACtB,IAAA,KAAK,EAAE,cAAc;AACrB,IAAA,GAAG,EAAE,cAAc;AACnB,IAAA,GAAG,EAAE,cAAc;AACnB,IAAA,KAAK,EAAE,cAAc;AACrB,IAAA,EAAE,EAAE,SAAS;AACb,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,EAAE,EAAE,SAAS;AACb,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,GAAG,EAAE,SAAS;AACd,IAAA,MAAM,EAAE,OAAO;AACf,IAAA,GAAG,EAAE,OAAO;AACZ,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,IAAI,EAAE,OAAO;AACb,IAAA,IAAI,EAAE,OAAO;AACb,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,GAAG,EAAE,OAAO;AACZ,IAAA,UAAU,EAAE,OAAO;CACpB;MAUY,mCAAmC,CAAA;AAC7B,IAAA,SAAS,GAAG,MAAM,CAAqB,YAAY,CAAC;AACpD,IAAA,IAAI,GAAG,MAAM,CAAuB,WAAW,CAAC;AAExD,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,4EAAC;AAEV,IAAA,SAAS,GAAG,QAAQ,CAAmC,MAAK;AAC3E,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmC;QACzD,KAAK,MAAM,KAAK,IAAI,cAAc;AAAE,YAAA,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;QACzD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACrC,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ;YACrD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC;QACnC;AACA,QAAA,OAAO;AACJ,aAAA,GAAG,CAAC,CAAC,KAAK,MAAM;YACf,KAAK;AACL,YAAA,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxF,SAAA,CAAC;AACD,aAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AACxC,IAAA,CAAC,gFAAC;AAEO,IAAA,cAAc,GAAG,QAAQ,CAAmC,MAAK;AACxE,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AAC3C,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,SAAS,EAAE;QAC/B,OAAO,IAAI,CAAC,SAAS;AAClB,aAAA,GAAG,CAAC,CAAC,CAAC,MAAM;YACX,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CACvB,CAAC,CAAC,KACA,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAChC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACrC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CACtC;AACF,SAAA,CAAC;AACD,aAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AACxC,IAAA,CAAC,qFAAC;AAEO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,iFAAC;AACrD,IAAA,UAAU,GAAG,QAAQ,CAAC,MAC7B,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,iFACpE;AAED,IAAA,YAAY,CAAC,KAAY,EAAA;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;IAC1D;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;wGAhDW,mCAAmC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mCAAmC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnEhD,u+CA4CA,EAAA,MAAA,EAAA,CAAA,4wEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDmBY,kBAAkB,qKAAE,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAI3C,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBAR/C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mCAAmC,EAAA,eAAA,EAC5B,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,EAAA,QAAA,EAAA,u+CAAA,EAAA,MAAA,EAAA,CAAA,4wEAAA,CAAA,EAAA;;;ME5C5C,4BAA4B,CAAA;AACtB,IAAA,SAAS,GAAG,MAAM,CAAmC,YAAY,CAAC;AAClE,IAAA,IAAI,GAAG,MAAM,CAAmB,WAAW,CAAC;AAEpD,IAAA,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB;IAE7C,KAAK,GAAG,MAAM,CAAc;AACnC,QAAA,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACrF,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,MAAM,kFAAC;AAErE,IAAA,aAAa,CAAC,KAAkB,EAAA;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC9D;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACpC;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAClE;wGA1BW,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,kFCnBzC,miBAeA,EAAA,MAAA,EAAA,CAAA,iMAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDAY,6BAA6B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,qKAAE,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAI1E,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAPxC,SAAS;+BACE,wBAAwB,EAAA,eAAA,EACjB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,6BAA6B,EAAE,kBAAkB,EAAE,wBAAwB,CAAC,EAAA,QAAA,EAAA,miBAAA,EAAA,MAAA,EAAA,CAAA,iMAAA,CAAA,EAAA;;;ME+tB3E,gBAAgB,CAAA;AACR,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AACvD,IAAA,UAAU,GAAG,MAAM,CAAgB,UAAU,CAAC;AAC9C,IAAA,UAAU,GAAG,MAAM,CAAgB,UAAU,CAAC;AAC9C,IAAA,gBAAgB,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AAChE,IAAA,YAAY,GAAG,MAAM,CAAwB,kBAAkB,CAAC;AAC9D,IAAA,kBAAkB,GAAG,MAAM,CAAwB,kBAAkB,CAAC;AACxE,IAAA,mBAAmB,GAAG,MAAM,CAAyB,mBAAmB,CAAC;AACzE,IAAA,cAAc,GAAG,MAAM,CAAoB,cAAc,CAAC;AAC1D,IAAA,eAAe,GAAG,MAAM,CAAqB,eAAe,CAAC;AAC7D,IAAA,aAAa,GAAG,MAAM,CAAmB,aAAa,CAAC;AACvD,IAAA,WAAW,GAAG,MAAM,CAAiB,WAAW,CAAC;AACjD,IAAA,YAAY,GAAG,MAAM,CAAkB,YAAY,CAAC;AAClD,IAAA,aAAa,GAAG,MAAM,CAAmB,aAAa,CAAC;AACzD,IAAA,YAAY,GAAG,MAAM,CAAC,0BAA0B,CAAC;AACjD,IAAA,iBAAiB,GAAG,MAAM,CAA4B,sBAAsB,CAAC;AAC7E,IAAA,YAAY,GAAG,MAAM,CAAkB,YAAY,CAAC;AACpD,IAAA,gBAAgB,GAAG,MAAM,CAA0B,oBAAoB,CAAC;AACxE,IAAA,2BAA2B,GAAG,MAAM,CAAC,2BAA2B,CAAC;AACjE,IAAA,6BAA6B,GAAG,MAAM,CACrD,6BAA6B,CAC9B;AACgB,IAAA,gBAAgB,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AAChE,IAAA,oBAAoB,GAAG,MAAM,CAA0B,oBAAoB,CAAC;AAE5E,IAAA,aAAa,GAAG,SAAS,CAA0B,eAAe,oFAAC;AACnE,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;;AAGxC,IAAA,UAAU,GAAG,eAAe,CAAC,gBAAgB,iFAAC;AAC9C,IAAA,WAAW,GAAG,eAAe,CAAC,iBAAiB,kFAAC;AAChD,IAAA,SAAS,GAAG,eAAe,CAAC,eAAe,gFAAC;;AAGpD,IAAA,IAAI,GAAG,KAAK,CAAM,EAAE,2EAAC;AACrB,IAAA,IAAI,GAAG,KAAK,CAAsB,QAAQ,2EAAC;AAC3C,IAAA,UAAU,GAAG,KAAK,CAAa,QAAQ,iFAAC;AACxC,IAAA,UAAU,GAAG,KAAK,CAAS,CAAC,iFAAC;AAC7B,IAAA,UAAU,GAAG,KAAK,CAAU,IAAI,iFAAC;AACjC,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;AAC5B,IAAA,eAAe,GAAG,KAAK,CAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,sFAAC;AACpD,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,gFAAC;AAC7B,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;AAC/B,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,mFAAC;AACpC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAClC,IAAA,UAAU,GAAG,KAAK,CAAS,IAAI,iFAAC;AACzC;;;;AAIG;AACM,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,cAAc,GAAG,KAAK,CAA8B,IAAI,qFAAC;AACzD,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAClC,IAAA,WAAW,GAAG,KAAK,CAAU,KAAK,kFAAC;AACnC,IAAA,QAAQ,GAAG,KAAK,CAAgB,IAAI,+EAAC;;;AAIrC,IAAA,cAAc,GAAG,KAAK,CAAS,EAAE,qFAAC;;AAElC,IAAA,oBAAoB,GAAG,KAAK,CAAS,EAAE,2FAAC;;AAExC,IAAA,cAAc,GAAG,KAAK,CAAS,EAAE,qFAAC;;AAElC,IAAA,oBAAoB,GAAG,KAAK,CAAS,EAAE,2FAAC;;AAExC,IAAA,oBAAoB,GAAG,KAAK,CAAS,eAAe,2FAAC;AACrD,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAC3C;;;;AAIG;AACM,IAAA,UAAU,GAAG,KAAK,CAAsB,QAAQ,iFAAC;AACjD,IAAA,WAAW,GAAG,KAAK,CAAU,IAAI,kFAAC;AAClC,IAAA,kBAAkB,GAAG,KAAK,CAAU,IAAI,yFAAC;AACzC,IAAA,uBAAuB,GAAG,KAAK,CAAU,KAAK,8FAAC;AAC/C,IAAA,eAAe,GAAG,KAAK,CAAkB,YAAY,sFAAC;AACtD,IAAA,eAAe,GAAG,KAAK,CAAS,GAAG,sFAAC;AACpC,IAAA,OAAO,GAAG,KAAK,CAAe,EAAE,8EAAC;;IAGjC,UAAU,GAAG,MAAM,EAAa;IAChC,UAAU,GAAG,MAAM,EAAa;IAChC,QAAQ,GAAG,MAAM,EAAiB;IAClC,QAAQ,GAAG,MAAM,EAAoB;IACrC,cAAc,GAAG,MAAM,EAAuB;IAC9C,eAAe,GAAG,MAAM,EAAwB;IAChD,mBAAmB,GAAG,MAAM,EAAyB;IACrD,WAAW,GAAG,MAAM,EAAc;IAClC,YAAY,GAAG,MAAM,EAAe;IACpC,QAAQ,GAAG,MAAM,EAAiB;IAClC,QAAQ,GAAG,MAAM,EAAiB;IAClC,SAAS,GAAG,MAAM,EAAkB;IACpC,UAAU,GAAG,MAAM,EAAmB;IACtC,QAAQ,GAAG,MAAM,EAAiB;IAClC,cAAc,GAAG,MAAM,EAAsB;;IAE7C,aAAa,GAAG,MAAM,EAAmB;;AAG/B,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,mFAAC;AAC5B,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,qFAAC;AACjD;;;;AAIG;AACM,IAAA,eAAe,GAAG,KAAK,CAAyB,IAAI,sFAAC;AAE3C,IAAA,uBAAuB,GAAG,QAAQ,CAAkB,MAAK;AAC1E,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;AACvC,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,QAAQ;AAC7B,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,QAAQ,GAAG,QAAQ,GAAG,MAAM;AAC3D,IAAA,CAAC,8FAAC;;AAGiB,IAAA,aAAa,GAAG,QAAQ,CAAiB,MAAK;AAC/D,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;YAChD,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,YAAA,SAAS,EAAE,IAAI;AAChB,SAAA,CAAC,CAAC;AACL,IAAA,CAAC,oFAAC;AAEiB,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,MAAM,wFAAC;AAE5F;;;;;;;AAOG;AACgB,IAAA,cAAc,GAAG,QAAQ,CAAyB,MAAK;QACxE,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,MAAM;AAC3D,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AAAE,YAAA,OAAO,MAAM;AAEzC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,MAAM,GAAG,CAAC;AAC5D,QAAA,MAAM,WAAW,GACf,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM;;;AAI3F,QAAA,IAAI,UAAU;AAAE,YAAA,OAAO,YAAY;QACnC,IAAI,WAAW,KAAK,CAAC;AAAE,YAAA,OAAO,SAAS;;;;;AAKvC,QAAA,OAAO,YAAY;AACrB,IAAA,CAAC,qFAAC;;AAGiB,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC/C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;QAClC,IAAI,IAAI,KAAK,MAAM;AAAE,YAAA,OAAO,IAAI;AAChC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;AACjD,QAAA,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,QAAQ;;QAEhC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC,EAAE,QAAQ,IAAI,IAAI;AACnE,IAAA,CAAC,oFAAC;;AAGiB,IAAA,YAAY,GAAG,QAAQ,CAAmB,OAAO;QAClE,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,MAAM;QACxD,YAAY,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AACjD,KAAA,CAAC,mFAAC;AAEH;;;;;AAKG;AACgB,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AACtD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;QAC/B,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE;AACnC,IAAA,CAAC,2FAAC;;AAGiB,IAAA,4BAA4B,GAAG,QAAQ,CAAC,MAAK;QAC9D,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;AAC1D,QAAA,OAAO,IAAI,CAAC,oBAAoB,EAAE;AACpC,IAAA,CAAC,mGAAC;IAEiB,gBAAgB,GAAG,QAAQ,CAAC,MAC7C,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACtD;AACkB,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,OAAO,IAAI,CAAC;AACT,aAAA,YAAY;aACZ,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO;AAC5B,aAAA,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,UAAU,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;AAChG,IAAA,CAAC,wFAAC;IACiB,gBAAgB,GAAG,QAAQ,CAAC,MAC7C,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACvD;IACkB,cAAc,GAAG,QAAQ,CAAC,MAC3C,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACrD;AACkB,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;QACxD,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC;AAC5C,IAAA,CAAC,6FAAC;IACiB,mBAAmB,GAAG,QAAQ,CAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAChE;IACkB,cAAc,GAAG,QAAQ,CAC1C,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,YAAY,qFACzE;IACkB,wBAAwB,GAAG,QAAQ,CACpD,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,iBAAiB,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,0BAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACnF;AAED;;AAEuD;AACtC,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AAC/C,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAC9D,IAAA,CAAC,sFAAC;AAEF;;AAEsE;AACrD,IAAA,qBAAqB,GAAG,MAAM,CAAsC,IAAI,4FAAC;AAE1F;;AAEsD;AACnC,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE;AACpE,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;AACxC,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,EAAE;AAC/B,QAAA,OAAO,CAAA,EAAG,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,EAAG,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE;AAC7D,IAAA,CAAC,wFAAC;AAEF;AACgE;AAC7C,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AACnD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK;AACpC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC;QAC3D,IAAI,SAAS,GAAG,CAAC;AAAE,YAAA,OAAO,EAAE;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,SAAS,CAAwC;AACrF,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,EAAE;QACnB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAgC;QACzE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE;AACzC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACnE,YAAA,IAAI,OAAO;AAAE,gBAAA,OAAO,OAAO;QAC7B;AACA,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;AAAE,YAAA,OAAO,EAAE;AAChD,QAAA,OAAO,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;AACpD,IAAA,CAAC,wFAAC;AAEF;AACwE;AACrD,IAAA,iBAAiB,GAAG,MAAM,CAAC,KAAK,wFAAC;AAEpD;AACiE;AAC9C,IAAA,eAAe,GAAG,MAAM,CAAgB,IAAI,sFAAC;AAEhE;;AAEwE;IAChE,sBAAsB,GAGnB,IAAI;;AAGI,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AACnD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,OAAO,KAAK,KAAK,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC1D,IAAA,CAAC,wFAAC;AAEF;;AAEyE;AACtD,IAAA,qBAAqB,GAAG,QAAQ,CAAqB,MAAK;QAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE;AACpE,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;AACvB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK;AAC3D,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC;QAC3D,IAAI,SAAS,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,SAAS,CAAwC;AACrF,QAAA,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAgC;AAC3E,QAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;AACtD,QAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;AACzB,IAAA,CAAC,4FAAC;;AAGiB,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AACpD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;AACxB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK;AAC3D,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;AACxB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,KAAK,IAAI;AAChE,IAAA,CAAC,yFAAC;IAEM,kBAAkB,GAAG,KAAK;IAC1B,aAAa,GAAG,KAAK;IACrB,sBAAsB,GAAwB,IAAI;AAE1D,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC;AAClC,YAAA,IAAI,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE;YAC7B,KAAK,EAAE,MAAK;AACV,gBAAA,KAAK,IAAI,CAAC,WAAW,EAAE;YACzB,CAAC;AACD,YAAA,GAAG,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE;AAC/B,YAAA,WAAW,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE;AACtC,YAAA,IAAI,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE;AACzB,YAAA,IAAI,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE;AACzB,YAAA,QAAQ,EAAE,MAAM,IAAI,CAAC,kBAAkB,EAAE;AACzC,YAAA,SAAS,EAAE,MAAM,IAAI,CAAC,mBAAmB,EAAE;AAC3C,YAAA,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC;AACxE,SAAA,CAAC;;;QAIF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC5C,QAAA,CAAC,CAAC;;;QAIF,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,sBAAsB,GAAG,MAAW;AACvC,gBAAA,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE;AAC1B,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBACzC;AACF,YAAA,CAAC;YACD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,sBAAsB,CAAC;AACjE,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AAC7B,gBAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE;oBAC/B,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,sBAAsB,CAAC;gBACtE;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;;;;;;;QAQF,eAAe,CAAC,MAAK;AACnB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;AACjC,YAAA,IAAI,CAAC,IAAI;gBAAE;AACX,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAA4B;YAElD,MAAM,UAAU,GAAG,MAAW;AAC5B,gBAAA,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,WAAW,CAAC;AACtF,gBAAA,IAAI,CAAC,2BAA2B,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,YAAY,CAAC;AACtF,YAAA,CAAC;;;;YAKD,cAAc,CAAC,UAAU,CAAC;YAE1B,IAAI,UAAU,GAAG,KAAK;AACtB,YAAA,QAAQ,CAAC,gBAAgB,CACvB,QAAQ,EACR,MAAK;AACH,gBAAA,IAAI,UAAU;oBAAE;gBAChB,UAAU,GAAG,IAAI;gBACjB,qBAAqB,CAAC,MAAK;AACzB,oBAAA,UAAU,EAAE;oBACZ,UAAU,GAAG,KAAK;AACpB,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB;YAED,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,UAAU,EAAE,CAAC;AACjD,YAAA,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;YAEpB,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,KAAI;AACnD,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;;;;;QAMF,MAAM,CACJ,MAAK;AACH,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;YAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,kBAAkB;gBAAE;AAClD,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;YAC9B,cAAc,CAAC,MAAK;gBAClB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC1D,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACxC,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACpC,YAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC;AACzC,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAClC,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AAC9C,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;AAC/E,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AAC9C,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC1C,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,MAAM;YACpD,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AACvC,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;QACD,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QAC1C,MAAM,CACJ,MAAK;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YACtC,IAAI,OAAO,KAAK,aAAa;gBAAE;YAC/B,aAAa,GAAG,OAAO;AACvB,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE;;YAErC,cAAc,CAAC,MAAK;AAClB,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;AACjC,gBAAA,IAAI,IAAI;AAAE,oBAAA,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,CAAC;AAC5C,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;AAC5C,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAC1C,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;AACxD,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AACrD,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACrE,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;AACvE,QAAA,CAAC,CAAC;;QAGF,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AAC9C,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;;;;QAMD,MAAM,CACJ,MAAK;AACH,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAAE;;AAEtB,YAAA,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;YACtC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;AACtF,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CACJ,MAAK;AACH,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AACtC,YAAA,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACjD,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC;YACrC;AACF,QAAA,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAC5B;;QAGD,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC3B,YAAA,IAAI,CAAC,GAAG;gBAAE;;AAEV,YAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AACzB,YAAA,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxB,YAAA,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxB,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;AAClC,QAAA,CAAC,CAAC;;;;QAKF,MAAM,CAAC,MAAK;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE;AAC3C,YAAA,IAAI,CAAC,KAAK;gBAAE;AACZ,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;YAC7B,IAAI,CAAC,2BAA2B,EAAE;AACpC,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE;AACjC,YAAA,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE;AAC/B,gBAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAA2C,CAAC;YAC/D;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACrC,YAAA,IAAI,CAAC,IAAI;gBAAE;AACX,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,UAAU;gBAAE;AAE7C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;AACjC,YAAA,IAAI,CAAC,IAAI;gBAAE;AACX,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa;;;;;;;;AASnC,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAA,iBAAA,EAAoB,IAAI,CAAC,GAAG,CAAA,EAAA,CAAI,CAE7D;YACR,IAAI,KAAK,EAAE;AACT,gBAAA,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;YACpF;iBAAO;AACL,gBAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY;AAC1C,gBAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS;gBACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,iBAAiB,CAAuB;AAChF,gBAAA,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC,MAAM,GAAG,CAAC;AAE9E,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACjE,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,GAAG,UAAU;gBACtC,MAAM,MAAM,GAAG,IAAI,CAAC,2BAA2B,CAAC,oBAAoB,CAAC,QAAQ,CAAC;AAC9E,gBAAA,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC,2BAA2B,CAAC,YAAY,CAAC,QAAQ,CAAC;AAElF,gBAAA,IAAI,MAAM,GAAG,YAAY,GAAG,eAAe,EAAE;AAC3C,oBAAA,QAAQ,CAAC,SAAS,GAAG,MAAM,GAAG,eAAe;gBAC/C;AAAO,qBAAA,IAAI,SAAS,GAAG,YAAY,GAAG,YAAY,EAAE;AAClD,oBAAA,QAAQ,CAAC,SAAS,GAAG,SAAS,GAAG,YAAY;gBAC/C;YACF;;;;;;;YAQA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;AACxC,YAAA,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;gBAC3C,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,MAAM;AAC7D,gBAAA,MAAM,gBAAgB,GACpB,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC/D,MAAM,WAAW,GAAG,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;gBACnE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE;gBAElD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;AAC7C,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,GAAG,eAAe;gBAE9C,IAAI,WAAW,IAAI,CAAC,IAAI,WAAW,GAAG,QAAQ,CAAC,MAAM,EAAE;oBACrD,IAAI,WAAW,GAAG,WAAW;AAC7B,oBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,wBAAA,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY;oBACzC;oBACA,MAAM,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,YAAY;AAEjE,oBAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,GAAG,WAAW;oBACrD,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,WAAW,GAAG,YAAY;AAE9E,oBAAA,IAAI,WAAW,GAAG,WAAW,EAAE;AAC7B,wBAAA,QAAQ,CAAC,UAAU,GAAG,WAAW,GAAG,WAAW;oBACjD;AAAO,yBAAA,IAAI,QAAQ,GAAG,YAAY,EAAE;AAClC,wBAAA,QAAQ,CAAC,UAAU,GAAG,QAAQ,IAAI,QAAQ,CAAC,WAAW,GAAG,YAAY,CAAC;oBACxE;gBACF;YACF;AACF,QAAA,CAAC,CAAC;IACJ;;AAIA,IAAA,WAAW,CAAC,KAA8C,EAAA;AACxD,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC;AAC1D,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACzD,IAAI,CAAC,2BAA2B,EAAE;IACpC;AAEA,IAAA,YAAY,CAAC,KAAsD,EAAA;AACjE,QAAA,QAAQ,KAAK,CAAC,QAAQ;AACpB,YAAA,KAAK,UAAU;gBACb,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;AAC3C,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzD;AACF,YAAA,KAAK,WAAW;gBACd,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC;AAC5C,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzD;AACF,YAAA,KAAK,cAAc;gBACjB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;AACtC,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,oBAAA,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;oBACtD,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;AACvC,iBAAA,CAAC;gBACF;AACF,YAAA,KAAK,eAAe;;AAElB,gBAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;gBAClE;AACF,YAAA,KAAK,aAAa;AAChB,gBAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBAC7D;YACF,KAAK,sBAAsB,EAAE;gBAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;gBAC1E,IAAI,GAAG,EAAE;AACP,oBAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBAClF;gBACA;YACF;AACA,YAAA,KAAK,oBAAoB;AACvB,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC5B;AACF,YAAA,KAAK,qBAAqB;AACxB,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC7B;AACF,YAAA,KAAK,iBAAiB;AACpB,gBAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBAC3D;;IAEN;AAEA,IAAA,UAAU,CAAC,KAA6B,EAAA;AACtC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAyB,CAAC;IAC/C;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,EAAE;QAC7C,IAAI,CAAC,wBAAwB,EAAE;AAC/B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,CAAC;IACxE;IAEA,oBAAoB,GAAA;QAClB,IAAI,CAAC,wBAAwB,EAAE;AAC/B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,CAAC;IACxE;IAEQ,wBAAwB,GAAA;QAC9B,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;YACvC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;AAC1C,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE;QACvC;aAAO;YACL,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;QAC5C;IACF;AAEA,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAC5C,QAAA,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,KAAK,IAAI;;QAGhD,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;YACjC;QACF;;QAGA,MAAM,GAAG,GAAI,KAAK,CAAC,MAAsB,EAAE,OAAO,EAAE,WAAW,EAAE;AACjE,QAAA,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,UAAU,EAAE;YAC7D;QACF;;;QAIA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE;AAChD,QAAA,IAAI,OAAO,KAAK,MAAM,EAAE;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;gBACvE,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,UAAU,EAAE;gBACjB;YACF;AACA,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;gBACvE,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,KAAK,IAAI,CAAC,WAAW,EAAE;gBACvB;YACF;AACA,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;gBACvD,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,YAAY,EAAE;gBACnB;YACF;QACF;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1C;AAEQ,IAAA,qBAAqB,CAAC,KAAoB,EAAA;AAChD,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAC1B,KAAK,CAAC,cAAc,EAAE;YACtB,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;YACpD,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;YACrC;YACA;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;;AAEzB,YAAA,IAAI,KAAK,CAAC,MAAM,EAAE;gBAChB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAC5C,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC;AACd,qBAAA,YAAY;qBACZ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;AAClF,gBAAA,MAAM,UAAU,GAAG,GAAG,EAAE,UAAU,IAAI,MAAM;AAC5C,gBAAA,IAAI,UAAU,KAAK,MAAM,EAAE;oBACzB,KAAK,CAAC,cAAc,EAAE;AACtB,oBAAA,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU;oBAClC,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI;AAC7E,oBAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC;gBACzC;gBACA;YACF;;YAGA,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE;gBAClC,KAAK,CAAC,cAAc,EAAE;gBACtB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAC5C,gBAAA,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU;gBAClC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;AACjD,gBAAA,IAAI,MAAM;AAAE,oBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE;gBAC3D,IAAI,KAAK,EAAE;AACT,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC;oBAChE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC;gBACtD;gBACA,IAAI,CAAC,WAAW,EAAE;gBAClB;YACF;YAEA,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,kBAAkB,EAAE;YACzB,IAAI,KAAK,CAAC,QAAQ;AAAE,gBAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;;AAChD,gBAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE;YACxC,IAAI,CAAC,WAAW,EAAE;YAClB;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE;YACvB,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,kBAAkB,EAAE;YACzB,IAAI,KAAK,CAAC,QAAQ;AAAE,gBAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE;;AAClD,gBAAA,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE;YACzC,IAAI,CAAC,WAAW,EAAE;QACpB;IACF;IAEQ,kBAAkB,GAAA;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;AAC9C,QAAA,IAAI,CAAC,GAAG;YAAE;AACV,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAuB,CAAC;AAC3C,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;IACjC;IAEQ,aAAa,GAAA;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE;AAC3D,QAAA,IAAI,CAAC,KAAK;YAAE;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1D,QAAA,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC;AAClC,QAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC;AACnC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,KAAK;AACL,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAClC,YAAA,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AACnC,SAAA,CAAC;IACJ;IAEQ,MAAM,GAAA;AACZ,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;AACzB,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;IACjC;IAEQ,MAAM,GAAA;AACZ,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;AACzB,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;IACjC;IAEQ,kBAAkB,GAAA;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE;AAC3D,QAAA,IAAI,CAAC,KAAK;YAAE;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;AACpD,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE;QAC1B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC;AAC/C,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;IACjC;IAEQ,mBAAmB,GAAA;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE;AAC3D,QAAA,IAAI,CAAC,KAAK;YAAE;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC;AACrD,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE;QAC1B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC;AAChD,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;IACjC;AAEQ,IAAA,mBAAmB,CAAC,GAAW,EAAE,GAAW,EAAE,WAAoB,EAAA;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC;AAC/C,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;QACvD,IAAI,CAAC,GAAG,EAAE,QAAQ;YAAE;AACpB,QAAA,IAAI,WAAW,KAAK,SAAS,EAAE;AAC7B,YAAA,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC;QACzE;aAAO;YACL,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC;QACpD;IACF;IAEQ,2BAA2B,GAAA;AACjC,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,iBAAiB;YAAE;AACxD,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,QAAQ;YAAE;QACpC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,KAAK,KAAI;AACxC,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3B,QAAA,CAAC,CAAC;IACJ;IAEQ,WAAW,GAAA;;;QAGjB,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE;YACtC,IAAI,SAAS,EAAE;AACb,gBAAA,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE;YACjC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,SAAS,GAAA;;;;AAIP,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE;AACtC,YAAA,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE;YACnC;QACF;;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE;YACjD,IAAI,MAAM,EAAE;gBACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YAC9C;YACA;QACF;AACA,QAAA,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE;IAC9C;AAEA;;;;AAIG;AACK,IAAA,mBAAmB,CACzB,KAAc,EACd,YAAqB,EACrB,QAAgB,EAChB,QAAgB,EAAA;AAEhB,QAAA,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,KAAK;QAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;QAC3C,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,KAAK;AACpD,QAAA,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AAClE,QAAA,OAAO,gBAAgB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IACpE;AAEA;;;;AAIG;AACK,IAAA,yBAAyB,CAAC,YAAoB,EAAA;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;QACjD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC;AACpF,QAAA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,CAAC,CAAC;AAC9C,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;IACpD;IAEQ,SAAS,CACf,MAAoC,EACpC,MAAoC,EAAA;QAEpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK;AAC3C,QAAA,IAAI,CAAC,WAAW;YAAE;AAElB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC;QAC5D,IAAI,CAAC,SAAS,EAAE,QAAQ;YAAE;QAE1B,MAAM,eAAe,GAAG,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,GAAG,CAAC;QAClE,IAAI,eAAe,GAAG,CAAC;YAAE;QAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;AACvC,QAAA,IAAI,CAAC,SAAS;YAAE;AAEhB,QAAA,MAAM,WAAW,GAAG,SAAS,CAAC;AAC5B,cAAE,SAAS,CAAC,WAAW,CAAC,SAAS;AACjC,cAAG,SAAqC,CAAC,WAAW,CAAC;QAEvD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG;QAC1C,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC;QAClE;aAAO;YACL,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,CAAC;QACxE;IACF;AAEQ,IAAA,iBAAiB,CACvB,MAAoC,EACpC,MAAoC,EACpC,KAAa,EACb,WAAoB,EAAA;AAEpB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC/C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC/C,QAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM;QAChC,IAAI,QAAQ,KAAK,CAAC;YAAE;AAEpB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,YAAY,KAAK,IAAI;;AAEhF,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB;AAC1C,QAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,IAAI,CAAC,KAAK,MAAM,CAAC,GAAG;gBAAE;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAChD,IAAI,MAAM,IAAI,CAAC;AAAE,gBAAA,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC;QAC1C;QAEA,MAAM,OAAO,GAA2E,EAAE;QAC1F,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;AACjC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,KAAK,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE;AAC3C,gBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;oBAAE;AACtB,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CACpC,WAAW,EACX,YAAY,EACZ,UAAU,GAAG,MAAM,CAAC,GAAG,EACvB,CAAC,CACF;gBACD,MAAM,MAAM,GAAI,OAAO,CAAC,MAAM,CAA6B,CAAC,KAAK,CAAC;gBAClE,IAAI,MAAM,KAAK,KAAK;oBAAE;gBACtB,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,EAA6B;AACjE,gBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;AACtB,gBAAA,OAAO,CAAC,MAAM,CAAC,GAAG,OAAY;AAC9B,gBAAA,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC1D;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;QAC5C;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;AAE/B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjB,YAAA,UAAU,EAAE,MAAM;YAClB,WAAW;AACX,YAAA,SAAS,EAAE,UAAU;AACrB,YAAA,iBAAiB,EAAE,QAAQ;YAC3B,KAAK;YACL,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;AACjD,YAAA,gBAAgB,EAAE,QAAQ;AAC3B,SAAA,CAAC;IACJ;AAEQ,IAAA,mBAAmB,CACzB,MAAoC,EACpC,MAAoC,EACpC,WAAoB,EACpB,eAAuB,EAAA;QAEvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AACxC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;AAC/C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;;;QAI/C,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACvC,QAAA,MAAM,UAAU,GAAG,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,SAAS;AAChF,QAAA,MAAM,gBAAgB,GAAG,UAAU,EAAE,UAAU,IAAI,MAAM;QAEzD,MAAM,YAAY,GAAa,EAAE;AACjC,QAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,IAAI,CAAC,KAAK,MAAM,CAAC,GAAG;gBAAE;AACtB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC;AACxB,YAAA,IAAI,CAAC,QAAQ;gBAAE;YACf,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YACtC,IAAI,CAAC,GAAG,EAAE,QAAQ;gBAAE;;AAEpB,YAAA,MAAM,gBAAgB,GAAG,GAAG,CAAC,UAAU,IAAI,MAAM;YACjD,IAAI,gBAAgB,KAAK,gBAAgB;gBAAE;AAC3C,YAAA,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnC;AACA,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE;QAE/B,MAAM,OAAO,GAA2E,EAAE;QAC1F,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;AACjC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;AACtB,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC;AACpC,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,OAAO;AACxB,YAAA,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,EAA6B;AACrD,YAAA,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE;AAC5B,gBAAA,MAAM,MAAM,GAAI,GAA+B,CAAC,CAAC,CAAC;AAClD,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;gBACzD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/B,gBAAA,MAAM,YAAY,GAAG,SAAS,EAAE,YAAY,KAAK,IAAI;AACrD,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CACpC,WAAW,EACX,YAAY,EACZ,CAAC,EACD,YAAY,GAAG,MAAM,CAAC,GAAG,CAC1B;gBACD,IAAI,MAAM,KAAK,KAAK;oBAAE;AACtB,gBAAA,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK;AAClB,gBAAA,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YACtE;AACA,YAAA,OAAO,CAAC,eAAe,CAAC,GAAG,OAAY;AACvC,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;QAC5C;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;AAE/B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjB,YAAA,UAAU,EAAE,MAAM;YAClB,WAAW;AACX,YAAA,SAAS,EAAE,YAAY;YACvB,iBAAiB,EAAE,YAAY,CAAC,MAAM;YACtC,YAAY;AACb,SAAA,CAAC;IACJ;AAEA,IAAA,aAAa,CAAC,QAAgB,EAAA;AAC5B,QAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,CAAC;IAC9C;AAEA,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC;AACnC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,YAAA,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;YACtD,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;AACvC,SAAA,CAAC;IACJ;AAEA,IAAA,iBAAiB,CAAC,KAAa,EAAA;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAC7C,CAAC,CAAC,KAAK,KAAK;AACV,cAAE;AACE,gBAAA,GAAG,CAAC;AACJ,gBAAA,aAAa,EAAE,CAAC,CAAC,aAAa,KAAK,KAAK,GAAI,MAAgB,GAAI,KAAe;AAChF;cACD,CAAC,CACN;AACD,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AACxC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;IACrF;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE;QACnC,IAAI,CAAC,wBAAwB,EAAE;AAC/B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,CAAC;IACxE;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE;QACrC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;AAC1C,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,CAAC;IACxE;;AAGA,IAAA,cAAc,CAAC,EAAU,EAAA;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,EAAE,CAAC;IACvC;;IAGA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;IAC9B;;IAIA,cAAc,GAAA;AACZ,QAAA,MAAM,IAAI,GAAqB;AAC7B,YAAA,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;AAC7D,YAAA,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;AAC/D,YAAA,SAAS,EAAE,IAAI,CAAC,uBAAuB,EAAE;SAC1C;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAIjC,4BAA4B,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAE3E,GAAG,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;AACrC,YAAA,IAAI,MAAM,EAAE,OAAO,EAAE;gBACnB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC;YACrD;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxD;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;;;QAGnC,qBAAqB,CAAC,MAAK;AACzB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;AACjC,YAAA,IAAI,CAAC,IAAI;gBAAE;AACX,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa;AAC7B,YAAA,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,WAAW,CAAC;AAC1E,YAAA,IAAI,CAAC,2BAA2B,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC;AAC1E,QAAA,CAAC,CAAC;IACJ;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,KACpC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAC7D;IACH;AAEA,IAAA,cAAc,CAAC,KAAa,EAAA;AAC1B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;AAChD,QAAA,OAAO,GAAG,EAAE,UAAU,IAAI,KAAK;IACjC;AAEA,IAAA,aAAa,CAAC,KAA2C,EAAA;AACvD,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACzD;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,QAAQ,EAAE;AAClC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACtB,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AAC/B,gBAAA,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACrC,gBAAA,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AACzD,aAAA,CAAC;YACF;QACF;QACA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1C;;IAIA,YAAY,GAAA;AACV,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC;AACvB,aAAA,UAAU;aACV,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAExE,QAAA,MAAM,IAAI,GAAoB;YAC5B,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;AACtC,YAAA,gBAAgB,EAAE,YAAY;SAC/B;AAED,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAIjC,wBAAwB,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAExD,GAAG,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;YACrC,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC/B;AACF,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,gBAAgB,CAAC,MAAyB,EAAA;QAChD,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AACxC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,YAAA,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AAC1C,YAAA,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;AAC3B,SAAA,CAAC;IACJ;;IAIA,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,oCAAoC,EACpC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAChC;IACH;;AAIA;;;AAGqC;IACrC,sBAAsB,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAAE;AAC5D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACxC,QAAA,IAAI,CAAC,sBAAsB,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE;QAC9D,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;AAC5C,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;AACjC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9C;AAEA,IAAA,wBAAwB,CAAC,KAAa,EAAA;AACpC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;IACjC;IAEA,wBAAwB,GAAA;QACtB,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,kBAAkB,EAAE;IAC3B;IAEA,wBAAwB,GAAA;QACtB,IAAI,CAAC,kBAAkB,EAAE;IAC3B;AAEA;;AAE6C;AAC7C,IAAA,2BAA2B,CAAC,KAAiB,EAAA;AAC3C,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAAE;AAC/B,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,aAA4B;AAClD,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,aAA4B;;AAE/C,QAAA,IAAI,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE;;;QAGpC,IAAI,IAAI,YAAY,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC;YAAE;;;QAG3E,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAAE;AAC/B,YAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa;AACrC,YAAA,IAAI,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE;YACxC,IAAI,MAAM,YAAY,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC;gBAAE;YAC/E,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,kBAAkB,EAAE;AAC3B,QAAA,CAAC,CAAC;IACJ;IAEQ,kBAAkB,GAAA;AACxB,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;AACjC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;AAClC,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC;IAC/C;IAEQ,gBAAgB,GAAA;AACtB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB;AAC5C,QAAA,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ;YAAE;;;AAGjC,QAAA,IAAI,KAAK,KAAK,QAAQ,CAAC,OAAO;YAAE;AAChC,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK;AAC5B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK;AAC3D,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;QAChD,IAAI,CAAC,GAAG,EAAE,QAAQ;YAAE;QAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC;QAC3D,IAAI,SAAS,GAAG,CAAC;YAAE;QACnB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,SAAS,CAAwC;AAC5F,QAAA,IAAI,CAAC,UAAU;YAAE;QACjB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAgC;AAChF,QAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE;AAE3C,QAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC;;;AAGlC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACxE,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACxE,MAAM,aAAa,GACjB,YAAY,KAAK,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvF,IAAI,KAAK,KAAK,aAAa;YAAE;;;;;QAM7B,MAAM,gBAAgB,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAC1D,MAAM,QAAQ,GAAY;AACxB,cAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK;AAC/B,cAAE,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC;AAErC,QAAA,IAAI,GAAG,CAAC,mBAAmB,EAAE;YAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAe,CAAC;AACjE,YAAA,IAAI,MAAM,KAAK,KAAK,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE;QACtD;QAEA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACpC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;AACzB,YAAA,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,GAAG,QAAQ,EAAO;AACtE,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC;AAEjD,QAAA,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;AAC7B,QAAA,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,KAAK,IAAI;AAC9C,QAAA,IAAI,YAAY,IAAI,gBAAgB,EAAE;YACpC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;QACrC;AAAO,aAAA,IAAI,YAAY,IAAI,gBAAgB,IAAI,CAAC,gBAAgB,EAAE;AAChE,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;QACjC;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC;AAEnC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjB,YAAA,GAAG,EAAE,MAAM;AACX,YAAA,QAAQ,EAAE,SAAS;YACnB,KAAK;YACL,QAAQ;YACR,QAAQ;AACW,SAAA,CAAC;IACxB;AAEA;;;;AAIG;AACK,IAAA,kBAAkB,CAAC,KAAa,EAAA;AACtC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;YACjD,MAAM,CAAC,GAAG,GAA8B;YACxC,OAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAiC,IAAI,EAAE;AAC1E,QAAA,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;QAC9D,OAAO,YAAY,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAChD;;IAIA,uBAAuB,GAAA;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;AAClD,QAAA,MAAM,OAAO,GAA4B,MAAM,CAAC,OAAO,CAAC,QAAQ;AAC7D,aAAA,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI;aAChC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM;YACtB,IAAI;AACJ,YAAA,SAAS,EAAE,IAAI,CAAC,IAAK,CAAC,SAAS;AAC/B,YAAA,OAAO,EAAE,IAAI,CAAC,IAAK,CAAC,OAAO;AAC5B,SAAA,CAAC,CAAC;AACL,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,mCAAmC,EACnC;AACE,YAAA,KAAK,EAAE,uBAAuB;YAC9B,IAAI,EAAE,EAAE,OAAO,EAAE;AAClB,SAAA,CACF;IACH;;IAIQ,OAAgB,kBAAkB,GAAgC;AACxE,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,OAAO,EAAE,EAAE;AACX,QAAA,KAAK,EAAE,EAAE;KACV;IAED,eAAe,GAAA;AACb,QAAA,MAAM,IAAI,GAAqB;AAC7B,YAAA,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;gBAC/C,KAAK,EAAE,GAAG,CAAC,KAAK;AAChB,gBAAA,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,UAAU,IAAI,GAAG,CAAC,KAAK;gBAC7E,OAAO,EAAE,GAAG,CAAC,OAAO;AACrB,aAAA,CAAC,CAAC;AACH,YAAA,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AAC7B,YAAA,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;gBACpD,KAAK,EAAE,GAAG,CAAC,KAAK;AAChB,gBAAA,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,KAAK;AACvC,gBAAA,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,KAAK;AAC/B,aAAA,CAAC,CAAC;SACJ;AAED,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAIjC,2BAA2B,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAE3D,GAAG,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;YACrC,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YAC5B;AACF,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,aAAa,CAAC,MAA0B,EAAA;QAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;AACtC,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAE7E,QAAA,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE;YAChC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QACrF;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;IAClC;;AAIQ,IAAA,UAAU,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC1D;AAEQ,IAAA,WAAW,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACxD;;AAIQ,IAAA,cAAc,CAAC,KAGtB,EAAA;QACC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QACpC,MAAM,GAAG,GAAc,EAAE;QACzB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;AACrD,YAAA,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE;AACX,gBAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD;QACF;AACA,QAAA,OAAO,GAAG;IACZ;AAEQ,IAAA,cAAc,CAAC,KAGtB,EAAA;QACC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,MAAM,GAAa,EAAE;QAC3B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACrD,IAAI,IAAI,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACzC;AACA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,kBAAkB,CAAC,KAA2B,EAAA;QACpD,OAAO,KAAK,CAAC,WAAwB;IACvC;IAEQ,mBAAmB,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;IACxD;AAEA;;;;AAIG;AACK,IAAA,iBAAiB,CAAC,OAA4B,EAAA;AACpD,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,IAAI;AACjD,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAwC;YACnE,OAAO;gBACL,QAAQ,EAAE,CAAC,CAAC,QAAQ;AACpB,gBAAA,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,SAAS;gBACrC,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,QAAQ,EAAE,CAAC,CAAC,MAAM;gBAClB,QAAQ,EAAE,CAAC,CAAC,KAAK;aAClB;AACH,QAAA,CAAC,CAAC;IACJ;IAEQ,yBAAyB,GAAA;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE;AAC7C,QAAA,IAAI,IAAI,KAAK,MAAM,EAAE;AACnB,YAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE;QACvC;AAAO,aAAA,IAAI,IAAI,KAAK,OAAO,EAAE;AAC3B,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE;QACvC;QACA,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;IAC5C;IAEA,UAAU,GAAA;QACR,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,MAAM,EAAE;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE;AACzD,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjB,gBAAA,KAAK,EAAE,IAAI;gBACX,SAAS,EAAE,KAAK,CAAC,KAAK;AACtB,gBAAA,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AACtC,gBAAA,MAAM,EAAE,IAAI,CAAC,mBAAmB,EAAE;AAClC,gBAAA,aAAa,EAAE,MAAM;AACrB,gBAAA,YAAY,EAAE,KAAK;AACpB,aAAA,CAAC;YACF;QACF;QACA,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE;AAC3D,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AAChD,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AAChD,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,KAAK;YACL,SAAS,EAAE,IAAI,GAAG,IAAI;AACtB,YAAA,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAClC,YAAA,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AACnC,SAAA,CAAC;IACJ;IAEA,UAAU,GAAA;;AAER,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;QAE/B,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,MAAM,EAAE;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE;YACzD,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,YAAmB,CAAC;YACvE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3D,YAAA,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC;AAClC,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjB,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AACtC,gBAAA,MAAM,EAAE,IAAI,CAAC,mBAAmB,EAAE;AAClC,gBAAA,aAAa,EAAE,MAAM;AACrB,gBAAA,YAAY,EAAE,KAAK;AACpB,aAAA,CAAC;YACF;QACF;AACA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACpC,QAAA,IAAI,CAAC,IAAI;YAAE;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/D,QAAA,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,MAAM;YACjB,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;YACvC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;AACxC,SAAA,CAAC;IACJ;AAEA,IAAA,MAAM,WAAW,GAAA;QACf,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,MAAM,EAAE;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE;AACzD,YAAA,IAAI;gBACF,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE;gBACjD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAClE,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,YAAmB,EAAE,SAAS,CAAC;AACnF,gBAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;oBACtB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;gBAC7C;AACA,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAClB,oBAAA,KAAK,EAAE,IAAI;AACX,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AACtC,oBAAA,MAAM,EAAE,IAAI,CAAC,mBAAmB,EAAE;AAClC,oBAAA,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;AACxC,oBAAA,aAAa,EAAE,MAAM;AACrB,oBAAA,YAAY,EAAE,KAAK;AACpB,iBAAA,CAAC;YACJ;AAAE,YAAA,MAAM;;YAER;YACA;QACF;;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE;YACjD,MAAM,IAAI,GAAG;AACV,iBAAA,OAAO,CAAC,QAAQ,EAAE,EAAE;iBACpB,KAAK,CAAC,IAAI;AACV,iBAAA,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;;;AAIxC,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;YAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE;AAC/D,YAAA,MAAM,oBAAoB,GACxB,CAAC,CAAC,SAAS;iBACV,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AAE1F,YAAA,IAAI,UAAqB;AACzB,YAAA,IAAI,YAAiC;AACrC,YAAA,IAAI,aAAa,IAAI,oBAAoB,IAAI,SAAS,EAAE;gBACtD,UAAU,GAAG,SAAS;AACtB,gBAAA,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1E;iBAAO;AACL,gBAAA,UAAU,GAAG;AACX,oBAAA,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;AAC7C,oBAAA,GAAG,EAAE;wBACH,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;wBAChF,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzE,qBAAA;iBACF;gBACD,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC;YAClE;;;YAIA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACxC,YAAA,MAAM,YAAY,GAAG,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE;YAChF,MAAM,UAAU,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,YAAY,CAAC;AACrD,YAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,GAAG,KAAK,GAAG,OAAO,EAAE,UAAU,CAAC;YACpE;AACA,YAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;AAC/B,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAClB,gBAAA,KAAK,EAAE,UAAU;AACjB,gBAAA,IAAI,EAAE,IAAI;AACV,gBAAA,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;AACvC,gBAAA,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;AACvC,gBAAA,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;AAC5C,aAAA,CAAC;QACJ;AAAE,QAAA,MAAM;;QAER;IACF;IAEA,YAAY,GAAA;QACV,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,MAAM,EAAE;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE;YACzD,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,YAAmB,EAAE;AACrD,gBAAA,QAAQ,EAAE,kBAAkB;AAC7B,aAAA,CAAC;YACF;QACF;;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE;AAC3D,QAAA,IAAI,CAAC,KAAK;YAAE;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;AACxC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;QACtF,MAAM,SAAS,GAAQ,EAAE;QACzB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACrD,IAAI,IAAI,CAAC,CAAC,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,EAAE;AACrC,YAAA,QAAQ,EAAE,kBAAkB;AAC5B,YAAA,OAAO,EAAE,WAAW;AACrB,SAAA,CAAC;IACJ;IAEA,YAAY,GAAA;QACV,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,MAAM,EAAE;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE;YACzD,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,YAAmB,CAAC;AAClE,YAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACtB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;YAC9C;;;AAGA,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACnB,gBAAA,KAAK,EAAE,IAAI;gBACX,SAAS,EAAE,KAAK,CAAC,KAAK;AACtB,gBAAA,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AACtC,gBAAA,MAAM,EAAE,IAAI,CAAC,mBAAmB,EAAE;AAClC,gBAAA,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;AACxC,gBAAA,aAAa,EAAE,MAAM;AACrB,gBAAA,YAAY,EAAE,KAAK;AACpB,aAAA,CAAC;YACF;QACF;QACA,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE;AAC3D,QAAA,IAAI,CAAC,KAAK;YAAE;;AAGZ,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AAChE,QAAA,MAAM,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,CAAC;AACtE,QAAA,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,OAAO;YAAE;AAE5D,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AAChD,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;QAEpD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC;AACtD,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC9C;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;AAE/B,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACnB,KAAK;YACL,SAAS,EAAE,IAAI,GAAG,QAAQ;AAC1B,YAAA,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAClC,YAAA,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAClC,YAAA,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;AACzC,SAAA,CAAC;IACJ;IAEQ,gBAAgB,GAAA;QAItB,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE;AAC3D,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,MAAM,MAAM,GAAe,EAAE;QAE7B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;AACrD,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,YAAA,IAAI,CAAC,GAAG;gBAAE;YACV,MAAM,SAAS,GAAa,EAAE;YAC9B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;gBACrD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK;gBAC5B,IAAI,CAAC,KAAK,EAAE;AACV,oBAAA,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClB;gBACF;gBACA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,gBAAA,MAAM,GAAG,GAAG,GAAG,EAAE;AACf,sBAAE,GAAG,CAAC,WAAW,CAAC,GAAG;AACrB,sBAAG,GAA+B,CAAC,KAAK,CAAC;AAC3C,gBAAA,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAChD;AACA,YAAA,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QACxB;AACA,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;IAC1B;AAEQ,IAAA,uBAAuB,CAAC,YAAiB,EAAA;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AACxC,QAAA,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AAC9B,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;gBACtB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AACjC,gBAAA,MAAM,GAAG,GAAG,GAAG,EAAE;AACf,sBAAE,GAAG,CAAC,WAAW,CAAC,GAAG;AACrB,sBAAG,GAA+B,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/C,gBAAA,OAAO,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;AACvC,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEQ,wBAAwB,CAAC,YAAiB,EAAE,SAAqB,EAAA;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,IAAI;QACjD,MAAM,OAAO,GAAwB,EAAE;QAEvC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACpC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;YACzB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE;AAC3E,gBAAA,MAAM,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;AACpC,gBAAA,MAAM,UAAU,GAAI,WAAuC,CAAC,OAAO,CAAC;AACpE,gBAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CACjC,CAAC,CAAC,KAAM,CAA6B,CAAC,OAAO,CAAC,KAAK,UAAU,CAC9D;gBACD,IAAI,SAAS,GAAG,CAAC;oBAAE;gBAEnB,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,EAA6B;gBACpE,IAAI,OAAO,GAAG,KAAK;gBACnB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE;oBACvE,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK;AAC7B,oBAAA,IAAI,CAAC,KAAK;wBAAE;oBACZ,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;oBACpF,IAAI,OAAO,KAAK,UAAU;wBAAE;oBAC5B,MAAM,MAAM,GAAI,OAAO,CAAC,SAAS,CAA6B,CAAC,KAAK,CAAC;oBACrE,IAAI,MAAM,KAAK,OAAO;wBAAE;AACxB,oBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO;AACxB,oBAAA,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;oBACpE,OAAO,GAAG,IAAI;gBAChB;gBACA,IAAI,OAAO,EAAE;AACX,oBAAA,OAAO,CAAC,SAAS,CAAC,GAAG,OAAY;gBACnC;YACF;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,OAAO;IAChB;AAEQ,IAAA,kBAAkB,CAAC,YAAiB,EAAA;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,IAAI;QACjD,MAAM,OAAO,GAAwB,EAAE;QAEvC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACpC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;AACzB,YAAA,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;AACtC,gBAAA,MAAM,UAAU,GAAI,WAAuC,CAAC,OAAO,CAAC;AACpE,gBAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CACjC,CAAC,CAAC,KAAM,CAA6B,CAAC,OAAO,CAAC,KAAK,UAAU,CAC9D;gBACD,IAAI,SAAS,GAAG,CAAC;oBAAE;gBAEnB,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,EAA6B;gBACpE,IAAI,OAAO,GAAG,KAAK;AACnB,gBAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;oBAC3E,IAAI,OAAO,KAAK,UAAU;wBAAE;oBAC5B,MAAM,MAAM,GAAI,OAAO,CAAC,SAAS,CAA6B,CAAC,GAAG,CAAC,KAAK,CAAC;oBACzE,IAAI,MAAM,KAAK,OAAO;wBAAE;AACxB,oBAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO;oBAC5B,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;oBAC/E,OAAO,GAAG,IAAI;gBAChB;gBACA,IAAI,OAAO,EAAE;AACX,oBAAA,OAAO,CAAC,SAAS,CAAC,GAAG,OAAY;gBACnC;YACF;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,OAAO;IAChB;AAEQ,IAAA,iBAAiB,CAAC,KAAa,EAAE,QAAiB,EAAE,GAAM,EAAA;AAChE,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;QAChD,IAAI,CAAC,GAAG,EAAE,QAAQ;AAAE,YAAA,OAAO,UAAU;AAErC,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU;;AAGjC,QAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;AACrB,YAAA,IAAI,UAAmB;YACvB,QAAQ,UAAU;AAChB,gBAAA,KAAK,QAAQ;oBACX,UAAU,GAAG,IAAI;oBACjB;AACF,gBAAA,KAAK,UAAU;oBACb,UAAU,GAAG,KAAK;oBAClB;AACF,gBAAA;oBACE,UAAU,GAAG,EAAE;oBACf;;AAEJ,YAAA,IAAI,GAAG,CAAC,mBAAmB,EAAE;gBAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,GAAG,CAAC;AACvD,gBAAA,IAAI,MAAM,KAAK,KAAK,IAAI,OAAO,MAAM,KAAK,QAAQ;AAAE,oBAAA,OAAO,UAAU;YACvE;AACA,YAAA,OAAO,UAAU;QACnB;QAEA,IAAI,KAAK,GAAY,QAAQ;AAE7B,QAAA,IAAI,UAAU,KAAK,QAAQ,EAAE;AAC3B,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC5B,IAAI,KAAK,CAAC,GAAG,CAAC;AAAE,gBAAA,OAAO,UAAU;YACjC,KAAK,GAAG,GAAG;QACb;AAAO,aAAA,IAAI,UAAU,KAAK,UAAU,EAAE;YACpC,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,IAAI,EAAE;gBAC5C,KAAK,GAAG,IAAI;YACd;iBAAO,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,KAAK,EAAE;gBACrD,KAAK,GAAG,KAAK;YACf;iBAAO;AACL,gBAAA,OAAO,UAAU;YACnB;QACF;aAAO,IAAI,UAAU,KAAK,QAAQ,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,EAAE;YACnE,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACjE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAAE,gBAAA,OAAO,UAAU;YAC1D,KAAK,GAAG,QAAQ;QAClB;AAEA,QAAA,IAAI,GAAG,CAAC,mBAAmB,EAAE;YAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC;AAClD,YAAA,IAAI,MAAM,KAAK,KAAK,IAAI,OAAO,MAAM,KAAK,QAAQ;AAAE,gBAAA,OAAO,UAAU;QACvE;AAEA,QAAA,OAAO,KAAK;IACd;wGA/6DW,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,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,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,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,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,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,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,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,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,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,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,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,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,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,SAAA,EAznBhB;YACT,gBAAgB;YAChB,UAAU;YACV,UAAU;YACV,kBAAkB;YAClB,gBAAgB;YAChB,kBAAkB;YAClB,mBAAmB;YACnB,cAAc;YACd,eAAe;YACf,aAAa;YACb,WAAW;YACX,YAAY;YACZ,mBAAmB;YACnB,gBAAgB;YAChB,mBAAmB;YACnB,sBAAsB;YACtB,YAAY;YACZ,UAAU;YACV,oBAAoB;YACpB,6BAA6B;YAC7B,2BAA2B;YAC3B,gBAAgB;YAChB,oBAAoB;YACpB,aAAa;YACb,0BAA0B;YAC1B,OAAO;AACR,SAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EA6nB6C,gBAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,SAAA,EACf,iBAAiB,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EACnB,eAAe,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAtmBlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsST,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,sqJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA7TC,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,sBAAsB,4MACtB,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,gCAAgC,uEAChC,4BAA4B,EAAA,QAAA,EAAA,wBAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC5B,0BAA0B,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1B,eAAe,0KACf,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,YAAY,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,QAAQ,4EACR,UAAU,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,iBAAiB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,gBAAgB,oFAChB,UAAU,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,WAAW,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,aAAa,iFACb,UAAU,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,YAAY,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,kBAAkB,qKAClB,6BAA6B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,aAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAukBpB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBA5nB5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,EAAA,eAAA,EACH,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;wBACT,gBAAgB;wBAChB,UAAU;wBACV,UAAU;wBACV,kBAAkB;wBAClB,gBAAgB;wBAChB,kBAAkB;wBAClB,mBAAmB;wBACnB,cAAc;wBACd,eAAe;wBACf,aAAa;wBACb,WAAW;wBACX,YAAY;wBACZ,mBAAmB;wBACnB,gBAAgB;wBAChB,mBAAmB;wBACnB,sBAAsB;wBACtB,YAAY;wBACZ,UAAU;wBACV,oBAAoB;wBACpB,6BAA6B;wBAC7B,2BAA2B;wBAC3B,gBAAgB;wBAChB,oBAAoB;wBACpB,aAAa;wBACb,0BAA0B;wBAC1B,OAAO;qBACR,EAAA,OAAA,EACQ;wBACP,gBAAgB;wBAChB,sBAAsB;wBACtB,oBAAoB;wBACpB,sBAAsB;wBACtB,gCAAgC;wBAChC,4BAA4B;wBAC5B,0BAA0B;wBAC1B,eAAe;wBACf,sBAAsB;wBACtB,uBAAuB;wBACvB,YAAY;wBACZ,QAAQ;wBACR,UAAU;wBACV,iBAAiB;wBACjB,gBAAgB;wBAChB,UAAU;wBACV,WAAW;wBACX,aAAa;wBACb,UAAU;wBACV,YAAY;wBACZ,kBAAkB;wBAClB,6BAA6B;qBAC9B,EAAA,QAAA,EACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsST,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,sqJAAA,CAAA,EAAA;AAwTmE,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,eAAe,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAMrC,gBAAgB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MACf,iBAAiB,8FACnB,eAAe,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,uBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;AAi5D9D;;;;;;AAMG;AACH,SAAS,gBAAgB,CAAC,GAAW,EAAE,QAAiB,EAAA;IACtD,IAAI,GAAG,KAAK,EAAE;AAAE,QAAA,OAAO,EAAE;AACzB,IAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,SAAS,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;AAC7F,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,CAAC;IAChC;AACA,IAAA,IAAI,OAAO,QAAQ,KAAK,SAAS,EAAE;AACjC,QAAA,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM;AAAE,YAAA,OAAO,IAAI;AACjD,QAAA,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO;AAAE,YAAA,OAAO,KAAK;IACtD;AACA,IAAA,OAAO,GAAG;AACZ;;ACvoFO,MAAM,oBAAoB,GAAgB;AAC/C,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,QAAQ,EAAE,EAAE;IACZ,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AAClC,IAAA,SAAS,EAAE,EAAE;AACb,IAAA,YAAY,EAAE,KAAK;AACnB,IAAA,aAAa,EAAE,UAAU;AACzB,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,cAAc,EAAE,KAAK;AACrB,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,aAAa,EAAE,KAAK;AACpB,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,kBAAkB,EAAE,IAAI;AACxB,IAAA,OAAO,EAAE,CAAC,KAAa,KAAK,KAAK;;;MCjDtB,qCAAqC,CAAA;AAC/B,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAExC,aAAa,GAAG,MAAM,EAAU;IAChC,UAAU,GAAG,MAAM,EAAQ;AAE3B,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AACxC,QAAA,OAAO;aACJ,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO;AAC5B,aAAA,GAAG,CAAC,CAAC,GAAG,MAAM;YACb,KAAK,EAAE,GAAG,CAAC,KAAK;AAChB,YAAA,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,UAAU,IAAI,GAAG,CAAC,KAAK;AACtD,SAAA,CAAC,CAAC;AACP,IAAA,CAAC,oFAAC;AAEF,IAAA,SAAS,CAAC,KAAa,EAAA;AACrB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;IAChC;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;wGAvBW,qCAAqC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qCAAqC,mKCTlD,0oBAkBA,EAAA,MAAA,EAAA,CAAA,6wCAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDTa,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBANjD,SAAS;+BACE,kCAAkC,EAAA,eAAA,EAC3B,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,0oBAAA,EAAA,MAAA,EAAA,CAAA,6wCAAA,CAAA,EAAA;;;MEmBpC,0BAA0B,CAAA;AACpB,IAAA,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAExC,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAU;AAChC,IAAA,MAAM,GAAG,KAAK,CAAU,KAAK,6EAAC;IAE9B,WAAW,GAAG,MAAM,EAAmD;IACvE,KAAK,GAAG,MAAM,EAAQ;AAEtB,IAAA,SAAS,GAAG,QAAQ,CAAsB,MAAK;AACtD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;AACzE,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE;QAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;QAChF,MAAM,KAAK,GAAwB,EAAE;;AAGrC,QAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK,EAAE;AAC1B,YAAA,KAAK,CAAC,IAAI,CACR,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,EAC1D,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,CAC9D;QACH;;AAGA,QAAA,IAAI,GAAG,CAAC,UAAU,EAAE;YAClB,KAAK,CAAC,IAAI,CAAC;AACT,gBAAA,EAAE,EAAE,eAAe;AACnB,gBAAA,KAAK,EAAE,uBAAuB;AAC9B,gBAAA,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;AAC1B,aAAA,CAAC;QACJ;AACA,QAAA,IAAI,GAAG,CAAC,SAAS,EAAE;YACjB,KAAK,CAAC,IAAI,CAAC;AACT,gBAAA,EAAE,EAAE,cAAc;AAClB,gBAAA,KAAK,EAAE,sBAAsB;gBAC7B,OAAO,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;AAC7C,aAAA,CAAC;QACJ;;AAGA,QAAA,IAAI,GAAG,CAAC,SAAS,KAAK,KAAK,EAAE;AAC3B,YAAA,IAAI,QAAQ,CAAC,MAAM,EAAE;gBACnB,KAAK,CAAC,IAAI,CAAC;AACT,oBAAA,EAAE,EAAE,iBAAiB;AACrB,oBAAA,KAAK,EAAE,iBAAiB;AACxB,oBAAA,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;AAC1B,iBAAA,CAAC;YACJ;iBAAO;gBACL,KAAK,CAAC,IAAI,CAAC;AACT,oBAAA,EAAE,EAAE,oBAAoB;AACxB,oBAAA,KAAK,EAAE,CAAA,yBAAA,EAA4B,QAAQ,GAAG,CAAC,CAAA,CAAE;AACjD,oBAAA,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;AAC1B,iBAAA,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC;AACT,oBAAA,EAAE,EAAE,qBAAqB;AACzB,oBAAA,KAAK,EAAE,CAAA,yBAAA,EAA4B,QAAQ,GAAG,CAAC,CAAA,CAAE;AAClD,iBAAA,CAAC;YACJ;QACF;;AAGA,QAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK,EAAE;YAC1B,KAAK,CAAC,IAAI,CAAC;AACT,gBAAA,EAAE,EAAE,aAAa;AACjB,gBAAA,KAAK,EAAE,aAAa;AACpB,gBAAA,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;AAC1B,aAAA,CAAC;QACJ;QACA,KAAK,CAAC,IAAI,CAAC;AACT,YAAA,EAAE,EAAE,sBAAsB;YAC1B,KAAK,EAAE,QAAQ,CAAC,aAAa,GAAG,uBAAuB,GAAG,uBAAuB;YACjF,OAAO,EAAE,GAAG,CAAC,QAAQ,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;AACpD,SAAA,CAAC;AAEF,QAAA,OAAO,KAAK;AACd,IAAA,CAAC,gFAAC;AAEF,IAAA,WAAW,CAAC,IAAuB,EAAA;AACjC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;YACnB,QAAQ,EAAE,IAAI,CAAC,EAAwB;AACxC,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;IACnB;wGAvFW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA1B,0BAA0B,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,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,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxBvC,qNAQA,EAAA,MAAA,EAAA,CAAA,4OAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDYY,yBAAyB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAIxB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAPtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,mBACf,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,yBAAyB,CAAC,EAAA,QAAA,EAAA,qNAAA,EAAA,MAAA,EAAA,CAAA,4OAAA,CAAA,EAAA;;;AEpBhC,SAAU,uBAAuB,CAAC,GAAW,EAAE,GAAW,EAAA;AAC9D,IAAA,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC;AAChC,IAAA,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC;AAC7B,IAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG;AAC5C,IAAA,OAAO,CAAC;AACV;AAEM,SAAU,iBAAiB,CAAC,cAAsB,EAAA;AACtD,IAAA,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC;AAChC,IAAA,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC;AAC7B,IAAA,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC;AACjD,IAAA,OAAO,CAAC;AACV;;ACZA;;;;AAIG;AA8CH;AACM,SAAU,SAAS,CAAI,IAAwB,EAAA;IACnD,OAAO,SAAS,IAAI,IAAI;AAC1B;AA0BM,SAAU,aAAa,CAAI,IAAiB,EAAA;AAChD,IAAA,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS;AAChC;AAEM,SAAU,YAAY,CAAI,IAAiB,EAAA;AAC/C,IAAA,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;AAC/B;;AC3CA;AACO,MAAM,YAAY,GAAG,EAAE;AAE9B;AACA,MAAM,kBAAkB,GAAG,GAAG;MA6BjB,oBAAoB,CAAA;AACd,IAAA,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC;;;;;AAO/B,IAAA,KAAK,GAAG,KAAK,CAAuB,EAAE,4EAAC;;AAGvC,IAAA,KAAK,GAAG,KAAK,CAAiB,IAAI,4EAAC;;AAGnC,IAAA,WAAW,GAAG,KAAK,CAAS,kBAAkB,kFAAC;;AAG/C,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;;AAGhC,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;;AAG/B,IAAA,IAAI,GAAG,KAAK,CAAkB,GAAG,2EAAC;;AAGlC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;;AAGhC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;;AAGhC,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;;AAG/B,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;;AAGjC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;AAE3C;;;;;AAKG;AACM,IAAA,WAAW,GAAG,KAAK,CAAU,KAAK,kFAAC;;AAGnC,IAAA,WAAW,GAAG,KAAK,CAAU,KAAK,kFAAC;;AAGnC,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;;AAG/B,IAAA,WAAW,GAAG,KAAK,CAA0B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,kFAAC;AAExE;;;;;;AAMG;IACM,YAAY,GAAG,KAAK,CAA4C,MAAM,IAAI,mFAAC;;AAG3E,IAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,gFAAC;;AAGhD,IAAA,cAAc,GAAG,KAAK,CAAqB,SAAS,qFAAC;;;;;AAOrD,IAAA,iBAAiB,GAAG,KAAK,CAAS,mBAAmB,wFAAC;;AAGtD,IAAA,aAAa,GAAG,KAAK,CAAS,kBAAkB,oFAAC;;AAGjD,IAAA,aAAa,GAAG,KAAK,CAAS,YAAY,oFAAC;;AAG3C,IAAA,SAAS,GAAG,KAAK,CAAS,OAAO,gFAAC;;AAGlC,IAAA,cAAc,GAAG,KAAK,CAAS,UAAU,qFAAC;;AAG1C,IAAA,cAAc,GAAG,KAAK,CAAS,iBAAiB,qFAAC;;AAGjD,IAAA,WAAW,GAAG,KAAK,CAAS,YAAY,kFAAC;;AAGzC,IAAA,gBAAgB,GAAG,KAAK,CAAU,IAAI,uFAAC;;;;IAMvC,MAAM,GAAG,MAAM,EAAQ;IACvB,MAAM,GAAG,MAAM,EAAQ;IACvB,QAAQ,GAAG,MAAM,EAAU;;;;AAMnB,IAAA,SAAS,GAAG,SAAS,CAAgC,YAAY,gFAAC;AAClE,IAAA,UAAU,GAAG,SAAS,CAA2B,UAAU,iFAAC;;;;;AAOpE,IAAA,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAC9B,IAAA,UAAU,GAAG,CAAA,YAAA,EAAe,IAAI,CAAC,MAAM,EAAE;AACzC,IAAA,SAAS,GAAG,CAAA,EAAG,IAAI,CAAC,UAAU,UAAU;;AAGxC,IAAA,MAAM,GAAG,MAAM,CAAC,KAAK,6EAAC;;AAGtB,IAAA,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,mFAAC;;AAGzB,IAAA,WAAW,GAAG,MAAM,CAAC,EAAE,kFAAC;;AAGhB,IAAA,iBAAiB,GAAG,MAAM,CAAC,KAAK,wFAAC;;AAGjC,IAAA,WAAW,GAAG,IAAI,GAAG,EAAa;;AAG3C,IAAA,SAAS,GAAkC,MAAK,EAAE,CAAC;AACnD,IAAA,UAAU,GAAe,MAAK,EAAE,CAAC;;;;;AAOhC,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE,4FAAC;;AAGnF,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,MAAM,OAAO,GAAG,CAAC,aAAa,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM,EAAE;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACpD,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC;QAC1D,IAAI,IAAI,CAAC,OAAO,EAAE;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC;QACxD,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC;QACvE,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC;AAC1D,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACvD,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,IAAA,CAAC,qFAAC;;AAGO,IAAA,SAAS,GAAG,QAAQ,CAAgB,MAAK;QAChD,MAAM,MAAM,GAAkB,EAAE;QAChC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;AAC/B,YAAA,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE;gBACnB,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,iBAAA,CAAC;AACF,gBAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE;AAC9B,oBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnE;YACF;iBAAO;AACL,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;YAC1C;QACF;AACA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,gFAAC;;AAGO,IAAA,aAAa,GAAG,QAAQ,CAAgB,MAAK;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;AACvC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI,CAAC,SAAS,EAAE;AAEnC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW;AAC5B,cAAE;iBACG,KAAK,CAAC,QAAQ;AACd,iBAAA,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;iBACjC,MAAM,CAAC,OAAO;AACnB,cAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;;AAGzB,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU;AAC1C,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;AACvB,YAAA,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;gBACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACtC,gBAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClD,gBAAA,IAAI,KAAK,IAAI,IAAI,CAAC,YAAY;AAAE,oBAAA,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;YACzE;QACF;AAEA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AAC1B,YAAA,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE;gBACvB,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;YACzC;YACA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AACtC,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC7C,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,oFAAC;;IAGO,mBAAmB,GAAG,QAAQ,CAAM,MAC3C,IAAI,CAAC,aAAa;AACf,SAAA,MAAM,CAAC,CAAC,CAAC,KAAyB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ;SAChE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACvB;;AAGQ,IAAA,YAAY,GAAG,QAAQ,CAAS,MAAK;AAC5C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;QACxB,IAAI,GAAG,IAAI,IAAI;AAAE,YAAA,OAAO,EAAE;AAC1B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAoB;AAC5D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW;AAE9B,QAAA,MAAM,SAAS,GAAG,CAAC,CAAI,KACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;AAEnE,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AACtB,YAAA,OAAO,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACtD;AACA,QAAA,OAAO,SAAS,CAAC,GAAG,CAAC;AACvB,IAAA,CAAC,mFAAC;;AAGO,IAAA,aAAa,GAAG,QAAQ,CAAS,MAAK;AAC7C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;QACxB,IAAI,GAAG,IAAI,IAAI;AAAE,YAAA,OAAO,CAAC;AACzB,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC,MAAM;QACzC,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,OAAO,CAAC;AAC7B,QAAA,OAAO,CAAC;AACV,IAAA,CAAC,oFAAC;;IAGO,SAAS,GAAG,QAAQ,CAC3B,MACE,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC;QACxB,CAAC,IAAI,CAAC,qBAAqB,EAAE;AAC7B,QAAA,CAAC,IAAI,CAAC,QAAQ,EAAE,gFACnB;;AAGQ,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM;QACzC,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,YAAY,EAAE,kBAAkB,CAAC;AAC3D,IAAA,CAAC,qFAAC;AAEF;;;;AAIG;AACM,IAAA,sBAAsB,GAAG,CAAC,YAAoB,KAAa;AAClE,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,EAAE;AACvC,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AAClC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS;aAC5B,MAAM,CACL,CAAC,CAAC,KAAyB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,QAAQ;aAE7F,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AACtB,QAAA,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACrF,IAAA,CAAC;;AAGQ,IAAA,0BAA0B,GAAG,CAAC,YAAoB,KAAa;AACtE,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,EAAE;AACvC,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AAClC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS;aAC5B,MAAM,CACL,CAAC,CAAC,KAAyB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,QAAQ;aAE7F,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AACtB,QAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM;QACnF,OAAO,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,QAAQ,CAAC,MAAM;AAC7D,IAAA,CAAC;;;;AAMQ,IAAA,gBAAgB,GAAwB;AAC/C,QAAA;AACE,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;AACD,QAAA;AACE,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,CAAC,CAAC;AACZ,SAAA;KACF;;AAGQ,IAAA,YAAY,GAAG,MAAM,CAAS,CAAC,mFAAC;;;;AAMzC,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;AACxB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AACrB,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,YAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;AACvB,gBAAA,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;AACtB,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;gBAC9C;YACF;AACF,QAAA,CAAC,CAAC;;;;QAKF,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,kCAAkC,CAAC,EAAE;gBACrE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;AAC9C,gBAAA,KAAK,CAAC,YAAY,CAAC,2BAA2B,EAAE,EAAE,CAAC;gBACnD,KAAK,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;SAiBnB;gBACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;YACnC;AACF,QAAA,CAAC,CAAC;IACJ;;;;IAMA,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,qBAAqB,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpE;QACF;QACA,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;AACpB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAClB,IAAI,CAAC,UAAU,EAAE;IACnB;;IAGA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,EAAE;IACd;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,CAAC,KAAK,EAAE;QACd;aAAO;YACL,IAAI,CAAC,IAAI,EAAE;QACb;IACF;;;;AAMA,IAAA,gBAAgB,CAAC,KAAoB,EAAA;QACnC,IAAI,IAAI,CAAC,qBAAqB,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;;AAGrD,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACjB,YAAA,QAAQ,KAAK,CAAC,GAAG;AACf,gBAAA,KAAK,WAAW;AAChB,gBAAA,KAAK,SAAS;AACd,gBAAA,KAAK,MAAM;AACX,gBAAA,KAAK,KAAK;AACV,gBAAA,KAAK,OAAO;AACV,oBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;oBAC1B;AACF,gBAAA,KAAK,GAAG;AACN,oBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;oBAC1B;AACF,gBAAA,KAAK,QAAQ;oBACX,KAAK,CAAC,cAAc,EAAE;oBACtB,IAAI,CAAC,KAAK,EAAE;oBACZ;AACF,gBAAA,KAAK,KAAK;oBACR,IAAI,CAAC,KAAK,EAAE;oBACZ;;QAEN;AAEA,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,GAAG;gBACN,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,IAAI,EAAE;gBACX;AACF,YAAA,KAAK,WAAW;AAChB,YAAA,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,IAAI,EAAE;gBACX;AACF,YAAA,KAAK,QAAQ;gBACX;AACF,YAAA,KAAK,KAAK;gBACR;AACF,YAAA,KAAK,MAAM;AACX,YAAA,KAAK,KAAK;gBACR,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,IAAI,EAAE;gBACX;;IAEN;;;;AAMA,IAAA,cAAc,CAAC,KAAoB,EAAA;AACjC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;QAClC,MAAM,gBAAgB,GAAG;AACtB,aAAA,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC9B,aAAA,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,CAAE,IAAsB,CAAC,QAAQ;aAC5E,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AAEpB,QAAA,QAAQ,KAAK,CAAC,GAAG;YACf,KAAK,WAAW,EAAE;gBAChB,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;gBAC/B,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC;AACzE,gBAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,oBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC3B,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,CAAC,IAAI,CAAC;gBACxC;gBACA;YACF;YACA,KAAK,SAAS,EAAE;gBACd,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;gBAC/B,MAAM,IAAI,GACR,CAAC,GAAG,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AACpD,oBAAA,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/C,gBAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,oBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC3B,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,CAAC,IAAI,CAAC;gBACxC;gBACA;YACF;AACA,YAAA,KAAK,OAAO;YACZ,KAAK,GAAG,EAAE;;AAER,gBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAK,KAAK,CAAC,MAAsB,CAAC,OAAO,KAAK,OAAO,EAAE;oBAC1E;gBACF;AACA,gBAAA,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE;AAC9B,gBAAA,IAAI,EAAE,IAAI,CAAC,EAAE;AACX,oBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;oBACtB,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;wBACxC,KAAK,CAAC,cAAc,EAAE;AACtB,wBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAU,CAAC;oBACpC;gBACF;gBACA;YACF;YACA,KAAK,MAAM,EAAE;gBACX,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,gBAAgB,CAAC,MAAM,EAAE;oBAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;oBAC1C,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;gBACvD;gBACA;YACF;YACA,KAAK,KAAK,EAAE;gBACV,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,gBAAgB,CAAC,MAAM,EAAE;oBAC3B,MAAM,IAAI,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;AAC1D,oBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC3B,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,CAAC,IAAI,CAAC;gBACxC;gBACA;YACF;AACA,YAAA,KAAK,QAAQ;gBACX,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,KAAK,EAAE;gBACZ,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;gBACvC;AACF,YAAA,KAAK,KAAK;gBACR,IAAI,CAAC,KAAK,EAAE;gBACZ;;IAEN;;;;AAMA,IAAA,YAAY,CAAC,WAAc,EAAA;AACzB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAC3C,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AACzD,YAAA,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,WAAW,CAAC;AACvF,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAe,CAAC;QACjC;aAAO;AACL,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;QACzC;IACF;;;;IAMA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE;AACtB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;AACrC,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS;AAClC,aAAA,MAAM,CAAC,CAAC,CAAC,KAAyB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ;aACjE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AACtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAC3C,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACrF,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa;aAC5B,MAAM,CAAC,CAAC,CAAC,KAAyB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC;aAChF,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AACtB,QAAA,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE;AAC7B,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAAE,gBAAA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAe,CAAC;IACjC;IAEA,cAAc,GAAA;AACZ,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS;AAClC,aAAA,MAAM,CAAC,CAAC,CAAC,KAAyB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ;aACjE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AAEtB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAC3C,YAAA,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7E,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAe,CAAC;QACjC;aAAO;AACL,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;AACxB,YAAA,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE;gBACnF;YACF;AACA,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB;IACF;AAEA,IAAA,OAAO,CAAC,KAAiB,EAAA;QACvB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IACzC;;;;AAMA,IAAA,aAAa,CAAC,YAAoB,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CACnC,CAAC,CAAC,KAAuB,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,YAAY,CACtE;QACD,IAAI,OAAO,EAAE,QAAQ;YAAE;AACvB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS;aAC/B,MAAM,CACL,CAAC,CAAC,KAAyB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,QAAQ;aAE7F,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AAEtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAC3C,QAAA,IAAI,IAAS;AACb,QAAA,IAAI,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,EAAE;AAC7C,YAAA,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACvE;aAAO;AACL,YAAA,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5E,IAAI,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC;QAC/B;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAe,CAAC;IACjC;;;;AAMA,IAAA,aAAa,CAAC,KAAY,EAAA;AACxB,QAAA,MAAM,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK;AACtD,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3B;AAEA,IAAA,eAAe,CAAC,KAAoB,EAAA;AAClC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;YACxD,KAAK,CAAC,eAAe,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QAC5B;AACA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAC1B,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;QACzC;IACF;;;;IAMA,qBAAqB,GAAA;QACnB,IAAI,CAAC,KAAK,EAAE;IACd;IAEA,iBAAiB,GAAA;QACf,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;;;YAGrB,UAAU,CAAC,MAAK;gBACd,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CACnC,wDAAwD,CACzD;gBACD,KAAK,EAAE,KAAK,EAAE;AAChB,YAAA,CAAC,CAAC;QACJ;IACF;;IAGQ,oBAAoB,GAAA;AAC1B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;AACxB,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,GAAG;AAClC,QAAA,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC;AAC3C,QAAA,OAAO,EAAE;IACX;;;;AAMA,IAAA,UAAU,CAAC,GAAmB,EAAA;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;IACrB;AAEA,IAAA,gBAAgB,CAAC,EAAiC,EAAA;AAChD,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC;IACxC;;;;IAMS,aAAa,GAAG,aAAa;IAC7B,YAAY,GAAG,YAAY;IAC3B,UAAU,GAAG,YAAY;IAElC,eAAe,CAAC,MAAc,EAAE,IAAiB,EAAA;QAC/C,IAAI,aAAa,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,CAAA,QAAA,EAAW,IAAI,CAAC,KAAK,EAAE;AACvD,QAAA,OAAO,CAAA,OAAA,EAAU,IAAI,CAAC,KAAK,EAAE;IAC/B;;AAGS,IAAA,cAAc,GAAG,QAAQ,CAAM,MAAK;AAC3C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;QACxB,IAAI,GAAG,IAAI,IAAI;AAAE,YAAA,OAAO,EAAE;AAC1B,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,GAAG;QAClC,OAAO,CAAC,GAAG,CAAC;AACd,IAAA,CAAC,qFAAC;;AAGF,IAAA,gBAAgB,CAAC,WAAc,EAAA;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC/D;;;;IAMQ,mBAAmB,GAAA;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa;QAC1C,IAAI,EAAE,EAAE;AACN,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,WAAW,IAAI,EAAE,CAAC,WAAW,CAAC;QACzF;IACF;wGAnuBW,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,cAAA,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,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,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,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,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,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,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,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,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,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,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,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,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,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,KAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,SAAA,EARpB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,oBAAoB,CAAC;AACnD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzEH,69SA8QA,EAAA,MAAA,EAAA,CAAA,u8PAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3NI,mBAAmB,EAAA,QAAA,EAAA,qEAAA,EAAA,MAAA,EAAA,CAAA,2BAAA,EAAA,8BAAA,EAAA,qCAAA,EAAA,4BAAA,EAAA,4BAAA,EAAA,0BAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,8BAAA,EAAA,kCAAA,EAAA,+BAAA,EAAA,mCAAA,EAAA,mCAAA,EAAA,yBAAA,EAAA,iCAAA,EAAA,sCAAA,EAAA,gCAAA,EAAA,iCAAA,EAAA,uCAAA,EAAA,kCAAA,EAAA,yBAAA,EAAA,wCAAA,EAAA,+BAAA,EAAA,+BAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,gBAAgB,sIAChB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,gCAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,cAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,mBAAmB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,aAAa,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,QAAQ,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,YAAY,wKACZ,oBAAoB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,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,WAAA,EAAA,IAAA,EACX,aAAa,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAaJ,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBA3BhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,OAAA,EACf;wBACP,mBAAmB;wBACnB,gBAAgB;wBAChB,eAAe;wBACf,kBAAkB;wBAClB,kBAAkB;wBAClB,mBAAmB;wBACnB,aAAa;wBACb,QAAQ;wBACR,YAAY;wBACZ,oBAAoB;wBACpB,WAAW;wBACX,aAAa;qBACd,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,0BAA0B,CAAC;AACnD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,69SAAA,EAAA,MAAA,EAAA,CAAA,u8PAAA,CAAA,EAAA;AAkHqE,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,YAAY,oEAChB,UAAU,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE1L9E;;AAEG;AACG,MAAO,wBAAyB,SAAQ,gBAAgB,CAAA;AAC5D,IAAA,OAAO,YAAY,GAAG,iEAAiE;AAEvF,IAAA,MAAM,QAAQ,GAAA;QACZ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,0BAA0B,CAAC,EAAE;AACxE,QAAA,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;IAChC;AAEA,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;QAC9B,OAAO,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,MAAM;IAC9D;AAEA,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;QAC9B,OAAO,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,MAAM;IAC9D;AAEA,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,MAAM,IAAI,CAAC,KAAK,EAAE;IACpB;;AAGF;;;;;;;;;;AAUG;AACG,MAAO,kBAAmB,SAAQ,gBAAgB,CAAA;AACtD,IAAA,OAAO,YAAY,GAAG,cAAc;;AAI5B,IAAA,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC;AAClD,IAAA,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,qBAAqB,CAAC;IAChE,eAAe,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC,kBAAkB,CAC5E,kDAAkD,CACnD;;AAID,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE;YAAE;AACzB,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE;AACxC,QAAA,MAAM,OAAO,CAAC,KAAK,EAAE;IACvB;AAEA,IAAA,MAAM,KAAK,GAAA;AACT,QAAA,IAAI,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YAAE;AAC5B,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE;QACxC,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;IACxC;AAEA,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE;QACxC,OAAO,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,MAAM;IACjE;;AAIA,IAAA,MAAM,eAAe,GAAA;AACnB,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE;AACxC,QAAA,OAAO,OAAO,CAAC,IAAI,EAAE;IACvB;AAEA,IAAA,MAAM,cAAc,GAAA;QAClB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,EAAE;AAChF,QAAA,OAAO,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE;IAC9C;;AAIA,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,MAAM,IAAI,CAAC,IAAI,EAAE;QACjB,OAAO,IAAI,CAAC,0BAA0B,EAAE,CAAC,aAAa,CAAC,wBAAwB,CAAC,EAAE;IACpF;IAEA,MAAM,YAAY,CAAC,MAAyB,EAAA;AAC1C,QAAA,MAAM,IAAI,CAAC,IAAI,EAAE;AACjB,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE;AACvC,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,MAAM,CAAC,KAAK,EAAE;AAC3C,gBAAA,MAAM,GAAG,CAAC,MAAM,EAAE;gBAClB;YACF;QACF;QACA,MAAM,IAAI,KAAK,CAAC,CAAA,mBAAA,EAAsB,MAAM,CAAC,KAAK,CAAA,WAAA,CAAa,CAAC;IAClE;;AAIA,IAAA,MAAM,KAAK,GAAA;AACT,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE;AAC7C,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC;AAC/E,QAAA,MAAM,QAAQ,CAAC,KAAK,EAAE;IACxB;IAEA,MAAM,MAAM,CAAC,KAAa,EAAA;AACxB,QAAA,MAAM,IAAI,CAAC,IAAI,EAAE;AACjB,QAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE;AAC1C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC;AAC7E,QAAA,MAAM,KAAK,CAAC,KAAK,EAAE;AACnB,QAAA,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC7B;;AAIA,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAC/C;AAEA,IAAA,MAAM,SAAS,GAAA;AACb,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IAC9C;AAEA,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAC/C;AAEA,IAAA,MAAM,gBAAgB,GAAA;QACpB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,EAAE;AACxE,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,CAAC;AACtB,QAAA,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AACjC,QAAA,OAAO,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;IAC3C;;;MCvIW,gBAAgB,CAAA;AAClB,IAAA,WAAW,GAAG,MAAM,CAAuB,IAAI,GAAG,EAAE,kFAAC;AACrD,IAAA,UAAU,GAAG,MAAM,CAAuB,IAAI,GAAG,EAAE,iFAAC;AACpD,IAAA,aAAa,GAAG,MAAM,CAAgB,EAAE,oFAAC;AACzC,IAAA,cAAc,GAAG,MAAM,CAA2B,IAAI,qFAAC;AAEhE;;;;AAIG;AACM,IAAA,eAAe,GAAG,MAAM,CAA+B,IAAI,GAAG,EAAE,sFAAC;AAEjE,IAAA,gBAAgB,GAAG,QAAQ,CAAgB,MAAK;QACvD,MAAM,MAAM,GAAkB,EAAE;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC;AACpD,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,uFAAC;AAEM,IAAA,QAAQ,CACd,KAAoB,EACpB,MAAqB,EACrB,KAAa,EACb,QAAgC,EAAA;AAEhC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,KAAK;gBACL,QAAQ;gBACR,YAAY,EAAE,KAAK,CAAC,MAAM;gBAC1B,QAAQ,EAAE,CAAC,GAAG,CAAC;AAChB,aAAA,CAAC;YACF,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAChF,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;YAC1D;QACF;IACF;AAEA,IAAA,WAAW,CAAC,GAAyB,EAAA;QACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC;AAEA,IAAA,cAAc,CAAC,EAAmB,EAAA;QAChC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AAClC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;AAC7B,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AAChB,gBAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjB;iBAAO;AACL,gBAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACd;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,aAAa,CAAC,IAAiB,EAAA;AAC7B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AACnD,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;AACpC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI;YAC/C,IAAI,MAAM,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE;AAC7C,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AACxB,gBAAA,OAAQ,MAAyB,CAAC,IAAgB,CAAC,CAAC,IAAI,CACtD,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,CAAC,QAAQ,KAAI;oBACf,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,QAAyB,CAAC;AACtD,oBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,CAAC,CAAC,EACF,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CACa;YAClC;QACF;AACA,QAAA,OAAO,EAAE,CAAC,SAAS,CAAC;IACtB;AAEA,IAAA,UAAU,CAAC,EAAmB,EAAA;QAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACpD;AAEA,IAAA,aAAa,CAAC,EAAmB,EAAA;QAC/B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;AAC3B,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACf,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;IAEA,aAAa,CAAC,MAAuB,EAAE,QAAuB,EAAA;QAC5D,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9E,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AAClC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;AAChB,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,UAAU,CAChB,KAAoB,EACpB,QAAyB,EACzB,QAAuB,EAAA;AAEvB,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACrB,YAAA,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,EAAE;AACrB,gBAAA,OAAO,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE;YAC3B;AACA,YAAA,IAAI,CAAC,CAAC,QAAQ,EAAE;AACd,gBAAA,OAAO,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;YAC5E;AACA,YAAA,OAAO,CAAC;AACV,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,QAAQ,CAAC,MAAuB,EAAA;QAC9B,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC;IAC9D;IAEQ,kBAAkB,CAAC,KAAoB,EAAE,EAAmB,EAAA;AAClE,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE;AAAE,gBAAA,OAAO,IAAI;AAC/B,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAyB,EAAE,EAAE,CAAC;AACzE,gBAAA,IAAI,KAAK;AAAE,oBAAA,OAAO,KAAK;YACzB;QACF;AACA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,YAAY,CAAC,MAAuB,EAAA;AAClC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACpC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC;AACpD,QAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,IAAI;IAChC;wGArIW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAhB,gBAAgB,EAAA,CAAA;;4FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B;;;MCCY,oBAAoB,CAAA;AACd,IAAA,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC/C,IAAA,WAAW,GAAG,MAAM,CAAuB,IAAI,GAAG,EAAE,kFAAC;AACrD,IAAA,aAAa,GAAG,MAAM,CAAoB,MAAM,oFAAC;AACjD,IAAA,SAAS,GAAG,MAAM,CAAgB,EAAE,gFAAC;AACrC,IAAA,WAAW,GAAG,MAAM,CAA0C,IAAI,kFAAC;AAE5E,IAAA,cAAc,CAAC,GAAyB,EAAA;AACtC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,IAAI,CAAC,IAAI,EAAE;YACT,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAClC;QACF;AACA,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB;AACvC,QAAA,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;YACpB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,EAAiB,CAAC;YACrD,IAAI,IAAI,CAAC,IAAI,CAAC;AAAE,gBAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;AAEA,IAAA,OAAO,CAAC,IAAuB,EAAA;AAC7B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9B;AAEA,IAAA,YAAY,CAAC,KAAoB,EAAA;AAC/B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;IAC3B;AAEA,IAAA,YAAY,CAAC,EAA2C,EAAA;AACtD,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1B;AAEA,IAAA,SAAS,CAAC,IAAiB,EAAA;AACzB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;IACjC;AAEA,IAAA,UAAU,CAAC,EAAmB,EAAA;QAC5B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACnC;AAEA;;;;;;AAMG;AACH,IAAA,UAAU,CAAC,IAAiB,EAAA;AAC1B,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ;IACxB;AAEA;;;;;AAKG;AACH,IAAA,eAAe,CAAC,IAAiB,EAAA;AAC/B,QAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,KAAK;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACxC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;AAC3E,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AACxC,QAAA,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3D;AAEA;;;;AAIG;AACH,IAAA,iBAAiB,CAAC,IAAiB,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,OAAO,EAAE;YACpC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC;QACA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;;AAE7C,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC;AACA,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzD;AAEA;;AAEG;AACH,IAAA,UAAU,CAAC,IAAiB,EAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAAE;AAC3B,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,OAAO,EAAE;AACpC,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC;QACF;QACA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACxC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AAClC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;AAC7C,YAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;;gBAEvB,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,oBAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC;iBAAO;AACL,gBAAA,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtC;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;AACH,IAAA,YAAY,CAAC,IAAiB,EAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,OAAO,EAAE;YACpC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AAClC,gBAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;AAC7B,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACpB,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;YACF;QACF;QACA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACxC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AAClC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;;AAE7B,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;;YAEpB,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACxE,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,UAAU,CAAC,IAAiB,EAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACzB;aAAO;AACL,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QACvB;IACF;AAEA;;;;;AAKG;AACH,IAAA,yBAAyB,CAAC,QAAyB,EAAA;AACjD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAiB,CAAC;AACjE,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE;AAEjE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;AACnC,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC;AAE9B,QAAA,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;;AAE1B,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;AACrB,YAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnC,gBAAA,IAAI,CAAE,KAAqB,CAAC,QAAQ,EAAE;AACpC,oBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,KAAoB,CAAC,CAAC;AACjF,oBAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AAC5B,wBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACpB;yBAAO;AACL,wBAAA,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC3C;gBACF;YACF;QACF;aAAO;;YAEL,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxE;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;AAEA;;;;;;AAMG;AACK,IAAA,eAAe,CACrB,IAAiB,EACjB,IAAA,GAAsC,EAAE,EAAA;QAExC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACxD,YAAA,OAAO,EAAE;QACX;QACA,MAAM,GAAG,GAA2B,EAAE;AACtC,QAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,EAAE;AACrC,YAAA,IAAI,CAAC,IAAI,CAAC,eAAe,IAAK,KAAqB,CAAC,QAAQ;gBAAE;YAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,KAAoB,CAAC;YAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC;AAC7D,YAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;;AAE5B,gBAAA,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAC5B;iBAAO;AACL,gBAAA,GAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;YAC1B;QACF;AACA,QAAA,OAAO,GAAG;IACZ;AAEA;;AAEG;AACK,IAAA,wBAAwB,CAAC,IAAiB,EAAA;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACxC,MAAM,GAAG,GAA2B,EAAE;QACtC,IAAI,CAAC,QAAQ,CAAC,QAAQ;AAAE,YAAA,OAAO,GAAG;AAClC,QAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,EAAE;YACrC,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,KAAoB,CAAC;AAC7D,YAAA,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;QAC3D;AACA,QAAA,OAAO,GAAG;IACZ;AAES,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,qFAAC;AAE7D,IAAA,YAAY,CAAC,IAAiB,EAAA;AACpC,QAAA,OAAQ,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAiB,IAAI,IAAI;IACrE;wGA/NW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAApB,oBAAoB,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;;MCEY,mBAAmB,CAAA;AACb,IAAA,KAAK,GAAG,MAAM,CAAsB,gBAAgB,CAAC;AACrD,IAAA,SAAS,GAAG,MAAM,CAA0B,oBAAoB,CAAC;AAEzE,IAAA,aAAa,GAAG,MAAM,CAAyB,IAAI,oFAAC;IAE7D,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,IAAI;YAAE;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE;AAC1C,QAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AACnB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC;IACF;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE;AAC1C,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE;AAEvB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE;AACtC,QAAA,MAAM,YAAY,GAAG,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,GAAG,CAAC,CAAC;AAE7F,QAAA,IAAI,YAAY,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE;AAEjE,QAAA,MAAM,OAAO,GAA4B,IAAI,CAAC,YAAY,CAAC;AAE3D,QAAA,QAAQ,KAAK,CAAC,GAAG;YACf,KAAK,WAAW,EAAE;gBAChB,KAAK,CAAC,cAAc,EAAE;gBACtB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;AACnC,gBAAA,IAAI,IAAI;oBAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C;YACF;YAEA,KAAK,SAAS,EAAE;gBACd,KAAK,CAAC,cAAc,EAAE;gBACtB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;AACnC,gBAAA,IAAI,IAAI;oBAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C;YACF;YAEA,KAAK,YAAY,EAAE;gBACjB,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,OAAO;oBAAE;AACd,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;AAEhE,gBAAA,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAClD,oBAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,IAAmB,CAAC,CAAC,SAAS,EAAE;gBACnE;qBAAO,IAAI,UAAU,EAAE;oBACrB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;oBACzC,IAAI,UAAU,IAAI,UAAU,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE;wBAClD,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7C;gBACF;gBACA;YACF;YAEA,KAAK,WAAW,EAAE;gBAChB,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,OAAO;oBAAE;AACd,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAEhE,IAAI,UAAU,EAAE;oBACd,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5C;AAAO,qBAAA,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE;AACpC,oBAAA,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC3C;gBACA;YACF;YAEA,KAAK,OAAO,EAAE;gBACZ,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,OAAO;oBAAE;gBACd,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACnC,oBAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,IAAmB,CAAC,CAAC,SAAS,EAAE;gBACnE;gBACA;YACF;YAEA,KAAK,GAAG,EAAE;gBACR,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,OAAO;oBAAE;gBACd,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,KAAK,MAAM,EAAE;oBAC7C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,IAA8B,CAAC;gBACnE;gBACA;YACF;YAEA,KAAK,GAAG,EAAE;gBACR,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,OAAO;oBAAE;AACd,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC;gBACnC;YACF;YAEA,KAAK,MAAM,EAAE;gBACX,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC;YACF;YAEA,KAAK,KAAK,EAAE;gBACV,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD;YACF;;IAEJ;AAEQ,IAAA,kBAAkB,CAAC,EAAmB,EAAA;AAC5C,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,qBAAqB,CAAC,MAAK;YACzB,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAc,CAAA,oBAAA,EAAuB,EAAE,CAAA,EAAA,CAAI,CAAC;YAC7E,EAAE,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;YACnC,EAAE,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC1C,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,YAAY,CAAC,IAAyB,EAAA;AAC5C,QAAA,QACE,IAAI,CAAC,WAAW,KAAK,KAAK;aACzB,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC;IAE1F;IAEQ,eAAe,CAAC,IAA4B,EAAE,OAAoB,EAAA;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAC1B,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CACpE;AACD,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;AACrF,gBAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,IAAmB,CAAC,CAAC,SAAS,EAAE;YACnE;QACF;IACF;wGArIW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAnB,mBAAmB,EAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B;;;MCoCY,oBAAoB,CAAA;AACZ,IAAA,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACvC,IAAA,gBAAgB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAC/C,IAAA,eAAe,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAEvD,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,0EAAe;AACpC,IAAA,KAAK,GAAG,KAAK,CAAS,CAAC,4EAAC;AACxB,IAAA,aAAa,GAAG,KAAK,CAAoB,MAAM,oFAAC;AAChD,IAAA,UAAU,GAAG,KAAK,CAAS,EAAE,iFAAC;AAC9B,IAAA,YAAY,GAAG,KAAK,CAAyC,IAAI,mFAAC;AAClE,IAAA,aAAa,GAAG,KAAK,CAAyD,IAAI,oFAAC;AACnF,IAAA,YAAY,GAAG,KAAK,CAA2B,IAAI,mFAAC;AACpD,IAAA,SAAS,GAAG,KAAK,CAAgB,EAAE,gFAAC;AACpC,IAAA,IAAI,GAAG,KAAK,CAAU,KAAK,2EAAC;AAC5B,IAAA,YAAY,GAAG,KAAK,CAAS,iBAAiB,mFAAC;IAC/C,YAAY,GAAG,MAAM,EAAmB;IACxC,eAAe,GAAG,MAAM,EAAwB;IAEhD,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IAChF,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAC9E,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,iFAAC;AAC1E,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,iFAAC;AACjF,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,sFAAC;IACpF,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,gFAAC;AACnF,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,MAAM;AAAE,YAAA,OAAO,KAAK;QACjD,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACrD,IAAA,CAAC,mFAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,QACE,IAAI,CAAC,WAAW,KAAK,KAAK;aACzB,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC;AAE1F,IAAA,CAAC,kFAAC;AAEO,IAAA,gBAAgB,GAAG,QAAQ,CAAyC,MAAK;QAChF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI;QAC7B,IAAI,IAAI,EAAE;AACR,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE;AACtC,YAAA,IAAI,SAAS,GAAG,IAAI,CAAC;AAAE,gBAAA,OAAO,SAAS,CAAC,IAAI,CAAC;QAC/C;AACA,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE;AAC5B,IAAA,CAAC,uFAAC;AAEO,IAAA,eAAe,GAAG,QAAQ,CAAqB,OAAO;AAC7D,QAAA,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE;AACtB,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,QAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,QAAA,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;AACvC,QAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;AAC3B,QAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC9B,KAAA,CAAC,sFAAC;AAEM,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,+EAAC;AAE3D,IAAA,iBAAiB,GAAG,QAAQ,CAAgB,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,wFAAC;IAErF,SAAS,GAAG,sBAAsB;AAElC,IAAA,gBAAgB,GAAG,QAAQ,CAAgB,MAAK;QACvD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CACjC,IAAI,CAAC,YAAY,CAAC,aAAa,EAAmB,EAClD,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CACf;AACD,QAAA,QAAQ,YAAY,EAAE,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,IAAI,EAAE;AAC9D,IAAA,CAAC,uFAAC;IAEF,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;AACtD,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAc,CAAC,CAAC,SAAS,EAAE;AACpE,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACxC;AAEA,IAAA,gBAAgB,CAAC,KAAY,EAAA;QAC3B,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;AACvB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;QAC1D,IAAI,OAAO,EAAE;YACX,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/C;aAAO;YACL,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjD;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC;IACnE;AAEA,IAAA,aAAa,CAAC,KAAY,EAAA;AACxB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAC1D,QAAA,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;QACnC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAC7C,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC;IACnE;IAEQ,SAAS,CAAC,KAAoB,EAAE,EAAmB,EAAA;AACzD,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE;AAAE,gBAAA,OAAO,IAAI;AAC/B,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAyB,EAAE,EAAE,CAAC;AAChE,gBAAA,IAAI,KAAK;AAAE,oBAAA,OAAO,KAAK;YACzB;QACF;AACA,QAAA,OAAO,IAAI;IACb;wGA7GW,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,mgDCzCjC,+hGA4FA,EAAA,MAAA,EAAA,CAAA,6zDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDnDa,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,cAAA,EAAA,WAAA,EAAA,MAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAT7B,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,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,WAAA,EAAA,IAAA,EACX,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,oBAAoB,gJACpB,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,aAAa,iFACb,cAAc,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGL,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAhBhC,SAAS;+BACE,eAAe,EAAA,eAAA,EAGR,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAA,OAAA,EACxB;wBACP,WAAW;wBACX,gBAAgB;wBAChB,oBAAoB;wBACpB,iBAAiB;wBACjB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;AACf,qBAAA,EAAA,QAAA,EAAA,+hGAAA,EAAA,MAAA,EAAA,CAAA,6zDAAA,CAAA,EAAA;;;MEjBU,4BAA4B,CAAA;AAEX,IAAA,WAAA;IADnB,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAC/B,IAAA,WAAA,CAA4B,WAAyC,EAAA;QAAzC,IAAA,CAAA,WAAW,GAAX,WAAW;IAAiC;wGAF7D,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,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,CAAA;;4FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBADxC,SAAS;mBAAC,EAAE,QAAQ,EAAE,0BAA0B,EAAE;;MActC,gBAAgB,CAAA;AACR,IAAA,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACvC,IAAA,gBAAgB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAC/C,IAAA,eAAe,GAAG,MAAM,CAAC,mBAAmB,CAAC;;AAGvD,IAAA,KAAK,GAAG,KAAK,CAAgB,EAAE,4EAAC;AAChC,IAAA,aAAa,GAAG,KAAK,CAAoB,MAAM,oFAAC;AAChD,IAAA,WAAW,GAAG,KAAK,CAAuB,IAAI,GAAG,EAAE,kFAAC;AACpD,IAAA,WAAW,GAAG,KAAK,CAAuB,IAAI,GAAG,EAAE,kFAAC;AACpD,IAAA,YAAY,GAAG,KAAK,CAA2B,IAAI,mFAAC;AACpD,IAAA,SAAS,GAAG,KAAK,CAA0C,IAAI,gFAAC;AAChE,IAAA,UAAU,GAAG,KAAK,CAAS,EAAE,iFAAC;AAC9B,IAAA,aAAa,GAAG,KAAK,CAAmB,MAAM,oFAAC;AAC/C,IAAA,sBAAsB,GAAG,KAAK,CAAS,GAAG,6FAAC;AAC3C,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,gFAAC;AAC7B,IAAA,cAAc,GAAG,KAAK,CAAS,OAAO,qFAAC;;AAGvC,IAAA,gBAAgB,GAAG,YAAY,CAAC,4BAA4B,uFAAC;AAC7D,IAAA,eAAe,GAAG,eAAe,CAAC,4BAA4B,sFAAC;AAE/D,IAAA,YAAY,GAAG,QAAQ,CAAyC,MAAK;AAC5E,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE;AACnC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9C,QAAA,QAAQ,UAAU,EAAE,WAAW,IAAI,IAAI;AACzC,IAAA,CAAC,mFAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAyD,MAAK;AAC7F,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5C,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QACnC,OAAO,MAAM,CAAC,WAAW,CACvB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAG,EAAE,CAAC,CAAC,WAA8C,CAAC,CAAC,CAChF;AACH,IAAA,CAAC,oFAAC;;IAGO,iBAAiB,GAAG,MAAM,EAAwB;IAClD,eAAe,GAAG,MAAM,EAAwB;AAEhD,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;QACjC,IAAI,IAAI,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;QAC9B,IAAI,IAAI,KAAK,KAAK;AAAE,YAAA,OAAO,KAAK;AAChC,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAE;AACpF,IAAA,CAAC,uFAAC;IAEO,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEpD,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAgB,CAAC;AACjE,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACnD,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC1D,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;AACrD,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAgB,CAAC;AAChE,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAChC,IAAI,CAAC,SAAS,EAA0C,CACzD;AACH,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAA2B,CAAC;AACpF,QAAA,CAAC,CAAC;;;;AAKF,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmB;QAC5C,MAAM,CAAC,MAAK;YACV,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE;AAClD,YAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,KAAK,UAAU;gBAAE;AAC1D,YAAA,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE;AAC7B,gBAAA,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAAE;AAC7B,gBAAA,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AACvB,gBAAA,IAAI,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,QAAQ,CAAC;YAC3D;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;QAChC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE;AAC5D,QAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE;AAC3D,QAAA,IAAI,aAAa,KAAK,YAAY,EAAE;AAClC,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC;QACzC;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE;IAClC;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IACvE;AAEA,IAAA,iBAAiB,CAAC,GAAyB,EAAA;AACzC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;IAChC;IAEA,MAAM,UAAU,CAAC,IAA4B,EAAA;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE;AACjD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACxC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;YACtB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAoB;AAClE,YAAA,IAAI,CAAC,IAAI;gBAAE;;AAGX,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AAChD,gBAAA,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,MAAM,CAAC;AACxC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;;AAErE,gBAAA,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC;YACrD;;YAGA,IAAI,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;AACzC,gBAAA,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;AACpC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;;AAErE,gBAAA,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC;AACnD,gBAAA,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAE,MAAyB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrF,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,EAAE,QAAsB,CAAC;AAC/D,gBAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC;;AAEvC,gBAAA,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC;YACrD;QACF;AACA,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IACvE;AAEA,IAAA,YAAY,CAAC,MAAuB,EAAA;QAClC,UAAU,CAAC,MAAK;YACd,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAc,CAAA,oBAAA,EAAuB,MAAM,CAAA,EAAA,CAAI,CAAC;AACjF,YAAA,EAAE,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC7D,QAAA,CAAC,CAAC;IACJ;IAEA,SAAS,GAAA;QACP,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;QACjD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAClD,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC;QACrC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9C;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACxC;IAEA,SAAS,CAAC,MAAc,EAAE,IAAiB,EAAA;QACzC,OAAO,IAAI,CAAC,EAAE;IAChB;IAEA,aAAa,CAAC,MAAc,EAAE,IAA+C,EAAA;AAC3E,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE;IACrB;wGA9KW,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,kqDAFhB,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAqB/B,4BAA4B,qFAC1B,4BAA4B,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvDzE,ygDA6CA,EAAA,MAAA,EAAA,CAAA,qRAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDbY,oBAAoB,uPAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,uCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,gCAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGpC,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAR5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,mBAGH,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,oBAAoB,EAAE,eAAe,CAAC,aACrC,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,ygDAAA,EAAA,MAAA,EAAA,CAAA,qRAAA,CAAA,EAAA;AAqB/B,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,4BAA4B,oGAC1B,4BAA4B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEvDzE;;AAEG;;;;"}