{"version":3,"file":"ngx-t-forms-calculated-field-rules.component-CwI-WEX7.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/calculated-field-rules/formula-tex.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/calculated-field-rules/math-preview.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/calculated-field-rules/calculated-field-rules.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/calculated-field-rules/calculated-field-rules.component.html"],"sourcesContent":["import { parse } from 'mathjs';\r\n\r\n/** Outcome of parsing a user-typed infix expression. */\r\nexport interface FormulaParseResult {\r\n  /** LaTeX rendering of the expression, or `null` when it is empty/invalid. */\r\n  readonly tex: string | null;\r\n  /** A non-technical validation message, or `null` when the expression is valid (or empty). */\r\n  readonly error: string | null;\r\n}\r\n\r\n/**\r\n * Parses a strictly-infix expression (the format `math.evaluate` consumes) and,\r\n * when it is syntactically valid, returns its LaTeX form for KaTeX to render.\r\n *\r\n * The expression is never rewritten — what the user types is what gets stored\r\n * and later evaluated by mathjs. This only *reads* it to derive a preview and a\r\n * friendly validity message; an empty expression is treated as \"not yet valid\"\r\n * rather than an error.\r\n */\r\nexport function parseInfixFormula(expression: string): FormulaParseResult {\r\n  const trimmed = expression.trim();\r\n  if (!trimmed) {\r\n    return { tex: null, error: null };\r\n  }\r\n  try {\r\n    return { tex: parse(trimmed).toTex(), error: null };\r\n  } catch (error) {\r\n    return { tex: null, error: friendlyMessage(error) };\r\n  }\r\n}\r\n\r\n/** Maps mathjs' technical parser errors onto guidance a non-technical user can act on. */\r\nfunction friendlyMessage(error: unknown): string {\r\n  const raw = error instanceof Error ? error.message : '';\r\n  if (/end of expression/i.test(raw)) {\r\n    return 'The equation looks unfinished — add the missing number or variable.';\r\n  }\r\n  if (/parenthesis|bracket/i.test(raw)) {\r\n    return 'Check that every opening bracket \"(\" has a matching closing bracket \")\".';\r\n  }\r\n  if (/value expected/i.test(raw)) {\r\n    return 'An operator (like + or ×) is missing a number or variable next to it.';\r\n  }\r\n  if (/unexpected/i.test(raw)) {\r\n    return 'There is an unexpected symbol in the equation.';\r\n  }\r\n  return 'This equation is not valid yet.';\r\n}\r\n","import {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  ElementRef,\r\n  PLATFORM_ID,\r\n  ViewEncapsulation,\r\n  computed,\r\n  effect,\r\n  inject,\r\n  input,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport katex from 'katex';\r\n\r\nimport { parseInfixFormula } from './formula-tex';\r\n\r\n/**\r\n * Read-only \"natural maths\" preview of a strictly-infix expression.\r\n *\r\n * It parses the expression with mathjs and renders the result as MathML via\r\n * KaTeX (no stylesheet required — the browser draws the glyphs natively). The\r\n * expression itself is never modified, so what is previewed is exactly what\r\n * `math.evaluate` will later consume.\r\n *\r\n * Internal to `t-dynamic-data-edit` — not part of the library's public surface.\r\n */\r\n@Component({\r\n  selector: 'lib-math-preview',\r\n  template: '',\r\n  styleUrl: './math-preview.component.scss',\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  host: {\r\n    'class': 'lib-math-preview',\r\n    '[attr.data-state]': 'state()',\r\n  },\r\n})\r\nexport class MathPreviewComponent {\r\n  /** Strictly-infix expression to render (mathjs syntax, e.g. `((a+2)/(b-1))*2`). */\r\n  readonly expression = input<string>('');\r\n\r\n  /** Text shown when there is nothing to preview. */\r\n  readonly placeholder = input<string>('Nothing to preview yet');\r\n\r\n  /** `'empty'` when no expression is set, otherwise `'rendered'`. */\r\n  protected readonly state = computed<'empty' | 'rendered'>(() =>\r\n    this.expression().trim() ? 'rendered' : 'empty',\r\n  );\r\n\r\n  readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n  readonly #isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n  constructor() {\r\n    effect(() => {\r\n      const expression = this.expression().trim();\r\n      const placeholder = this.placeholder();\r\n      const element = this.#host.nativeElement;\r\n\r\n      // On the server KaTeX has no DOM to render into — fall back to plain text.\r\n      if (!this.#isBrowser) {\r\n        element.textContent = expression || placeholder;\r\n        return;\r\n      }\r\n      if (!expression) {\r\n        element.textContent = placeholder;\r\n        return;\r\n      }\r\n\r\n      const { tex } = parseInfixFormula(expression);\r\n      if (tex == null) {\r\n        // Mid-edit / not yet valid: show the raw infix until it parses cleanly.\r\n        element.textContent = expression;\r\n        return;\r\n      }\r\n      katex.render(tex, element, {\r\n        output: 'mathml',\r\n        throwOnError: false,\r\n        displayMode: true,\r\n      });\r\n    });\r\n  }\r\n}\r\n","import {\r\n  ChangeDetectionStrategy,\r\n  Component,\r\n  ElementRef,\r\n  Input,\r\n  OnDestroy,\r\n  ViewEncapsulation,\r\n  computed,\r\n  inject,\r\n  input,\r\n  output,\r\n  signal,\r\n  viewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, NgControl } from '@angular/forms';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { Subject } from 'rxjs';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport {\r\n  CalculatedFieldRules,\r\n  CalculationFunctions,\r\n  FormColumnInputs,\r\n  TableConfigurationsInterface,\r\n  calculationVariableInterface,\r\n} from 'ngx-t-forms-types';\r\n\r\nimport type { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\nimport { _isEqual } from '../../../../shared/functions/isEqual';\r\nimport { MathPreviewComponent } from './math-preview.component';\r\nimport { parseInfixFormula } from './formula-tex';\r\n\r\n/** Escapes a string for safe inclusion as a literal inside a `RegExp`. */\r\nfunction escapeRegExp(value: string): string {\r\n  return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\n/** One selectable rounding strategy shown as a chip option. */\r\ninterface RoundingOption {\r\n  readonly value: 'FLOOR' | 'CEIL' | 'ROUND';\r\n  readonly label: string;\r\n}\r\n\r\n/** One operator-palette button: the glyph shown, the infix token it inserts. */\r\ninterface OperatorKey {\r\n  /** Glyph rendered on the button. */\r\n  readonly label: string;\r\n  /** Strictly-infix token inserted into the equation (mathjs syntax). */\r\n  readonly token: string;\r\n  /** Characters to step the caret back after insertion (e.g. land inside `()`). */\r\n  readonly caretBack: number;\r\n  /** Accessible name for the button. */\r\n  readonly aria: string;\r\n}\r\n\r\n/** Live syntactic state of the equation, surfaced to the user as plain guidance. */\r\ninterface FormulaStatus {\r\n  readonly kind: 'empty' | 'valid' | 'invalid';\r\n  readonly message: string;\r\n}\r\n\r\n// ControlValueAccessor write callback. Angular types the registered change\r\n// handler as `(value: any) => void`; the alias keeps that `any` contained to one\r\n// place rather than repeating an eslint-disable on every reference.\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Angular CVA mandates an untyped change callback.\r\ntype CvaChange = (value: any) => void;\r\n\r\n/**\r\n * Internal calculated-field-rules editor implementing\r\n * `MatFormFieldControl<CalculatedFieldRules | undefined>` and\r\n * `ControlValueAccessor`.\r\n *\r\n * Rendered by `t-dynamic-data-edit`, which supplies the surrounding field label,\r\n * hint, and validation errors — so this component owns only its two modes: a\r\n * read-only formula summary (view) and a sectioned editor (edit) for the\r\n * formula, its variables, the optional formula source link, and the rounding\r\n * settings.\r\n *\r\n * NOTE: `MatFormFieldControl<T>` and `ControlValueAccessor` mandate plain\r\n * mutable `value` / `placeholder` / `required` / `disabled` / `id` members,\r\n * `@Input()` decorators on them, the `focused` / `touched` / `stateChanges` /\r\n * `onChange` / `onTouched` members, and the `useExisting` provider. These are\r\n * framework wiring, not defects — the CLAUDE.md bans on `@Input()` /\r\n * `useExisting` do not apply to MatFormFieldControl integration. Genuinely\r\n * internal state is signal-based.\r\n */\r\n@Component({\r\n  selector: 'lib-calculated-field-rules',\r\n  templateUrl: './calculated-field-rules.component.html',\r\n  styleUrls: ['./calculated-field-rules.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  encapsulation: ViewEncapsulation.Emulated,\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    MathPreviewComponent,\r\n    OverlayModule,\r\n    MatFormFieldModule,\r\n    MatInputModule,\r\n    MatSelectModule,\r\n    MatIconModule,\r\n    MatCardModule,\r\n    MatButtonModule,\r\n    MatChipsModule,\r\n  ],\r\n  providers: [{ provide: MatFormFieldControl, useExisting: CalculatedFieldRulesComponent }],\r\n  host: {\r\n    'class': 'lib-calculated-field-rules',\r\n    '[attr.aria-describedby]': 'describedBy',\r\n  },\r\n})\r\nexport class CalculatedFieldRulesComponent\r\n  implements OnDestroy, MatFormFieldControl<CalculatedFieldRules | undefined>\r\n{\r\n  static nextId = 0;\r\n\r\n  // #region MatFormFieldControl framework members (plain mutable — not signals)\r\n  @Input() placeholder = '';\r\n  @Input() required = false;\r\n  @Input() disabled = false;\r\n\r\n  readonly stateChanges = new Subject<void>();\r\n  readonly controlType = 'app-calculated-field-rules';\r\n  readonly id = `app-calculated-field-rules-${CalculatedFieldRulesComponent.nextId++}`;\r\n\r\n  focused = false;\r\n  touched = false;\r\n  describedBy = '';\r\n  // #endregion\r\n\r\n  // #region Non-MFC inputs / outputs (contract preserved exactly)\r\n  /** Owning input definition; supplies table mode and the formula-source map. */\r\n  readonly mapToData = input<FormColumnInputs | undefined>(undefined);\r\n  /** All form inputs available to bind as calculation variables. */\r\n  readonly formInputs = input<Array<FormColumnInputs>>([]);\r\n  /** Validation errors surfaced by the parent for error-state derivation. */\r\n  readonly errors = input<IConfigElementError[] | undefined>([]);\r\n\r\n  /** Retained on the contract; reserved for path-scoped value emission. */\r\n  readonly valueChange2dWithPath = output<unknown>();\r\n  /** Emits the persisted rules whenever the editor commits a new value. */\r\n  readonly valueChanged = output<CalculatedFieldRules | null>();\r\n  // #endregion\r\n\r\n  // #region Internal signal state\r\n  /** Whether the editor card is open (edit mode) versus the summary (view). */\r\n  protected readonly isEditing = signal(false);\r\n  /** Working copy edited in the card; committed to `value` on save. */\r\n  protected readonly tempValue = signal<CalculatedFieldRules>({} as CalculatedFieldRules);\r\n\r\n  /** Whether the inline `$` field-picker is open. */\r\n  protected readonly pickerOpen = signal(false);\r\n  /** Text typed after `$`, used to filter the field-picker. */\r\n  protected readonly pickerQuery = signal('');\r\n  /** Keyboard-highlighted result in the field-picker. */\r\n  protected readonly pickerActiveIndex = signal(0);\r\n\r\n  /** Index of the `$` that opened the picker, and the caret at that moment. */\r\n  #dollarIndex = -1;\r\n  #cursorPosition = 0;\r\n  // #endregion\r\n\r\n  protected readonly roundingType: readonly RoundingOption[] = [\r\n    { value: 'ROUND', label: 'Nearest' },\r\n    { value: 'FLOOR', label: 'Round down' },\r\n    { value: 'CEIL', label: 'Round up' },\r\n  ];\r\n\r\n  /** Operator palette inserted into the equation; glyphs are friendly, tokens are infix. */\r\n  protected readonly operatorKeys: readonly OperatorKey[] = [\r\n    { label: '+', token: ' + ', caretBack: 0, aria: 'Add' },\r\n    { label: '−', token: ' - ', caretBack: 0, aria: 'Subtract' },\r\n    { label: '×', token: ' * ', caretBack: 0, aria: 'Multiply' },\r\n    { label: '÷', token: ' / ', caretBack: 0, aria: 'Divide' },\r\n    { label: '( )', token: '()', caretBack: 1, aria: 'Brackets' },\r\n    { label: 'xⁿ', token: '^', caretBack: 0, aria: 'Power' },\r\n  ];\r\n\r\n  /** The equation textarea, used for caret-aware token insertion. */\r\n  protected readonly formulaInputRef =\r\n    viewChild<ElementRef<HTMLTextAreaElement>>('formulaInput');\r\n\r\n  /** Live, non-technical validity of the working equation (drives the preview banner). */\r\n  protected readonly formulaStatus = computed<FormulaStatus>(() => {\r\n    const formula = (this.tempValue().formula ?? '').trim();\r\n    if (!formula) {\r\n      return { kind: 'empty', message: 'Start building your equation below.' };\r\n    }\r\n    const { error } = parseInfixFormula(formula);\r\n    return error\r\n      ? { kind: 'invalid', message: error }\r\n      : { kind: 'valid', message: 'This equation is valid.' };\r\n  });\r\n\r\n  /** Number-typed inputs that may back a calculation variable. */\r\n  protected readonly cachedNumberInputs = computed<FormColumnInputs[]>(() =>\r\n    this.formInputs().filter(\r\n      (input) => input.dataType === 'number' || input.type === 'number',\r\n    ),\r\n  );\r\n\r\n  /** Field-picker results: number inputs filtered by the text typed after `$`. */\r\n  protected readonly pickerResults = computed<FormColumnInputs[]>(() => {\r\n    const query = this.pickerQuery().trim().toLowerCase();\r\n    const inputs = this.cachedNumberInputs();\r\n    if (!query) {\r\n      return inputs;\r\n    }\r\n    return inputs.filter(\r\n      (input) =>\r\n        input.label?.toLowerCase().includes(query) ||\r\n        input.formControlName?.toLowerCase().includes(query),\r\n    );\r\n  });\r\n\r\n  /** Every calculation function offered as a list-aggregation chip. */\r\n  protected readonly allCalculationFunction = computed<CalculationFunctions[]>(() =>\r\n    Object.values(CalculationFunctions),\r\n  );\r\n\r\n  /** True when this editor targets a table column rather than a scalar input. */\r\n  protected readonly tableMode = computed<boolean>(() => !!this.mapToData()?.tableConfig);\r\n\r\n  /** Table configuration when in table mode. */\r\n  protected readonly tableConfig = computed<TableConfigurationsInterface | undefined>(\r\n    () => this.mapToData()?.tableConfig,\r\n  );\r\n\r\n  readonly ngControl = inject(NgControl, { self: true, optional: true });\r\n  readonly #elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n  constructor() {\r\n    if (this.ngControl != null) {\r\n      this.ngControl.valueAccessor = this;\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.stateChanges.next();\r\n    this.stateChanges.complete();\r\n  }\r\n\r\n  // #region Value accessor & MatFormFieldControl logic\r\n\r\n  #value: CalculatedFieldRules | undefined;\r\n\r\n  @Input()\r\n  get value(): CalculatedFieldRules | undefined {\r\n    return this.#value;\r\n  }\r\n  set value(val: CalculatedFieldRules | undefined) {\r\n    if (_isEqual(this.#value, val)) {\r\n      return;\r\n    }\r\n    this.#value = val ? { ...val } : undefined;\r\n    this.stateChanges.next();\r\n    this.valueChanged.emit(this.#value ?? null);\r\n    this.onChange(this.#value);\r\n  }\r\n\r\n  // MatFormFieldControl reads these as plain getters during its own change\r\n  // detection, so they stay getters rather than `computed()` signals.\r\n  get empty(): boolean {\r\n    return !this.#value;\r\n  }\r\n\r\n  get shouldLabelFloat(): boolean {\r\n    return this.focused || !this.empty;\r\n  }\r\n\r\n  get errorState(): boolean {\r\n    const hasCustomError = (this.errors() ?? []).length > 0;\r\n    const hasControlError = this.ngControl?.control?.errors != null;\r\n    return (\r\n      (this.touched && (hasControlError || hasCustomError)) ||\r\n      (this.required && !this.#value)\r\n    );\r\n  }\r\n\r\n  // ControlValueAccessor — Angular registers an untyped change callback.\r\n  onChange: CvaChange = () => {};\r\n  onTouched: () => void = () => {};\r\n\r\n  writeValue(value: CalculatedFieldRules): void {\r\n    this.value = value;\r\n  }\r\n\r\n  registerOnChange(fn: CvaChange): void {\r\n    this.onChange = fn;\r\n  }\r\n\r\n  registerOnTouched(fn: () => void): void {\r\n    this.onTouched = fn;\r\n  }\r\n\r\n  setDisabledState(isDisabled: boolean): void {\r\n    this.disabled = isDisabled;\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  setDescribedByIds(ids: string[]): void {\r\n    const controlElement = this.#elementRef.nativeElement.querySelector(\r\n      '.app-calculated-field-rules',\r\n    );\r\n    controlElement?.setAttribute('aria-describedby', ids.join(' '));\r\n    this.describedBy = ids.join(' ');\r\n    this.stateChanges.next();\r\n  }\r\n\r\n  onContainerClick(): void {\r\n    if (!this.focused) {\r\n      this.focused = true;\r\n      this.stateChanges.next();\r\n    }\r\n    this.markAsTouched();\r\n  }\r\n\r\n  markAsTouched(): void {\r\n    if (!this.touched) {\r\n      this.onTouched();\r\n      this.touched = true;\r\n      this.stateChanges.next();\r\n    }\r\n  }\r\n\r\n  // #endregion\r\n\r\n  // #region Edit-mode lifecycle\r\n\r\n  protected startEdit(): void {\r\n    this.tempValue.set(\r\n      this.#value ? structuredClone(this.#value) : ({} as CalculatedFieldRules),\r\n    );\r\n    this.isEditing.set(true);\r\n    this.markAsTouched();\r\n  }\r\n\r\n  protected saveEdit(): void {\r\n    this.value = this.tempValue();\r\n    this.isEditing.set(false);\r\n  }\r\n\r\n  protected cancelEdit(): void {\r\n    this.isEditing.set(false);\r\n    this.tempValue.set({} as CalculatedFieldRules);\r\n  }\r\n\r\n  // #endregion\r\n\r\n  // #region Formula / variable editing (operates on tempValue)\r\n\r\n  protected checkIfInputCanBeLinkedToCalVariable(\r\n    currentInput: FormColumnInputs | undefined,\r\n    inputToDisable: {\r\n      formControlName: unknown;\r\n      parentInput?: unknown;\r\n      multipleInputInEditId?: unknown;\r\n    },\r\n  ): boolean {\r\n    if (!currentInput) {\r\n      return false;\r\n    }\r\n    if (currentInput.formControlName === inputToDisable.formControlName) {\r\n      return true;\r\n    }\r\n    if (!currentInput.multipleInputInEditId) {\r\n      return !!inputToDisable.parentInput || !!inputToDisable.multipleInputInEditId;\r\n    }\r\n    return false;\r\n  }\r\n\r\n  protected linkFormulaSource(event: MatSelectChange): void {\r\n    // Resetting formula to undefined intentionally during edit; persisted value\r\n    // re-validates on save.\r\n    this.tempValue.update((current) => ({\r\n      ...current,\r\n      formControlWithFormula: event.value,\r\n      formula: '',\r\n    }));\r\n  }\r\n\r\n  protected removeVariable(variableId: string): void {\r\n    const current = this.tempValue();\r\n    const variables = current.variables ?? [];\r\n    const target = variables.find((v) => v.id === variableId);\r\n    let formula = current.formula ?? '';\r\n    if (target?.variable) {\r\n      formula = formula\r\n        .replace(new RegExp(`\\\\b${escapeRegExp(target.variable)}\\\\b`, 'g'), '')\r\n        .replace(/\\s{2,}/g, ' ')\r\n        .trim();\r\n    }\r\n    this.tempValue.set({\r\n      ...current,\r\n      variables: variables.filter((v) => v.id !== variableId),\r\n      formula,\r\n    });\r\n  }\r\n\r\n  protected appendVariableToFormula(variableName: string): void {\r\n    // A variable carries no spacing of its own, so pad it only where it would\r\n    // otherwise fuse with an adjacent token (e.g. `ab` instead of `a b`).\r\n    const { before, after } = this.#caretSlices();\r\n    const lead = before.length > 0 && !/[\\s(]$/.test(before) ? ' ' : '';\r\n    const trail = after.length > 0 && !/^[\\s)]/.test(after) ? ' ' : '';\r\n    this.insertToken(`${lead}${variableName}${trail}`, trail ? 1 : 0);\r\n  }\r\n\r\n  protected setFormula(formula: string): void {\r\n    this.tempValue.update((current) => ({ ...current, formula }));\r\n  }\r\n\r\n  /**\r\n   * Inserts an infix token at the caret (or appends it when the textarea is not\r\n   * focused), then restores the caret just after the insertion. Used by both the\r\n   * operator palette and the variable chips so the equation reads naturally while\r\n   * staying strictly infix.\r\n   */\r\n  protected insertToken(token: string, caretBack = 0): void {\r\n    const element = this.formulaInputRef()?.nativeElement;\r\n    const { before, after } = this.#caretSlices();\r\n    const next = before + token + after;\r\n\r\n    this.setFormula(next);\r\n\r\n    if (!element) {\r\n      return;\r\n    }\r\n    const caret = before.length + token.length - caretBack;\r\n    // Restore focus + caret after Angular has written the new value back to the DOM.\r\n    setTimeout(() => {\r\n      element.focus();\r\n      element.setSelectionRange(caret, caret);\r\n    });\r\n  }\r\n\r\n  /** The formula split around the current caret/selection (end-of-string when unfocused). */\r\n  #caretSlices(): { before: string; after: string } {\r\n    const current = this.tempValue().formula ?? '';\r\n    const element = this.formulaInputRef()?.nativeElement;\r\n    const start = element?.selectionStart ?? current.length;\r\n    const end = element?.selectionEnd ?? current.length;\r\n    return { before: current.slice(0, start), after: current.slice(end) };\r\n  }\r\n\r\n  protected setDecimalPlaces(value: number | string | null): void {\r\n    const parsed =\r\n      value === null || value === '' ? undefined : Number(value);\r\n    this.tempValue.update((current) => ({\r\n      ...current,\r\n      decimalPlaces: parsed !== undefined && Number.isFinite(parsed) ? parsed : undefined,\r\n    }));\r\n  }\r\n\r\n  protected setRoundingMode(mode: 'FLOOR' | 'CEIL' | 'ROUND'): void {\r\n    this.tempValue.update((current) => ({ ...current, roundingMode: mode }));\r\n  }\r\n\r\n  /** Friendly label for a stored rounding mode, used in the read-only summary. */\r\n  protected roundingLabel(mode: 'FLOOR' | 'CEIL' | 'ROUND' | undefined): string {\r\n    return this.roundingType.find((option) => option.value === mode)?.label ?? 'nearest';\r\n  }\r\n\r\n  // #endregion\r\n\r\n  // #region Inline `$` field-picker & variable binding\r\n\r\n  /** Formula text changed: persist it and re-evaluate whether the `$` picker should show. */\r\n  protected onFormulaChange(value: string): void {\r\n    this.setFormula(value);\r\n    this.#syncPicker();\r\n  }\r\n\r\n  /** Caret moved (click / arrow keys / focus): re-evaluate the `$` picker against the new caret. */\r\n  protected onFormulaCaret(): void {\r\n    this.#syncPicker();\r\n  }\r\n\r\n  /** Closes the picker shortly after blur, leaving time for a result click to register. */\r\n  protected onFormulaBlur(): void {\r\n    setTimeout(() => this.closePicker(), 150);\r\n  }\r\n\r\n  /** Keyboard control for the open picker: navigate, select, dismiss. */\r\n  protected onFormulaKeydown(event: KeyboardEvent): void {\r\n    if (!this.pickerOpen()) {\r\n      return;\r\n    }\r\n    const results = this.pickerResults();\r\n    switch (event.key) {\r\n      case 'ArrowDown':\r\n        event.preventDefault();\r\n        this.pickerActiveIndex.update((i) => Math.min(i + 1, results.length - 1));\r\n        break;\r\n      case 'ArrowUp':\r\n        event.preventDefault();\r\n        this.pickerActiveIndex.update((i) => Math.max(i - 1, 0));\r\n        break;\r\n      case 'Enter': {\r\n        const item = results[this.pickerActiveIndex()];\r\n        if (item) {\r\n          event.preventDefault();\r\n          this.selectField(item);\r\n        }\r\n        break;\r\n      }\r\n      case 'Escape':\r\n        event.preventDefault();\r\n        this.closePicker();\r\n        break;\r\n    }\r\n  }\r\n\r\n  protected closePicker(): void {\r\n    this.pickerOpen.set(false);\r\n    this.pickerActiveIndex.set(0);\r\n    this.#dollarIndex = -1;\r\n  }\r\n\r\n  /**\r\n   * Binds a form field to a calculation variable and drops its short token into\r\n   * the equation. Reuses an existing scalar binding for the same field; otherwise\r\n   * mints the next free short name (a, b, c, …). When opened from `$`, the typed\r\n   * `$query` is replaced in place; otherwise the token is appended.\r\n   */\r\n  protected selectField(input: FormColumnInputs): void {\r\n    const current = this.tempValue();\r\n    const variables = current.variables ?? [];\r\n    const existing = variables.find(\r\n      (v) => v.formControlName === input.formControlName && !v.function && !v.parentInputId,\r\n    );\r\n    const token = existing ? existing.variable : this.#nextShortName();\r\n    const nextVars = existing ? variables : [...variables, this.#makeVariable(input, token)];\r\n\r\n    const formula = current.formula ?? '';\r\n    let nextFormula: string;\r\n    let caret: number;\r\n    if (this.pickerOpen() && this.#dollarIndex >= 0) {\r\n      const before = formula.slice(0, this.#dollarIndex);\r\n      const after = formula.slice(this.#cursorPosition);\r\n      const lead = before.length > 0 && !/[\\s(]$/.test(before) ? ' ' : '';\r\n      const insert = `${lead}${token} `;\r\n      nextFormula = before + insert + after;\r\n      caret = (before + insert).length;\r\n    } else {\r\n      const lead = formula.length > 0 && !/[\\s(]$/.test(formula) ? ' ' : '';\r\n      nextFormula = `${formula}${lead}${token} `;\r\n      caret = nextFormula.length;\r\n    }\r\n\r\n    this.tempValue.set({ ...current, formula: nextFormula, variables: nextVars });\r\n    this.closePicker();\r\n\r\n    const element = this.formulaInputRef()?.nativeElement;\r\n    if (element) {\r\n      setTimeout(() => {\r\n        element.focus();\r\n        element.setSelectionRange(caret, caret);\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Renames a variable's short token, updating every whole-word occurrence in the\r\n   * formula. An empty name is ignored so the token never desyncs from the formula\r\n   * (the field repopulates with the current name on the next render).\r\n   */\r\n  protected setVariableShortName(id: string, rawName: string): void {\r\n    const name = rawName.trim();\r\n    const current = this.tempValue();\r\n    const variables = current.variables ?? [];\r\n    const target = variables.find((v) => v.id === id);\r\n    if (!target || !name || name === target.variable) {\r\n      return;\r\n    }\r\n    const formula = target.variable\r\n      ? (current.formula ?? '').replace(\r\n          new RegExp(`\\\\b${escapeRegExp(target.variable)}\\\\b`, 'g'),\r\n          name,\r\n        )\r\n      : (current.formula ?? '');\r\n    this.tempValue.set({\r\n      ...current,\r\n      formula,\r\n      variables: variables.map((v) => (v.id === id ? { ...v, variable: name } : v)),\r\n    });\r\n  }\r\n\r\n  /** Toggles a list-aggregation function (sum/avg/…) on a sub-item variable. */\r\n  protected setVariableFunction(id: string, func: CalculationFunctions): void {\r\n    this.tempValue.update((current) => ({\r\n      ...current,\r\n      variables: (current.variables ?? []).map((v) => {\r\n        if (v.id !== id) {\r\n          return v;\r\n        }\r\n        if (v.function === func) {\r\n          return {\r\n            ...v,\r\n            function: undefined,\r\n            applyFunctionToCol: undefined,\r\n            applyFunctionToLabel: undefined,\r\n          };\r\n        }\r\n        return {\r\n          ...v,\r\n          function: func,\r\n          applyFunctionToCol: v.formControlName,\r\n          applyFunctionToLabel: v.label,\r\n        };\r\n      }),\r\n    }));\r\n  }\r\n\r\n  /** Recomputes the picker visibility/query from the current formula and caret. */\r\n  #syncPicker(): void {\r\n    const element = this.formulaInputRef()?.nativeElement;\r\n    if (!element) {\r\n      this.closePicker();\r\n      return;\r\n    }\r\n    const position = element.selectionStart ?? 0;\r\n    this.#cursorPosition = position;\r\n    const formula = this.tempValue().formula ?? '';\r\n    const lastDollar = formula.slice(0, position).lastIndexOf('$');\r\n    if (lastDollar === -1) {\r\n      this.closePicker();\r\n      return;\r\n    }\r\n    const query = formula.slice(lastDollar + 1, position);\r\n    // Only a run of letters/digits/spaces keeps the picker open; anything else\r\n    // (an operator, a newline) means the `$` was not a field trigger.\r\n    if (!/^[a-zA-Z0-9 ]*$/.test(query)) {\r\n      this.closePicker();\r\n      return;\r\n    }\r\n    this.#dollarIndex = lastDollar;\r\n    this.pickerQuery.set(query);\r\n    this.pickerActiveIndex.set(0);\r\n    this.pickerOpen.set(true);\r\n  }\r\n\r\n  /** Builds a calculation variable bound to a form field, carrying the list parent when present. */\r\n  #makeVariable(input: FormColumnInputs, token: string): calculationVariableInterface {\r\n    return {\r\n      id: uuidv4(),\r\n      variable: token,\r\n      formControlName: input.formControlName,\r\n      inputId: input.id,\r\n      label: input.label,\r\n      ...(input.multipleInputInEditId ? { parentInputId: input.multipleInputInEditId } : {}),\r\n    } as calculationVariableInterface;\r\n  }\r\n\r\n  /** Next free single-letter token (a, b, c, …), skipping mathjs constants and falling back to v1, v2…. */\r\n  #nextShortName(): string {\r\n    const used = new Set((this.tempValue().variables ?? []).map((v) => v.variable));\r\n    const reserved = new Set(['e', 'i']); // mathjs constants\r\n    for (let code = 97; code <= 122; code++) {\r\n      const char = String.fromCharCode(code);\r\n      if (!used.has(char) && !reserved.has(char)) {\r\n        return char;\r\n      }\r\n    }\r\n    let n = 1;\r\n    while (used.has(`v${n}`)) {\r\n      n++;\r\n    }\r\n    return `v${n}`;\r\n  }\r\n\r\n  // #endregion\r\n}\r\n","<!-- View mode: read-only calculation summary -->\r\n@if (!isEditing()) {\r\n<div class=\"cfr-summary\">\r\n  @if (!!value && !mapToData()?.id && !tableMode()) {\r\n  <div class=\"cfr-hint\">\r\n    <mat-icon class=\"cfr-hint__icon\" color=\"primary\">info</mat-icon>\r\n    <span>Save the input first to enable calculated field configurations</span>\r\n  </div>\r\n  }\r\n\r\n  <div class=\"cfr-formula-card\">\r\n    <span class=\"cfr-section__label\">Calculation</span>\r\n    <lib-math-preview class=\"cfr-formula-card__preview\" [expression]=\"value?.formula || ''\"\r\n      placeholder=\"No calculation set up yet\" />\r\n    @if (value?.decimalPlaces) {\r\n    <div class=\"cfr-formula-card__meta\">\r\n      <mat-icon class=\"cfr-formula-card__meta-icon\">tune</mat-icon>\r\n      <span>Shown to {{ value?.decimalPlaces }} decimal place(s) · {{ value?.roundingMode ? roundingLabel(value?.roundingMode) : 'nearest' }}</span>\r\n    </div>\r\n    }\r\n  </div>\r\n\r\n  <button class=\"cfr-edit-trigger\" mat-stroked-button color=\"primary\" [disabled]=\"disabled\"\r\n    (click)=\"startEdit()\">\r\n    <mat-icon>edit</mat-icon>\r\n    {{ !!value?.formula ? 'Edit calculation' : 'Set up calculation' }}\r\n  </button>\r\n</div>\r\n}\r\n\r\n<!-- Edit mode: guided calculation builder -->\r\n@else {\r\n<mat-card appearance=\"outlined\" class=\"cfr-editor\">\r\n  <header class=\"cfr-editor__head\">\r\n    <h3 class=\"cfr-editor__title\">\r\n      <mat-icon>functions</mat-icon>\r\n      Build the calculation\r\n    </h3>\r\n    <p class=\"cfr-editor__subtitle\">\r\n      Combine your form fields with operators to work out this value automatically.\r\n    </p>\r\n  </header>\r\n\r\n  <!-- Live preview + validity -->\r\n  <div class=\"cfr-preview\" [attr.data-state]=\"formulaStatus().kind\">\r\n    <span class=\"cfr-section__label\">Live preview</span>\r\n    <lib-math-preview class=\"cfr-preview__render\" [expression]=\"tempValue().formula || ''\"\r\n      placeholder=\"Your equation will appear here\" />\r\n    <p class=\"cfr-preview__status\">\r\n      <mat-icon class=\"cfr-preview__status-icon\">\r\n        {{ formulaStatus().kind === 'valid' ? 'check_circle' : formulaStatus().kind === 'invalid' ? 'error' : 'lightbulb' }}\r\n      </mat-icon>\r\n      <span>{{ formulaStatus().message }}</span>\r\n    </p>\r\n  </div>\r\n\r\n  <section class=\"cfr-section\">\r\n    <!-- Equation input + inline field-picker + operator keypad -->\r\n    <div class=\"cfr-equation\">\r\n      <div class=\"cfr-equation__field\">\r\n        <mat-form-field class=\"cfr-field\" [subscriptSizing]=\"'dynamic'\" [floatLabel]=\"'always'\"\r\n          appearance=\"outline\">\r\n          <mat-label>Equation</mat-label>\r\n          <textarea #formulaInput matInput [ngModel]=\"tempValue().formula\"\r\n            (ngModelChange)=\"onFormulaChange($event)\" (keyup)=\"onFormulaCaret()\"\r\n            (click)=\"onFormulaCaret()\" (focus)=\"onFormulaCaret()\"\r\n            (keydown)=\"onFormulaKeydown($event)\" (blur)=\"onFormulaBlur()\"\r\n            placeholder=\"e.g. (a + 2) / b\" rows=\"2\" spellcheck=\"false\" autocapitalize=\"off\"\r\n            autocomplete=\"off\"></textarea>\r\n          <mat-hint>Type <strong>$</strong> to add a form field, then join fields with the operator keys.</mat-hint>\r\n        </mat-form-field>\r\n\r\n        @if (pickerOpen()) {\r\n        <div class=\"cfr-picker\" role=\"listbox\" aria-label=\"Form fields\">\r\n          <div class=\"cfr-picker__head\">Insert a field</div>\r\n          @if (pickerResults().length === 0) {\r\n          <div class=\"cfr-picker__empty\">No matching number fields</div>\r\n          } @else {\r\n          @for (item of pickerResults(); track item.id; let idx = $index) {\r\n          <button type=\"button\" role=\"option\" class=\"cfr-picker__item\"\r\n            [class.cfr-picker__item--active]=\"idx === pickerActiveIndex()\"\r\n            [attr.aria-selected]=\"idx === pickerActiveIndex()\"\r\n            (mousedown)=\"$event.preventDefault()\" (click)=\"selectField(item)\">\r\n            <mat-icon class=\"cfr-picker__icon\">{{ item.multipleInputInEditId ? 'format_list_numbered' : 'tag' }}</mat-icon>\r\n            <span class=\"cfr-picker__label\">{{ item.label }}</span>\r\n            <span class=\"cfr-picker__meta\">{{ item.formControlName }}</span>\r\n          </button>\r\n          }\r\n          }\r\n        </div>\r\n        }\r\n      </div>\r\n\r\n      <div class=\"cfr-keypad\" role=\"group\" aria-label=\"Operators\">\r\n        @for (key of operatorKeys; track key.token) {\r\n        <button type=\"button\" class=\"cfr-key\" [attr.aria-label]=\"key.aria\"\r\n          (click)=\"insertToken(key.token, key.caretBack)\">\r\n          {{ key.label }}\r\n        </button>\r\n        }\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Optional equation source link -->\r\n    @if (!!tempValue().getFormulaFromAFormInput) {\r\n    <mat-form-field class=\"cfr-field\" [subscriptSizing]=\"'dynamic'\" [floatLabel]=\"'always'\"\r\n      appearance=\"outline\">\r\n      <mat-label>Equation source</mat-label>\r\n      <mat-select [value]=\"tempValue().formControlWithFormula\"\r\n        (selectionChange)=\"linkFormulaSource($event)\" placeholder=\"Select an input that holds a formula\">\r\n        @for (input of formInputs(); track input.id) {\r\n        <mat-option\r\n          [disabled]=\"checkIfInputCanBeLinkedToCalVariable(mapToData(), input) || input.element !== 'select'\"\r\n          [value]=\"input.formControlName\">\r\n          {{ input.label }}\r\n        </mat-option>\r\n        }\r\n      </mat-select>\r\n      <mat-hint>Pull the equation from another input's value</mat-hint>\r\n    </mat-form-field>\r\n    }\r\n\r\n    <!-- Bound fields legend -->\r\n    <div class=\"cfr-variables\">\r\n      <div class=\"cfr-block-head\">\r\n        <span class=\"cfr-section__label\">Fields in this calculation</span>\r\n        <span class=\"cfr-block-head__hint\">Rename a letter, or type $ above to add another</span>\r\n      </div>\r\n\r\n      @if ((tempValue().variables || []).length === 0) {\r\n      <p class=\"cfr-variables__empty\">\r\n        Type <strong>$</strong> in the equation above to add a form field — each becomes a short\r\n        letter you can use in the equation.\r\n      </p>\r\n      } @else {\r\n      <ul class=\"cfr-legend\">\r\n        @for (variable of (tempValue().variables || []); track variable.id) {\r\n        <li class=\"cfr-legend__row\">\r\n          <div class=\"cfr-legend__main\">\r\n            <input class=\"cfr-legend__token\" [ngModel]=\"variable.variable\"\r\n              (ngModelChange)=\"setVariableShortName(variable.id, $event)\" aria-label=\"Short name\"\r\n              maxlength=\"12\" spellcheck=\"false\" autocomplete=\"off\" autocapitalize=\"off\">\r\n            <mat-icon class=\"cfr-legend__arrow\">arrow_right_alt</mat-icon>\r\n            <button type=\"button\" class=\"cfr-legend__field\"\r\n              [attr.aria-label]=\"'Insert ' + variable.label + ' into the equation'\"\r\n              (click)=\"appendVariableToFormula(variable.variable)\">\r\n              {{ variable.label }}\r\n            </button>\r\n            <button type=\"button\" class=\"cfr-legend__remove\"\r\n              [attr.aria-label]=\"'Remove ' + variable.variable\"\r\n              (click)=\"removeVariable(variable.id)\">\r\n              <mat-icon>close</mat-icon>\r\n            </button>\r\n          </div>\r\n\r\n          @if (variable.parentInputId) {\r\n          <div class=\"cfr-legend__fns\" role=\"group\" aria-label=\"Combine list values with\">\r\n            <span class=\"cfr-legend__fns-label\" aria-hidden=\"true\">ƒ</span>\r\n            @for (func of allCalculationFunction(); track func) {\r\n            <button type=\"button\" class=\"cfr-legend__fn\"\r\n              [class.cfr-legend__fn--active]=\"variable.function === func\"\r\n              (click)=\"setVariableFunction(variable.id, func)\">\r\n              {{ func }}\r\n            </button>\r\n            }\r\n          </div>\r\n          }\r\n        </li>\r\n        }\r\n      </ul>\r\n      }\r\n    </div>\r\n\r\n    <!-- Result formatting -->\r\n    <div class=\"cfr-rounding\">\r\n      <div class=\"cfr-block-head\">\r\n        <span class=\"cfr-section__label\">Result formatting</span>\r\n        <span class=\"cfr-block-head__hint\">Optional — how the answer is rounded</span>\r\n      </div>\r\n\r\n      <div class=\"cfr-rounding__row\">\r\n        <mat-form-field class=\"cfr-field cfr-rounding__decimals\" [subscriptSizing]=\"'dynamic'\"\r\n          [floatLabel]=\"'always'\" appearance=\"outline\">\r\n          <mat-label>Decimal places</mat-label>\r\n          <input matInput [ngModel]=\"tempValue().decimalPlaces\"\r\n            (ngModelChange)=\"setDecimalPlaces($event)\" placeholder=\"0\" type=\"number\" min=\"0\">\r\n        </mat-form-field>\r\n\r\n        @if (tempValue().decimalPlaces) {\r\n        <div class=\"cfr-rounding__mode\">\r\n          <label class=\"cfr-section__label\">Rounding</label>\r\n          <mat-chip-listbox aria-label=\"Rounding method\">\r\n            @for (type of roundingType; track type.value) {\r\n            <mat-chip-option (click)=\"setRoundingMode(type.value)\"\r\n              [selected]=\"tempValue().roundingMode === type.value\">\r\n              {{ type.label }}\r\n            </mat-chip-option>\r\n            }\r\n          </mat-chip-listbox>\r\n        </div>\r\n        }\r\n      </div>\r\n    </div>\r\n  </section>\r\n\r\n  <div class=\"cfr-editor__actions\">\r\n    <button mat-button (click)=\"cancelEdit()\">Cancel</button>\r\n    <button mat-flat-button color=\"primary\" [disabled]=\"formulaStatus().kind === 'invalid'\"\r\n      (click)=\"saveEdit()\">\r\n      Save calculation\r\n    </button>\r\n  </div>\r\n</mat-card>\r\n}\r\n\r\n<!-- Disabled overlay -->\r\n<ng-template cdkConnectedOverlay [cdkConnectedOverlayOpen]=\"disabled\">\r\n  <div class=\"cfr-disabled-overlay\"></div>\r\n</ng-template>\r\n"],"names":["uuidv4","i4","i5","i6","i7","i9"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA;;;;;;;;AAQG;AACG,SAAU,iBAAiB,CAAC,UAAkB,EAAA;AAClD,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE;IACjC,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;IACnC;AACA,IAAA,IAAI;AACF,QAAA,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;IACrD;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE;IACrD;AACF;AAEA;AACA,SAAS,eAAe,CAAC,KAAc,EAAA;AACrC,IAAA,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,EAAE;AACvD,IAAA,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AAClC,QAAA,OAAO,qEAAqE;IAC9E;AACA,IAAA,IAAI,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACpC,QAAA,OAAO,0EAA0E;IACnF;AACA,IAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AAC/B,QAAA,OAAO,uEAAuE;IAChF;AACA,IAAA,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AAC3B,QAAA,OAAO,gDAAgD;IACzD;AACA,IAAA,OAAO,iCAAiC;AAC1C;;AC/BA;;;;;;;;;AASG;MAYU,oBAAoB,CAAA;AAYtB,IAAA,KAAK;AACL,IAAA,UAAU;AAEnB,IAAA,WAAA,GAAA;;AAbS,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAS,EAAE,iFAAC;;AAG9B,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAS,wBAAwB,kFAAC;;QAG3C,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAuB,MACxD,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,UAAU,GAAG,OAAO,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAChD;AAEQ,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAA0B,UAAU,CAAC;QACnD,IAAA,CAAA,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAG1D,MAAM,CAAC,MAAK;YACV,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;AAC3C,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa;;AAGxC,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,gBAAA,OAAO,CAAC,WAAW,GAAG,UAAU,IAAI,WAAW;gBAC/C;YACF;YACA,IAAI,CAAC,UAAU,EAAE;AACf,gBAAA,OAAO,CAAC,WAAW,GAAG,WAAW;gBACjC;YACF;YAEA,MAAM,EAAE,GAAG,EAAE,GAAG,iBAAiB,CAAC,UAAU,CAAC;AAC7C,YAAA,IAAI,GAAG,IAAI,IAAI,EAAE;;AAEf,gBAAA,OAAO,CAAC,WAAW,GAAG,UAAU;gBAChC;YACF;AACA,YAAA,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE;AACzB,gBAAA,MAAM,EAAE,QAAQ;AAChB,gBAAA,YAAY,EAAE,KAAK;AACnB,gBAAA,WAAW,EAAE,IAAI;AAClB,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;+GA3CW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,qcATrB,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,0VAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FASD,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAXhC,SAAS;+BACE,kBAAkB,EAAA,QAAA,EAClB,EAAE,EAAA,eAAA,EAEK,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,QAAQ,EAAA,IAAA,EACnC;AACJ,wBAAA,OAAO,EAAE,kBAAkB;AAC3B,wBAAA,mBAAmB,EAAE,SAAS;AAC/B,qBAAA,EAAA,MAAA,EAAA,CAAA,0VAAA,CAAA,EAAA;;;ACKH;AACA,SAAS,YAAY,CAAC,KAAa,EAAA;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC;AACrD;AAgCA;;;;;;;;;;;;;;;;;;AAkBG;MA0BU,6BAA6B,CAAA;aAGjC,IAAA,CAAA,MAAM,GAAG,CAAH,CAAK;;AA4ClB,IAAA,YAAY;AACZ,IAAA,eAAe;AAsEN,IAAA,WAAW;AAEpB,IAAA,WAAA,GAAA;;QAlHS,IAAA,CAAA,WAAW,GAAG,EAAE;QAChB,IAAA,CAAA,QAAQ,GAAG,KAAK;QAChB,IAAA,CAAA,QAAQ,GAAG,KAAK;AAEhB,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,OAAO,EAAQ;QAClC,IAAA,CAAA,WAAW,GAAG,4BAA4B;AAC1C,QAAA,IAAA,CAAA,EAAE,GAAG,CAAA,2BAAA,EAA8B,6BAA6B,CAAC,MAAM,EAAE,EAAE;QAEpF,IAAA,CAAA,OAAO,GAAG,KAAK;QACf,IAAA,CAAA,OAAO,GAAG,KAAK;QACf,IAAA,CAAA,WAAW,GAAG,EAAE;;;;AAKP,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAA+B,SAAS,gFAAC;;AAE1D,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAA0B,EAAE,iFAAC;;AAE/C,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAoC,EAAE,6EAAC;;QAGrD,IAAA,CAAA,qBAAqB,GAAG,MAAM,EAAW;;QAEzC,IAAA,CAAA,YAAY,GAAG,MAAM,EAA+B;;;;AAK1C,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,KAAK,gFAAC;;AAEzB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAuB,EAA0B,gFAAC;;AAGpE,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,KAAK,iFAAC;;AAE1B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,EAAE,kFAAC;;AAExB,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,CAAC,wFAAC;;QAGhD,IAAA,CAAA,YAAY,GAAG,CAAC,CAAC;QACjB,IAAA,CAAA,eAAe,GAAG,CAAC;;AAGA,QAAA,IAAA,CAAA,YAAY,GAA8B;AAC3D,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;AACpC,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE;AACvC,YAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE;SACrC;;AAGkB,QAAA,IAAA,CAAA,YAAY,GAA2B;AACxD,YAAA,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;AACvD,YAAA,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE;AAC5D,YAAA,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE;AAC5D,YAAA,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;AAC1D,YAAA,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE;AAC7D,YAAA,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;SACzD;;AAGkB,QAAA,IAAA,CAAA,eAAe,GAChC,SAAS,CAAkC,cAAc,sFAAC;;AAGzC,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAgB,MAAK;AAC9D,YAAA,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE;YACvD,IAAI,CAAC,OAAO,EAAE;gBACZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,qCAAqC,EAAE;YAC1E;YACA,MAAM,EAAE,KAAK,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC;AAC5C,YAAA,OAAO;kBACH,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK;kBACjC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE;AAC3D,QAAA,CAAC,oFAAC;;AAGiB,QAAA,IAAA,CAAA,kBAAkB,GAAG,QAAQ,CAAqB,MACnE,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CACtB,CAAC,KAAK,KAAK,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAClE,yFACF;;AAGkB,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAqB,MAAK;AACnE,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AACrD,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE;YACxC,IAAI,CAAC,KAAK,EAAE;AACV,gBAAA,OAAO,MAAM;YACf;AACA,YAAA,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,KAAK,KACJ,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC1C,KAAK,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CACvD;AACH,QAAA,CAAC,oFAAC;;AAGiB,QAAA,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAAyB,MAC3E,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,6FACpC;;AAGkB,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAU,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,WAAW,gFAAC;;AAGpE,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CACvC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,WAAW,kFACpC;AAEQ,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC7D,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAA0B,UAAU,CAAC;;AAmDlE,QAAA,IAAA,CAAA,QAAQ,GAAc,MAAK,EAAE,CAAC;AAC9B,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAjD9B,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE;AAC1B,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACrC;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;IAC9B;;AAIA,IAAA,MAAM;AAEN,IAAA,IACI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,MAAM;IACpB;IACA,IAAI,KAAK,CAAC,GAAqC,EAAA;QAC7C,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;YAC9B;QACF;AACA,QAAA,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,SAAS;AAC1C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;QACxB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;AAC3C,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IAC5B;;;AAIA,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,CAAC,IAAI,CAAC,MAAM;IACrB;AAEA,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK;IACpC;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,MAAM,GAAG,CAAC;QACvD,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,IAAI,IAAI;QAC/D,QACE,CAAC,IAAI,CAAC,OAAO,KAAK,eAAe,IAAI,cAAc,CAAC;aACnD,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAEnC;AAMA,IAAA,UAAU,CAAC,KAA2B,EAAA;AACpC,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;IACpB;AAEA,IAAA,gBAAgB,CAAC,EAAa,EAAA;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;AAEA,IAAA,iBAAiB,CAAC,GAAa,EAAA;AAC7B,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,CACjE,6BAA6B,CAC9B;AACD,QAAA,cAAc,EAAE,YAAY,CAAC,kBAAkB,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AAChC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACjB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;QAC1B;QACA,IAAI,CAAC,aAAa,EAAE;IACtB;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;QAC1B;IACF;;;IAMU,SAAS,GAAA;QACjB,IAAI,CAAC,SAAS,CAAC,GAAG,CAChB,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,GAAI,EAA2B,CAC1E;AACD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,aAAa,EAAE;IACtB;IAEU,QAAQ,GAAA;AAChB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;AAC7B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;IAC3B;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAA0B,CAAC;IAChD;;;IAMU,oCAAoC,CAC5C,YAA0C,EAC1C,cAIC,EAAA;QAED,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,OAAO,KAAK;QACd;QACA,IAAI,YAAY,CAAC,eAAe,KAAK,cAAc,CAAC,eAAe,EAAE;AACnE,YAAA,OAAO,IAAI;QACb;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,qBAAqB,EAAE;YACvC,OAAO,CAAC,CAAC,cAAc,CAAC,WAAW,IAAI,CAAC,CAAC,cAAc,CAAC,qBAAqB;QAC/E;AACA,QAAA,OAAO,KAAK;IACd;AAEU,IAAA,iBAAiB,CAAC,KAAsB,EAAA;;;QAGhD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM;AAClC,YAAA,GAAG,OAAO;YACV,sBAAsB,EAAE,KAAK,CAAC,KAAK;AACnC,YAAA,OAAO,EAAE,EAAE;AACZ,SAAA,CAAC,CAAC;IACL;AAEU,IAAA,cAAc,CAAC,UAAkB,EAAA;AACzC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE;AAChC,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE;AACzC,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC;AACzD,QAAA,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE;AACnC,QAAA,IAAI,MAAM,EAAE,QAAQ,EAAE;AACpB,YAAA,OAAO,GAAG;AACP,iBAAA,OAAO,CAAC,IAAI,MAAM,CAAC,CAAA,GAAA,EAAM,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA,GAAA,CAAK,EAAE,GAAG,CAAC,EAAE,EAAE;AACrE,iBAAA,OAAO,CAAC,SAAS,EAAE,GAAG;AACtB,iBAAA,IAAI,EAAE;QACX;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AACjB,YAAA,GAAG,OAAO;AACV,YAAA,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC;YACvD,OAAO;AACR,SAAA,CAAC;IACJ;AAEU,IAAA,uBAAuB,CAAC,YAAoB,EAAA;;;QAGpD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE;QAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE;QACnE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE;QAClE,IAAI,CAAC,WAAW,CAAC,CAAA,EAAG,IAAI,CAAA,EAAG,YAAY,GAAG,KAAK,CAAA,CAAE,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;IACnE;AAEU,IAAA,UAAU,CAAC,OAAe,EAAA;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D;AAEA;;;;;AAKG;AACO,IAAA,WAAW,CAAC,KAAa,EAAE,SAAS,GAAG,CAAC,EAAA;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa;QACrD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE;AAC7C,QAAA,MAAM,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK;AAEnC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAErB,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;QACA,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS;;QAEtD,UAAU,CAAC,MAAK;YACd,OAAO,CAAC,KAAK,EAAE;AACf,YAAA,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;AACzC,QAAA,CAAC,CAAC;IACJ;;IAGA,YAAY,GAAA;QACV,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,IAAI,EAAE;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa;QACrD,MAAM,KAAK,GAAG,OAAO,EAAE,cAAc,IAAI,OAAO,CAAC,MAAM;QACvD,MAAM,GAAG,GAAG,OAAO,EAAE,YAAY,IAAI,OAAO,CAAC,MAAM;QACnD,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACvE;AAEU,IAAA,gBAAgB,CAAC,KAA6B,EAAA;QACtD,MAAM,MAAM,GACV,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;QAC5D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM;AAClC,YAAA,GAAG,OAAO;AACV,YAAA,aAAa,EAAE,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,SAAS;AACpF,SAAA,CAAC,CAAC;IACL;AAEU,IAAA,eAAe,CAAC,IAAgC,EAAA;QACxD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E;;AAGU,IAAA,aAAa,CAAC,IAA4C,EAAA;QAClE,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,SAAS;IACtF;;;;AAOU,IAAA,eAAe,CAAC,KAAa,EAAA;AACrC,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACtB,IAAI,CAAC,WAAW,EAAE;IACpB;;IAGU,cAAc,GAAA;QACtB,IAAI,CAAC,WAAW,EAAE;IACpB;;IAGU,aAAa,GAAA;QACrB,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC;IAC3C;;AAGU,IAAA,gBAAgB,CAAC,KAAoB,EAAA;AAC7C,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;YACtB;QACF;AACA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;AACpC,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACzE;AACF,YAAA,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxD;YACF,KAAK,OAAO,EAAE;gBACZ,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC9C,IAAI,IAAI,EAAE;oBACR,KAAK,CAAC,cAAc,EAAE;AACtB,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;gBACxB;gBACA;YACF;AACA,YAAA,KAAK,QAAQ;gBACX,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,WAAW,EAAE;gBAClB;;IAEN;IAEU,WAAW,GAAA;AACnB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7B,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IACxB;AAEA;;;;;AAKG;AACO,IAAA,WAAW,CAAC,KAAuB,EAAA;AAC3C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE;AAChC,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE;AACzC,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAC7B,CAAC,CAAC,KAAK,CAAC,CAAC,eAAe,KAAK,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,aAAa,CACtF;AACD,QAAA,MAAM,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;QAClE,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAExF,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE;AACrC,QAAA,IAAI,WAAmB;AACvB,QAAA,IAAI,KAAa;QACjB,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,EAAE;AAC/C,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC;YAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;YACjD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE;AACnE,YAAA,MAAM,MAAM,GAAG,CAAA,EAAG,IAAI,CAAA,EAAG,KAAK,GAAG;AACjC,YAAA,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK;YACrC,KAAK,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM;QAClC;aAAO;YACL,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,EAAE;YACrE,WAAW,GAAG,GAAG,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,KAAK,GAAG;AAC1C,YAAA,KAAK,GAAG,WAAW,CAAC,MAAM;QAC5B;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QAC7E,IAAI,CAAC,WAAW,EAAE;QAElB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa;QACrD,IAAI,OAAO,EAAE;YACX,UAAU,CAAC,MAAK;gBACd,OAAO,CAAC,KAAK,EAAE;AACf,gBAAA,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;AACzC,YAAA,CAAC,CAAC;QACJ;IACF;AAEA;;;;AAIG;IACO,oBAAoB,CAAC,EAAU,EAAE,OAAe,EAAA;AACxD,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE;AAChC,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE;AACzC,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AACjD,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,MAAM,CAAC,QAAQ,EAAE;YAChD;QACF;AACA,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC;cACnB,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,CAC7B,IAAI,MAAM,CAAC,CAAA,GAAA,EAAM,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA,GAAA,CAAK,EAAE,GAAG,CAAC,EACzD,IAAI;eAEL,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AACjB,YAAA,GAAG,OAAO;YACV,OAAO;AACP,YAAA,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAC9E,SAAA,CAAC;IACJ;;IAGU,mBAAmB,CAAC,EAAU,EAAE,IAA0B,EAAA;QAClE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM;AAClC,YAAA,GAAG,OAAO;AACV,YAAA,SAAS,EAAE,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,KAAI;AAC7C,gBAAA,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;AACf,oBAAA,OAAO,CAAC;gBACV;AACA,gBAAA,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,EAAE;oBACvB,OAAO;AACL,wBAAA,GAAG,CAAC;AACJ,wBAAA,QAAQ,EAAE,SAAS;AACnB,wBAAA,kBAAkB,EAAE,SAAS;AAC7B,wBAAA,oBAAoB,EAAE,SAAS;qBAChC;gBACH;gBACA,OAAO;AACL,oBAAA,GAAG,CAAC;AACJ,oBAAA,QAAQ,EAAE,IAAI;oBACd,kBAAkB,EAAE,CAAC,CAAC,eAAe;oBACrC,oBAAoB,EAAE,CAAC,CAAC,KAAK;iBAC9B;AACH,YAAA,CAAC,CAAC;AACH,SAAA,CAAC,CAAC;IACL;;IAGA,WAAW,GAAA;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa;QACrD,IAAI,CAAC,OAAO,EAAE;YACZ,IAAI,CAAC,WAAW,EAAE;YAClB;QACF;AACA,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,IAAI,CAAC;AAC5C,QAAA,IAAI,CAAC,eAAe,GAAG,QAAQ;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,IAAI,EAAE;AAC9C,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC;AAC9D,QAAA,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE;YACrB,IAAI,CAAC,WAAW,EAAE;YAClB;QACF;AACA,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,QAAQ,CAAC;;;QAGrD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YAClC,IAAI,CAAC,WAAW,EAAE;YAClB;QACF;AACA,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU;AAC9B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;;IAGA,aAAa,CAAC,KAAuB,EAAE,KAAa,EAAA;QAClD,OAAO;YACL,EAAE,EAAEA,EAAM,EAAE;AACZ,YAAA,QAAQ,EAAE,KAAK;YACf,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,YAAA,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,aAAa,EAAE,KAAK,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC;SACvD;IACnC;;IAGA,cAAc,GAAA;AACZ,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,SAAS,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC/E,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACrC,QAAA,KAAK,IAAI,IAAI,GAAG,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE;YACvC,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;AACtC,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC1C,gBAAA,OAAO,IAAI;YACb;QACF;QACA,IAAI,CAAC,GAAG,CAAC;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC,EAAE;AACxB,YAAA,CAAC,EAAE;QACL;QACA,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE;IAChB;+GA9iBW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,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,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,EAAA,cAAA,EAAA,4BAAA,EAAA,EAAA,SAAA,EAN7B,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,iBAAA,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,ECjH3F,42TA2NA,28RDtHI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,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,mBAAA,EAAA,QAAA,EAAA,iGAAA,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,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,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,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,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,UAAA,EAAA,IAAA,EACb,kBAAkB,wYAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,eAAe,qXACf,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,oFAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAQL,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAzBzC,SAAS;+BACE,4BAA4B,EAAA,eAAA,EAGrB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,QAAQ,EAAA,OAAA,EAChC;wBACP,YAAY;wBACZ,WAAW;wBACX,oBAAoB;wBACpB,aAAa;wBACb,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,aAAa;wBACb,aAAa;wBACb,eAAe;wBACf,cAAc;qBACf,EAAA,SAAA,EACU,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAA,6BAA+B,EAAE,CAAC,EAAA,IAAA,EACnF;AACJ,wBAAA,OAAO,EAAE,4BAA4B;AACrC,wBAAA,yBAAyB,EAAE,aAAa;AACzC,qBAAA,EAAA,QAAA,EAAA,42TAAA,EAAA,MAAA,EAAA,CAAA,o5RAAA,CAAA,EAAA;;sBAQA;;sBACA;;sBACA;6eA6D4C,cAAc,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA;sBAkE1D;;;;;"}