@memberjunction/ng-base-forms 6.1.0-edge.6 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"form-field.component.js","sourceRoot":"","sources":["../../../src/lib/field/form-field.component.ts","../../../src/lib/field/form-field.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject, OnChanges, SimpleChanges, OnDestroy, ElementRef, Renderer2 } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { BaseEntity, EntityInfo, EntityFieldInfo, EntityFieldTSType, CompositeKey, KeyValuePair, RunView, CoerceImageSrc, IsInlineImageDataUri, CoerceRawImageBase64ToDataUri, MaxStoredImageChars, MaxInlineImageBytes, FormatByteSize, ParseCssHexColor, PrettyPrintJson } from '@memberjunction/core';\nimport { BaseEngineRegistry } from '@memberjunction/core';\nimport { ValidationErrorInfo, HighlightSearchMatches, detectRichTextFormat, RichTextFormat, UUIDsEqual } from '@memberjunction/global';\nimport { FormContext } from '../types/form-types';\nimport { FormNavigationEvent } from '../types/navigation-events';\nimport { FormatFKCell, FilterCachedFKRows } from './fk-search-utils';\nimport { LinkedFieldOptionsStore } from './linked-field-options';\n\n/**\n * How a field's value should be rendered/edited beyond a plain input.\n * - `markdown` / `html`: render formatted in read mode, code editor in edit mode\n * - `code`: source code (uses the field's CodeType as the editor language)\n * - `plain`: standard text rendering (default)\n */\nexport type FieldRichTextMode = 'markdown' | 'html' | 'code' | 'plain';\n\n/**\n * One extra (non-name, non-PK) column rendered in an FK suggestion row.\n * Built from the related entity's fields where `DefaultInView === true`.\n */\nexport interface FKSuggestionColumn {\n /** Field code name on the related entity. */\n FieldName: string;\n /** Friendly column header (the field's DisplayNameOrName). */\n Header: string;\n /** Pre-formatted display value for this row+column. */\n Value: string;\n /**\n * {@link Value} with the query substring highlighted when this column is the one\n * being searched (else plain, still HTML-escaped). Bound to `[innerHTML]`.\n */\n HighlightedValue: string;\n}\n\n/**\n * A field the user can scope the FK search to, shown in the scope-picker menu.\n * `Group` separates the columns visible in the grid ('shown') from other\n * searchable fields like ID/Status ('other').\n */\nexport interface FKSearchableField {\n /** Related-entity field code name to search against. */\n FieldName: string;\n /** Friendly label (DisplayNameOrName) shown in the menu + scope pill. */\n Label: string;\n /** FontAwesome icon class for the menu row. */\n Icon: string;\n /** Which menu group this field belongs to. */\n Group: 'shown' | 'other';\n}\n\n/**\n * Represents a suggestion item for FK autocomplete search results.\n */\nexport interface FKSuggestion {\n /** Primary-key value used as the FK value when selected. */\n PrimaryKeyValue: unknown;\n /** The related entity's NameField value — the primary clickable label. */\n DisplayName: string;\n /** {@link DisplayName} with the typed query substring wrapped in a highlight mark. Bound to `[innerHTML]`. */\n HighlightedName: string;\n /** Additional DefaultInView columns shown to the right of the name (multi-column rows). */\n ExtraColumns: FKSuggestionColumn[];\n /**\n * Leading icon for this row — a FontAwesome class. Per-row when the related\n * entity has an `ExtendedType = 'Icon'` field; otherwise the entity-level\n * icon; null when neither exists.\n */\n Icon: string | null;\n}\n\n/**\n * Describes the column layout (besides the name column) for the FK suggestion\n * dropdown of the current related entity. Recomputed when the related entity changes.\n */\ninterface FKColumnPlan {\n /** Code name of the related entity's NameField (or PK fallback). */\n NameFieldName: string;\n /** Code name of the related entity's PK field used as the FK value. */\n PkFieldName: string;\n /**\n * The ordered list of ALL display columns INCLUDING the name field — this is the\n * user-reorderable column order. The name field is always present (can't be hidden)\n * but may sit anywhere in the order.\n */\n ColumnFields: string[];\n /** Non-name display columns (ColumnFields minus the name field), for cell building. */\n ExtraFieldNames: string[];\n /** Friendly headers for the extra columns, index-aligned with ExtraFieldNames. */\n ExtraHeaders: string[];\n /**\n * Code name of the related entity's `ExtendedType = 'Icon'` field, whose\n * per-row value is a FontAwesome class — or null if the entity has no such\n * field (then {@link EntityIcon} is used as a uniform fallback).\n */\n IconFieldName: string | null;\n /** Entity-level icon (`EntityInfo.Icon`) used when there's no per-row icon field. */\n EntityIcon: string | null;\n}\n\n/**\n * Modern form field component that renders entity fields in both read-only and edit modes.\n *\n * **Read mode**: Clean text display with optional hyperlinks (email, URL, record).\n * **Edit mode**: Native HTML inputs with custom-built select and autocomplete components.\n *\n * Uses:\n * - Native `<input>` for text, number, date\n * - Custom styled dropdown for value list selections\n * - Custom autocomplete with floating dropdown for foreign key search\n * - Custom-styled `<input type=\"checkbox\">` for booleans\n *\n * All navigation (clicking FK links, email links, URL links) is emitted as events.\n *\n * @example\n * ```html\n * <mj-form-field\n * [Record]=\"record\"\n * [EditMode]=\"editMode\"\n * FieldName=\"CustomerName\"\n * Type=\"textbox\"\n * [FormContext]=\"formContext\"\n * (Navigate)=\"onNavigate($event)\"\n * (ValueChange)=\"onValueChange($event)\">\n * </mj-form-field>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-form-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './form-field.component.html',\n styleUrls: ['./form-field.component.css']\n})\nexport class MjFormFieldComponent extends BaseAngularComponent implements OnChanges, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private renderer = inject(Renderer2);\n private hostRef = inject(ElementRef<HTMLElement>);\n\n /** The entity record containing this field */\n @Input() Record!: BaseEntity;\n\n /** Whether the form is in edit mode */\n @Input() EditMode = false;\n\n /** The field code name (must match a field on the entity) */\n @Input() FieldName = '';\n\n /**\n * The control type to render in edit mode.\n * Determines which input component is used.\n *\n * Also accepts deprecated Kendo-style type names for backward compatibility:\n * - `'dropdownlist'` → `'select'`\n * - `'numerictextbox'` → `'number'`\n */\n @Input()\n set Type(value: 'textbox' | 'textarea' | 'number' | 'datepicker' | 'checkbox' | 'select' | 'autocomplete' | 'code' | 'dropdownlist' | 'numerictextbox') {\n // Normalize deprecated Kendo type names to modern equivalents\n switch (value) {\n case 'dropdownlist': this._type = 'select'; break;\n case 'numerictextbox': this._type = 'number'; break;\n default: this._type = value; break;\n }\n }\n get Type(): 'textbox' | 'textarea' | 'number' | 'datepicker' | 'checkbox' | 'select' | 'autocomplete' | 'code' {\n return this._type;\n }\n private _type: 'textbox' | 'textarea' | 'number' | 'datepicker' | 'checkbox' | 'select' | 'autocomplete' | 'code' = 'textbox';\n\n /**\n * Link type for read-only rendering.\n * - 'Email': renders as mailto link\n * - 'URL': renders as external hyperlink\n * - 'Record': renders as FK link to related entity record\n * - 'None': renders as plain text\n */\n @Input() LinkType: 'Email' | 'URL' | 'Record' | 'None' = 'None';\n\n /** Whether to show the field label */\n @Input() ShowLabel = true;\n\n /** Form-level context (search filter, showEmptyFields) */\n @Input() FormContext?: FormContext;\n\n /**\n * Whether FK / record links are interactive. Driven by\n * `FormContext.enableRecordLinks`; false renders FK values as plain text\n * (dialog/slide-in surfaces). Undefined / true means links are live.\n */\n get RecordLinksEnabled(): boolean {\n return this.FormContext?.enableRecordLinks !== false;\n }\n\n // ---- Deprecated camelCase aliases (backward compat) ----\n\n /** @deprecated Use [Record] instead */\n @Input('record') set _deprecatedRecord(value: BaseEntity) { this.Record = value; }\n\n /** @deprecated Use [FormContext] instead */\n @Input('formContext') set _deprecatedFormContext(value: FormContext | undefined) { this.FormContext = value; }\n\n /** Whether to hide this field when empty in read-only mode. Default: true */\n @Input() HideWhenEmptyInReadOnlyMode = true;\n\n /** Override display name (defaults to entity field metadata DisplayName) */\n @Input() DisplayNameOverride = '';\n\n /** Override possible values for select/autocomplete */\n @Input() PossibleValuesOverride: string[] | null = null;\n\n /** Emitted when the field value changes */\n @Output() ValueChange = new EventEmitter<{ FieldName: string; OldValue: unknown; NewValue: unknown }>();\n\n /** Emitted when a navigation action is triggered (FK link click, email click, etc.) */\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n // ---- Computed Properties ----\n\n /** Get EntityFieldInfo metadata for this field */\n get FieldInfo(): EntityFieldInfo | undefined {\n return this.Record?.EntityInfo?.Fields?.find(f => f.Name === this.FieldName);\n }\n\n /** Display name from metadata or override */\n get DisplayName(): string {\n if (this.DisplayNameOverride) return this.DisplayNameOverride;\n\n // Friendly labels for standard MJ timestamp fields\n if (this.FieldName === '__mj_CreatedAt') return 'Created';\n if (this.FieldName === '__mj_UpdatedAt') return 'Updated';\n\n // For FK fields that have a mapped name field, use the name field's\n // friendly label (e.g., show \"Parent\" instead of \"Parent ID\")\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n const nameField = this.Record?.EntityInfo?.Fields?.find(f => f.Name === nameFieldMap);\n if (nameField) {\n return nameField.DisplayNameOrName;\n }\n }\n\n return this.FieldInfo?.DisplayNameOrName ?? this.FieldName;\n }\n\n /** Display name with search highlighting applied. Output is bound to `[innerHTML]`. */\n get HighlightedDisplayName(): string {\n return HighlightSearchMatches(this.DisplayName, this.FormContext?.sectionFilter ?? '', 'mj-forms-search-highlight');\n }\n\n /** Current field value */\n get Value(): unknown {\n return this.Record?.Get(this.FieldName);\n }\n\n /** Set field value, mark touched, run validation, and emit change event */\n set Value(newValue: unknown) {\n if (!this.Record) return;\n const oldValue = this.Record.Get(this.FieldName);\n this.Record.Set(this.FieldName, newValue);\n this._touched = true;\n this.runFieldValidation();\n this.ValueChange.emit({ FieldName: this.FieldName, OldValue: oldValue, NewValue: newValue });\n }\n\n /** Whether this field is read-only based on entity metadata */\n get IsFieldReadOnly(): boolean {\n if (!this.FieldInfo) return false;\n return this.FieldInfo.ReadOnly;\n }\n\n /** Whether this field has been modified (dirty). Only shown for saved records (not new). */\n get IsDirty(): boolean {\n if (!this.Record || !this.Record.IsSaved) return false;\n const field = this.Record.Fields?.find(f => f.Name === this.FieldName);\n return field?.Dirty ?? false;\n }\n\n /** Whether this field is required (not nullable) */\n get IsRequired(): boolean {\n return this.FieldInfo?.AllowsNull === false;\n }\n\n /** Whether this is a required field that is currently empty (for validation styling) */\n get IsRequiredEmpty(): boolean {\n // Defer to the validation system when it has active errors for this field\n if (this.ShowErrors) return false;\n if (!this.IsRequired || !this.EditMode) return false;\n const val = this.Value;\n return val === null || val === undefined || val === '';\n }\n\n // ---- INLINE VALIDATION ----\n\n /** Whether the user has interacted with (changed) this field */\n private _touched = false;\n\n /** Set when an image upload is rejected (type/size) — shown with field validation. */\n private imageUploadError: string | null = null;\n\n /** Locally computed validation errors for this field */\n private _fieldErrors: ValidationErrorInfo[] = [];\n\n /** Validation errors for this field from the best available source */\n get FieldErrors(): ValidationErrorInfo[] {\n // If touched, use fresh local validation (covers real-time feedback)\n if (this._touched) {\n return this._fieldErrors;\n }\n // Otherwise use form-level errors from save failure (covers untouched fields)\n const contextErrors = this.FormContext?.validationErrors;\n if (contextErrors && contextErrors.length > 0) {\n return contextErrors.filter(e => e.Source === this.FieldName);\n }\n return [];\n }\n\n /** Whether to show validation messages (touched OR form-level showValidation) */\n get ShowValidation(): boolean {\n if (!this.EditMode || this.IsFieldReadOnly) return false;\n return this._touched || (this.FormContext?.showValidation === true);\n }\n\n /** Whether this field has active error-level validation failures to display */\n get ShowErrors(): boolean {\n if (this.imageUploadError) return true;\n return this.ShowValidation && this.FieldErrors.some(e => e.Type === 'Failure');\n }\n\n /** Whether this field has active warning-level validation issues to display */\n get ShowWarnings(): boolean {\n return this.ShowValidation && !this.ShowErrors && this.FieldErrors.some(e => e.Type === 'Warning');\n }\n\n /** Error messages to render in the template */\n get DisplayErrors(): ValidationErrorInfo[] {\n const errors = this.ShowValidation\n ? this.FieldErrors.filter(e => e.Type === 'Failure')\n : [];\n if (this.imageUploadError) {\n return [\n ...errors,\n new ValidationErrorInfo(this.FieldName, this.imageUploadError, this.Value),\n ];\n }\n return errors;\n }\n\n /** Warning messages to render in the template */\n get DisplayWarnings(): ValidationErrorInfo[] {\n if (!this.ShowValidation) return [];\n return this.FieldErrors.filter(e => e.Type === 'Warning');\n }\n\n /**\n * Runs validation for this field using the full Record.Validate() method.\n * This captures both built-in field checks and custom Validate() overrides\n * (including cross-field rules). Results are filtered to this field only.\n */\n private runFieldValidation(): void {\n if (!this.Record || !this.EditMode) {\n this._fieldErrors = [];\n return;\n }\n try {\n const result = this.Record.Validate();\n this._fieldErrors = result.Errors.filter(e => e.Source === this.FieldName);\n } catch {\n this._fieldErrors = [];\n }\n this.cdr.markForCheck();\n }\n\n /** Whether this field should be hidden (empty in read-only mode) */\n get ShouldHideField(): boolean {\n if (this.EditMode) return false;\n if (!this.HideWhenEmptyInReadOnlyMode) return false;\n if (this.FormContext?.showEmptyFields) return false;\n const val = this.Value;\n return val === null || val === undefined || val === '';\n }\n\n /** Possible values for select/autocomplete from entity metadata or override */\n get PossibleValues(): string[] {\n if (this.PossibleValuesOverride) return this.PossibleValuesOverride;\n const values = this.FieldInfo?.EntityFieldValues;\n if (values && values.length > 0) {\n return values.map(v => v.Value);\n }\n return [];\n }\n\n /** Whether this field has a related entity (foreign key) */\n get HasRelatedEntity(): boolean {\n const re = this.FieldInfo?.RelatedEntity;\n return re != null && re.length > 0;\n }\n\n /**\n * For FK fields, returns the human-readable name to display instead of the raw ID.\n *\n * Resolution order:\n * 1. If `RelatedEntityNameFieldMap` exists, read the name from the joined field on the record (sync).\n * 2. Otherwise, fall back to an async `GetEntityRecordName` lookup (result cached in `_resolvedFKName`).\n */\n get FKDisplayName(): string | null {\n if (!this.Record || !this.HasRelatedEntity) return null;\n\n // If the FK value itself is null/empty, there's nothing to display\n // (the joined name field may still hold a stale cached value from the view)\n const fkValue = this.Value;\n if (fkValue == null || fkValue === '') return null;\n\n // Fast path: name field is joined into our record's view\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n const val = this.Record.Get(nameFieldMap);\n if (val != null && val !== '') return String(val);\n }\n\n // Async fallback: resolved via GetEntityRecordName\n if (this._resolvedFKName !== undefined) {\n return this._resolvedFKName;\n }\n\n // Kick off async resolution if not already in flight\n this.resolveFKNameAsync();\n return null; // will render once resolved\n }\n\n /**\n * Whether this FK field should display the related entity name\n * with a hyperlink instead of the raw ID value.\n */\n get IsFKWithNameField(): boolean {\n return this.HasRelatedEntity && this.FKDisplayName != null;\n }\n\n // ---- Async FK name resolution ----\n\n /** Cached result from GetEntityRecordName. undefined = not yet resolved. */\n private _resolvedFKName: string | null | undefined = undefined;\n\n /** Tracks which FK value we resolved so we can invalidate on record change */\n private _resolvedFKValue: unknown = undefined;\n\n /** Whether an async lookup is in flight */\n private _fkNameLoading = false;\n\n /**\n * Asynchronously resolves the display name for an FK field that lacks\n * a RelatedEntityNameFieldMap by calling Metadata.GetEntityRecordName.\n */\n private resolveFKNameAsync(): void {\n if (this._fkNameLoading) return;\n\n const fkValue = this.Value;\n if (fkValue == null || fkValue === '') return;\n\n const fieldInfo = this.FieldInfo;\n if (!fieldInfo?.RelatedEntity || !fieldInfo?.RelatedEntityFieldName) return;\n\n this._fkNameLoading = true;\n this._resolvedFKValue = fkValue;\n\n const pk = new CompositeKey([{\n FieldName: fieldInfo.RelatedEntityFieldName,\n Value: fkValue\n }]);\n\n const md = this.ProviderToUse;\n md.GetEntityRecordName(fieldInfo.RelatedEntity, pk)\n .then(name => {\n this._resolvedFKName = name || null;\n this._fkNameLoading = false;\n this.cdr.markForCheck();\n })\n .catch(() => {\n this._resolvedFKName = null;\n this._fkNameLoading = false;\n });\n }\n\n // ============================================\n // DROPDOWN POSITIONING (shared by FK, value list, select)\n // ============================================\n\n /** Calculated position for fixed-position dropdowns */\n DropdownTop = 0;\n DropdownLeft = 0;\n /** Computed: dropdown is at least the trigger width, at most {@link DropdownMaxWidth}. */\n DropdownMinWidth = 0;\n DropdownMaxWidth = 0;\n OpenAbove = false;\n\n /**\n * Max width (px) of the FK suggestion dropdown. The panel grows to fit its\n * columns up to this cap (then scrolls horizontally). When null, defaults to\n * 2× the trigger width so multi-column rows aren't cramped by a narrow field.\n * Always additionally bounded by the viewport's right edge.\n */\n @Input() FKDropdownMaxWidth: number | null = null;\n\n /**\n * Whether to highlight the typed query substring within each suggestion's name\n * in the FK dropdown. On by default — uses the muted, theme-aware\n * `--mj-status-warning` highlight (not the old bright yellow). Set false for\n * plain, un-marked names.\n */\n @Input() FKHighlightMatches = true;\n\n /**\n * Whether to offer inline \"create new\" for the related record when the one you need\n * isn't found. The affordance only renders when this is true AND the current user can\n * create records of the related entity (entity allows creation + role permits it).\n */\n @Input() AllowFKCreate = true;\n\n /** Surface used for the inline create form: a modal dialog (default) or a slide-in. */\n @Input() FKCreatePresentation: 'dialog' | 'slide-in' = 'dialog';\n\n /** Cleanup function for scroll/resize listeners */\n private _scrollCleanup: (() => void) | null = null;\n\n /** Inline style for the fixed-position dropdown */\n get DropdownPositionStyle(): Record<string, string> {\n // min-width floors at the trigger width; max-width caps growth; the auto\n // intrinsic width then shrink-to-fits the columns between the two, and\n // `.mj-fk-options` scrolls horizontally once content exceeds the cap.\n const sizing = {\n 'min-width': this.DropdownMinWidth + 'px',\n 'max-width': this.DropdownMaxWidth + 'px',\n 'width': 'max-content',\n };\n if (this.OpenAbove) {\n return {\n 'position': 'fixed',\n 'bottom': (window.innerHeight - this.DropdownTop) + 'px',\n 'top': 'auto',\n 'left': this.DropdownLeft + 'px',\n ...sizing,\n 'z-index': '10000'\n };\n }\n return {\n 'position': 'fixed',\n 'top': this.DropdownTop + 'px',\n 'bottom': 'auto',\n 'left': this.DropdownLeft + 'px',\n ...sizing,\n 'z-index': '10000'\n };\n }\n\n /** Calculate dropdown position relative to viewport from anchor element */\n private updateDropdownPosition(anchorEl: HTMLElement): void {\n const rect = anchorEl.getBoundingClientRect();\n const dropdownMaxHeight = 240;\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n if (spaceBelow < dropdownMaxHeight && spaceAbove > spaceBelow) {\n this.OpenAbove = true;\n this.DropdownTop = rect.top - gap;\n } else {\n this.OpenAbove = false;\n this.DropdownTop = rect.bottom + gap;\n }\n this.DropdownLeft = rect.left;\n // At least the trigger width; up to FKDropdownMaxWidth (default 2×), but never\n // past the viewport's right edge. Content fills between min and max; overflow\n // scrolls horizontally.\n this.DropdownMinWidth = rect.width;\n const desiredMax = this.FKDropdownMaxWidth ?? rect.width * 2;\n this.DropdownMaxWidth = Math.max(rect.width, Math.min(desiredMax, window.innerWidth - rect.left - 8));\n }\n\n // ---- Dropdown portal (escape transformed ancestors) ----\n\n /**\n * The dropdown is `position: fixed` with viewport coords. Inside the slide-in /\n * dialog overlays (which use CSS `transform`), a `fixed` descendant is positioned\n * relative to the transformed ancestor instead of the viewport, so it renders\n * off-screen. Re-parenting the dropdown element to `document.body` removes it from\n * any transformed containing block, restoring true viewport-fixed positioning.\n *\n * Call after change detection has rendered the dropdown (microtask). Angular still\n * owns the node — when the structural `@if` tears it down it removes the node by\n * reference regardless of where it currently lives, so no manual cleanup is needed\n * beyond clearing our tracking pointer.\n */\n private portalDropdownToBody(): void {\n // Already portaled and still in the DOM → nothing to do (e.g. typing while open).\n if (this._portaledDropdownEl?.isConnected) return;\n\n // The dropdown is rendered by `@if (ShowFKDropdown)`. On the synchronous cached\n // path (focus → searchCachedEntity → applySuggestions) the element may not be in\n // the DOM yet when we first look, so retry across a few frames until it renders.\n // (The async DB path lands here post-render, so it succeeds on the first try.)\n const tryPortal = (retriesLeft: number): void => {\n const host = this.hostRef?.nativeElement;\n if (!host) return;\n const dropdown = host.querySelector('.mj-fk-dropdown') as HTMLElement | null;\n if (dropdown) {\n if (dropdown.parentElement !== document.body) {\n this.renderer.appendChild(document.body, dropdown);\n this._portaledDropdownEl = dropdown;\n }\n } else if (retriesLeft > 0) {\n setTimeout(() => tryPortal(retriesLeft - 1), 0);\n }\n };\n Promise.resolve().then(() => tryPortal(5));\n }\n\n /** Tracks a dropdown element we relocated to body so we can drop the reference on close. */\n private _portaledDropdownEl: HTMLElement | null = null;\n\n /** Start listening for scroll/resize to close dropdowns */\n private startScrollListener(): void {\n this.stopScrollListener();\n\n const onScroll = (e: Event) => {\n // Scrolling WITHIN the dropdown (vertical list or horizontal column scroll)\n // must not close it — only an ancestor/page scroll, which would detach the\n // fixed-position panel from its trigger, should.\n const target = e.target as Node | null;\n if (this._portaledDropdownEl && target && this._portaledDropdownEl.contains(target)) return;\n this.closeAllDropdowns();\n this.cdr.markForCheck();\n };\n const onResize = () => {\n this.closeAllDropdowns();\n this.cdr.markForCheck();\n };\n\n document.addEventListener('scroll', onScroll, true); // capture phase catches all scrollable ancestors\n window.addEventListener('resize', onResize);\n\n this._scrollCleanup = () => {\n document.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n };\n }\n\n /** Remove scroll/resize listeners */\n private stopScrollListener(): void {\n if (this._scrollCleanup) {\n this._scrollCleanup();\n this._scrollCleanup = null;\n }\n }\n\n /** Close all dropdown types */\n private closeAllDropdowns(): void {\n this.ShowFKDropdown = false;\n this.FKActiveIndex = -1;\n this.FKLoading = false;\n this.FKNoMatches = false;\n this._portaledDropdownEl = null;\n this.ShowValueListDropdown = false;\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n }\n\n // ============================================\n // FK AUTOCOMPLETE (custom implementation)\n // ============================================\n\n /** Max rows shown on an empty-input focus-show (cached fast path only). */\n private static readonly FK_FOCUS_SHOW_LIMIT = 50;\n\n /** Max rows returned from a DB search. */\n private static readonly FK_DB_SEARCH_LIMIT = 20;\n\n /** Suggestions returned from the FK entity search */\n FKSuggestions: FKSuggestion[] = [];\n\n /**\n * The currently-linked record, pinned as a sticky \"Currently selected\" section at the\n * top of the dropdown (browse mode only). Null when there's no selection or the user is\n * actively filtering. Removed from {@link FKSuggestions} so it isn't listed twice.\n */\n FKSelectedSuggestion: FKSuggestion | null = null;\n\n /** Whether the current FK value is a confirmed match (user selected from dropdown) */\n FKIsMatched = false;\n\n /** Whether the FK dropdown is visible */\n ShowFKDropdown = false;\n\n /** Whether a DB search is currently in flight (drives the loading indicator). */\n FKLoading = false;\n\n /** True when a search completed with zero results (drives the \"No matches\" row). */\n FKNoMatches = false;\n\n /** Index of the keyboard-highlighted active suggestion (-1 = none). */\n FKActiveIndex = -1;\n\n /** Headers for the extra (DefaultInView) columns shown in the dropdown. */\n FKColumnHeaders: string[] = [];\n\n /** Field code names for the extra columns, index-aligned with {@link FKColumnHeaders}. */\n FKColumnFields: string[] = [];\n\n /** Code name of the name column (used as its sort key). */\n FKNameField = '';\n\n /** Whether rows render a leading icon column (drives the header's empty icon cell). */\n FKHasIconColumn = false;\n\n /** Active sort column (field code name), or null for natural (unsorted) order. */\n FKSortField: string | null = null;\n\n /** Active sort direction; only meaningful when {@link FKSortField} is set. */\n FKSortDir: 'asc' | 'desc' = 'asc';\n\n /** Unsorted snapshot of the current suggestions, used to restore natural order. */\n private _fkSuggestionsNatural: FKSuggestion[] = [];\n\n /** Text the user is currently typing in the FK search input. null = use display name. */\n private _fkInputText: string | null = null;\n\n /**\n * The active search query that produced the current results — `''` on a focus/clear\n * browse (full list), the typed text when filtering. Distinct from {@link _fkInputText},\n * which holds the *displayed* text (the selected record's name when not typing). This is\n * the correct signal for \"browse mode\" and for the create-footer label.\n */\n private _fkQuery = '';\n\n /** Debounce timer for FK search */\n private _fkSearchTimeout: ReturnType<typeof setTimeout> | null = null;\n\n /** Last known FK input element for position recalculation */\n private _lastFKInputEl: HTMLElement | null = null;\n\n /** Monotonic token so a slow DB response from a stale query can't clobber a newer one. */\n private _fkSearchSeq = 0;\n\n /** Cached column plan for the current related entity (rebuilt on demand). */\n private _fkColumnPlan: FKColumnPlan | null = null;\n\n // ---- Scope / search-field picker (Option B) ----\n\n /** Related-entity field code name currently searched against (defaults to the name field). */\n FKSearchField = '';\n\n /** Friendly label of {@link FKSearchField}, shown on the scope pill. */\n FKSearchFieldLabel = '';\n\n /** Whether the scope-picker menu is open. */\n FKShowScopeMenu = false;\n\n /** Whether the FK input is focused — the scope pill only appears while focused. */\n FKFocused = false;\n\n /** Fields the user can scope the search to (name + shown columns + other fields). */\n FKSearchableFields: FKSearchableField[] = [];\n\n // ---- Per-user persisted prefs (scope / sort / column widths) ----\n\n /** User-resized column widths in px, keyed by related-entity field code name. */\n private _fkColWidths: Record<string, number> = {};\n\n /** The (host entity|field) pref key currently loaded; reload when it changes. */\n private _fkPrefKey: string | null = null;\n\n /** Active column-resize drag, or null when not resizing. */\n private _fkResize: { field: string; startX: number; startWidth: number } | null = null;\n private _fkResizeMove: ((e: MouseEvent) => void) | null = null;\n private _fkResizeUp: (() => void) | null = null;\n\n /** The display text shown in the FK search input */\n get FKSearchText(): string {\n if (this._fkInputText !== null) return this._fkInputText;\n return this.FKDisplayName || '';\n }\n\n /**\n * True when this FK currently points at a real record (has a value AND we can show\n * its name). Drives the \"linked\" affordance — the chain icon + accent — so the user\n * can tell at a glance this is a resolved link, not free text.\n */\n get FKHasLinkedValue(): boolean {\n return this.Value != null && this.Value !== '' && this.FKDisplayName != null;\n }\n\n /** Whether a dropdown row is the record currently linked by this FK (UUID-safe compare). */\n IsFKRowSelected(suggestion: FKSuggestion): boolean {\n const v = this.Value;\n const pk = suggestion.PrimaryKeyValue;\n if (v == null || pk == null) return false;\n return UUIDsEqual(String(v), String(pk));\n }\n\n /**\n * Resolves the related `EntityInfo` for this FK field via the instance provider\n * (multi-provider safe — never the global `Metadata`).\n */\n private getRelatedEntityInfo(): EntityInfo | undefined {\n const relatedName = this.FieldInfo?.RelatedEntity;\n if (!relatedName) return undefined;\n return this.ProviderToUse.EntityByName(relatedName);\n }\n\n /**\n * Returns the LIVE cached array of records for the related entity IF a loaded\n * engine holds the full (unfiltered) set; otherwise null. Records are read-only —\n * never mutate. Wraps {@link BaseEngineRegistry.TryGetCachedRecords}.\n */\n private getCachedRecordsForRelatedEntity(): BaseEntity[] | null {\n const relatedName = this.FieldInfo?.RelatedEntity;\n if (!relatedName) return null;\n const registry = BaseEngineRegistry.Instance;\n const records = registry.TryGetCachedRecords<BaseEntity>(relatedName, { unfilteredOnly: true });\n // Treat an empty (or absent) cache as \"no usable cache\" so callers fall through\n // to the DB path and still show options on focus — never a blank dropdown.\n return records && records.length > 0 ? records : null;\n }\n\n /**\n * Builds (and memoizes) the column plan for the related entity: the name field,\n * the PK field used as the FK value, and the extra `DefaultInView` columns\n * (excluding the name + PK). Returns null when the related entity can't be resolved\n * or has no usable name/PK.\n */\n private buildColumnPlan(): FKColumnPlan | null {\n if (this._fkColumnPlan) {\n this.ensureLinkedFieldPrefsLoaded(this._fkColumnPlan);\n return this._fkColumnPlan;\n }\n\n const relatedEntity = this.getRelatedEntityInfo();\n if (!relatedEntity) return null;\n\n const nameField = relatedEntity.NameField;\n const pkFields = relatedEntity.PrimaryKeys;\n if (!nameField && (!pkFields || pkFields.length !== 1)) return null;\n\n const nameFieldName = nameField ? nameField.Name : pkFields[0].Name;\n const pkFieldName = this.FieldInfo?.RelatedEntityFieldName || (pkFields?.[0]?.Name ?? 'ID');\n\n // A field flagged ExtendedType='Icon' holds a per-row icon class — render it\n // as the row's leading glyph, not as a text column.\n const iconField = relatedEntity.Fields.find(f => f.ExtendedType === 'Icon');\n const iconFieldName = iconField?.Name ?? null;\n\n const columnFields = this.computeOrderedColumns(relatedEntity, nameFieldName, pkFieldName, iconFieldName);\n const extraFieldNames = columnFields.filter(c => c !== nameFieldName);\n\n this._fkColumnPlan = {\n NameFieldName: nameFieldName,\n PkFieldName: pkFieldName,\n ColumnFields: columnFields,\n ExtraFieldNames: extraFieldNames,\n ExtraHeaders: extraFieldNames.map(n => this.labelForRelatedField(n)),\n IconFieldName: iconFieldName,\n EntityIcon: relatedEntity.Icon || null\n };\n this.FKSearchableFields = this.buildSearchableFields(this._fkColumnPlan);\n this.ensureLinkedFieldPrefsLoaded(this._fkColumnPlan);\n return this._fkColumnPlan;\n }\n\n /**\n * Whether a `DefaultInView` field is worth showing as an extra dropdown column.\n * Excludes columns that read as opaque noise to a human picking a record:\n * • Primary keys (UUIDs/identities).\n * • Foreign-key columns — these hold the related record's raw ID (e.g. `ParentID`\n * → a GUID), not a human-readable label. The view's joined *name* field (if it's\n * itself `DefaultInView`) is the readable substitute and is kept.\n */\n private isUsefulExtraColumn(f: EntityFieldInfo): boolean {\n if (f.IsPrimaryKey) return false;\n if (f.RelatedEntityID && f.RelatedEntityID.length > 0) return false; // foreign key → raw ID\n return true;\n }\n\n /**\n * The ordered list of display columns INCLUDING the name field — the user-reorderable\n * column order. Honors a user `visibleFields` override (exact set + order, letting them\n * add fields like ID, drop defaults, or move the name field); otherwise falls back to\n * `[name, ...DefaultInView columns]`. The name field is always guaranteed present, and\n * the icon field is never a text column.\n */\n private computeOrderedColumns(\n relatedEntity: EntityInfo, nameFieldName: string, pkFieldName: string, iconFieldName: string | null\n ): string[] {\n const exists = (n: string) => n !== iconFieldName && !!relatedEntity.Fields.find(f => f.Name === n);\n\n const saved = this.fkHostEntityName && this.fkFieldCodeName\n ? LinkedFieldOptionsStore.Instance.Get(this.fkHostEntityName, this.fkFieldCodeName) : undefined;\n\n let cols: string[];\n if (saved?.visibleFields) {\n cols = saved.visibleFields.filter(exists);\n // Migrate older prefs (stored extras-only, without the name field) and guarantee\n // the name field is always present.\n if (!cols.includes(nameFieldName)) cols = [nameFieldName, ...cols];\n } else {\n const defaults = relatedEntity.Fields\n .filter(f => f.DefaultInView && f.Name !== nameFieldName && f.Name !== pkFieldName\n && f.Name !== iconFieldName && this.isUsefulExtraColumn(f))\n .map(f => f.Name);\n cols = [nameFieldName, ...defaults];\n }\n\n // De-dupe (preserve order) and ensure the name field is present.\n const seen = new Set<string>();\n const ordered = cols.filter(c => (seen.has(c) ? false : (seen.add(c), true)));\n if (!ordered.includes(nameFieldName)) ordered.unshift(nameFieldName);\n return ordered;\n }\n\n // ============================================\n // SCOPE PICKER + PER-USER PREFS\n // ============================================\n\n /** Host entity name (the entity whose form this field belongs to), or null. */\n private get fkHostEntityName(): string | null {\n return this.Record?.EntityInfo?.Name ?? null;\n }\n\n /** This FK field's code name on the host entity, or null. */\n private get fkFieldCodeName(): string | null {\n return this.FieldInfo?.Name ?? null;\n }\n\n /** Whether the active search column is the name field (drives where we highlight). */\n private isSearchingNameField(plan: FKColumnPlan): boolean {\n return !this.FKSearchField || this.FKSearchField === plan.NameFieldName;\n }\n\n /** A field is scope-searchable if it's a string column (LIKE-able) and not a system column. */\n private isScopeSearchableField(f: EntityFieldInfo): boolean {\n if (f.TSType !== EntityFieldTSType.String) return false;\n if (f.Name.startsWith('__mj_')) return false;\n return true;\n }\n\n /** Friendly label for a related-entity field code name. */\n private labelForRelatedField(name: string): string {\n return this.getRelatedEntityInfo()?.Fields.find(x => x.Name === name)?.DisplayNameOrName ?? name;\n }\n\n /** Whether a field code name exists on the related entity (guards stale saved prefs). */\n private isValidRelatedField(name: string): boolean {\n return !!this.getRelatedEntityInfo()?.Fields.find(x => x.Name === name);\n }\n\n /**\n * Build the scope-picker field list: the name + shown columns ('shown' group),\n * then any other searchable string fields like ID/Status ('other' group).\n */\n private buildSearchableFields(plan: FKColumnPlan): FKSearchableField[] {\n const re = this.getRelatedEntityInfo();\n if (!re) return [];\n const iconFor = (fieldName: string) => {\n if (fieldName === plan.NameFieldName) return 'fa-solid fa-font';\n return re.Fields.find(x => x.Name === fieldName)?.IsPrimaryKey ? 'fa-solid fa-hashtag' : 'fa-solid fa-tag';\n };\n // 'shown' group rendered in the actual column order so the menu matches the grid\n // (and so the up/down arrows hide correctly on the true first/last columns).\n const shown = new Set(plan.ColumnFields);\n const list: FKSearchableField[] = plan.ColumnFields.map(fieldName => ({\n FieldName: fieldName,\n Label: this.labelForRelatedField(fieldName),\n Icon: iconFor(fieldName),\n Group: 'shown' as const\n }));\n for (const f of re.Fields) {\n if (shown.has(f.Name) || f.Name === plan.IconFieldName) continue;\n if (!this.isScopeSearchableField(f)) continue;\n list.push({\n FieldName: f.Name,\n Label: f.DisplayNameOrName,\n Icon: f.IsPrimaryKey ? 'fa-solid fa-hashtag' : 'fa-solid fa-font',\n Group: 'other'\n });\n }\n return list;\n }\n\n /**\n * Load this (host entity, FK field)'s saved prefs — search scope, sort, column\n * widths — once per field. No-ops when the field hasn't changed. Falls back to\n * defaults (search the name field, natural sort, content-sized columns) and only\n * applies a saved value when it still resolves to a real field.\n */\n private ensureLinkedFieldPrefsLoaded(plan: FKColumnPlan): void {\n const key = this.fkHostEntityName && this.fkFieldCodeName\n ? `${this.fkHostEntityName}|${this.fkFieldCodeName}` : null;\n if (key === this._fkPrefKey) return;\n this._fkPrefKey = key;\n\n // Defaults\n this.FKSearchField = plan.NameFieldName;\n this._fkColWidths = {};\n\n const saved = this.fkHostEntityName && this.fkFieldCodeName\n ? LinkedFieldOptionsStore.Instance.Get(this.fkHostEntityName, this.fkFieldCodeName) : undefined;\n if (saved) {\n if (saved.searchField && this.isValidRelatedField(saved.searchField)) {\n this.FKSearchField = saved.searchField;\n }\n if (saved.sortField !== undefined && (saved.sortField === null || this.isValidRelatedField(saved.sortField))) {\n this.FKSortField = saved.sortField;\n this.FKSortDir = saved.sortDir ?? 'asc';\n }\n if (saved.colWidths) this._fkColWidths = { ...saved.colWidths };\n }\n this.FKSearchFieldLabel = this.labelForRelatedField(this.FKSearchField);\n }\n\n /** Format a raw cell value for display in the dropdown (delegates to the pure helper). */\n private formatCell(val: unknown): string {\n return FormatFKCell(val);\n }\n\n /**\n * Build the suggestion view-models from a set of plain rows (cached or DB),\n * applying the typed-query substring highlight to the name column.\n * `getField` abstracts cached BaseEntity rows (`.Get(name)`) vs simple objects.\n */\n private buildSuggestions(\n rows: ReadonlyArray<{ get: (field: string) => unknown }>,\n plan: FKColumnPlan,\n query: string\n ): FKSuggestion[] {\n const searchField = this.FKSearchField || plan.NameFieldName;\n // Only highlight the column actually being searched, and only when enabled.\n const nameQuery = (this.FKHighlightMatches && this.isSearchingNameField(plan)) ? query : '';\n return rows.map(row => {\n const name = this.formatCell(row.get(plan.NameFieldName));\n // Per-row icon from the entity's ExtendedType='Icon' field; else the\n // entity-level icon; else none.\n const rowIcon = plan.IconFieldName ? this.formatCell(row.get(plan.IconFieldName)).trim() : '';\n return {\n PrimaryKeyValue: row.get(plan.PkFieldName),\n DisplayName: name,\n // Empty query yields the (still HTML-escaped) plain name — no marks.\n HighlightedName: HighlightSearchMatches(name, nameQuery, 'mj-forms-search-highlight'),\n ExtraColumns: plan.ExtraFieldNames.map((fieldName, i) => {\n const value = this.formatCell(row.get(fieldName));\n const colQuery = (this.FKHighlightMatches && fieldName === searchField) ? query : '';\n return {\n FieldName: fieldName,\n Header: plan.ExtraHeaders[i],\n Value: value,\n HighlightedValue: HighlightSearchMatches(value, colQuery, 'mj-forms-search-highlight')\n };\n }),\n Icon: (rowIcon || plan.EntityIcon) || null\n };\n });\n }\n\n /** Apply a freshly-built suggestion list to the dropdown state + reposition + portal. */\n private applySuggestions(suggestions: FKSuggestion[], plan: FKColumnPlan): void {\n // Pinned \"currently selected\" row: in browse mode (empty query) with a valid linked\n // value, lift the selected record into a sticky section and remove it from the list so\n // the user can keep it or pick another without clearing first.\n this.FKSelectedSuggestion = null;\n const browseMode = this._fkQuery.trim().length === 0;\n if (browseMode && this.FKHasLinkedValue) {\n const idx = suggestions.findIndex(s => this.IsFKRowSelected(s));\n if (idx >= 0) {\n this.FKSelectedSuggestion = suggestions[idx];\n suggestions = suggestions.filter((_, i) => i !== idx);\n } else {\n // Selected record isn't in the (first-N) result — show a lightweight pinned row.\n this.FKSelectedSuggestion = this.buildSelectedFallbackSuggestion(plan);\n }\n }\n\n this._fkSuggestionsNatural = suggestions;\n this.FKNameField = plan.NameFieldName;\n // Full ordered column list (incl. the name field) + matching headers.\n this.FKColumnFields = plan.ColumnFields;\n this.FKColumnHeaders = plan.ColumnFields.map(c => c === plan.NameFieldName ? 'Name' : this.labelForRelatedField(c));\n this.FKHasIconColumn = (this.FKSelectedSuggestion?.Icon != null) || suggestions.some(s => s.Icon != null);\n this.FKSuggestions = this.sortSuggestions(suggestions);\n this.FKActiveIndex = this.FKSuggestions.length > 0 ? 0 : -1;\n this.FKNoMatches = suggestions.length === 0 && !this.FKSelectedSuggestion;\n\n // Show the dropdown for rows, a \"no matches\" state, or just the pinned selection.\n this.ShowFKDropdown = suggestions.length > 0 || this.FKNoMatches || !!this.FKSelectedSuggestion;\n if (this.ShowFKDropdown && this._lastFKInputEl) {\n this.updateDropdownPosition(this._lastFKInputEl);\n this.startScrollListener();\n this.portalDropdownToBody();\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Build a lightweight pinned row for the selected record when it isn't present in the\n * current result set (DB beyond first-N, or cached beyond the focus-show limit). We have\n * its display name from the FK name resolution; extra-column values are left blank.\n */\n private buildSelectedFallbackSuggestion(plan: FKColumnPlan): FKSuggestion | null {\n const name = this.FKDisplayName;\n if (this.Value == null || this.Value === '' || !name) return null;\n return {\n PrimaryKeyValue: this.Value,\n DisplayName: name,\n HighlightedName: HighlightSearchMatches(name, '', 'mj-forms-search-highlight'),\n ExtraColumns: plan.ExtraFieldNames.map((fn, i) => ({\n FieldName: fn, Header: plan.ExtraHeaders[i], Value: '', HighlightedValue: ''\n })),\n Icon: plan.EntityIcon ?? null\n };\n }\n\n /**\n * Returns a sorted copy of the suggestions per the active sort column/direction.\n * Null sort field → natural order (original array, untouched). Sorts on the name\n * column's `DisplayName` or the matching extra column's formatted `Value`,\n * case-insensitively.\n */\n private sortSuggestions(suggestions: FKSuggestion[]): FKSuggestion[] {\n const field = this.FKSortField;\n if (!field) return suggestions;\n const keyOf = (s: FKSuggestion): string => {\n if (field === this.FKNameField) return s.DisplayName ?? '';\n return s.ExtraColumns.find(c => c.FieldName === field)?.Value ?? '';\n };\n const dir = this.FKSortDir === 'desc' ? -1 : 1;\n return [...suggestions].sort((a, b) =>\n dir * keyOf(a).localeCompare(keyOf(b), undefined, { numeric: true, sensitivity: 'base' })\n );\n }\n\n /**\n * Toggle the sort on a column header: same column cycles asc → desc → none;\n * a new column starts at asc. Re-derives the visible list from the natural snapshot.\n */\n OnFKSortToggle(fieldName: string): void {\n if (this.FKSortField === fieldName) {\n if (this.FKSortDir === 'asc') this.FKSortDir = 'desc';\n else { this.FKSortField = null; this.FKSortDir = 'asc'; } // desc → cleared\n } else {\n this.FKSortField = fieldName;\n this.FKSortDir = 'asc';\n }\n this.FKSuggestions = this.sortSuggestions(this._fkSuggestionsNatural);\n this.FKActiveIndex = this.FKSuggestions.length > 0 ? 0 : -1;\n this.persistLinkedFieldSort();\n this.cdr.markForCheck();\n }\n\n /** Persist the active sort for this (host entity, FK field) pair. */\n private persistLinkedFieldSort(): void {\n if (this.fkHostEntityName && this.fkFieldCodeName) {\n LinkedFieldOptionsStore.Instance.SetSort(\n this.fkHostEntityName, this.fkFieldCodeName, this.FKSortField, this.FKSortDir\n );\n }\n }\n\n /** FontAwesome class for a column header's sort indicator (idle / asc / desc). */\n FKSortIcon(fieldName: string): string {\n if (this.FKSortField !== fieldName) return 'fa-solid fa-sort mj-fk-sort-icon mj-fk-sort-icon--idle';\n return this.FKSortDir === 'asc'\n ? 'fa-solid fa-sort-up mj-fk-sort-icon'\n : 'fa-solid fa-sort-down mj-fk-sort-icon';\n }\n\n // ---- Scope pill (search-field picker) ----\n\n /** Toggle the scope-picker menu. mousedown+preventDefault keeps the input focused. */\n OnFKScopeToggle(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.FKShowScopeMenu = !this.FKShowScopeMenu;\n this.cdr.markForCheck();\n }\n\n /** Whether a scope-menu row is the active search field. */\n IsFKScopeActive(field: FKSearchableField): boolean {\n return field.FieldName === (this.FKSearchField || this.FKNameField);\n }\n\n /** Whether there are non-visible searchable fields (drives the \"Other fields\" group). */\n get FKHasOtherSearchableFields(): boolean {\n return this.FKSearchableFields.some(f => f.Group === 'other');\n }\n\n /** User picked a field to search by — persist the override and re-run the search. */\n OnFKScopeSelect(event: MouseEvent, field: FKSearchableField): void {\n event.preventDefault();\n this.selectScope(field);\n }\n\n /** Set the active search field (used by click + the no-drag path of menu drag). */\n private selectScope(field: FKSearchableField): void {\n this.FKSearchField = field.FieldName;\n this.FKSearchFieldLabel = field.Label;\n this.FKShowScopeMenu = false;\n if (this.fkHostEntityName && this.fkFieldCodeName) {\n LinkedFieldOptionsStore.Instance.SetSearchField(this.fkHostEntityName, this.fkFieldCodeName, field.FieldName);\n }\n this.rerunCurrentFKSearch();\n this.cdr.markForCheck();\n }\n\n /** Re-run the active query against the (possibly newly-chosen) search field. */\n private rerunCurrentFKSearch(): void {\n const query = this._fkQuery;\n const cached = this.getCachedRecordsForRelatedEntity();\n if (cached) this.searchCachedEntity(cached, query);\n else void this.searchRelatedEntity(query);\n }\n\n // ---- Column visibility (show/hide a field as a column) ----\n\n /** Whether a field is currently rendered as a column (the Name column is always shown). */\n IsFKColumnVisible(field: FKSearchableField): boolean {\n return field.FieldName === this.FKNameField || this.FKColumnFields.includes(field.FieldName);\n }\n\n /** Whether this field's column visibility can be toggled (Name is always shown). */\n CanToggleFKColumn(field: FKSearchableField): boolean {\n return field.FieldName !== this.FKNameField;\n }\n\n /**\n * Toggle whether a field shows as a column. Persists the full visible set, then\n * rebuilds the column plan + re-runs the search so the grid reflects it live.\n * stopPropagation so the row's search-scope click doesn't also fire.\n */\n OnFKColumnToggle(event: MouseEvent, field: FKSearchableField): void {\n event.preventDefault();\n event.stopPropagation();\n if (!this.CanToggleFKColumn(field)) return;\n\n const next = [...this.FKColumnFields];\n const idx = next.indexOf(field.FieldName);\n if (idx >= 0) next.splice(idx, 1);\n else next.push(field.FieldName);\n this.applyVisibleColumns(next);\n }\n\n /** Persist a new visible-column set/order and rebuild the grid live. */\n private applyVisibleColumns(cols: string[]): void {\n if (this.fkHostEntityName && this.fkFieldCodeName) {\n LinkedFieldOptionsStore.Instance.SetVisibleFields(this.fkHostEntityName, this.fkFieldCodeName, cols);\n }\n this._fkColumnPlan = null; // force rebuild with the new column set/order\n this.rerunCurrentFKSearch();\n this.cdr.markForCheck();\n }\n\n // ---- Column reorder (up/down arrows in the field-selector menu) ----\n\n /** Whether the column can move up (it's a column and not already first). */\n CanMoveFKColumnUp(field: string): boolean {\n return this.FKColumnFields.indexOf(field) > 0;\n }\n\n /** Whether the column can move down (it's a column and not already last). */\n CanMoveFKColumnDown(field: string): boolean {\n const i = this.FKColumnFields.indexOf(field);\n return i >= 0 && i < this.FKColumnFields.length - 1;\n }\n\n /**\n * Move a column one slot up (delta -1) or down (delta +1) and persist. mousedown +\n * stopPropagation so the row's select-scope handler doesn't fire and the menu stays open.\n */\n MoveFKColumn(event: MouseEvent, field: string, delta: -1 | 1): void {\n event.preventDefault();\n event.stopPropagation();\n const cols = [...this.FKColumnFields];\n const i = cols.indexOf(field);\n const j = i + delta;\n if (i < 0 || j < 0 || j >= cols.length) return;\n [cols[i], cols[j]] = [cols[j], cols[i]];\n this.applyVisibleColumns(cols);\n }\n\n /**\n * CSS `grid-template-columns` for the dropdown grid: optional icon column, then one\n * track per ordered column. The LAST column grows to fill any remaining width (`1fr`)\n * so the grid never leaves dead space on the right; earlier columns size to content.\n * A user-resized column uses its saved pixel width as the floor.\n */\n get FKGridTemplateColumns(): string {\n const cols: string[] = [];\n if (this.FKHasIconColumn) cols.push('min-content');\n const lastIdx = this.FKColumnFields.length - 1;\n this.FKColumnFields.forEach((field, i) => cols.push(this.fkColumnTrack(field, i === lastIdx)));\n return cols.join(' ');\n }\n\n /**\n * Track sizing for one column. Resized → fixed px (the last column still grows past it\n * via `1fr` when there's room). Default → content-sized, except the last column which\n * fills remaining space.\n */\n private fkColumnTrack(field: string, isLast: boolean): string {\n const w = this._fkColWidths[field];\n const min = field === this.FKNameField ? 120 : 80;\n if (w) return isLast ? `minmax(${w}px, 1fr)` : `${w}px`;\n return isLast ? `minmax(${min}px, 1fr)` : `minmax(${min}px, max-content)`;\n }\n\n /** Whether a column's cells should stretch to fill their track (last column or resized). */\n FKColumnFillsTrack(field: string, isLast: boolean): boolean {\n return isLast || this._fkColWidths[field] != null;\n }\n\n /** The built cell (value + highlighted html) for a non-name column of a suggestion. */\n FKCellFor(suggestion: FKSuggestion, field: string): FKSuggestionColumn | undefined {\n return suggestion.ExtraColumns.find(c => c.FieldName === field);\n }\n\n /** Header sort handler (grid headers click-to-sort only; drag-reorder is menu-only). */\n OnFKHeaderSort(event: MouseEvent, field: string): void {\n event.preventDefault(); // keep input focus so the body-portaled dropdown stays open\n this.OnFKSortToggle(field);\n }\n\n // ---- Column resize (drag a header's right edge) ----\n\n /** Begin resizing a column. stopPropagation so the header's sort handler doesn't fire. */\n OnFKColResizeStart(event: MouseEvent, field: string): void {\n event.preventDefault();\n event.stopPropagation();\n const headerCell = (event.target as HTMLElement).closest('.mj-fk-hcell') as HTMLElement | null;\n const startWidth = headerCell ? headerCell.offsetWidth : 120;\n this._fkResize = { field, startX: event.clientX, startWidth };\n this._fkResizeMove = (e: MouseEvent) => this.onFKColResizeMove(e);\n this._fkResizeUp = () => this.onFKColResizeEnd();\n document.addEventListener('mousemove', this._fkResizeMove);\n document.addEventListener('mouseup', this._fkResizeUp);\n }\n\n private onFKColResizeMove(e: MouseEvent): void {\n if (!this._fkResize) return;\n const width = Math.max(60, Math.round(this._fkResize.startWidth + (e.clientX - this._fkResize.startX)));\n this._fkColWidths = { ...this._fkColWidths, [this._fkResize.field]: width };\n this.cdr.markForCheck();\n }\n\n private onFKColResizeEnd(): void {\n if (this._fkResize) {\n const width = this._fkColWidths[this._fkResize.field];\n if (width && this.fkHostEntityName && this.fkFieldCodeName) {\n LinkedFieldOptionsStore.Instance.SetColWidth(\n this.fkHostEntityName, this.fkFieldCodeName, this._fkResize.field, width\n );\n }\n }\n this.teardownFKResizeListeners();\n this.cdr.markForCheck();\n }\n\n private teardownFKResizeListeners(): void {\n if (this._fkResizeMove) document.removeEventListener('mousemove', this._fkResizeMove);\n if (this._fkResizeUp) document.removeEventListener('mouseup', this._fkResizeUp);\n this._fkResize = null;\n this._fkResizeMove = null;\n this._fkResizeUp = null;\n }\n\n /** Handle typing in the FK search input */\n OnFKInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this._fkInputText = input.value;\n this._lastFKInputEl = input;\n this.FKIsMatched = false;\n\n const query = this._fkInputText;\n\n // Cached fast path: filter the in-memory array immediately (no DB, no debounce).\n const cached = this.getCachedRecordsForRelatedEntity();\n if (cached) {\n if (this._fkSearchTimeout) { clearTimeout(this._fkSearchTimeout); this._fkSearchTimeout = null; }\n this.searchCachedEntity(cached, query);\n return;\n }\n\n // DB path: debounce a RunView search. Empty query (cleared field) → first N,\n // so clearing the field reveals the list rather than closing it.\n if (this._fkSearchTimeout) clearTimeout(this._fkSearchTimeout);\n this._fkSearchTimeout = setTimeout(() => {\n void this.searchRelatedEntity(this._fkInputText ?? '');\n }, 300);\n }\n\n /**\n * Show dropdown on focus. With a cached-unfiltered entity we immediately show the\n * first N rows (sorted by name) even on empty input — zero DB round-trips. Without\n * a cache we keep prior behavior: only re-open if we already have suggestions.\n */\n OnFKFocus(event: FocusEvent): void {\n const input = event.target as HTMLInputElement;\n this._lastFKInputEl = input;\n this.FKFocused = true; // reveal the scope pill while focused\n // Select any pre-filled (linked) text so the first keystroke replaces it instead\n // of appending — matches how a searchable dropdown behaves.\n if (input.value) input.select();\n this.showInitialFKSuggestions();\n }\n\n /**\n * Show the initial suggestion list (no/empty query): the full set from a cached\n * unfiltered engine, otherwise the first N rows via a DB query. Used on focus and\n * when the field is cleared, so the user always sees options without typing.\n */\n private showInitialFKSuggestions(): void {\n // Always show the FULL list (empty query) on focus/clear — even when a value is\n // already selected — so the user can browse and re-pick like a normal dropdown.\n // Filtering only kicks in once they actually type (OnFKInput).\n const cached = this.getCachedRecordsForRelatedEntity();\n if (cached) {\n if (this._fkSearchTimeout) { clearTimeout(this._fkSearchTimeout); this._fkSearchTimeout = null; }\n this.searchCachedEntity(cached, '');\n return;\n }\n void this.searchRelatedEntity('');\n }\n\n /**\n * In-memory search over a cached-unfiltered entity array. Case-insensitive substring\n * on the name field. Empty query → first N rows sorted by name (focus-show). Instant,\n * no spinner, no DB.\n */\n private searchCachedEntity(records: ReadonlyArray<BaseEntity>, query: string): void {\n const plan = this.buildColumnPlan();\n if (!plan) { this.closeFKDropdown(); this.cdr.markForCheck(); return; }\n\n this._fkQuery = query;\n const accessor = (r: BaseEntity) => ({ get: (field: string) => r.Get(field) });\n const searchField = this.FKSearchField || plan.NameFieldName;\n const matches = FilterCachedFKRows(\n records,\n query,\n MjFormFieldComponent.FK_FOCUS_SHOW_LIMIT,\n r => r.Get(searchField)\n );\n\n this.FKLoading = false;\n this.applySuggestions(this.buildSuggestions(matches.map(accessor), plan, query), plan);\n }\n\n /** Hide dropdown on blur, revert to matched name if user didn't select */\n OnFKBlur(): void {\n // Small delay so mousedown on dropdown items / scope menu fires first\n setTimeout(() => {\n this.closeFKDropdown();\n this.FKShowScopeMenu = false;\n this.FKFocused = false; // hide the scope pill\n // If user was typing but didn't select, revert to display name\n if (!this.FKIsMatched && this._fkInputText !== null) {\n this._fkInputText = null;\n }\n this.cdr.markForCheck();\n }, 200);\n }\n\n /**\n * Keyboard navigation in the FK input: ArrowDown/ArrowUp move the active row,\n * Enter selects it, Escape closes the dropdown.\n */\n OnFKKeydown(event: KeyboardEvent): void {\n if (!this.ShowFKDropdown || this.FKSuggestions.length === 0) {\n if (event.key === 'Escape') { this.closeFKDropdown(); this.cdr.markForCheck(); }\n return;\n }\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.FKActiveIndex = Math.min(this.FKActiveIndex + 1, this.FKSuggestions.length - 1);\n this.scrollActiveOptionIntoView();\n this.cdr.markForCheck();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.FKActiveIndex = Math.max(this.FKActiveIndex - 1, 0);\n this.scrollActiveOptionIntoView();\n this.cdr.markForCheck();\n break;\n case 'Enter': {\n const active = this.FKSuggestions[this.FKActiveIndex];\n if (active) {\n event.preventDefault();\n this.selectFKSuggestion(active);\n }\n break;\n }\n case 'Escape':\n event.preventDefault();\n this.closeFKDropdown();\n this.cdr.markForCheck();\n break;\n }\n }\n\n /** Scroll the keyboard-active option into view inside the (possibly portaled) dropdown. */\n private scrollActiveOptionIntoView(): void {\n Promise.resolve().then(() => {\n const dropdown = this._portaledDropdownEl\n ?? (this.hostRef?.nativeElement?.querySelector('.mj-fk-dropdown') as HTMLElement | null);\n const active = dropdown?.querySelectorAll('.mj-fk-option')[this.FKActiveIndex] as HTMLElement | undefined;\n active?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n /** Select an item from the FK dropdown (mouse) */\n OnFKSelectItem(suggestion: FKSuggestion, event: MouseEvent): void {\n event.preventDefault();\n this.selectFKSuggestion(suggestion);\n }\n\n /** Shared selection logic for mouse-click and keyboard-Enter. */\n private selectFKSuggestion(suggestion: FKSuggestion): void {\n this._fkInputText = suggestion.DisplayName;\n this.Value = suggestion.PrimaryKeyValue;\n this.FKIsMatched = true;\n this.closeFKDropdown();\n\n // Update virtual name field for visual consistency after save\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n this.Record.Set(nameFieldMap, suggestion.DisplayName);\n }\n this.cdr.markForCheck();\n }\n\n // ---- Inline \"create new related record\" ----\n\n /**\n * Whether to show the inline-create affordance: the field opts in (`AllowFKCreate`),\n * the related entity resolves, and the current user can create records of it (entity\n * allows creation + role permits — `GetUserPermisions().CanCreate` folds in `AllowCreateAPI`).\n */\n get CanCreateFK(): boolean {\n if (!this.AllowFKCreate) return false;\n const re = this.getRelatedEntityInfo();\n const user = this.ProviderToUse?.CurrentUser;\n if (!re || !user) return false;\n return re.GetUserPermisions(user)?.CanCreate === true;\n }\n\n /** Footer label: prefilled with the typed text when present, else generic \"create new\". */\n get FKCreateLabel(): string {\n const entityLabel = this.getRelatedEntityInfo()?.DisplayName || this.FieldInfo?.RelatedEntity || 'record';\n const query = this._fkQuery.trim();\n return query ? `Create \"${query}\"` : `Create new ${entityLabel}`;\n }\n\n /**\n * Ask the host (app layer) to create a new related record, prefilled with the typed\n * text as the name. We only EMIT the request — opening the form is the app's job (the\n * generic forms layer must not depend on the app-level form presenter). The host calls\n * `Complete(record)` when saved and we select it.\n */\n OnFKCreateNew(event: MouseEvent): void {\n event.preventDefault(); // don't blur the input before we capture the query\n const plan = this.buildColumnPlan();\n const relatedEntity = this.FieldInfo?.RelatedEntity;\n if (!plan || !relatedEntity) return;\n\n const query = this._fkQuery.trim();\n this.FKShowScopeMenu = false;\n this.FKFocused = false;\n this.closeFKDropdown();\n this.cdr.markForCheck();\n\n const newRecordValues: Record<string, unknown> = {};\n if (query) newRecordValues[plan.NameFieldName] = query;\n\n this.Navigate.emit({\n Kind: 'create-related',\n EntityName: relatedEntity,\n NewRecordValues: Object.keys(newRecordValues).length ? newRecordValues : undefined,\n Presentation: this.FKCreatePresentation,\n Provider: this.Provider ?? undefined,\n Complete: (created: BaseEntity | null) => { if (created) this.selectCreatedFKRecord(created, plan); },\n });\n }\n\n /** Select a freshly-created related record as this field's value. */\n private selectCreatedFKRecord(created: BaseEntity, plan: FKColumnPlan): void {\n const pk = created.Get(plan.PkFieldName);\n if (pk == null) return;\n const name = this.formatCell(created.Get(plan.NameFieldName));\n this._fkInputText = name;\n this.Value = pk;\n this.FKIsMatched = true;\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) this.Record.Set(nameFieldMap, name);\n this.closeFKDropdown();\n this.cdr.markForCheck();\n }\n\n /** Clear FK value via the X button */\n OnFKClearClick(event: MouseEvent): void {\n // preventDefault keeps focus on the input (the button never steals it), so the\n // freshly-opened dropdown stays open for the user to pick a replacement.\n event.preventDefault();\n this.Value = null;\n this._fkInputText = null;\n this.FKIsMatched = false;\n this._resolvedFKName = undefined;\n this._resolvedFKValue = undefined;\n\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n this.Record.Set(nameFieldMap, '');\n }\n\n // Re-open the full list — clearing almost always precedes picking something else.\n this.showInitialFKSuggestions();\n this.cdr.markForCheck();\n }\n\n /** Close the FK dropdown and reset its transient view state. */\n private closeFKDropdown(): void {\n this.ShowFKDropdown = false;\n this.FKLoading = false;\n this.FKNoMatches = false;\n this.FKActiveIndex = -1;\n this.FKSelectedSuggestion = null;\n this._portaledDropdownEl = null;\n this.stopScrollListener();\n }\n\n /**\n * Perform a RunView search on the related entity's name field (DB path — used only\n * when no loaded engine caches the related entity unfiltered).\n * Falls back to searching by primary key when no NameField exists (single-field PKs only).\n */\n private async searchRelatedEntity(query: string): Promise<void> {\n const plan = this.buildColumnPlan();\n const fieldInfo = this.FieldInfo;\n if (!plan || !fieldInfo?.RelatedEntity) return;\n\n this._fkQuery = query;\n const seq = ++this._fkSearchSeq;\n this.FKLoading = true;\n this.FKNoMatches = false;\n this.ShowFKDropdown = true;\n if (this._lastFKInputEl) {\n this.updateDropdownPosition(this._lastFKInputEl);\n this.startScrollListener();\n this.portalDropdownToBody();\n }\n this.cdr.markForCheck();\n\n // Build Fields: PK + name + extra DefaultInView columns + the searched field +\n // the per-row icon field (when present), deduped via Set.\n const searchField = this.FKSearchField || plan.NameFieldName;\n const fields = Array.from(new Set([\n plan.PkFieldName, plan.NameFieldName, ...plan.ExtraFieldNames, searchField,\n ...(plan.IconFieldName ? [plan.IconFieldName] : [])\n ]));\n const escapedQuery = query.replace(/'/g, \"''\").trim();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: fieldInfo.RelatedEntity,\n // Empty query (focus / cleared field) → no filter → first N rows.\n ExtraFilter: escapedQuery ? `[${searchField}] LIKE '%${escapedQuery}%'` : '',\n MaxRows: MjFormFieldComponent.FK_DB_SEARCH_LIMIT,\n ResultType: 'simple',\n Fields: fields\n });\n\n // Ignore stale responses (a newer keystroke already fired).\n if (seq !== this._fkSearchSeq) return;\n this.FKLoading = false;\n\n if (result.Success) {\n const accessor = (r: Record<string, unknown>) => ({ get: (field: string) => r[field] });\n this.applySuggestions(this.buildSuggestions(result.Results.map(accessor), plan, query), plan);\n } else {\n this.FKSuggestions = [];\n this.FKNoMatches = true;\n this.ShowFKDropdown = true;\n }\n this.cdr.markForCheck();\n }\n\n // ============================================\n // VALUE LIST AUTOCOMPLETE (for 'autocomplete' type)\n // ============================================\n\n /** Whether the value list dropdown is visible */\n ShowValueListDropdown = false;\n\n /** Current filter text for the value list */\n private _valueListFilter = '';\n\n /** Filtered possible values based on what the user typed */\n get FilteredPossibleValues(): string[] {\n if (!this._valueListFilter) return this.PossibleValues;\n const filter = this._valueListFilter.toLowerCase();\n return this.PossibleValues.filter(v => v.toLowerCase().includes(filter));\n }\n\n /** Handle typing in the value list autocomplete */\n OnValueListInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this._valueListFilter = input.value;\n this.Value = input.value;\n this.updateDropdownPosition(input);\n if (!this._scrollCleanup) this.startScrollListener();\n this.ShowValueListDropdown = true;\n this.cdr.markForCheck();\n }\n\n /** Show dropdown on focus */\n OnValueListFocus(event: FocusEvent): void {\n const input = event.target as HTMLElement;\n this.updateDropdownPosition(input);\n this.startScrollListener();\n this.ShowValueListDropdown = true;\n this.cdr.markForCheck();\n }\n\n /** Hide dropdown on blur */\n OnValueListBlur(): void {\n setTimeout(() => {\n this.ShowValueListDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }, 200);\n }\n\n /** Select an item from the value list dropdown */\n OnValueListSelect(value: string, event: MouseEvent): void {\n event.preventDefault();\n this.Value = value;\n this._valueListFilter = '';\n this.ShowValueListDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }\n\n // ============================================\n // CUSTOM SELECT DROPDOWN (replaces native <select>)\n // ============================================\n\n /** Whether the custom select dropdown is visible */\n ShowSelectDropdown = false;\n\n /** Toggle the custom select dropdown */\n OnSelectTriggerClick(event: Event): void {\n event.preventDefault();\n if (this.ShowSelectDropdown) {\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n } else {\n const el = event.currentTarget as HTMLElement;\n this.updateDropdownPosition(el);\n this.startScrollListener();\n this.ShowSelectDropdown = true;\n }\n this.cdr.markForCheck();\n }\n\n /** Close the select dropdown on blur */\n OnSelectTriggerBlur(): void {\n setTimeout(() => {\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }, 200);\n }\n\n /** Select an option from the custom select dropdown */\n OnSelectOptionClick(value: string, event: MouseEvent): void {\n event.preventDefault();\n this.Value = value;\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }\n\n // ============================================\n // GENERAL PROPERTIES\n // ============================================\n\n /** Whether the field's varchar(max) - long text that gets the wide read-only style */\n get IsLongText(): boolean {\n return this.FieldInfo?.Length === -1;\n }\n\n /**\n * Whether this field is large enough to be a candidate for rich-text (markdown/html)\n * auto-detection. Generic & multi-platform: keys off the TS type and character length\n * rather than a specific SQL type, so nvarchar(max)/ntext (MaxLength === 0 means\n * unlimited) and longer fixed fields (nvarchar(400)/varchar(500)/...) all qualify,\n * while short strings, UUIDs, numbers, dates, etc. do not.\n */\n get IsRichTextEligible(): boolean {\n const fi = this.FieldInfo;\n if (!fi || fi.TSType !== EntityFieldTSType.String) return false;\n const maxLen = fi.MaxLength;\n return maxLen === 0 || maxLen >= 255;\n }\n\n /**\n * Resolved rendering mode for this field. Honors an explicit `ExtendedType` first\n * ('Markdown' | 'HTML' | 'Code'); when `ExtendedType` is null, falls back to lightweight\n * client-side content detection — but only for {@link IsRichTextEligible} long-text fields.\n */\n get RichTextMode(): FieldRichTextMode {\n const fi = this.FieldInfo;\n if (!fi) return 'plain';\n\n switch (fi.ExtendedType) {\n case 'Markdown': return 'markdown';\n case 'HTML': return 'html';\n case 'Code': return 'code';\n }\n\n // Any other explicit ExtendedType (Email, URL, Geo*, Tel, ...) is not rich text here.\n if (fi.ExtendedType != null) return 'plain';\n\n // ExtendedType is null → auto-detect, but only on eligible long-text fields.\n if (!this.IsRichTextEligible) return 'plain';\n\n return this.detectFormat();\n }\n\n /** Backing snapshot for {@link EditRichTextMode}; null until first computed for the session. */\n private _editRichTextMode: FieldRichTextMode | null = null;\n\n /**\n * Stable rendering mode for EDIT mode. Unlike {@link RichTextMode} (which re-detects on the\n * live value), this is snapshotted when edit mode is entered so that typing markdown/html into\n * a plain textarea doesn't swap the control out from under the user mid-keystroke. Explicit\n * ExtendedType always wins regardless; only the auto-detect branch is frozen for the session.\n */\n get EditRichTextMode(): FieldRichTextMode {\n if (this._editRichTextMode === null) {\n this._editRichTextMode = this.RichTextMode;\n }\n return this._editRichTextMode;\n }\n\n /** Cached detection result, keyed by the exact string value it was computed from. */\n private _detectCacheValue: string | null = null;\n private _detectCacheResult: RichTextFormat = 'plain';\n\n /** Memoized content detection so the getter stays cheap under OnPush change detection. */\n private detectFormat(): RichTextFormat {\n const raw = this.Value;\n const text = raw == null ? '' : String(raw);\n if (text !== this._detectCacheValue) {\n this._detectCacheValue = text;\n this._detectCacheResult = detectRichTextFormat(text);\n }\n return this._detectCacheResult;\n }\n\n /**\n * Editor language for the code editor. In edit mode it tracks the frozen\n * {@link EditRichTextMode}; in read mode it tracks the live {@link RichTextMode}.\n */\n get CodeEditorLanguage(): string {\n const mode = this.EditMode ? this.EditRichTextMode : this.RichTextMode;\n switch (mode) {\n case 'markdown': return 'markdown';\n case 'html': return 'html';\n case 'code': return this.codeTypeToLanguage(this.FieldInfo?.CodeType);\n default: return '';\n }\n }\n\n /** Map the field's CodeType metadata value to a CodeMirror language id. */\n private codeTypeToLanguage(codeType: string | null | undefined): string {\n switch (codeType) {\n case 'CSS': return 'css';\n case 'HTML': return 'html';\n case 'JavaScript': return 'javascript';\n case 'SQL': return 'sql';\n case 'TypeScript': return 'typescript';\n default: return ''; // 'Other' / null → plain code editing\n }\n }\n\n /**\n * Runtime display kind from EntityField.ExtendedType. Honored ahead of the\n * generated `LinkType` input so PhotoURL forms still tagged LinkType=URL\n * render as images once metadata says Image.\n */\n get ExtendedDisplay(): 'image' | 'color' | 'json' | null {\n switch (this.FieldInfo?.ExtendedType) {\n case 'Image': return 'image';\n case 'Color': return 'color';\n case 'JSON': return 'json';\n default: return null;\n }\n }\n\n get ImagePreviewSrc(): string | null {\n const raw = this.FormatValue();\n return CoerceImageSrc(raw);\n }\n\n get IsInlineImageValue(): boolean {\n const raw = this.FormatValue().trim();\n if (!raw) return false;\n return IsInlineImageDataUri(raw) || CoerceRawImageBase64ToDataUri(raw) != null;\n }\n\n get ImageValueSizeLabel(): string {\n const raw = this.FormatValue();\n if (!raw) return '';\n return FormatByteSize(raw.length);\n }\n\n get ImageMaxSizeLabel(): string {\n return FormatByteSize(MaxInlineImageBytes(this.FieldInfo?.MaxLength ?? 0));\n }\n\n /** URL box: empty for inline images so we never dump a data URI into a text input. */\n get ImageUrlInputValue(): string {\n if (this.IsInlineImageValue) return '';\n return this.FormatValue();\n }\n\n get ImageUrlDisplay(): string {\n const raw = this.FormatValue().trim();\n return raw.replace(/^https?:\\/\\//i, '').replace(/\\/$/, '');\n }\n\n get ColorPickerValue(): string {\n return ParseCssHexColor(this.FormatValue()) ?? '#000000';\n }\n\n get ColorSwatchValue(): string {\n return ParseCssHexColor(this.FormatValue()) ?? 'transparent';\n }\n\n get JsonDisplayValue(): string {\n // Pretty-print only in read mode. Edit mode shows the live value; OnJsonBlur pretty-prints.\n if (this.EditMode) return this.FormatValue();\n return PrettyPrintJson(this.FormatValue());\n }\n\n /** Handle value changes coming from the embedded code editor (emits a plain string). */\n OnCodeEditorChange(value: string): void {\n this.Value = value;\n }\n\n /** Format a value for display */\n /**\n * Whether this field holds a DATE with no time, as opposed to a timestamp.\n *\n * The distinction decides which timezone the value may be rendered in, and getting it wrong\n * moves the day. A `date` column has no time and no zone: it is a calendar day, and the only\n * correct way to show it is in the zone it was written in. A `datetime`/`datetimeoffset` names\n * an instant, and the correct way to show THAT is the reader's local zone.\n */\n private get IsDateOnlyField(): boolean {\n return (this.FieldInfo?.Type ?? '').trim().toLowerCase() === 'date';\n }\n\n FormatValue(): string {\n const val = this.Value;\n if (val === null || val === undefined) return '';\n if (val instanceof Date) {\n /**\n * A DATE-ONLY VALUE IS NOT AN INSTANT, AND toLocaleString() TREATS IT AS ONE.\n *\n * A `date` column arrives as UTC midnight. Passing that through a LOCAL-time formatter\n * subtracts the reader's offset and lands on the previous day for everyone west of\n * Greenwich: a stored 2026-11-20 rendered as `11/19/2026, 7:00:00 PM` in America/New_York,\n * and 2026-01-01 rendered as `12/31/2025` — the wrong YEAR.\n *\n * The edit path does not have this bug: `DateInputValue` uses `toISOString()`, which is UTC.\n * So the two modes DISAGREED — a rep opened a record and saw 19 November, clicked Edit and\n * saw the 20th, on the same field, with no invalid data anywhere. Read mode was simply wrong.\n *\n * Pinning the timezone rather than switching to `toISOString()` keeps the reader's locale\n * format (a US reader still sees 11/20/2026, a UK reader 20/11/2026) and changes only the\n * zone the day is computed in. A TIMESTAMP is left exactly as it was: it names an instant,\n * and local time is the right way to show one.\n */\n if (this.IsDateOnlyField) {\n return val.toLocaleDateString(undefined, { timeZone: 'UTC' });\n }\n return val.toLocaleString();\n }\n return String(val);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['FormContext'] || changes['EditMode'] || changes['Record']) {\n // Reset FK state when record changes\n if (changes['Record']) {\n this._fkInputText = null;\n this.FKIsMatched = false;\n this._fkQuery = '';\n this.FKSuggestions = [];\n this.FKSelectedSuggestion = null;\n this.ShowFKDropdown = false;\n this.FKActiveIndex = -1;\n this.FKLoading = false;\n this.FKNoMatches = false;\n this.FKColumnHeaders = [];\n this.FKColumnFields = [];\n this.FKSortField = null;\n this.FKSortDir = 'asc';\n this._fkSuggestionsNatural = [];\n this.FKSearchableFields = [];\n this.FKShowScopeMenu = false;\n this.FKFocused = false;\n this._fkColWidths = {};\n this._fkPrefKey = null; // force prefs reload for the new field\n this._portaledDropdownEl = null;\n this._fkColumnPlan = null;\n this._resolvedFKName = undefined;\n this._resolvedFKValue = undefined;\n this._fkNameLoading = false;\n // Reset validation state for new record\n this._touched = false;\n this._fieldErrors = [];\n // Invalidate cached rich-text detection (recomputed lazily for the new value)\n this._detectCacheValue = null;\n this._detectCacheResult = 'plain';\n this._editRichTextMode = null;\n }\n // Reset validation state when exiting edit mode\n if (changes['EditMode'] && !this.EditMode) {\n this._touched = false;\n this._fieldErrors = [];\n }\n // Re-snapshot the edit-mode rendering decision whenever edit mode toggles\n if (changes['EditMode']) {\n this._editRichTextMode = null;\n }\n this.cdr.markForCheck();\n }\n }\n\n ngOnDestroy(): void {\n if (this._fkSearchTimeout) {\n clearTimeout(this._fkSearchTimeout);\n }\n this.teardownFKResizeListeners();\n this.stopScrollListener();\n // If we relocated the dropdown to <body> and Angular tears us down while it's\n // still open, remove the orphaned node ourselves (Angular removes by reference,\n // but guard against a race where the view is destroyed before the @if updates).\n if (this._portaledDropdownEl && this._portaledDropdownEl.parentElement === document.body) {\n this.renderer.removeChild(document.body, this._portaledDropdownEl);\n }\n this._portaledDropdownEl = null;\n }\n\n // ---- Navigation Handlers ----\n\n /**\n * Handle click on a record FK link in read-only mode.\n */\n OnRecordLinkClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n if (!this.FieldInfo || !this.Record) return;\n const relatedEntityName = this.FieldInfo.RelatedEntity;\n if (!relatedEntityName) return;\n\n const fkValue = this.Value;\n if (!fkValue) return;\n\n // Build a CompositeKey for the FK target record using the related entity's PK field\n const relatedFieldName = this.FieldInfo.RelatedEntityFieldName || 'ID';\n const targetKey = new CompositeKey([new KeyValuePair(relatedFieldName, fkValue)]);\n\n this.Navigate.emit({\n Kind: 'record',\n EntityName: relatedEntityName,\n PrimaryKey: targetKey,\n OpenInNewTab: event.ctrlKey || event.metaKey\n });\n }\n\n /**\n * Handle click on an email link in read-only mode.\n */\n OnEmailLinkClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const email = this.FormatValue();\n if (!email) return;\n this.Navigate.emit({\n Kind: 'email',\n EmailAddress: email\n });\n }\n\n /**\n * Handle click on a URL link in read-only mode.\n */\n OnUrlLinkClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const url = this.FormatValue();\n if (!url) return;\n this.Navigate.emit({\n Kind: 'external-link',\n Url: url,\n OpenInNewTab: true\n });\n }\n\n /**\n * Handle value change from a native input.\n */\n OnInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.imageUploadError = null;\n this.Value = input.value;\n }\n\n OnImageUrlInput(event: Event): void {\n this.OnInputChange(event);\n }\n\n OnImageClear(): void {\n this.imageUploadError = null;\n this.Value = null;\n this.cdr.markForCheck();\n }\n\n async OnImageFileSelected(event: Event): Promise<void> {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n input.value = '';\n this.imageUploadError = null;\n if (!file) return;\n\n const allowed = new Set(['image/png', 'image/jpeg', 'image/jpg', 'image/gif', 'image/webp', 'image/svg+xml']);\n if (file.type && !allowed.has(file.type)) {\n this.imageUploadError = 'That file is not a supported image type (PNG, JPEG, GIF, WebP, or SVG).';\n this._touched = true;\n this.cdr.markForCheck();\n return;\n }\n\n const absoluteReadCap = 8 * 1024 * 1024;\n if (file.size > absoluteReadCap) {\n this.imageUploadError = `File is too large to read (max ${FormatByteSize(absoluteReadCap)}).`;\n this._touched = true;\n this.cdr.markForCheck();\n return;\n }\n\n try {\n const maxChars = MaxStoredImageChars(this.FieldInfo?.MaxLength ?? 0);\n const dataUri = await this.readFileAsDataUri(file);\n if (!IsInlineImageDataUri(dataUri)) {\n this.imageUploadError = 'That file is not a supported image type (PNG, JPEG, GIF, WebP, or SVG).';\n this._touched = true;\n this.cdr.markForCheck();\n return;\n }\n if (dataUri.length <= maxChars) {\n this.Value = dataUri;\n this.cdr.markForCheck();\n return;\n }\n const compressed = await this.compressImageDataUriToFit(dataUri, maxChars);\n if (compressed) {\n this.Value = compressed;\n this.cdr.markForCheck();\n return;\n }\n this.imageUploadError = `Image is too large for this field (max ${this.ImageMaxSizeLabel}). Try a smaller file or paste an image URL.`;\n this._touched = true;\n } catch {\n this.imageUploadError = 'Could not read that image.';\n this._touched = true;\n }\n this.cdr.markForCheck();\n }\n\n OnColorPickerInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.imageUploadError = null;\n this.Value = input.value;\n }\n\n OnJsonBlur(): void {\n const raw = this.FormatValue();\n const pretty = PrettyPrintJson(raw);\n if (pretty !== raw) {\n this.Value = pretty;\n }\n }\n\n private readFileAsDataUri(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result ?? ''));\n reader.onerror = () => reject(reader.error ?? new Error('read failed'));\n reader.readAsDataURL(file);\n });\n }\n\n private loadHtmlImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error('image decode failed'));\n img.src = src;\n });\n }\n\n /**\n * Re-encode a raster data URI as JPEG, shrinking dimensions/quality until it fits\n * `maxChars`. GIF/SVG are left alone (would lose animation / vectors).\n */\n private async compressImageDataUriToFit(dataUri: string, maxChars: number): Promise<string | null> {\n if (typeof document === 'undefined') return null;\n if (/^data:image\\/(gif|svg\\+xml)/i.test(dataUri)) return null;\n const img = await this.loadHtmlImage(dataUri);\n const naturalW = img.naturalWidth || img.width;\n const naturalH = img.naturalHeight || img.height;\n if (!naturalW || !naturalH) return null;\n\n let maxDim = Math.min(Math.max(naturalW, naturalH), 1024);\n let quality = 0.85;\n for (let i = 0; i < 8; i++) {\n const scale = maxDim / Math.max(naturalW, naturalH);\n const w = Math.max(1, Math.round(naturalW * scale));\n const h = Math.max(1, Math.round(naturalH * scale));\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n ctx.drawImage(img, 0, 0, w, h);\n const next = canvas.toDataURL('image/jpeg', quality);\n if (next.length <= maxChars) return next;\n maxDim = Math.max(32, Math.round(maxDim * 0.65));\n quality = Math.max(0.4, quality - 0.1);\n }\n return null;\n }\n\n /**\n * Handle value change from a number input.\n */\n OnNumberChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const num = input.valueAsNumber;\n this.Value = isNaN(num) ? null : num;\n }\n\n /**\n * Handle value change from a date input.\n */\n OnDateChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.Value = input.value ? new Date(input.value) : null;\n }\n\n /**\n * Handle value change from a checkbox.\n */\n OnCheckboxChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.Value = input.checked;\n }\n\n /**\n * Get date value formatted for HTML date input.\n */\n get DateInputValue(): string {\n const val = this.Value;\n if (!val) return '';\n const date = val instanceof Date ? val : new Date(String(val));\n if (isNaN(date.getTime())) return '';\n return date.toISOString().split('T')[0];\n }\n\n /**\n * The field holds SOMETHING, and the date editor cannot show it.\n *\n * WHY A SEPARATE SIGNAL IS THE ONLY OPTION. `DateInputValue` returns '' for a value it cannot\n * render, and an `<input type=\"date\">` renders '' as an empty box — the same empty box it shows\n * for a field that was never set. There is no string that makes the element display\n * `not-a-date`, so the control physically cannot surface the problem itself. The most the getter\n * can do is refuse to emit garbage; saying WHY has to happen beside it.\n *\n * The consequence of not saying it is not cosmetic. The field reads as \"no date\", and the next\n * save writes that emptiness over whatever was actually stored — so an unreadable value becomes a\n * destroyed one, silently, by a user who was never told anything was wrong.\n *\n * READ MODE ALREADY DOES THIS and needs nothing: `FormatValue()` shows `Invalid Date` for a bad\n * Date and the raw text for a bad string. It is only the EDITOR that hides the problem, which is\n * why this is scoped to EditMode rather than to the field.\n *\n * An ABSENT value is not unreadable. Empty means empty, and must never be decorated as a fault.\n */\n get StoredDateIsUnreadable(): boolean {\n if (!this.EditMode) return false;\n if (this.Type !== 'datepicker' && this.FieldInfo?.TSType !== EntityFieldTSType.Date) return false;\n const val = this.Value;\n if (val === null || val === undefined || val === '') return false;\n return this.DateInputValue === '';\n }\n}\n","@if (Record && (Record.IsSaved || !IsFieldReadOnly)) {\n <!-- READ-ONLY MODE -->\n @if ((!EditMode || IsFieldReadOnly) && !ShouldHideField) {\n <div class=\"mj-forms-field\" [class.mj-forms-field--readonly]=\"EditMode && IsFieldReadOnly\" [class.mj-forms-field--dirty]=\"IsDirty\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- FK fields with a mapped name field: show the name as a hyperlink -->\n @if (IsFKWithNameField) {\n <span class=\"mj-forms-field-value\">\n @if (RecordLinksEnabled) {\n <a class=\"mj-forms-field-link mj-forms-field-link--fk\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FKDisplayName }}\n </a>\n } @else {\n {{ FKDisplayName }}\n }\n </span>\n }\n @else if (ExtendedDisplay === 'image') {\n <div class=\"mj-forms-image\">\n @if (ImagePreviewSrc) {\n <img class=\"mj-forms-image-preview\" [src]=\"ImagePreviewSrc\" alt=\"\" />\n }\n @if (IsInlineImageValue) {\n <span class=\"mj-forms-image-meta\">Inline image ({{ ImageValueSizeLabel }})</span>\n } @else if (ImagePreviewSrc) {\n <a class=\"mj-forms-field-link\" (click)=\"OnUrlLinkClick($event)\" title=\"Open image\">\n {{ ImageUrlDisplay }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n } @else {\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n }\n </div>\n }\n @else if (ExtendedDisplay === 'color') {\n <div class=\"mj-forms-color\">\n <span class=\"mj-forms-color-swatch\" [style.background-color]=\"ColorSwatchValue\"></span>\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n </div>\n }\n @else if (ExtendedDisplay === 'json') {\n <pre class=\"mj-forms-json\">{{ JsonDisplayValue }}</pre>\n }\n @else {\n @switch (LinkType) {\n @case ('Email') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnEmailLinkClick($event)\" title=\"Send email\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-envelope mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('URL') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnUrlLinkClick($event)\" title=\"Open link\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('Record') {\n <span class=\"mj-forms-field-value\">\n @if (RecordLinksEnabled) {\n <a class=\"mj-forms-field-link\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n } @else {\n {{ FormatValue() }}\n }\n </span>\n }\n @default {\n @if (Type === 'checkbox') {\n <span class=\"mj-forms-field-value\">\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\" [checked]=\"!!Value\" disabled>\n </div>\n </span>\n }\n @else if (RichTextMode === 'markdown') {\n <div class=\"mj-forms-field-value mj-forms-field-value--rich\">\n <mj-markdown [data]=\"FormatValue()\"></mj-markdown>\n </div>\n }\n @else if (RichTextMode === 'html') {\n <!-- XSS: the mjSafeRichHtml pipe sanitizes with DOMPurify (HTML + SVG profiles)\n and then bypasses Angular's redundant re-sanitize. DOMPurify strips <script>,\n on* handlers, javascript:/data: URLs and <foreignObject> while KEEPING safe\n inline SVG + styles — richer than Angular's built-in sanitizer, still safe for\n untrusted content. -->\n <div class=\"mj-forms-field-value mj-forms-field-value--rich\" [innerHTML]=\"FormatValue() | mjSafeRichHtml\"></div>\n }\n @else if (RichTextMode === 'code') {\n <div class=\"mj-forms-field-value mj-forms-field-value--code\">\n <mj-code-editor [value]=\"FormatValue()\" [language]=\"CodeEditorLanguage\" [readonly]=\"true\"></mj-code-editor>\n </div>\n }\n @else if (IsLongText) {\n <span class=\"mj-forms-field-value mj-forms-field-value--long\">{{ FormatValue() }}</span>\n }\n @else {\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n }\n }\n }\n }\n </div>\n </div>\n }\n\n <!-- EDIT MODE -->\n @if (EditMode && !IsFieldReadOnly) {\n <div class=\"mj-forms-field mj-forms-field--editing\" [class.mj-forms-field--dirty]=\"IsDirty\" [class.mj-forms-field--required-empty]=\"IsRequiredEmpty\" [class.mj-forms-field--has-error]=\"ShowErrors\" [class.mj-forms-field--has-warning]=\"ShowWarnings || StoredDateIsUnreadable\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- Foreign Key fields get custom search autocomplete -->\n @if (HasRelatedEntity) {\n <div class=\"mj-fk-search\"\n [class.mj-fk-search--matched]=\"FKHasLinkedValue\"\n [class.mj-fk-search--scoped]=\"FKFocused && FKSearchableFields.length > 1\">\n @if (FKHasLinkedValue && !(FKFocused && FKSearchableFields.length > 1)) {\n <i class=\"fa-solid fa-link mj-fk-link-icon\" title=\"Linked record\"></i>\n }\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [class.mj-forms-field-input--linked]=\"FKHasLinkedValue\"\n [value]=\"FKSearchText\"\n (input)=\"OnFKInput($event)\"\n (focus)=\"OnFKFocus($event)\"\n (blur)=\"OnFKBlur()\"\n (keydown)=\"OnFKKeydown($event)\"\n placeholder=\"Search...\">\n\n <!-- Scope pill: only while focused, only when there's more than one searchable field.\n The menu itself lives INSIDE the results dropdown (below) so it overlays the\n list and rides the same above/below flip. -->\n @if (FKFocused && FKSearchableFields.length > 1) {\n <button class=\"mj-fk-scope-pill\"\n [class.mj-fk-scope-pill--open]=\"FKShowScopeMenu\"\n (mousedown)=\"OnFKScopeToggle($event)\"\n [title]=\"'Searching ' + FKSearchFieldLabel + ' — click to change'\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-scope-pill-icon\"></i>\n <span class=\"mj-fk-scope-pill-label\">{{ FKSearchFieldLabel }}</span>\n <i class=\"fa-solid mj-fk-scope-pill-caret\" [class.fa-chevron-up]=\"FKShowScopeMenu\" [class.fa-chevron-down]=\"!FKShowScopeMenu\"></i>\n </button>\n }\n\n @if (FKSearchText) {\n <button class=\"mj-fk-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n } @else {\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n }\n @if (ShowFKDropdown) {\n <div class=\"mj-fk-dropdown mj-fk-dropdown--multi\"\n [ngStyle]=\"DropdownPositionStyle\"\n [class.mj-fk-dropdown--above]=\"OpenAbove\"\n [class.mj-fk-dropdown--scope-open]=\"FKShowScopeMenu\">\n\n <!-- Scope (search-field) picker + column toggles — overlays the list, anchored to the pill edge.\n Click a row to SEARCH that field; click the eye to SHOW/HIDE it as a column. -->\n @if (FKShowScopeMenu) {\n <div class=\"mj-fk-scope-menu\" [class.mj-fk-scope-menu--bottom]=\"OpenAbove\">\n <div class=\"mj-fk-scope-grp\">Columns shown</div>\n @for (f of FKSearchableFields; track f.FieldName) {\n @if (f.Group === 'shown') {\n <ng-container *ngTemplateOutlet=\"scopeRow; context: { $implicit: f }\"></ng-container>\n }\n }\n @if (FKHasOtherSearchableFields) {\n <div class=\"mj-fk-scope-divider\"></div>\n <div class=\"mj-fk-scope-grp\">Other fields</div>\n @for (f of FKSearchableFields; track f.FieldName) {\n @if (f.Group === 'other') {\n <ng-container *ngTemplateOutlet=\"scopeRow; context: { $implicit: f }\"></ng-container>\n }\n }\n }\n </div>\n }\n\n <!-- Shared scope-menu row, fixed-slot layout for clean alignment:\n [reorder ▲▼ — hover-reveal] [icon] [label] [eye].\n Click the row = search this field; the active search row is shown bold+accent. -->\n <ng-template #scopeRow let-f>\n <div class=\"mj-fk-scope-mi\"\n [class.mj-fk-scope-mi--on]=\"IsFKScopeActive(f)\"\n (mousedown)=\"OnFKScopeSelect($event, f)\">\n <span class=\"mj-fk-col-reorder\">\n @if (f.Group === 'shown') {\n <button type=\"button\" class=\"mj-fk-col-move mj-fk-col-move--up\" [disabled]=\"!CanMoveFKColumnUp(f.FieldName)\"\n (mousedown)=\"MoveFKColumn($event, f.FieldName, -1)\" title=\"Move column up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button type=\"button\" class=\"mj-fk-col-move mj-fk-col-move--down\" [disabled]=\"!CanMoveFKColumnDown(f.FieldName)\"\n (mousedown)=\"MoveFKColumn($event, f.FieldName, 1)\" title=\"Move column down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n }\n </span>\n <i [class]=\"f.Icon + ' mj-fk-scope-mi-icon'\"></i>\n <span class=\"mj-fk-scope-mi-label\">{{ f.Label }}</span>\n <span class=\"mj-fk-col-eye-slot\">\n @if (CanToggleFKColumn(f)) {\n <button type=\"button\" class=\"mj-fk-col-toggle\"\n [class.mj-fk-col-toggle--on]=\"IsFKColumnVisible(f)\"\n (mousedown)=\"OnFKColumnToggle($event, f)\"\n [title]=\"IsFKColumnVisible(f) ? 'Hide this column' : 'Show as a column'\">\n <i class=\"fa-solid\" [class.fa-eye]=\"IsFKColumnVisible(f)\" [class.fa-eye-slash]=\"!IsFKColumnVisible(f)\"></i>\n </button>\n }\n </span>\n </div>\n </ng-template>\n\n <!-- Pinned \"currently selected\" — sticky at the top while browsing, so you can\n keep it or pick another without clearing first. -->\n @if (FKSelectedSuggestion && !FKLoading) {\n <div class=\"mj-fk-current\">\n <div class=\"mj-fk-current-head\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Currently selected</span>\n </div>\n <div class=\"mj-fk-current-row\" (mousedown)=\"OnFKSelectItem(FKSelectedSuggestion, $event)\" title=\"Keep this selection\">\n @if (FKSelectedSuggestion.Icon) { <i class=\"mj-fk-current-icon\" [class]=\"FKSelectedSuggestion.Icon\"></i> }\n <span class=\"mj-fk-current-name\" [innerHTML]=\"FKSelectedSuggestion.HighlightedName\"></span>\n @if (FKSelectedSuggestion.ExtraColumns.length && FKSelectedSuggestion.ExtraColumns[0].Value) {\n <span class=\"mj-fk-current-detail\">{{ FKSelectedSuggestion.ExtraColumns[0].Value }}</span>\n }\n <button type=\"button\" class=\"mj-fk-current-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear selection\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n @if (FKLoading) {\n <div class=\"mj-fk-status\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span>Searching…</span>\n </div>\n }\n @if (!FKLoading && FKNoMatches) {\n <div class=\"mj-fk-status mj-fk-status--empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No matches</span>\n </div>\n }\n @if (!FKLoading && FKSuggestions.length > 0) {\n <div class=\"mj-fk-options\">\n <div class=\"mj-fk-grid\" [style.grid-template-columns]=\"FKGridTemplateColumns\">\n <!-- Header row: click to sort, drag the right edge to resize.\n (Column reorder lives in the field-selector menu, not here.) -->\n <div class=\"mj-fk-grid-row mj-fk-grid-row--header\">\n @if (FKHasIconColumn) {\n <div class=\"mj-fk-hcell mj-fk-hcell--icon\"></div>\n }\n @for (col of FKColumnFields; track col; let i = $index) {\n <div class=\"mj-fk-hcell\"\n (mousedown)=\"OnFKHeaderSort($event, col)\"\n [title]=\"'Click to sort by ' + FKColumnHeaders[i]\">\n <span class=\"mj-fk-hcell-label\">{{ FKColumnHeaders[i] }}</span>\n <i [class]=\"FKSortIcon(col)\"></i>\n <span class=\"mj-fk-resizer\" (mousedown)=\"OnFKColResizeStart($event, col)\" title=\"Drag to resize\"></span>\n </div>\n }\n </div>\n <!-- Data rows -->\n @for (suggestion of FKSuggestions; track suggestion.PrimaryKeyValue; let i = $index) {\n <div class=\"mj-fk-grid-row\"\n [class.mj-fk-grid-row--active]=\"i === FKActiveIndex\"\n [class.mj-fk-grid-row--selected]=\"IsFKRowSelected(suggestion)\"\n (mousedown)=\"OnFKSelectItem(suggestion, $event)\"\n (mouseenter)=\"FKActiveIndex = i\">\n @if (FKHasIconColumn) {\n <div class=\"mj-fk-cell mj-fk-cell--icon\">\n @if (suggestion.Icon) { <i [class]=\"suggestion.Icon\"></i> }\n </div>\n }\n @for (col of FKColumnFields; track col; let last = $last) {\n @if (col === FKNameField) {\n <div class=\"mj-fk-cell mj-fk-cell--name\" [class.mj-fk-cell--fill]=\"FKColumnFillsTrack(col, last)\">\n @if (IsFKRowSelected(suggestion)) {\n <i class=\"fa-solid fa-check mj-fk-selected-check\" title=\"Currently selected\"></i>\n }\n <span [innerHTML]=\"suggestion.HighlightedName\"></span>\n </div>\n } @else {\n <div class=\"mj-fk-cell\" [class.mj-fk-cell--fill]=\"FKColumnFillsTrack(col, last)\" [title]=\"FKCellFor(suggestion, col)?.Value || ''\">\n <span [innerHTML]=\"FKCellFor(suggestion, col)?.HighlightedValue || ''\"></span>\n </div>\n }\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Sticky \"create new\" footer — always visible at the bottom (no scrolling),\n prefilled with the typed text. Gated on create permission. -->\n @if (CanCreateFK) {\n <button type=\"button\" class=\"mj-fk-create-footer\" (mousedown)=\"OnFKCreateNew($event)\" [title]=\"FKCreateLabel\">\n <i class=\"fa-solid fa-plus mj-fk-create-icon\"></i>\n <span class=\"mj-fk-create-label\">{{ FKCreateLabel }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n @else if (ExtendedDisplay === 'image') {\n <div class=\"mj-forms-image mj-forms-image--edit\">\n @if (ImagePreviewSrc) {\n <img class=\"mj-forms-image-preview\" [src]=\"ImagePreviewSrc\" alt=\"\" />\n } @else {\n <div class=\"mj-forms-image-preview mj-forms-image-preview--empty\" aria-hidden=\"true\">\n <i class=\"fa-regular fa-image\"></i>\n </div>\n }\n <div class=\"mj-forms-image-meta\">\n @if (IsInlineImageValue) {\n <span>Inline image ({{ ImageValueSizeLabel }})</span>\n }\n <span class=\"mj-forms-image-hint\">Max {{ ImageMaxSizeLabel }}</span>\n </div>\n <div class=\"mj-forms-image-actions\">\n <input #imageFileInput type=\"file\" accept=\"image/png,image/jpeg,image/gif,image/webp,image/svg+xml\"\n class=\"mj-forms-image-file\" (change)=\"OnImageFileSelected($event)\">\n <button type=\"button\" class=\"mj-forms-image-btn\" (click)=\"imageFileInput.click()\">\n <i class=\"fa-solid fa-upload\"></i>\n {{ ImagePreviewSrc ? 'Replace' : 'Upload' }}\n </button>\n @if (ImagePreviewSrc) {\n <button type=\"button\" class=\"mj-forms-image-btn mj-forms-image-btn--ghost\" (click)=\"OnImageClear()\">Clear</button>\n }\n </div>\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"ImageUrlInputValue\"\n (input)=\"OnImageUrlInput($event)\"\n placeholder=\"https://… or paste a data URI\">\n </div>\n }\n @else if (ExtendedDisplay === 'color') {\n <div class=\"mj-forms-color mj-forms-color--edit\">\n <input type=\"color\"\n class=\"mj-forms-color-picker\"\n [value]=\"ColorPickerValue\"\n (input)=\"OnColorPickerInput($event)\"\n [attr.aria-label]=\"DisplayName + ' color'\">\n <input type=\"text\"\n class=\"mj-forms-field-input mj-forms-color-hex\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"\n placeholder=\"#RRGGBB\">\n </div>\n }\n @else if (ExtendedDisplay === 'json') {\n <textarea\n class=\"mj-forms-field-input mj-forms-field-input--textarea mj-forms-json\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"\n (blur)=\"OnJsonBlur()\"></textarea>\n }\n @else if (EditRichTextMode !== 'plain') {\n <!-- Markdown / HTML / Code long-text: edit raw with a syntax-highlighted code editor -->\n <mj-code-editor\n class=\"mj-forms-field-input--code\"\n [value]=\"FormatValue()\"\n [language]=\"CodeEditorLanguage\"\n (change)=\"OnCodeEditorChange($event)\"></mj-code-editor>\n }\n @else {\n @switch (Type) {\n @case ('textbox') {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\">\n }\n @case ('textarea') {\n <textarea\n class=\"mj-forms-field-input mj-forms-field-input--textarea\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"></textarea>\n }\n @case ('number') {\n <input type=\"number\"\n class=\"mj-forms-field-input mj-forms-field-input--number\"\n [value]=\"Value\"\n (change)=\"OnNumberChange($event)\">\n }\n @case ('datepicker') {\n <input type=\"date\"\n class=\"mj-forms-field-input mj-forms-field-input--date\"\n [value]=\"DateInputValue\"\n (change)=\"OnDateChange($event)\">\n }\n @case ('checkbox') {\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"!!Value\"\n (change)=\"OnCheckboxChange($event)\">\n </div>\n }\n @case ('select') {\n <div class=\"mj-custom-select-trigger\"\n tabindex=\"0\"\n (click)=\"OnSelectTriggerClick($event)\"\n (blur)=\"OnSelectTriggerBlur()\">\n <span class=\"mj-custom-select-value\" [class.mj-custom-select-value--placeholder]=\"!FormatValue()\">\n {{ FormatValue() || '-- Select --' }}\n </span>\n <i class=\"fa-solid fa-chevron-down mj-custom-select-chevron\" [class.mj-custom-select-chevron--open]=\"ShowSelectDropdown\"></i>\n </div>\n @if (ShowSelectDropdown && PossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of PossibleValues; track option) {\n <div class=\"mj-fk-option\" [class.mj-fk-option--selected]=\"FormatValue() === option\" (mousedown)=\"OnSelectOptionClick(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n }\n @case ('autocomplete') {\n <div class=\"mj-fk-search\">\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnValueListInput($event)\"\n (focus)=\"OnValueListFocus($event)\"\n (blur)=\"OnValueListBlur()\"\n placeholder=\"Type to search...\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n @if (ShowValueListDropdown && FilteredPossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of FilteredPossibleValues; track option) {\n <div class=\"mj-fk-option\" (mousedown)=\"OnValueListSelect(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n </div>\n }\n @default {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (change)=\"OnInputChange($event)\">\n }\n }\n }\n </div>\n <!-- Inline validation messages -->\n @if (DisplayErrors.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--error\">\n @for (error of DisplayErrors; track error.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ error.Message }}</span>\n </div>\n }\n </div>\n }\n @if (DisplayWarnings.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--warning\">\n @for (warning of DisplayWarnings; track warning.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ warning.Message }}</span>\n </div>\n }\n </div>\n }\n <!--\n An unreadable stored value renders as an EMPTY date box, identical to a field that\n was never set - and the next save writes that emptiness over whatever is stored. The\n element cannot display the bad value itself, so the warning sits with the other validation messages, beneath the control.\n -->\n @if (StoredDateIsUnreadable) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--warning\">\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>This field holds a value that is not a readable date, so the box above is\n empty. Saving now will replace it.</span>\n </div>\n </div>\n }\n </div>\n }\n}\n"]}
1
+ {"version":3,"file":"form-field.component.js","sourceRoot":"","sources":["../../../src/lib/field/form-field.component.ts","../../../src/lib/field/form-field.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,EAAuC,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACvL,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAA2C,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACzS,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,oBAAoB,EAAkB,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGvI,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;;;;;;;;;;;ICEzD,2BAAiF;;;IAA7C,4EAAoC;;;;IAOlE,6BAAuH;IAAhE,oOAAS,gCAAyB,KAAC;IACxF,YACF;IAAA,iBAAI;;;IADF,cACF;IADE,qDACF;;;IAEA,YACF;;;IADE,qDACF;;;IAPF,+BAAmC;IAK/B,AAJF,+HAA0B,gGAIjB;IAGX,iBAAO;;;IAPL,cAMC;IAND,mDAMC;;;IAMC,0BAAqE;;;IAAjC,8DAAuB;;;IAG3D,gCAAkC;IAAA,YAAwC;IAAA,iBAAO;;;IAA/C,cAAwC;IAAxC,wEAAwC;;;;IAE1E,6BAAmF;IAApD,oOAAS,6BAAsB,KAAC;IAC7D,YACA;IAAA,wBAA+E;IACjF,iBAAI;;;IAFF,cACA;IADA,uDACA;;;IAGF,+BAAmC;IAAA,YAAmB;IAAA,iBAAO;;;IAA1B,cAAmB;IAAnB,0CAAmB;;;IAZ1D,8BAA4B;IAC1B,iIAAuB;IAUrB,AALA,AAFF,kIAA0B,yGAEI,2GAKrB;IAGX,iBAAM;;;IAbJ,cAEC;IAFD,iDAEC;IACD,cASC;IATD,gFASC;;;IAIH,8BAA4B;IAC1B,2BAAuF;IACvF,+BAAmC;IAAA,YAAmB;IACxD,AADwD,iBAAO,EACzD;;;IAFgC,cAA2C;IAA3C,2DAA2C;IAC5C,eAAmB;IAAnB,0CAAmB;;;IAIxD,+BAA2B;IAAA,YAAsB;IAAA,iBAAM;;;IAA5B,cAAsB;IAAtB,6CAAsB;;;;IAM3C,AADF,+BAAmC,YACoD;IAAtD,6NAAS,+BAAwB,KAAC;IAC/D,YACA;IAAA,wBAA6D;IAEjE,AADE,iBAAI,EACC;;;IAHH,eACA;IADA,qDACA;;;;IAMF,AADF,+BAAmC,YACiD;IAAnD,6NAAS,6BAAsB,KAAC;IAC7D,YACA;IAAA,wBAA+E;IAEnF,AADE,iBAAI,EACC;;;IAHH,eACA;IADA,qDACA;;;;IAOA,6BAA+F;IAAhE,2OAAS,gCAAyB,KAAC;IAChE,YACA;IAAA,wBAA+E;IACjF,iBAAI;;;IAFF,cACA;IADA,qDACA;;;IAGF,YACF;;;IADE,qDACF;;;IARF,+BAAmC;IAM/B,AALF,sIAA0B,uGAKjB;IAGX,iBAAO;;;IARL,cAOC;IAPD,mDAOC;;;IAMC,AADF,+BAAmC,cACI;IACnC,4BAAoD;IAExD,AADE,iBAAM,EACD;;;IAFoB,eAAmB;IAAnB,wCAAmB;;;IAK9C,+BAA6D;IAC3D,kCAAkD;IACpD,iBAAM;;;IADS,cAAsB;IAAtB,2CAAsB;;;IASrC,0BAAgH;;;;IAAnD,yFAA4C;;;IAGzG,+BAA6D;IAC3D,qCAA2G;IAC7G,iBAAM;;;IADY,cAAuB;IAAiC,AAAhC,AAAxB,4CAAuB,uCAAgC,kBAAkB;;;IAI3F,gCAA8D;IAAA,YAAmB;IAAA,iBAAO;;;IAA1B,cAAmB;IAAnB,0CAAmB;;;IAGjF,+BAAmC;IAAA,YAAmB;IAAA,iBAAO;;;IAA1B,cAAmB;IAAnB,0CAAmB;;;IADxD,AAHA,AALA,AARA,AALA,AAPA,wIAA2B,kHAOa,kHAKJ,kHAQA,mHAKb,kHAGhB;;;IA5BP,+LA8BC;;;IA/BH,AAZA,AARA,AARA,0HAAiB,oGAQF,oGAQG,yFAYR;;;;IA7BZ,iDAAA,OAAO,mBAAP,KAAK,mBAAL,QAAQ,SA8DP;;;IA1GP,8BAAmI;IACjI,oHAAiB;IAGjB,8BAAoC;IAuClC,AAHA,AANA,AAjBA,AAXA,mHAAyB,4FAWe,4FAiBA,6FAMD,kFAGhC;IAkEX,AADE,iBAAM,EACF;;;IA7GqF,AAA/D,qFAA8D,yCAAwC;IAChI,cAEC;IAFD,2CAEC;IAGC,eAqGC;IArGD,4KAqGC;;;IASD,2BAAiF;;;IAA7C,4EAAoC;;;IASlE,wBAAsE;;;;IAgBtE,kCAGuE;IADnE,iPAAa,8BAAuB,KAAC;IAEvC,wBAAkE;IAClE,gCAAqC;IAAA,YAAwB;IAAA,iBAAO;IACpE,wBAAkI;IACpI,iBAAS;;;IANL,gEAAgD;IAEhD,4FAAkE;IAE/B,eAAwB;IAAxB,+CAAwB;IAClB,cAAuC;IAAC,AAAxC,uDAAuC,4CAA2C;;;;IAK/H,kCAA+E;IAAnD,iPAAa,6BAAsB,KAAC;IAC9D,wBAAiC;IACnC,iBAAS;;;IAET,wBAA8D;;;IAepD,wBAAqF;;;IAArF,kLAAsE;;;;;IAA3B,AAA5B,+CAA4B,8DAAyB;;;IADtE,wKAA2B;;;IAA3B,kDAEC;;;IAOG,wBAAqF;;;IAArF,gMAAsE;;;;;IAA3B,AAA5B,+CAA4B,8DAAyB;;;IADtE,sLAA2B;;;IAA3B,kDAEC;;;IALH,0BAAuC;IACvC,+BAA6B;IAAA,4BAAY;IAAA,iBAAM;IAC/C,6KAIC;;;IAJD,eAIC;IAJD,wCAIC;;;IAbH,AADF,+BAA2E,cAC5C;IAAA,6BAAa;IAAA,iBAAM;IAChD,+JAIC;IACD,kJAAkC;IASpC,iBAAM;;;IAhBwB,4DAA4C;IAExE,eAIC;IAJD,wCAIC;IACD,eAQC;IARD,4DAQC;;;;IAaG,kCAC+E;IAA3E,0TAAa,8CAAmC,CAAC,CAAC,KAAC;IACrD,wBAAsC;IACxC,iBAAS;IACT,kCACgF;IAA5E,0TAAa,6CAAkC,CAAC,CAAC,KAAC;IACpD,wBAAwC;IAC1C,iBAAS;;;;IAPuD,qEAA4C;IAI1C,eAA8C;IAA9C,uEAA8C;;;;IAUhH,kCAG6E;IADzE,0TAAa,sCAA2B,KAAC;IAE3C,wBAA2G;IAC7G,iBAAS;;;;IAJL,uEAAmD;IAEnD,iGAAwE;IACtD,cAAqC;IAAC,AAAtC,yDAAqC,kDAA6C;;;;IAvB9G,+BAE6C;IAAzC,qRAAa,qCAA0B,KAAC;IAC1C,gCAAgC;IAC9B,kJAA2B;IAU7B,iBAAO;IACP,oBAAiD;IACjD,gCAAmC;IAAA,YAAa;IAAA,iBAAO;IACvD,gCAAiC;IAC/B,gKAA4B;IAShC,AADE,iBAAO,EACH;;;;IA1BF,mEAA+C;IAG/C,eASC;IATD,kDASC;IAEA,cAAyC;IAAzC,kDAAyC;IACT,eAAa;IAAb,iCAAa;IAE9C,eAOC;IAPD,0DAOC;;;IAciC,wBAAsE;;;IAAxC,+CAAmC;;;IAGjG,gCAAmC;IAAA,YAAgD;IAAA,iBAAO;;;IAAvD,cAAgD;IAAhD,uEAAgD;;;;IARvF,AADF,+BAA2B,cACO;IAC9B,wBAAwC;IACxC,4BAAM;IAAA,kCAAkB;IAC1B,AAD0B,iBAAO,EAC3B;IACN,+BAAsH;IAAvF,6PAAa,0DAA4C,KAAC;IACvF,2JAAiC;IACjC,2BAA2F;IAC3F,8JAA8F;IAG9F,kCAA+G;IAA7D,gQAAa,6BAAsB,KAAC;IACpF,yBAAiC;IAGvC,AADE,AADE,iBAAS,EACL,EACF;;;IATF,eAA0G;IAA1G,2DAA0G;IACzE,cAAkD;IAAlD,0FAAkD;IACnF,cAEC;IAFD,+HAEC;;;IASL,+BAA0B;IACxB,wBAAgD;IAChD,4BAAM;IAAA,+BAAU;IAClB,AADkB,iBAAO,EACnB;;;IAGN,+BAA8C;IAC5C,wBAA4C;IAC5C,4BAAM;IAAA,0BAAU;IAClB,AADkB,iBAAO,EACnB;;;IASE,0BAAiD;;;;IAGjD,+BAEuD;IADnD,6RAAa,sCAA2B,KAAC;IAE3C,gCAAgC;IAAA,YAAwB;IAAA,iBAAO;IAC/D,oBAAiC;IACjC,gCAAiG;IAArE,8RAAa,0CAA+B,KAAC;IAC3E,AADmG,iBAAO,EACpG;;;;;IAJF,qFAAkD;IACpB,eAAwB;IAAxB,6DAAwB;IACrD,cAAyB;IAAzB,yCAAyB;;;IAcF,oBAAiC;;;IAA9B,kCAAyB;;;IADtD,+BAAyC;IACvC,+KAAuB;IACzB,iBAAM;;;IADJ,cAA2D;IAA3D,8CAA2D;;;IAOvD,wBAAiF;;;IAFrF,+BAAkG;IAChG,qLAAmC;IAGnC,4BAAsD;IACxD,iBAAM;;;;;;;;IALmC,+GAAwD;IAC/F,cAEC;IAFD,iEAEC;IACK,cAAwC;IAAxC,6EAAwC;;;IAGhD,gCAAmI;IACjI,4BAA8E;IAChF,iBAAM;;;;;;;;;;IAFkB,+GAAwD;IAAC,sHAAiD;IAC1H,cAAgE;IAAhE,wJAAgE;;;IAFxE,AAPF,yKAA2B,mJAOlB;;;;IAPT,wDAWC;;;;IAtBL,+BAIqC;IAAjC,AADA,oSAAa,6CAAkC,KAAC,4TAChB;IAClC,mKAAuB;IAKvB,uLAaC;IACH,iBAAM;;;;;IAtBF,AADA,kFAAoD,oEACU;IAGhE,cAIC;IAJD,iDAIC;IACD,cAaC;IAbD,oCAaC;;;IAvCL,AAHF,AADF,+BAA2B,cACqD,cAGzB;IACjD,6JAAuB;IAGvB,gLAQC;IACH,iBAAM;IAEN,8JA0BC;IAEL,AADE,iBAAM,EACF;;;IA9CoB,cAAqD;IAArD,qEAAqD;IAIzE,eAEC;IAFD,iDAEC;IACD,cAQC;IARD,oCAQC;IAGH,eA0BC;IA1BD,mCA0BC;;;;IAQL,mCAA8G;IAA5D,gQAAa,4BAAqB,KAAC;IACnF,yBAAkD;IAClD,iCAAiC;IAAA,YAAmB;IACtD,AADsD,iBAAO,EACpD;;;IAH6E,4CAAuB;IAE1E,eAAmB;IAAnB,0CAAmB;;;IAtJ1D,+BAGyD;IAIvD,+IAAuB;IAuBvB,8KAA6B;IAiC7B,gJAA0C;IAmB1C,+IAAiB;IAMjB,+IAAiC;IAMjC,+IAA8C;IAqD9C,kJAAmB;IAMrB,iBAAM;;;IAtJF,AADA,yDAAyC,sDACW;IAFpD,sDAAiC;IAMnC,cAkBC;IAlBD,iDAkBC;IAsCD,eAiBC;IAjBD,2EAiBC;IAED,cAKC;IALD,2CAKC;IACD,cAKC;IALD,kEAKC;IACD,cAiDC;IAjDD,+EAiDC;IAID,cAKC;IALD,6CAKC;;;;IA9LP,+BAE8E;IAC5E,+HAAyE;IAGzE,iCAQ0B;IADxB,AADA,AADA,AADA,0NAAS,wBAAiB,KAAC,6MAClB,wBAAiB,KAAC,qMACnB,iBAAU,KAAC,iNACR,0BAAmB,KAAC;IAPjC,iBAQ0B;IAK1B,oIAAkD;IAehD,AAJF,oIAAoB,yGAIX;IAGT,kIAAsB;IA4JxB,iBAAM;;;IA/LF,AADA,gEAAgD,kFACyB;IAC3E,cAEC;IAFD,iHAEC;IAGC,cAAuD;IAAvD,uEAAuD;IACvD,2CAAsB;IAUxB,cASC;IATD,mFASC;IAED,cAMC;IAND,6CAMC;IACD,eA2JC;IA3JD,gDA2JC;;;IAMC,0BAAqE;;;IAAjC,8DAAuB;;;IAE3D,gCAAqF;IACnF,yBAAmC;IACrC,iBAAM;;;IAIJ,4BAAM;IAAA,YAAwC;IAAA,iBAAO;;;IAA/C,cAAwC;IAAxC,wEAAwC;;;;IAY9C,mCAAoG;IAAzB,qOAAS,qBAAc,KAAC;IAAC,qBAAK;IAAA,iBAAS;;;;IAtBxH,+BAAiD;IAG7C,AAFF,iIAAuB,4GAEd;IAKT,+BAAiC;IAC/B,8HAA0B;IAG1B,iCAAkC;IAAA,YAA2B;IAC/D,AAD+D,iBAAO,EAChE;IAEJ,AADF,gCAAoC,oBAEmC;IAAvC,6NAAU,kCAA2B,KAAC;IADpE,iBACqE;IACrE,oCAAkF;IAAjC,iOAAS,0BAAsB,KAAC;IAC/E,0BAAkC;IAClC,aACF;IAAA,iBAAS;IACT,uIAAuB;IAGzB,iBAAM;IACN,mCAI8C;IAD5C,4NAAS,8BAAuB,KAAC;IAErC,AALE,iBAI8C,EAC1C;;;IA7BJ,cAMC;IAND,gDAMC;IAEC,eAEC;IAFD,oDAEC;IACiC,eAA2B;IAA3B,uDAA2B;IAO3D,eACF;IADE,8EACF;IACA,cAEC;IAFD,kDAEC;IAID,cAA4B;IAA5B,iDAA4B;;;;IAO9B,AADF,+BAAiD,iBAKF;IAD3C,2NAAS,iCAA0B,KAAC;IAHtC,iBAI6C;IAC7C,kCAIwB;IADtB,2NAAS,4BAAqB,KAAC;IAEnC,AALE,iBAIwB,EACpB;;;IARF,cAA0B;IAA1B,+CAA0B;;IAK1B,cAAuB;IAAvB,4CAAuB;;;;IAM3B,qCAIwB;IAAtB,AADA,8NAAS,4BAAqB,KAAC,yMACvB,mBAAY,KAAC;IAAC,iBAAW;;;IAFjC,4CAAuB;;;;IAMzB,2CAIwC;IAAtC,sOAAU,iCAA0B,KAAC;IAAC,iBAAiB;;;IADvD,AADA,4CAAuB,uCACQ;;;;IAM7B,kCAGkC;IAAhC,kOAAS,4BAAqB,KAAC;IAHjC,iBAGkC;;;IADhC,4CAAuB;;;;IAIzB,qCAGkC;IAAhC,qOAAS,4BAAqB,KAAC;IAAC,iBAAW;;;IAD3C,4CAAuB;;;;IAIzB,kCAGoC;IAAlC,oOAAU,6BAAsB,KAAC;IAHnC,iBAGoC;;;IADlC,oCAAe;;;;IAIjB,kCAGkC;IAAhC,oOAAU,2BAAoB,KAAC;IAHjC,iBAGkC;;;IADhC,6CAAwB;;;;IAKxB,AADF,+BAAqC,iBAGG;IAApC,oOAAU,+BAAwB,KAAC;IACvC,AAHE,iBAEsC,EAClC;;;IAFF,cAAmB;IAAnB,wCAAmB;;;;IAiBjB,gCAAsI;IAAlD,yRAAa,8CAAmC,KAAC;IACnI,YACF;IAAA,iBAAM;;;;IAFoB,6EAAyD;IACjF,cACF;IADE,2CACF;;;IAJJ,gCAAwG;IACtG,0KAIC;IACH,iBAAM;;;IANwD,yDAAyC;IAA3E,sDAAiC;IAC3D,cAIC;IAJD,oCAIC;;;;IAfL,gCAGiC;IAA/B,AADA,gOAAS,mCAA4B,KAAC,2MAC9B,4BAAqB,KAAC;IAC9B,iCAAkG;IAChG,YACF;IAAA,iBAAO;IACP,yBAA6H;IAC/H,iBAAM;IACN,yIAAuD;;;IALhB,cAA4D;IAA5D,4EAA4D;IAC/F,cACF;IADE,uEACF;IAC6D,cAA2D;IAA3D,2EAA2D;IAE1H,cAQC;IARD,wFAQC;;;;IAeO,gCAA0E;IAAhD,yRAAa,4CAAiC,KAAC;IACvE,YACF;IAAA,iBAAM;;;IADJ,cACF;IADE,2CACF;;;IAJJ,gCAAwG;IACtG,0KAIC;IACH,iBAAM;;;IANwD,yDAAyC;IAA3E,sDAAiC;IAC3D,cAIC;IAJD,4CAIC;;;;IAdL,AADF,+BAA0B,iBAOU;IADhC,AADA,AADA,kOAAS,+BAAwB,KAAC,qNACzB,+BAAwB,KAAC,6MAC1B,wBAAiB,KAAC;IAL5B,iBAMkC;IAClC,wBAA8D;IAC9D,yIAAkE;IASpE,iBAAM;;;IAfF,cAAuB;IAAvB,4CAAuB;IAMzB,eAQC;IARD,mGAQC;;;;IAIH,kCAGmC;IAAjC,oOAAU,4BAAqB,KAAC;IAHlC,iBAGmC;;;IADjC,4CAAuB;;;IAH3B,AArBA,AApBA,AAPA,AANA,AANA,AANA,AANA,6HAAmB,0GAMC,uGAMF,uGAMI,oGAMF,yFAOF,oGAoBM,uGAqBd;;;;IAzEZ,6CAAA,SAAS,mBAAT,UAAU,mBAAV,QAAQ,mBAAR,YAAY,mBAAZ,UAAU,mBAAV,QAAQ,mBAAR,cAAc,SA+Eb;;;IAOC,gCAA4C;IAC1C,yBAA8C;IAC9C,4BAAM;IAAA,YAAmB;IAC3B,AAD2B,iBAAO,EAC5B;;;IADE,eAAmB;IAAnB,uCAAmB;;;IAJ/B,+BAAwE;IACtE,mIAKC;IACH,iBAAM;;;IANJ,cAKC;IALD,mCAKC;;;IAMC,gCAA4C;IAC1C,yBAAgD;IAChD,4BAAM;IAAA,YAAqB;IAC7B,AAD6B,iBAAO,EAC9B;;;IADE,eAAqB;IAArB,yCAAqB;;;IAJjC,+BAA0E;IACxE,oIAKC;IACH,iBAAM;;;IANJ,cAKC;IALD,qCAKC;;;IAUD,AADF,+BAA0E,eAC5B;IAC1C,yBAAgD;IAChD,4BAAM;IAAA,4HAC8B;IAExC,AADE,AADsC,iBAAO,EACvC,EACF;;;IA5XV,+BAAiR;IAC/Q,oHAAiB;IAGjB,8BAAoC;IAoQlC,AARA,AAPA,AAdA,AAjCA,AApMA,oHAAwB,8FAoMgB,6FAiCA,kGAcD,wGAOE,kFAQlC;IAkFT,iBAAM;IAEN,mHAAgC;IAUhC,qHAAkC;IAelC,qHAA8B;IAShC,iBAAM;;;IA9X8L,AAA/C,AAAzD,AAAxC,uDAAuC,0DAAyD,gDAA+C,qFAA6E;IAC9Q,cAEC;IAFD,2CAEC;IAGC,eAmVC;IAnVD,qNAmVC;IAGH,eASC;IATD,0DASC;IACD,cASC;IATD,6DASC;IAMD,cAQC;IARD,yDAQC;;;IAhfL,oGAA0D;IAkH1D,sGAAoC;;;IAlHpC,kGA+GC;IAGD,cAgYC;IAhYD,qEAgYC;;ADpZH;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAQH,MAAM,OAAO,oBAAqB,SAAQ,oBAAoB;IACpD,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAChC,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7B,OAAO,GAAG,MAAM,CAAC,CAAA,UAAuB,CAAA,CAAC,CAAC;IAElD,8CAA8C;IACrC,MAAM,CAAc;IAE7B,uCAAuC;IAC9B,QAAQ,GAAG,KAAK,CAAC;IAE1B,6DAA6D;IACpD,SAAS,GAAG,EAAE,CAAC;IAExB;;;;;;;OAOG;IACH,IACI,IAAI,CAAC,KAA6I;QACpJ,8DAA8D;QAC9D,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,cAAc;gBAAG,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;gBAAC,MAAM;YACnD,KAAK,gBAAgB;gBAAE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;gBAAC,MAAM;YACpD;gBAAsB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;gBAAC,MAAM;QAClD,CAAC;IACH,CAAC;IACD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IACO,KAAK,GAAuG,SAAS,CAAC;IAE9H;;;;;;OAMG;IACM,QAAQ,GAAwC,MAAM,CAAC;IAEhE,sCAAsC;IAC7B,SAAS,GAAG,IAAI,CAAC;IAE1B,0DAA0D;IACjD,WAAW,CAAe;IAEnC;;;;OAIG;IACH,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,WAAW,EAAE,iBAAiB,KAAK,KAAK,CAAC;IACvD,CAAC;IAED,2DAA2D;IAE3D,uCAAuC;IACvC,IAAqB,iBAAiB,CAAC,KAAiB,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;IAElF,4CAA4C;IAC5C,IAA0B,sBAAsB,CAAC,KAA8B,IAAI,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC;IAE9G,6EAA6E;IACpE,2BAA2B,GAAG,IAAI,CAAC;IAE5C,4EAA4E;IACnE,mBAAmB,GAAG,EAAE,CAAC;IAElC,uDAAuD;IAC9C,sBAAsB,GAAoB,IAAI,CAAC;IAExD,2CAA2C;IACjC,WAAW,GAAG,IAAI,YAAY,EAA+D,CAAC;IAExG,uFAAuF;IAC7E,QAAQ,GAAG,IAAI,YAAY,EAAuB,CAAC;IAE7D,gCAAgC;IAEhC,kDAAkD;IAClD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/E,CAAC;IAED,qFAAqF;IAC7E,iBAAiB,CAAsB;IAE/C,qFAAqF;IAC7E,iBAAiB,CAAsB;IAE/C,iFAAiF;IACzE,wBAAwB,CAAsB;IAEtD;;;;;;;;;;;;;;;OAeG;IACH,IAAI,qBAAqB;QACvB,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,4BAA4B,EAAE,CAAC;QAC/D,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAEO,4BAA4B;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;QAC3C,IAAI,CAAC,UAAU,EAAE,wBAAwB,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,CAAC,wDAAwD;QACvE,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC;QAC7C,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,6CAA6C;IAC7C,IAAI,WAAW;QACb,IAAI,IAAI,CAAC,mBAAmB;YAAE,OAAO,IAAI,CAAC,mBAAmB,CAAC;QAE9D,mDAAmD;QACnD,IAAI,IAAI,CAAC,SAAS,KAAK,gBAAgB;YAAE,OAAO,SAAS,CAAC;QAC1D,IAAI,IAAI,CAAC,SAAS,KAAK,gBAAgB;YAAE,OAAO,SAAS,CAAC;QAE1D,oEAAoE;QACpE,8DAA8D;QAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC;QAC/D,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YACtF,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,SAAS,CAAC,iBAAiB,CAAC;YACrC,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,EAAE,iBAAiB,IAAI,IAAI,CAAC,SAAS,CAAC;IAC7D,CAAC;IAED,uFAAuF;IACvF,IAAI,sBAAsB;QACxB,OAAO,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,aAAa,IAAI,EAAE,EAAE,2BAA2B,CAAC,CAAC;IACtH,CAAC;IAED,0BAA0B;IAC1B,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED,2EAA2E;IAC3E,IAAI,KAAK,CAAC,QAAiB;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,+DAA+D;IAC/D,IAAI,eAAe;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAClC,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC;IAChE,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,IAAI,qBAAqB;QACvB,yFAAyF;QACzF,6FAA6F;QAC7F,yFAAyF;QACzF,uEAAuE;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QAC9C,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,IAAI,CAAC,wBAAwB,KAAK,OAAO,EAAE,CAAC;YACtF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,4BAA4B,EAAE,CAAC;YAC7D,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC;QAC1C,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAEO,4BAA4B;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;QAC3C,IAAI,CAAC,UAAU,EAAE,wBAAwB,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,CAAC,wDAAwD;QACvE,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC;QAC7C,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,CAAC,oCAAoC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO;YACzB,CAAC,CAAC,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;YACzD,CAAC,CAAC,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,4FAA4F;IAC5F,IAAI,OAAO;QACT,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC;QACvE,OAAO,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC;IAC/B,CAAC;IAED,oDAAoD;IACpD,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,SAAS,EAAE,UAAU,KAAK,KAAK,CAAC;IAC9C,CAAC;IAED,wFAAwF;IACxF,IAAI,eAAe;QACjB,0EAA0E;QAC1E,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,CAAC;IACzD,CAAC;IAED,8BAA8B;IAE9B,gEAAgE;IACxD,QAAQ,GAAG,KAAK,CAAC;IAEzB;;;;;OAKG;IACK,kBAAkB,GAAG,CAAC,CAAC;IAE/B,sFAAsF;IAC9E,gBAAgB,GAAkB,IAAI,CAAC;IAE/C,wDAAwD;IAChD,YAAY,GAA0B,EAAE,CAAC;IAEjD;;;OAGG;IACK,WAAW;QACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,WAAW,EAAE,kBAAkB,IAAI,CAAC,CAAC;IACtE,CAAC;IAED;;;;;;;OAOG;IACH,IAAY,gCAAgC;QAC1C,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,IAAI,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,sEAAsE;IACtE,IAAI,WAAW;QACb,uFAAuF;QACvF,6EAA6E;QAC7E,IAAI,IAAI,CAAC,gCAAgC,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QACD,+FAA+F;QAC/F,8CAA8C;QAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC;QACzD,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,iFAAiF;IACjF,IAAI,cAAc;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe;YAAE,OAAO,KAAK,CAAC;QACzD,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,KAAK,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,+EAA+E;IAC/E,IAAI,UAAU;QACZ,IAAI,IAAI,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC;QACvC,OAAO,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACjF,CAAC;IAED,+EAA+E;IAC/E,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACrG,CAAC;IAED,+CAA+C;IAC/C,IAAI,aAAa;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc;YAChC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;YACpD,CAAC,CAAC,EAAE,CAAC;QACP,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO;gBACL,GAAG,MAAM;gBACT,IAAI,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC;aAC3E,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,iDAAiD;IACjD,IAAI,eAAe;QACjB,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED;;;;OAIG;IACK,kBAAkB;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7E,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,oEAAoE;IACpE,IAAI,eAAe;QACjB,mFAAmF;QACnF,qFAAqF;QACrF,sFAAsF;QACtF,yFAAyF;QACzF,uFAAuF;QACvF,2DAA2D;QAC3D,IAAI,CAAC,IAAI,CAAC,qBAAqB;YAAE,OAAO,IAAI,CAAC;QAC7C,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,2BAA2B;YAAE,OAAO,KAAK,CAAC;QACpD,IAAI,IAAI,CAAC,WAAW,EAAE,eAAe;YAAE,OAAO,KAAK,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,CAAC;IACzD,CAAC;IAED,+EAA+E;IAC/E,IAAI,cAAc;QAChB,IAAI,IAAI,CAAC,sBAAsB;YAAE,OAAO,IAAI,CAAC,sBAAsB,CAAC;QACpE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC;QACjD,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,4DAA4D;IAC5D,IAAI,gBAAgB;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;QACzC,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;OAMG;IACH,IAAI,aAAa;QACf,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC;QAExD,mEAAmE;QACnE,4EAA4E;QAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QAEnD,0DAA0D;QAC1D,EAAE;QACF,6FAA6F;QAC7F,0FAA0F;QAC1F,0FAA0F;QAC1F,0FAA0F;QAC1F,4EAA4E;QAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC;QAC/D,IAAI,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,CAAC;YACjH,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC1C,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE;gBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC;QAED,mDAAmD;QACnD,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,eAAe,CAAC;QAC9B,CAAC;QAED,qDAAqD;QACrD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,CAAC,4BAA4B;IAC3C,CAAC;IAED;;;OAGG;IACH,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;IAC7D,CAAC;IAED,qCAAqC;IAErC,4EAA4E;IACpE,eAAe,GAA8B,SAAS,CAAC;IAE/D,8EAA8E;IACtE,gBAAgB,GAAY,SAAS,CAAC;IAE9C,2CAA2C;IACnC,cAAc,GAAG,KAAK,CAAC;IAE/B;;;OAGG;IACK,kBAAkB;QACxB,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO;QAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,KAAK,EAAE;YAAE,OAAO;QAE9C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,SAAS,EAAE,aAAa,IAAI,CAAC,SAAS,EAAE,sBAAsB;YAAE,OAAO;QAE5E,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;QAEhC,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;gBAC3B,SAAS,EAAE,SAAS,CAAC,sBAAsB;gBAC3C,KAAK,EAAE,OAAO;aACf,CAAC,CAAC,CAAC;QAEJ,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QAC9B,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,CAAC;aAChD,IAAI,CAAC,IAAI,CAAC,EAAE;YACX,IAAI,CAAC,eAAe,GAAG,IAAI,IAAI,IAAI,CAAC;YACpC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC9B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,+CAA+C;IAC/C,0DAA0D;IAC1D,+CAA+C;IAE/C,uDAAuD;IACvD,WAAW,GAAG,CAAC,CAAC;IAChB,YAAY,GAAG,CAAC,CAAC;IACjB,0FAA0F;IAC1F,gBAAgB,GAAG,CAAC,CAAC;IACrB,gBAAgB,GAAG,CAAC,CAAC;IACrB,SAAS,GAAG,KAAK,CAAC;IAElB;;;;;OAKG;IACM,kBAAkB,GAAkB,IAAI,CAAC;IAElD;;;;;OAKG;IACM,kBAAkB,GAAG,IAAI,CAAC;IAEnC;;;;OAIG;IACM,aAAa,GAAG,IAAI,CAAC;IAE9B,uFAAuF;IAC9E,oBAAoB,GAA0B,QAAQ,CAAC;IAEhE,mDAAmD;IAC3C,cAAc,GAAwB,IAAI,CAAC;IAEnD,mDAAmD;IACnD,IAAI,qBAAqB;QACvB,yEAAyE;QACzE,uEAAuE;QACvE,sEAAsE;QACtE,MAAM,MAAM,GAAG;YACb,WAAW,EAAE,IAAI,CAAC,gBAAgB,GAAG,IAAI;YACzC,WAAW,EAAE,IAAI,CAAC,gBAAgB,GAAG,IAAI;YACzC,OAAO,EAAE,aAAa;SACvB,CAAC;QACF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;gBACL,UAAU,EAAE,OAAO;gBACnB,QAAQ,EAAE,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI;gBACxD,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI;gBAChC,GAAG,MAAM;gBACT,SAAS,EAAE,OAAO;aACnB,CAAC;QACJ,CAAC;QACD,OAAO;YACL,UAAU,EAAE,OAAO;YACnB,KAAK,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI;YAC9B,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI;YAChC,GAAG,MAAM;YACT,SAAS,EAAE,OAAO;SACnB,CAAC;IACJ,CAAC;IAED,2EAA2E;IACnE,sBAAsB,CAAC,QAAqB;QAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QAC9C,MAAM,iBAAiB,GAAG,GAAG,CAAC;QAC9B,MAAM,GAAG,GAAG,CAAC,CAAC;QACd,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC;QAE5B,IAAI,UAAU,GAAG,iBAAiB,IAAI,UAAU,GAAG,UAAU,EAAE,CAAC;YAC9D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC;QAC9B,+EAA+E;QAC/E,8EAA8E;QAC9E,wBAAwB;QACxB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACxG,CAAC;IAED,2DAA2D;IAE3D;;;;;;;;;;;OAWG;IACK,oBAAoB;QAC1B,kFAAkF;QAClF,IAAI,IAAI,CAAC,mBAAmB,EAAE,WAAW;YAAE,OAAO;QAElD,gFAAgF;QAChF,iFAAiF;QACjF,iFAAiF;QACjF,+EAA+E;QAC/E,MAAM,SAAS,GAAG,CAAC,WAAmB,EAAQ,EAAE;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;YACzC,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAuB,CAAC;YAC7E,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,QAAQ,CAAC,aAAa,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;oBAC7C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBACnD,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC;gBACtC,CAAC;YACH,CAAC;iBAAM,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBAC3B,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC,CAAC;QACF,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,4FAA4F;IACpF,mBAAmB,GAAuB,IAAI,CAAC;IAEvD,2DAA2D;IACnD,mBAAmB;QACzB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,MAAM,QAAQ,GAAG,CAAC,CAAQ,EAAE,EAAE;YAC5B,4EAA4E;YAC5E,2EAA2E;YAC3E,iDAAiD;YACjD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAqB,CAAC;YACvC,IAAI,IAAI,CAAC,mBAAmB,IAAI,MAAM,IAAI,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO;YAC5F,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,CAAC;QACF,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,iDAAiD;QACtG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE5C,IAAI,CAAC,cAAc,GAAG,GAAG,EAAE;YACzB,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YACvD,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjD,CAAC,CAAC;IACJ,CAAC;IAED,qCAAqC;IAC7B,kBAAkB;QACxB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,+BAA+B;IACvB,iBAAiB;QACvB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,+CAA+C;IAC/C,0CAA0C;IAC1C,+CAA+C;IAE/C,2EAA2E;IACnE,MAAM,CAAU,mBAAmB,GAAG,EAAE,CAAC;IAEjD,0CAA0C;IAClC,MAAM,CAAU,kBAAkB,GAAG,EAAE,CAAC;IAEhD,qDAAqD;IACrD,aAAa,GAAmB,EAAE,CAAC;IAEnC;;;;OAIG;IACH,oBAAoB,GAAwB,IAAI,CAAC;IAEjD,sFAAsF;IACtF,WAAW,GAAG,KAAK,CAAC;IAEpB,yCAAyC;IACzC,cAAc,GAAG,KAAK,CAAC;IAEvB,iFAAiF;IACjF,SAAS,GAAG,KAAK,CAAC;IAElB,oFAAoF;IACpF,WAAW,GAAG,KAAK,CAAC;IAEpB,uEAAuE;IACvE,aAAa,GAAG,CAAC,CAAC,CAAC;IAEnB,2EAA2E;IAC3E,eAAe,GAAa,EAAE,CAAC;IAE/B,0FAA0F;IAC1F,cAAc,GAAa,EAAE,CAAC;IAE9B,2DAA2D;IAC3D,WAAW,GAAG,EAAE,CAAC;IAEjB,uFAAuF;IACvF,eAAe,GAAG,KAAK,CAAC;IAExB,kFAAkF;IAClF,WAAW,GAAkB,IAAI,CAAC;IAElC,8EAA8E;IAC9E,SAAS,GAAmB,KAAK,CAAC;IAElC,mFAAmF;IAC3E,qBAAqB,GAAmB,EAAE,CAAC;IAEnD,yFAAyF;IACjF,YAAY,GAAkB,IAAI,CAAC;IAE3C;;;;;OAKG;IACK,QAAQ,GAAG,EAAE,CAAC;IAEtB,mCAAmC;IAC3B,gBAAgB,GAAyC,IAAI,CAAC;IAEtE,6DAA6D;IACrD,cAAc,GAAuB,IAAI,CAAC;IAElD,0FAA0F;IAClF,YAAY,GAAG,CAAC,CAAC;IAEzB,6EAA6E;IACrE,aAAa,GAAwB,IAAI,CAAC;IAElD,mDAAmD;IAEnD,8FAA8F;IAC9F,aAAa,GAAG,EAAE,CAAC;IAEnB,wEAAwE;IACxE,kBAAkB,GAAG,EAAE,CAAC;IAExB,6CAA6C;IAC7C,eAAe,GAAG,KAAK,CAAC;IAExB,mFAAmF;IACnF,SAAS,GAAG,KAAK,CAAC;IAElB,qFAAqF;IACrF,kBAAkB,GAAwB,EAAE,CAAC;IAE7C,oEAAoE;IAEpE,iFAAiF;IACzE,YAAY,GAA2B,EAAE,CAAC;IAElD,iFAAiF;IACzE,UAAU,GAAkB,IAAI,CAAC;IAEzC,4DAA4D;IACpD,SAAS,GAAiE,IAAI,CAAC;IAC/E,aAAa,GAAqC,IAAI,CAAC;IACvD,WAAW,GAAwB,IAAI,CAAC;IAEhD,oDAAoD;IACpD,IAAI,YAAY;QACd,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC;QACzD,OAAO,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;IAC/E,CAAC;IAED,4FAA4F;IAC5F,eAAe,CAAC,UAAwB;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACrB,MAAM,EAAE,GAAG,UAAU,CAAC,eAAe,CAAC;QACtC,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI;YAAE,OAAO,KAAK,CAAC;QAC1C,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACK,oBAAoB;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;QAClD,IAAI,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC;QACnC,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACK,gCAAgC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;QAClD,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC;QAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,mBAAmB,CAAa,WAAW,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QAChG,gFAAgF;QAChF,2EAA2E;QAC3E,OAAO,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;IAED;;;;;OAKG;IACK,eAAe;QACrB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAClD,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAEhC,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC;QAC3C,2FAA2F;QAC3F,6FAA6F;QAC7F,wFAAwF;QACxF,0FAA0F;QAC1F,4EAA4E;QAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC;QAC7C,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,IAAI,aAAa,CAAC,qBAAqB,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC;YAChH,CAAC,CAAC,aAAa,CAAC,SAAS;YACzB,CAAC,CAAC,IAAI,CAAC;QACX,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAEpE,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,sBAAsB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;QAE5F,6EAA6E;QAC7E,oDAAoD;QACpD,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,MAAM,IAAI,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACjI,MAAM,aAAa,GAAG,SAAS,EAAE,IAAI,IAAI,IAAI,CAAC;QAE9C,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,CAAC;aACpG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/D,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC;QAEtE,IAAI,CAAC,aAAa,GAAG;YACnB,aAAa,EAAE,aAAa;YAC5B,WAAW,EAAE,WAAW;YACxB,YAAY,EAAE,YAAY;YAC1B,eAAe,EAAE,eAAe;YAChC,YAAY,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;YACpE,aAAa,EAAE,aAAa;YAC5B,UAAU,EAAE,aAAa,CAAC,IAAI,IAAI,IAAI;SACvC,CAAC;QACF,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzE,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;;;;;OAOG;IACK,mBAAmB,CAAC,CAAkB;QAC5C,IAAI,CAAC,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC;QACjC,IAAI,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,uBAAuB;QAC5F,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACK,qBAAqB,CAC3B,aAAyB,EAAE,aAAqB,EAAE,WAAmB,EAAE,aAA4B;QAEnG,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,aAAa,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAEpG,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,eAAe;YACzD,CAAC,CAAC,uBAAuB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAElG,IAAI,IAAc,CAAC;QACnB,IAAI,KAAK,EAAE,aAAa,EAAE,CAAC;YACzB,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1C,iFAAiF;YACjF,oCAAoC;YACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAAE,IAAI,GAAG,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM;iBAClC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;mBAC7E,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;iBAC5D,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,GAAG,CAAC,aAAa,EAAE,GAAG,QAAQ,CAAC,CAAC;QACtC,CAAC;QAED,iEAAiE;QACjE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;YAAE,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACrE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,+CAA+C;IAC/C,gCAAgC;IAChC,+CAA+C;IAE/C,+EAA+E;IAC/E,IAAY,gBAAgB;QAC1B,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,IAAI,IAAI,CAAC;IAC/C,CAAC;IAED,6DAA6D;IAC7D,IAAY,eAAe;QACzB,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,IAAI,CAAC;IACtC,CAAC;IAED,sFAAsF;IAC9E,oBAAoB,CAAC,IAAkB;QAC7C,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa,CAAC;IAC1E,CAAC;IAED,+FAA+F;IACvF,sBAAsB,CAAC,CAAkB;QAC/C,IAAI,CAAC,CAAC,MAAM,KAAK,iBAAiB,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACxD,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2DAA2D;IACnD,oBAAoB,CAAC,IAAY;QACvC,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,iBAAiB,IAAI,IAAI,CAAC;IACnG,CAAC;IAED,yFAAyF;IACjF,mBAAmB,CAAC,IAAY;QACtC,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC1E,CAAC;IAED;;;OAGG;IACK,qBAAqB,CAAC,IAAkB;QAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACvC,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,CAAC,SAAiB,EAAE,EAAE;YACpC,IAAI,SAAS,KAAK,IAAI,CAAC,aAAa;gBAAE,OAAO,kBAAkB,CAAC;YAChE,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAC7G,CAAC,CAAC;QACF,iFAAiF;QACjF,6EAA6E;QAC7E,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,IAAI,GAAwB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACpE,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC;YAC3C,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC;YACxB,KAAK,EAAE,OAAgB;SACxB,CAAC,CAAC,CAAC;QACJ,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa;gBAAE,SAAS;YACjE,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBAAE,SAAS;YAC9C,IAAI,CAAC,IAAI,CAAC;gBACR,SAAS,EAAE,CAAC,CAAC,IAAI;gBACjB,KAAK,EAAE,CAAC,CAAC,iBAAiB;gBAC1B,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,kBAAkB;gBACjE,KAAK,EAAE,OAAO;aACf,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACK,4BAA4B,CAAC,IAAkB;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,eAAe;YACvD,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9D,IAAI,GAAG,KAAK,IAAI,CAAC,UAAU;YAAE,OAAO;QACpC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QAEtB,WAAW;QACX,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,eAAe;YACzD,CAAC,CAAC,uBAAuB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClG,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,WAAW,CAAC;YACzC,CAAC;YACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;gBAC7G,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC;gBACnC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;YAC1C,CAAC;YACD,IAAI,KAAK,CAAC,SAAS;gBAAE,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1E,CAAC;IAED,0FAA0F;IAClF,UAAU,CAAC,GAAY;QAC7B,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACK,gBAAgB,CACtB,IAAwD,EACxD,IAAkB,EAClB,KAAa;QAEb,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC;QAC7D,4EAA4E;QAC5E,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACpB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YAC1D,qEAAqE;YACrE,gCAAgC;YAChC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9F,OAAO;gBACL,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC1C,WAAW,EAAE,IAAI;gBACjB,qEAAqE;gBACrE,eAAe,EAAE,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,2BAA2B,CAAC;gBACrF,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;oBACtD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;oBAClD,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrF,OAAO;wBACL,SAAS,EAAE,SAAS;wBACpB,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;wBAC5B,KAAK,EAAE,KAAK;wBACZ,gBAAgB,EAAE,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,2BAA2B,CAAC;qBACvF,CAAC;gBACJ,CAAC,CAAC;gBACF,IAAI,EAAE,CAAC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI;aAC3C,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,yFAAyF;IACjF,gBAAgB,CAAC,WAA2B,EAAE,IAAkB;QACtE,oFAAoF;QACpF,uFAAuF;QACvF,+DAA+D;QAC/D,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;QACrD,IAAI,UAAU,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YAChE,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBACb,IAAI,CAAC,oBAAoB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;gBAC7C,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,iFAAiF;gBACjF,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QAED,IAAI,CAAC,qBAAqB,GAAG,WAAW,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC;QACtC,sEAAsE;QACtE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC;QACxC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QACpH,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QAC1G,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC;QAE1E,kFAAkF;QAClF,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC;QAChG,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/C,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACjD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACK,+BAA+B,CAAC,IAAkB;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;QAChC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAClE,OAAO;YACL,eAAe,EAAE,IAAI,CAAC,KAAK;YAC3B,WAAW,EAAE,IAAI;YACjB,eAAe,EAAE,sBAAsB,CAAC,IAAI,EAAE,EAAE,EAAE,2BAA2B,CAAC;YAC9E,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjD,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE;aAC7E,CAAC,CAAC;YACH,IAAI,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;SAC9B,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,eAAe,CAAC,WAA2B;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC;QAC/B,IAAI,CAAC,KAAK;YAAE,OAAO,WAAW,CAAC;QAC/B,MAAM,KAAK,GAAG,CAAC,CAAe,EAAU,EAAE;YACxC,IAAI,KAAK,KAAK,IAAI,CAAC,WAAW;gBAAE,OAAO,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;YAC3D,OAAO,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACtE,CAAC,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACpC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAC1F,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,SAAiB;QAC9B,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK;gBAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;iBACjD,CAAC;gBAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YAAC,CAAC,CAAC,iBAAiB;QAC7E,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACtE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,qEAAqE;IAC7D,sBAAsB;QAC5B,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAClD,uBAAuB,CAAC,QAAQ,CAAC,OAAO,CACtC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAC9E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kFAAkF;IAClF,UAAU,CAAC,SAAiB;QAC1B,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;YAAE,OAAO,wDAAwD,CAAC;QACpG,OAAO,IAAI,CAAC,SAAS,KAAK,KAAK;YAC7B,CAAC,CAAC,qCAAqC;YACvC,CAAC,CAAC,uCAAuC,CAAC;IAC9C,CAAC;IAED,6CAA6C;IAE7C,sFAAsF;IACtF,eAAe,CAAC,KAAiB;QAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;QAC7C,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,2DAA2D;IAC3D,eAAe,CAAC,KAAwB;QACtC,OAAO,KAAK,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;IACtE,CAAC;IAED,yFAAyF;IACzF,IAAI,0BAA0B;QAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,qFAAqF;IACrF,eAAe,CAAC,KAAiB,EAAE,KAAwB;QACzD,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,mFAAmF;IAC3E,WAAW,CAAC,KAAwB;QAC1C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC;QACrC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,KAAK,CAAC;QACtC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAClD,uBAAuB,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAChH,CAAC;QACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,gFAAgF;IACxE,oBAAoB;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,gCAAgC,EAAE,CAAC;QACvD,IAAI,MAAM;YAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;;YAC9C,KAAK,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,8DAA8D;IAE9D,2FAA2F;IAC3F,iBAAiB,CAAC,KAAwB;QACxC,OAAO,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/F,CAAC;IAED,oFAAoF;IACpF,iBAAiB,CAAC,KAAwB;QACxC,OAAO,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,WAAW,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACH,gBAAgB,CAAC,KAAiB,EAAE,KAAwB;QAC1D,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAAE,OAAO;QAE3C,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,GAAG,IAAI,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;;YAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,wEAAwE;IAChE,mBAAmB,CAAC,IAAc;QACxC,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAClD,uBAAuB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC,8CAA8C;QACzE,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,uEAAuE;IAEvE,4EAA4E;IAC5E,iBAAiB,CAAC,KAAa;QAC7B,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,6EAA6E;IAC7E,mBAAmB,CAAC,KAAa;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;IACtD,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,KAAiB,EAAE,KAAa,EAAE,KAAa;QAC1D,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QAC/C,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACH,IAAI,qBAAqB;QACvB,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,eAAe;YAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/F,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACK,aAAa,CAAC,KAAa,EAAE,MAAe;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC;YAAE,OAAO,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QACxD,OAAO,MAAM,CAAC,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,kBAAkB,CAAC;IAC5E,CAAC;IAED,4FAA4F;IAC5F,kBAAkB,CAAC,KAAa,EAAE,MAAe;QAC/C,OAAO,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IACpD,CAAC;IAED,uFAAuF;IACvF,SAAS,CAAC,UAAwB,EAAE,KAAa;QAC/C,OAAO,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,wFAAwF;IACxF,cAAc,CAAC,KAAiB,EAAE,KAAa;QAC7C,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,4DAA4D;QACpF,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,uDAAuD;IAEvD,0FAA0F;IAC1F,kBAAkB,CAAC,KAAiB,EAAE,KAAa;QACjD,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,MAAM,UAAU,GAAI,KAAK,CAAC,MAAsB,CAAC,OAAO,CAAC,cAAc,CAAuB,CAAC;QAC/F,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;QAC7D,IAAI,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;QAC9D,IAAI,CAAC,aAAa,GAAG,CAAC,CAAa,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACjD,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3D,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACzD,CAAC;IAEO,iBAAiB,CAAC,CAAa;QACrC,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxG,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;QAC5E,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEO,gBAAgB;QACtB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACtD,IAAI,KAAK,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC3D,uBAAuB,CAAC,QAAQ,CAAC,WAAW,CAC1C,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CACzE,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEO,yBAAyB;QAC/B,IAAI,IAAI,CAAC,aAAa;YAAE,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACtF,IAAI,IAAI,CAAC,WAAW;YAAE,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAChF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,2CAA2C;IAC3C,SAAS,CAAC,KAAY;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;QAEhC,iFAAiF;QACjF,MAAM,MAAM,GAAG,IAAI,CAAC,gCAAgC,EAAE,CAAC;QACvD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAAC,CAAC;YACjG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,6EAA6E;QAC7E,iEAAiE;QACjE,IAAI,IAAI,CAAC,gBAAgB;YAAE,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/D,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,GAAG,EAAE;YACtC,KAAK,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,KAAiB;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,sCAAsC;QAC7D,iFAAiF;QACjF,4DAA4D;QAC5D,IAAI,KAAK,CAAC,KAAK;YAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAChC,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACK,wBAAwB;QAC9B,gFAAgF;QAChF,gFAAgF;QAChF,+DAA+D;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,gCAAgC,EAAE,CAAC;QACvD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAAC,CAAC;YACjG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,KAAK,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACK,kBAAkB,CAAC,OAAkC,EAAE,KAAa;QAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAEvE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,MAAM,QAAQ,GAAG,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/E,4FAA4F;QAC5F,sFAAsF;QACtF,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;QAC3C,MAAM,WAAW,GACf,IAAI,CAAC,aAAa,IAAI,WAAW,EAAE,qBAAqB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,KAAK,KAAK;YACrH,CAAC,CAAC,IAAI,CAAC,aAAa;YACpB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;QACzB,MAAM,OAAO,GAAG,kBAAkB,CAChC,OAAO,EACP,KAAK,EACL,oBAAoB,CAAC,mBAAmB,EACxC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CACxB,CAAC;QAEF,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IACzF,CAAC;IAED,0EAA0E;IAC1E,QAAQ;QACN,sEAAsE;QACtE,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,sBAAsB;YAC9C,+DAA+D;YAC/D,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;gBACpD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YAC3B,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,KAAoB;QAC9B,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAAC,CAAC;YAChF,OAAO;QACT,CAAC;QACD,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC;YAClB,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACrF,IAAI,CAAC,0BAA0B,EAAE,CAAC;gBAClC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBACxB,MAAM;YACR,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzD,IAAI,CAAC,0BAA0B,EAAE,CAAC;gBAClC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBACxB,MAAM;YACR,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACtD,IAAI,MAAM,EAAE,CAAC;oBACX,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAClC,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,QAAQ;gBACX,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBACxB,MAAM;QACV,CAAC;IACH,CAAC;IAED,2FAA2F;IACnF,0BAA0B;QAChC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB;mBACnC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,aAAa,CAAC,iBAAiB,CAAwB,CAAC;YAC3F,MAAM,MAAM,GAAG,QAAQ,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,aAAa,CAA4B,CAAC;YAC1G,MAAM,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kDAAkD;IAClD,cAAc,CAAC,UAAwB,EAAE,KAAiB;QACxD,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED,iEAAiE;IACzD,kBAAkB,CAAC,UAAwB;QACjD,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,eAAe,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,8DAA8D;QAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC;QAC/D,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,+CAA+C;IAE/C;;;;OAIG;IACH,IAAI,WAAW;QACb,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC;QAC7C,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC/B,OAAO,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACxD,CAAC;IAED,2FAA2F;IAC3F,IAAI,aAAa;QACf,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,EAAE,EAAE,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,aAAa,IAAI,QAAQ,CAAC;QAC1G,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,WAAW,EAAE,CAAC;IACnE,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,KAAiB;QAC7B,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,mDAAmD;QAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACpC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;QACpD,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAEpC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,MAAM,eAAe,GAA4B,EAAE,CAAC;QACpD,IAAI,KAAK;YAAE,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;QAEvD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,gBAAgB;YACtB,UAAU,EAAE,aAAa;YACzB,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;YAClF,YAAY,EAAE,IAAI,CAAC,oBAAoB;YACvC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,SAAS;YACpC,QAAQ,EAAE,CAAC,OAA0B,EAAE,EAAE,GAAG,IAAI,OAAO;gBAAE,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;SACtG,CAAC,CAAC;IACL,CAAC;IAED,qEAAqE;IAC7D,qBAAqB,CAAC,OAAmB,EAAE,IAAkB;QACnE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,IAAI,EAAE,IAAI,IAAI;YAAE,OAAO;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC;QAC/D,IAAI,YAAY;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,sCAAsC;IACtC,cAAc,CAAC,KAAiB;QAC9B,+EAA+E;QAC/E,yEAAyE;QACzE,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACjC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAElC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC;QAC/D,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,kFAAkF;QAClF,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,gEAAgE;IACxD,eAAe;QACrB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,mBAAmB,CAAC,KAAa;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,aAAa;YAAE,OAAO;QAE/C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACjD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,+EAA+E;QAC/E,0DAA0D;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC;QAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;YAChC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,WAAW;YAC1E,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD,CAAC,CAAC,CAAC;QACJ,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAEtD,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAA0B;YACvD,UAAU,EAAE,SAAS,CAAC,aAAa;YACnC,kEAAkE;YAClE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,WAAW,YAAY,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE;YAC5E,OAAO,EAAE,oBAAoB,CAAC,kBAAkB;YAChD,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QAEH,4DAA4D;QAC5D,IAAI,GAAG,KAAK,IAAI,CAAC,YAAY;YAAE,OAAO;QACtC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,QAAQ,GAAG,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACxF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAChG,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,+CAA+C;IAC/C,oDAAoD;IACpD,+CAA+C;IAE/C,iDAAiD;IACjD,qBAAqB,GAAG,KAAK,CAAC;IAE9B,6CAA6C;IACrC,gBAAgB,GAAG,EAAE,CAAC;IAE9B,4DAA4D;IAC5D,IAAI,sBAAsB;QACxB,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC,cAAc,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,mDAAmD;IACnD,gBAAgB,CAAC,KAAY;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACrD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,6BAA6B;IAC7B,gBAAgB,CAAC,KAAiB;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAqB,CAAC;QAC1C,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,4BAA4B;IAC5B,eAAe;QACb,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;YACnC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED,kDAAkD;IAClD,iBAAiB,CAAC,KAAa,EAAE,KAAiB;QAChD,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,+CAA+C;IAC/C,oDAAoD;IACpD,+CAA+C;IAE/C,oDAAoD;IACpD,kBAAkB,GAAG,KAAK,CAAC;IAE3B,wCAAwC;IACxC,oBAAoB,CAAC,KAAY;QAC/B,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,GAAG,KAAK,CAAC,aAA4B,CAAC;YAC9C,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,wCAAwC;IACxC,mBAAmB;QACjB,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED,uDAAuD;IACvD,mBAAmB,CAAC,KAAa,EAAE,KAAiB;QAClD,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,+CAA+C;IAC/C,qBAAqB;IACrB,+CAA+C;IAE/C,sFAAsF;IACtF,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,SAAS,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC;IACvC,CAAC;IAED;;;;;;OAMG;IACH,IAAI,kBAAkB;QACpB,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,KAAK,iBAAiB,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAChE,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC;QAC5B,OAAO,MAAM,KAAK,CAAC,IAAI,MAAM,IAAI,GAAG,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,IAAI,YAAY;QACd,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,IAAI,CAAC,EAAE;YAAE,OAAO,OAAO,CAAC;QAExB,QAAQ,EAAE,CAAC,YAAY,EAAE,CAAC;YACxB,KAAK,UAAU,CAAC,CAAC,OAAO,UAAU,CAAC;YACnC,KAAK,MAAM,CAAC,CAAK,OAAO,MAAM,CAAC;YAC/B,KAAK,MAAM,CAAC,CAAK,OAAO,MAAM,CAAC;QACjC,CAAC;QAED,sFAAsF;QACtF,IAAI,EAAE,CAAC,YAAY,IAAI,IAAI;YAAE,OAAO,OAAO,CAAC;QAE5C,6EAA6E;QAC7E,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO,OAAO,CAAC;QAE7C,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAED,gGAAgG;IACxF,iBAAiB,GAA6B,IAAI,CAAC;IAE3D;;;;;OAKG;IACH,IAAI,gBAAgB;QAClB,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,YAAY,CAAC;QAC7C,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,qFAAqF;IAC7E,iBAAiB,GAAkB,IAAI,CAAC;IACxC,kBAAkB,GAAmB,OAAO,CAAC;IAErD,0FAA0F;IAClF,YAAY;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,IAAI,KAAK,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACpC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,IAAI,CAAC,kBAAkB,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAI,kBAAkB;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;QACvE,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,UAAU,CAAC,CAAC,OAAO,UAAU,CAAC;YACnC,KAAK,MAAM,CAAC,CAAK,OAAO,MAAM,CAAC;YAC/B,KAAK,MAAM,CAAC,CAAK,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC1E,OAAO,CAAC,CAAS,OAAO,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,2EAA2E;IACnE,kBAAkB,CAAC,QAAmC;QAC5D,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,KAAK,CAAC,CAAQ,OAAO,KAAK,CAAC;YAChC,KAAK,MAAM,CAAC,CAAO,OAAO,MAAM,CAAC;YACjC,KAAK,YAAY,CAAC,CAAC,OAAO,YAAY,CAAC;YACvC,KAAK,KAAK,CAAC,CAAQ,OAAO,KAAK,CAAC;YAChC,KAAK,YAAY,CAAC,CAAC,OAAO,YAAY,CAAC;YACvC,OAAO,CAAC,CAAW,OAAO,EAAE,CAAC,CAAC,sCAAsC;QACtE,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,IAAI,eAAe;QACjB,QAAQ,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC;YACrC,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;YAC7B,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;YAC7B,KAAK,MAAM,CAAC,CAAE,OAAO,MAAM,CAAC;YAC5B,OAAO,CAAC,CAAM,OAAO,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,eAAe;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,kBAAkB;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QACvB,OAAO,oBAAoB,CAAC,GAAG,CAAC,IAAI,6BAA6B,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACjF,CAAC;IAED,IAAI,mBAAmB;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,OAAO,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,cAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,sFAAsF;IACtF,IAAI,kBAAkB;QACpB,IAAI,IAAI,CAAC,kBAAkB;YAAE,OAAO,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,eAAe;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACtC,OAAO,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,SAAS,CAAC;IAC3D,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,aAAa,CAAC;IAC/D,CAAC;IAED,IAAI,gBAAgB;QAClB,4FAA4F;QAC5F,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC7C,OAAO,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,wFAAwF;IACxF,kBAAkB,CAAC,KAAa;QAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,iCAAiC;IACjC;;;;;;;OAOG;IACH,IAAY,eAAe;QACzB,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IACtE,CAAC;IAED,WAAW;QACT,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACjD,IAAI,GAAG,YAAY,IAAI,EAAE,CAAC;YACxB;;;;;;;;;;;;;;;;eAgBG;YACH,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,OAAO,GAAG,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,OAAO,GAAG,CAAC,cAAc,EAAE,CAAC;QAC9B,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,WAAW,CAAC,OAAsB;QAChC,qFAAqF;QACrF,6DAA6D;QAC7D,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACnC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACnC,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;QAC5C,CAAC;QACD,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvE,qCAAqC;YACrC,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACnB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;gBACxB,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;gBACzB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;gBACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBACxB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;gBAChC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;gBAC7B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC7B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;gBACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,uCAAuC;gBAC/D,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;gBAChC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC1B,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;gBACjC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;gBAClC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,wCAAwC;gBACxC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACtB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;gBACvB,8EAA8E;gBAC9E,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAC9B,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;gBAClC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAChC,CAAC;YACD,gDAAgD;YAChD,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACtB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YACzB,CAAC;YACD,0EAA0E;YAC1E,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAChC,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,8EAA8E;QAC9E,gFAAgF;QAChF,gFAAgF;QAChF,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,CAAC,aAAa,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YACzF,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAClC,CAAC;IAED,gCAAgC;IAEhC;;OAEG;IACH,iBAAiB,CAAC,KAAiB;QACjC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAC5C,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;QACvD,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAE/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,oFAAoF;QACpF,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,sBAAsB,IAAI,IAAI,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,CAAC,IAAI,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAElF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,iBAAiB;YAC7B,UAAU,EAAE,SAAS;YACrB,YAAY,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;SAC7C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAiB;QAChC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,OAAO;YACb,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,KAAiB;QAC9B,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,eAAe;YACrB,GAAG,EAAE,GAAG;YACR,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,KAAY;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,eAAe,CAAC,KAAY;QAC1B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,YAAY;QACV,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,KAAY;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9B,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;QAC9G,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,gBAAgB,GAAG,yEAAyE,CAAC;YAClG,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;QACxC,IAAI,IAAI,CAAC,IAAI,GAAG,eAAe,EAAE,CAAC;YAChC,IAAI,CAAC,gBAAgB,GAAG,kCAAkC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC;YAC9F,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,gBAAgB,GAAG,yEAAyE,CAAC;gBAClG,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;gBACrB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC3E,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,IAAI,CAAC,gBAAgB,GAAG,0CAA0C,IAAI,CAAC,iBAAiB,8CAA8C,CAAC;YACvI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,gBAAgB,GAAG,4BAA4B,CAAC;YACrD,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,kBAAkB,CAAC,KAAY;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,IAAU;QAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;YACxE,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,GAAW;QAC/B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAChC,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC7D,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,yBAAyB,CAAC,OAAe,EAAE,QAAgB;QACvE,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QACjD,IAAI,8BAA8B,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,KAAK,CAAC;QAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,MAAM,CAAC;QACjD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAExC,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1D,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACpD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;YACpD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;YACjB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAClB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACrD,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;gBAAE,OAAO,IAAI,CAAC;YACzC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;YACjD,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,KAAY;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,KAAY;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAY;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI,cAAc;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAAE,OAAO,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,IAAI,sBAAsB;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QACjC,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,KAAK,iBAAiB,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAClG,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QAClE,OAAO,IAAI,CAAC,cAAc,KAAK,EAAE,CAAC;IACpC,CAAC;6PApyEU,oBAAoB,yBAApB,oBAAoB;6DAApB,oBAAoB;YClIjC,4EAA+E;;YAA/E,kHAqfC;;;iFDnXY,oBAAoB;cAPhC,SAAS;6BACI,KAAK,YACP,eAAe,mBACR,uBAAuB,CAAC,MAAM;;kBAU9C,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAUL,KAAK;;kBAqBL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAcL,KAAK;mBAAC,QAAQ;;kBAGd,KAAK;mBAAC,aAAa;;kBAGnB,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,MAAM;;kBAGN,MAAM;;kBAuaN,KAAK;;kBAQL,KAAK;;kBAOL,KAAK;;kBAGL,KAAK;;kFA1gBK,oBAAoB","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject, OnChanges, SimpleChanges, OnDestroy, ElementRef, Renderer2 } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { BaseEntity, EntityInfo, EntityFieldInfo, EntityFieldTSType, CompositeKey, KeyValuePair, RunView, CoerceImageSrc, IsInlineImageDataUri, CoerceRawImageBase64ToDataUri, MaxStoredImageChars, MaxInlineImageBytes, FormatByteSize, ParseCssHexColor, PrettyPrintJson } from '@memberjunction/core';\nimport { BaseEngineRegistry } from '@memberjunction/core';\nimport { ValidationErrorInfo, HighlightSearchMatches, detectRichTextFormat, RichTextFormat, UUIDsEqual } from '@memberjunction/global';\nimport { FormContext } from '../types/form-types';\nimport { FormNavigationEvent } from '../types/navigation-events';\nimport { FormatFKCell, FilterCachedFKRows } from './fk-search-utils';\nimport { LinkedFieldOptionsStore } from './linked-field-options';\n\n/**\n * How a field's value should be rendered/edited beyond a plain input.\n * - `markdown` / `html`: render formatted in read mode, code editor in edit mode\n * - `code`: source code (uses the field's CodeType as the editor language)\n * - `plain`: standard text rendering (default)\n */\nexport type FieldRichTextMode = 'markdown' | 'html' | 'code' | 'plain';\n\n/**\n * One extra (non-name, non-PK) column rendered in an FK suggestion row.\n * Built from the related entity's fields where `DefaultInView === true`.\n */\nexport interface FKSuggestionColumn {\n /** Field code name on the related entity. */\n FieldName: string;\n /** Friendly column header (the field's DisplayNameOrName). */\n Header: string;\n /** Pre-formatted display value for this row+column. */\n Value: string;\n /**\n * {@link Value} with the query substring highlighted when this column is the one\n * being searched (else plain, still HTML-escaped). Bound to `[innerHTML]`.\n */\n HighlightedValue: string;\n}\n\n/**\n * A field the user can scope the FK search to, shown in the scope-picker menu.\n * `Group` separates the columns visible in the grid ('shown') from other\n * searchable fields like ID/Status ('other').\n */\nexport interface FKSearchableField {\n /** Related-entity field code name to search against. */\n FieldName: string;\n /** Friendly label (DisplayNameOrName) shown in the menu + scope pill. */\n Label: string;\n /** FontAwesome icon class for the menu row. */\n Icon: string;\n /** Which menu group this field belongs to. */\n Group: 'shown' | 'other';\n}\n\n/**\n * Represents a suggestion item for FK autocomplete search results.\n */\nexport interface FKSuggestion {\n /** Primary-key value used as the FK value when selected. */\n PrimaryKeyValue: unknown;\n /** The related entity's NameField value — the primary clickable label. */\n DisplayName: string;\n /** {@link DisplayName} with the typed query substring wrapped in a highlight mark. Bound to `[innerHTML]`. */\n HighlightedName: string;\n /** Additional DefaultInView columns shown to the right of the name (multi-column rows). */\n ExtraColumns: FKSuggestionColumn[];\n /**\n * Leading icon for this row — a FontAwesome class. Per-row when the related\n * entity has an `ExtendedType = 'Icon'` field; otherwise the entity-level\n * icon; null when neither exists.\n */\n Icon: string | null;\n}\n\n/**\n * Describes the column layout (besides the name column) for the FK suggestion\n * dropdown of the current related entity. Recomputed when the related entity changes.\n */\ninterface FKColumnPlan {\n /** Code name of the related entity's NameField (or PK fallback). */\n NameFieldName: string;\n /** Code name of the related entity's PK field used as the FK value. */\n PkFieldName: string;\n /**\n * The ordered list of ALL display columns INCLUDING the name field — this is the\n * user-reorderable column order. The name field is always present (can't be hidden)\n * but may sit anywhere in the order.\n */\n ColumnFields: string[];\n /** Non-name display columns (ColumnFields minus the name field), for cell building. */\n ExtraFieldNames: string[];\n /** Friendly headers for the extra columns, index-aligned with ExtraFieldNames. */\n ExtraHeaders: string[];\n /**\n * Code name of the related entity's `ExtendedType = 'Icon'` field, whose\n * per-row value is a FontAwesome class — or null if the entity has no such\n * field (then {@link EntityIcon} is used as a uniform fallback).\n */\n IconFieldName: string | null;\n /** Entity-level icon (`EntityInfo.Icon`) used when there's no per-row icon field. */\n EntityIcon: string | null;\n}\n\n/**\n * Modern form field component that renders entity fields in both read-only and edit modes.\n *\n * **Read mode**: Clean text display with optional hyperlinks (email, URL, record).\n * **Edit mode**: Native HTML inputs with custom-built select and autocomplete components.\n *\n * Uses:\n * - Native `<input>` for text, number, date\n * - Custom styled dropdown for value list selections\n * - Custom autocomplete with floating dropdown for foreign key search\n * - Custom-styled `<input type=\"checkbox\">` for booleans\n *\n * All navigation (clicking FK links, email links, URL links) is emitted as events.\n *\n * @example\n * ```html\n * <mj-form-field\n * [Record]=\"record\"\n * [EditMode]=\"editMode\"\n * FieldName=\"CustomerName\"\n * Type=\"textbox\"\n * [FormContext]=\"formContext\"\n * (Navigate)=\"onNavigate($event)\"\n * (ValueChange)=\"onValueChange($event)\">\n * </mj-form-field>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-form-field',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './form-field.component.html',\n styleUrls: ['./form-field.component.css']\n})\nexport class MjFormFieldComponent extends BaseAngularComponent implements OnChanges, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private renderer = inject(Renderer2);\n private hostRef = inject(ElementRef<HTMLElement>);\n\n /** The entity record containing this field */\n @Input() Record!: BaseEntity;\n\n /** Whether the form is in edit mode */\n @Input() EditMode = false;\n\n /** The field code name (must match a field on the entity) */\n @Input() FieldName = '';\n\n /**\n * The control type to render in edit mode.\n * Determines which input component is used.\n *\n * Also accepts deprecated Kendo-style type names for backward compatibility:\n * - `'dropdownlist'` → `'select'`\n * - `'numerictextbox'` → `'number'`\n */\n @Input()\n set Type(value: 'textbox' | 'textarea' | 'number' | 'datepicker' | 'checkbox' | 'select' | 'autocomplete' | 'code' | 'dropdownlist' | 'numerictextbox') {\n // Normalize deprecated Kendo type names to modern equivalents\n switch (value) {\n case 'dropdownlist': this._type = 'select'; break;\n case 'numerictextbox': this._type = 'number'; break;\n default: this._type = value; break;\n }\n }\n get Type(): 'textbox' | 'textarea' | 'number' | 'datepicker' | 'checkbox' | 'select' | 'autocomplete' | 'code' {\n return this._type;\n }\n private _type: 'textbox' | 'textarea' | 'number' | 'datepicker' | 'checkbox' | 'select' | 'autocomplete' | 'code' = 'textbox';\n\n /**\n * Link type for read-only rendering.\n * - 'Email': renders as mailto link\n * - 'URL': renders as external hyperlink\n * - 'Record': renders as FK link to related entity record\n * - 'None': renders as plain text\n */\n @Input() LinkType: 'Email' | 'URL' | 'Record' | 'None' = 'None';\n\n /** Whether to show the field label */\n @Input() ShowLabel = true;\n\n /** Form-level context (search filter, showEmptyFields) */\n @Input() FormContext?: FormContext;\n\n /**\n * Whether FK / record links are interactive. Driven by\n * `FormContext.enableRecordLinks`; false renders FK values as plain text\n * (dialog/slide-in surfaces). Undefined / true means links are live.\n */\n get RecordLinksEnabled(): boolean {\n return this.FormContext?.enableRecordLinks !== false;\n }\n\n // ---- Deprecated camelCase aliases (backward compat) ----\n\n /** @deprecated Use [Record] instead */\n @Input('record') set _deprecatedRecord(value: BaseEntity) { this.Record = value; }\n\n /** @deprecated Use [FormContext] instead */\n @Input('formContext') set _deprecatedFormContext(value: FormContext | undefined) { this.FormContext = value; }\n\n /** Whether to hide this field when empty in read-only mode. Default: true */\n @Input() HideWhenEmptyInReadOnlyMode = true;\n\n /** Override display name (defaults to entity field metadata DisplayName) */\n @Input() DisplayNameOverride = '';\n\n /** Override possible values for select/autocomplete */\n @Input() PossibleValuesOverride: string[] | null = null;\n\n /** Emitted when the field value changes */\n @Output() ValueChange = new EventEmitter<{ FieldName: string; OldValue: unknown; NewValue: unknown }>();\n\n /** Emitted when a navigation action is triggered (FK link click, email click, etc.) */\n @Output() Navigate = new EventEmitter<FormNavigationEvent>();\n\n // ---- Computed Properties ----\n\n /** Get EntityFieldInfo metadata for this field */\n get FieldInfo(): EntityFieldInfo | undefined {\n return this.Record?.EntityInfo?.Fields?.find(f => f.Name === this.FieldName);\n }\n\n /** Memoized answer for {@link IsFieldReadableByUser}; invalidated in ngOnChanges. */\n private _isReadableByUser: boolean | undefined;\n\n /** Memoized answer for {@link IsFieldWritableByUser}; invalidated in ngOnChanges. */\n private _isWritableByUser: boolean | undefined;\n\n /** The `Record.IsSaved` state {@link _isWritableByUser} was computed against. */\n private _isWritableForSavedState: boolean | undefined;\n\n /**\n * Whether field-level security permits the current user to READ this field.\n *\n * The template gates the whole field on this BEFORE anything reads a value, because\n * `BaseEntity.Get()` throws for a denied field — so rendering one at all would take out the\n * entire form rather than hiding a column. Everything downstream (`Value`, `ShouldHideField`,\n * FK resolution) is safe only because this check runs first.\n *\n * Memoized: template getters are evaluated on every change-detection cycle, and\n * `GetDeniedReadFields` walks every field on the entity and aggregates permissions across the\n * user's roles. `ngOnChanges` clears the memo when `Record` or `FieldName` changes.\n *\n * Fails OPEN — on a missing entity, missing user, or an entity with field security switched\n * off — matching `BaseEntity`'s own gate. A form that hid fields because no user had resolved\n * yet would be worse than one that shows them, since the server is the real boundary.\n */\n get IsFieldReadableByUser(): boolean {\n if (this._isReadableByUser === undefined) {\n this._isReadableByUser = this.computeIsFieldReadableByUser();\n }\n return this._isReadableByUser;\n }\n\n private computeIsFieldReadableByUser(): boolean {\n const entityInfo = this.Record?.EntityInfo;\n if (!entityInfo?.EnableFieldLevelSecurity) {\n return true; // one boolean for the overwhelming majority of entities\n }\n const user = this.ProviderToUse?.CurrentUser;\n if (!user || !this.FieldName) {\n return true;\n }\n return !entityInfo.GetDeniedReadFields(user).has(this.FieldName.trim().toLowerCase());\n }\n\n /** Display name from metadata or override */\n get DisplayName(): string {\n if (this.DisplayNameOverride) return this.DisplayNameOverride;\n\n // Friendly labels for standard MJ timestamp fields\n if (this.FieldName === '__mj_CreatedAt') return 'Created';\n if (this.FieldName === '__mj_UpdatedAt') return 'Updated';\n\n // For FK fields that have a mapped name field, use the name field's\n // friendly label (e.g., show \"Parent\" instead of \"Parent ID\")\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n const nameField = this.Record?.EntityInfo?.Fields?.find(f => f.Name === nameFieldMap);\n if (nameField) {\n return nameField.DisplayNameOrName;\n }\n }\n\n return this.FieldInfo?.DisplayNameOrName ?? this.FieldName;\n }\n\n /** Display name with search highlighting applied. Output is bound to `[innerHTML]`. */\n get HighlightedDisplayName(): string {\n return HighlightSearchMatches(this.DisplayName, this.FormContext?.sectionFilter ?? '', 'mj-forms-search-highlight');\n }\n\n /** Current field value */\n get Value(): unknown {\n return this.Record?.Get(this.FieldName);\n }\n\n /** Set field value, mark touched, run validation, and emit change event */\n set Value(newValue: unknown) {\n if (!this.Record) return;\n const oldValue = this.Record.Get(this.FieldName);\n this.Record.Set(this.FieldName, newValue);\n this.markTouched();\n this.runFieldValidation();\n this.ValueChange.emit({ FieldName: this.FieldName, OldValue: oldValue, NewValue: newValue });\n }\n\n /** Whether this field is read-only based on entity metadata */\n get IsFieldReadOnly(): boolean {\n if (!this.FieldInfo) return false;\n return this.FieldInfo.ReadOnly || !this.IsFieldWritableByUser;\n }\n\n /**\n * Whether field-level security permits the current user to WRITE this field, against the verb\n * that actually applies to the record in hand: Create on a new record, Update on a saved one.\n *\n * Read access is handled separately and earlier ({@link IsFieldReadableByUser}) — a field the\n * user cannot see is not rendered at all. This is the narrower case of a field they CAN see\n * but may not change, which should render as a read-only value rather than an editable control.\n *\n * Both verbs matter and they fail differently, which is why this picks by record state rather\n * than checking update alone:\n *\n * - **Update denied** — the server rejects the save. Without this, the user types, saves, and\n * gets an error naming a field they had every reason to think was editable.\n * - **Create denied** — the server does NOT reject. It silently drops the value and takes the\n * column default, matching the read path where a denied field is simply absent. So an\n * editable control on a new record quietly discards what was typed, with no error anywhere.\n * That is the worse of the two, and the only signal the user gets is this.\n *\n * Memoized alongside the read check and invalidated by the same `ngOnChanges`, for the same\n * reason: template getters run every change-detection cycle and the underlying walk covers\n * every field on the entity.\n */\n get IsFieldWritableByUser(): boolean {\n // Keyed on IsSaved as well as memoized: the answer switches from the Create rules to the\n // Update rules the moment a new record is saved, and that happens WITHOUT ngOnChanges firing\n // — the Record input is the same object, only its state changed. A plain memo would keep\n // answering with the create-time verb for the rest of the form's life.\n const isSaved = this.Record?.IsSaved === true;\n if (this._isWritableByUser === undefined || this._isWritableForSavedState !== isSaved) {\n this._isWritableByUser = this.computeIsFieldWritableByUser();\n this._isWritableForSavedState = isSaved;\n }\n return this._isWritableByUser;\n }\n\n private computeIsFieldWritableByUser(): boolean {\n const entityInfo = this.Record?.EntityInfo;\n if (!entityInfo?.EnableFieldLevelSecurity) {\n return true; // one boolean for the overwhelming majority of entities\n }\n const user = this.ProviderToUse?.CurrentUser;\n if (!user || !this.FieldName) {\n return true; // fail open, matching the read gate\n }\n return this.Record?.IsSaved\n ? entityInfo.IsFieldUpdatableByUser(this.FieldName, user)\n : entityInfo.IsFieldCreatableByUser(this.FieldName, user);\n }\n\n /** Whether this field has been modified (dirty). Only shown for saved records (not new). */\n get IsDirty(): boolean {\n if (!this.Record || !this.Record.IsSaved) return false;\n const field = this.Record.Fields?.find(f => f.Name === this.FieldName);\n return field?.Dirty ?? false;\n }\n\n /** Whether this field is required (not nullable) */\n get IsRequired(): boolean {\n return this.FieldInfo?.AllowsNull === false;\n }\n\n /** Whether this is a required field that is currently empty (for validation styling) */\n get IsRequiredEmpty(): boolean {\n // Defer to the validation system when it has active errors for this field\n if (this.ShowErrors) return false;\n if (!this.IsRequired || !this.EditMode) return false;\n const val = this.Value;\n return val === null || val === undefined || val === '';\n }\n\n // ---- INLINE VALIDATION ----\n\n /** Whether the user has interacted with (changed) this field */\n private _touched = false;\n\n /**\n * `FormContext.validationRevision` as it stood when the user last edited this field. Compared with\n * the current revision in {@link FieldErrors}: equal means the edit came AFTER the last failed\n * save, so the user is addressing it and live local validation is the truth; lower means the\n * failure is newer than the edit, so the form-level errors must win.\n */\n private _touchedAtRevision = 0;\n\n /** Set when an image upload is rejected (type/size) — shown with field validation. */\n private imageUploadError: string | null = null;\n\n /** Locally computed validation errors for this field */\n private _fieldErrors: ValidationErrorInfo[] = [];\n\n /**\n * The ONE way a user interaction marks this field touched: every site must also stamp the\n * revision, or a field touched after a failed save would keep showing the stale form-level error.\n */\n private markTouched(): void {\n this._touched = true;\n this._touchedAtRevision = this.FormContext?.validationRevision ?? 0;\n }\n\n /**\n * True when the user has edited this field since the form last published validation errors.\n *\n * Plain `_touched` was the wrong test: it stayed true from the moment the user typed, so after a\n * failed save the field returned its own — necessarily local, synchronous — validation, and an\n * error the SERVER had just reported for that very field (a `ValidateAsync()` refusal, which the\n * client cannot compute) never showed on the one field the user had just been in.\n */\n private get editedSinceLastValidationFailure(): boolean {\n return this._touched && this._touchedAtRevision === (this.FormContext?.validationRevision ?? 0);\n }\n\n /** Validation errors for this field from the best available source */\n get FieldErrors(): ValidationErrorInfo[] {\n // Edited after the last failure: fresh local validation (real-time feedback, and how a\n // server-reported error clears — a later valid edit yields no local errors).\n if (this.editedSinceLastValidationFailure) {\n return this._fieldErrors;\n }\n // Otherwise the form-level errors from the failed save — whether this field was never touched,\n // or was touched before the save that failed.\n const contextErrors = this.FormContext?.validationErrors;\n if (contextErrors && contextErrors.length > 0) {\n return contextErrors.filter(e => e.Source === this.FieldName);\n }\n return [];\n }\n\n /** Whether to show validation messages (touched OR form-level showValidation) */\n get ShowValidation(): boolean {\n if (!this.EditMode || this.IsFieldReadOnly) return false;\n return this._touched || (this.FormContext?.showValidation === true);\n }\n\n /** Whether this field has active error-level validation failures to display */\n get ShowErrors(): boolean {\n if (this.imageUploadError) return true;\n return this.ShowValidation && this.FieldErrors.some(e => e.Type === 'Failure');\n }\n\n /** Whether this field has active warning-level validation issues to display */\n get ShowWarnings(): boolean {\n return this.ShowValidation && !this.ShowErrors && this.FieldErrors.some(e => e.Type === 'Warning');\n }\n\n /** Error messages to render in the template */\n get DisplayErrors(): ValidationErrorInfo[] {\n const errors = this.ShowValidation\n ? this.FieldErrors.filter(e => e.Type === 'Failure')\n : [];\n if (this.imageUploadError) {\n return [\n ...errors,\n new ValidationErrorInfo(this.FieldName, this.imageUploadError, this.Value),\n ];\n }\n return errors;\n }\n\n /** Warning messages to render in the template */\n get DisplayWarnings(): ValidationErrorInfo[] {\n if (!this.ShowValidation) return [];\n return this.FieldErrors.filter(e => e.Type === 'Warning');\n }\n\n /**\n * Runs validation for this field using the full Record.Validate() method.\n * This captures both built-in field checks and custom Validate() overrides\n * (including cross-field rules). Results are filtered to this field only.\n */\n private runFieldValidation(): void {\n if (!this.Record || !this.EditMode) {\n this._fieldErrors = [];\n return;\n }\n try {\n const result = this.Record.Validate();\n this._fieldErrors = result.Errors.filter(e => e.Source === this.FieldName);\n } catch {\n this._fieldErrors = [];\n }\n this.cdr.markForCheck();\n }\n\n /** Whether this field should be hidden (empty in read-only mode) */\n get ShouldHideField(): boolean {\n // A read-denied field is always hidden. This must run before Value is touched: the\n // template's own @if guards rendering behind IsFieldReadableByUser, but programmatic\n // callers (MjCollapsiblePanelComponent.hasRenderableContent sweeps ShouldHideField to\n // decide section visibility) reach this getter directly, and BaseEntity.Get() THROWS for\n // a denied field. Returning true here is also what lets a section whose fields are all\n // denied collapse away instead of rendering an empty card.\n if (!this.IsFieldReadableByUser) return true;\n if (this.EditMode) return false;\n if (!this.HideWhenEmptyInReadOnlyMode) return false;\n if (this.FormContext?.showEmptyFields) return false;\n const val = this.Value;\n return val === null || val === undefined || val === '';\n }\n\n /** Possible values for select/autocomplete from entity metadata or override */\n get PossibleValues(): string[] {\n if (this.PossibleValuesOverride) return this.PossibleValuesOverride;\n const values = this.FieldInfo?.EntityFieldValues;\n if (values && values.length > 0) {\n return values.map(v => v.Value);\n }\n return [];\n }\n\n /** Whether this field has a related entity (foreign key) */\n get HasRelatedEntity(): boolean {\n const re = this.FieldInfo?.RelatedEntity;\n return re != null && re.length > 0;\n }\n\n /**\n * For FK fields, returns the human-readable name to display instead of the raw ID.\n *\n * Resolution order:\n * 1. If `RelatedEntityNameFieldMap` exists, read the name from the joined field on the record (sync).\n * 2. Otherwise, fall back to an async `GetEntityRecordName` lookup (result cached in `_resolvedFKName`).\n */\n get FKDisplayName(): string | null {\n if (!this.Record || !this.HasRelatedEntity) return null;\n\n // If the FK value itself is null/empty, there's nothing to display\n // (the joined name field may still hold a stale cached value from the view)\n const fkValue = this.Value;\n if (fkValue == null || fkValue === '') return null;\n\n // Fast path: name field is joined into our record's view.\n //\n // The joined display column is a SEPARATE EntityField from the FK it accompanies, and can be\n // denied independently — CompanyID readable while Company is not. `IsFieldReadableByUser`\n // gates this component on its OWN field name, so it does not cover this read; without the\n // check here, Get() throws and takes out the form. Falling through to the async lookup is\n // right: that path reads the related record, which has its own permissions.\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap && this.Record.EntityInfo?.IsFieldReadableByUser(nameFieldMap, this.ProviderToUse?.CurrentUser)) {\n const val = this.Record.Get(nameFieldMap);\n if (val != null && val !== '') return String(val);\n }\n\n // Async fallback: resolved via GetEntityRecordName\n if (this._resolvedFKName !== undefined) {\n return this._resolvedFKName;\n }\n\n // Kick off async resolution if not already in flight\n this.resolveFKNameAsync();\n return null; // will render once resolved\n }\n\n /**\n * Whether this FK field should display the related entity name\n * with a hyperlink instead of the raw ID value.\n */\n get IsFKWithNameField(): boolean {\n return this.HasRelatedEntity && this.FKDisplayName != null;\n }\n\n // ---- Async FK name resolution ----\n\n /** Cached result from GetEntityRecordName. undefined = not yet resolved. */\n private _resolvedFKName: string | null | undefined = undefined;\n\n /** Tracks which FK value we resolved so we can invalidate on record change */\n private _resolvedFKValue: unknown = undefined;\n\n /** Whether an async lookup is in flight */\n private _fkNameLoading = false;\n\n /**\n * Asynchronously resolves the display name for an FK field that lacks\n * a RelatedEntityNameFieldMap by calling Metadata.GetEntityRecordName.\n */\n private resolveFKNameAsync(): void {\n if (this._fkNameLoading) return;\n\n const fkValue = this.Value;\n if (fkValue == null || fkValue === '') return;\n\n const fieldInfo = this.FieldInfo;\n if (!fieldInfo?.RelatedEntity || !fieldInfo?.RelatedEntityFieldName) return;\n\n this._fkNameLoading = true;\n this._resolvedFKValue = fkValue;\n\n const pk = new CompositeKey([{\n FieldName: fieldInfo.RelatedEntityFieldName,\n Value: fkValue\n }]);\n\n const md = this.ProviderToUse;\n md.GetEntityRecordName(fieldInfo.RelatedEntity, pk)\n .then(name => {\n this._resolvedFKName = name || null;\n this._fkNameLoading = false;\n this.cdr.markForCheck();\n })\n .catch(() => {\n this._resolvedFKName = null;\n this._fkNameLoading = false;\n });\n }\n\n // ============================================\n // DROPDOWN POSITIONING (shared by FK, value list, select)\n // ============================================\n\n /** Calculated position for fixed-position dropdowns */\n DropdownTop = 0;\n DropdownLeft = 0;\n /** Computed: dropdown is at least the trigger width, at most {@link DropdownMaxWidth}. */\n DropdownMinWidth = 0;\n DropdownMaxWidth = 0;\n OpenAbove = false;\n\n /**\n * Max width (px) of the FK suggestion dropdown. The panel grows to fit its\n * columns up to this cap (then scrolls horizontally). When null, defaults to\n * 2× the trigger width so multi-column rows aren't cramped by a narrow field.\n * Always additionally bounded by the viewport's right edge.\n */\n @Input() FKDropdownMaxWidth: number | null = null;\n\n /**\n * Whether to highlight the typed query substring within each suggestion's name\n * in the FK dropdown. On by default — uses the muted, theme-aware\n * `--mj-status-warning` highlight (not the old bright yellow). Set false for\n * plain, un-marked names.\n */\n @Input() FKHighlightMatches = true;\n\n /**\n * Whether to offer inline \"create new\" for the related record when the one you need\n * isn't found. The affordance only renders when this is true AND the current user can\n * create records of the related entity (entity allows creation + role permits it).\n */\n @Input() AllowFKCreate = true;\n\n /** Surface used for the inline create form: a modal dialog (default) or a slide-in. */\n @Input() FKCreatePresentation: 'dialog' | 'slide-in' = 'dialog';\n\n /** Cleanup function for scroll/resize listeners */\n private _scrollCleanup: (() => void) | null = null;\n\n /** Inline style for the fixed-position dropdown */\n get DropdownPositionStyle(): Record<string, string> {\n // min-width floors at the trigger width; max-width caps growth; the auto\n // intrinsic width then shrink-to-fits the columns between the two, and\n // `.mj-fk-options` scrolls horizontally once content exceeds the cap.\n const sizing = {\n 'min-width': this.DropdownMinWidth + 'px',\n 'max-width': this.DropdownMaxWidth + 'px',\n 'width': 'max-content',\n };\n if (this.OpenAbove) {\n return {\n 'position': 'fixed',\n 'bottom': (window.innerHeight - this.DropdownTop) + 'px',\n 'top': 'auto',\n 'left': this.DropdownLeft + 'px',\n ...sizing,\n 'z-index': '10000'\n };\n }\n return {\n 'position': 'fixed',\n 'top': this.DropdownTop + 'px',\n 'bottom': 'auto',\n 'left': this.DropdownLeft + 'px',\n ...sizing,\n 'z-index': '10000'\n };\n }\n\n /** Calculate dropdown position relative to viewport from anchor element */\n private updateDropdownPosition(anchorEl: HTMLElement): void {\n const rect = anchorEl.getBoundingClientRect();\n const dropdownMaxHeight = 240;\n const gap = 4;\n const spaceBelow = window.innerHeight - rect.bottom;\n const spaceAbove = rect.top;\n\n if (spaceBelow < dropdownMaxHeight && spaceAbove > spaceBelow) {\n this.OpenAbove = true;\n this.DropdownTop = rect.top - gap;\n } else {\n this.OpenAbove = false;\n this.DropdownTop = rect.bottom + gap;\n }\n this.DropdownLeft = rect.left;\n // At least the trigger width; up to FKDropdownMaxWidth (default 2×), but never\n // past the viewport's right edge. Content fills between min and max; overflow\n // scrolls horizontally.\n this.DropdownMinWidth = rect.width;\n const desiredMax = this.FKDropdownMaxWidth ?? rect.width * 2;\n this.DropdownMaxWidth = Math.max(rect.width, Math.min(desiredMax, window.innerWidth - rect.left - 8));\n }\n\n // ---- Dropdown portal (escape transformed ancestors) ----\n\n /**\n * The dropdown is `position: fixed` with viewport coords. Inside the slide-in /\n * dialog overlays (which use CSS `transform`), a `fixed` descendant is positioned\n * relative to the transformed ancestor instead of the viewport, so it renders\n * off-screen. Re-parenting the dropdown element to `document.body` removes it from\n * any transformed containing block, restoring true viewport-fixed positioning.\n *\n * Call after change detection has rendered the dropdown (microtask). Angular still\n * owns the node — when the structural `@if` tears it down it removes the node by\n * reference regardless of where it currently lives, so no manual cleanup is needed\n * beyond clearing our tracking pointer.\n */\n private portalDropdownToBody(): void {\n // Already portaled and still in the DOM → nothing to do (e.g. typing while open).\n if (this._portaledDropdownEl?.isConnected) return;\n\n // The dropdown is rendered by `@if (ShowFKDropdown)`. On the synchronous cached\n // path (focus → searchCachedEntity → applySuggestions) the element may not be in\n // the DOM yet when we first look, so retry across a few frames until it renders.\n // (The async DB path lands here post-render, so it succeeds on the first try.)\n const tryPortal = (retriesLeft: number): void => {\n const host = this.hostRef?.nativeElement;\n if (!host) return;\n const dropdown = host.querySelector('.mj-fk-dropdown') as HTMLElement | null;\n if (dropdown) {\n if (dropdown.parentElement !== document.body) {\n this.renderer.appendChild(document.body, dropdown);\n this._portaledDropdownEl = dropdown;\n }\n } else if (retriesLeft > 0) {\n setTimeout(() => tryPortal(retriesLeft - 1), 0);\n }\n };\n Promise.resolve().then(() => tryPortal(5));\n }\n\n /** Tracks a dropdown element we relocated to body so we can drop the reference on close. */\n private _portaledDropdownEl: HTMLElement | null = null;\n\n /** Start listening for scroll/resize to close dropdowns */\n private startScrollListener(): void {\n this.stopScrollListener();\n\n const onScroll = (e: Event) => {\n // Scrolling WITHIN the dropdown (vertical list or horizontal column scroll)\n // must not close it — only an ancestor/page scroll, which would detach the\n // fixed-position panel from its trigger, should.\n const target = e.target as Node | null;\n if (this._portaledDropdownEl && target && this._portaledDropdownEl.contains(target)) return;\n this.closeAllDropdowns();\n this.cdr.markForCheck();\n };\n const onResize = () => {\n this.closeAllDropdowns();\n this.cdr.markForCheck();\n };\n\n document.addEventListener('scroll', onScroll, true); // capture phase catches all scrollable ancestors\n window.addEventListener('resize', onResize);\n\n this._scrollCleanup = () => {\n document.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n };\n }\n\n /** Remove scroll/resize listeners */\n private stopScrollListener(): void {\n if (this._scrollCleanup) {\n this._scrollCleanup();\n this._scrollCleanup = null;\n }\n }\n\n /** Close all dropdown types */\n private closeAllDropdowns(): void {\n this.ShowFKDropdown = false;\n this.FKActiveIndex = -1;\n this.FKLoading = false;\n this.FKNoMatches = false;\n this._portaledDropdownEl = null;\n this.ShowValueListDropdown = false;\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n }\n\n // ============================================\n // FK AUTOCOMPLETE (custom implementation)\n // ============================================\n\n /** Max rows shown on an empty-input focus-show (cached fast path only). */\n private static readonly FK_FOCUS_SHOW_LIMIT = 50;\n\n /** Max rows returned from a DB search. */\n private static readonly FK_DB_SEARCH_LIMIT = 20;\n\n /** Suggestions returned from the FK entity search */\n FKSuggestions: FKSuggestion[] = [];\n\n /**\n * The currently-linked record, pinned as a sticky \"Currently selected\" section at the\n * top of the dropdown (browse mode only). Null when there's no selection or the user is\n * actively filtering. Removed from {@link FKSuggestions} so it isn't listed twice.\n */\n FKSelectedSuggestion: FKSuggestion | null = null;\n\n /** Whether the current FK value is a confirmed match (user selected from dropdown) */\n FKIsMatched = false;\n\n /** Whether the FK dropdown is visible */\n ShowFKDropdown = false;\n\n /** Whether a DB search is currently in flight (drives the loading indicator). */\n FKLoading = false;\n\n /** True when a search completed with zero results (drives the \"No matches\" row). */\n FKNoMatches = false;\n\n /** Index of the keyboard-highlighted active suggestion (-1 = none). */\n FKActiveIndex = -1;\n\n /** Headers for the extra (DefaultInView) columns shown in the dropdown. */\n FKColumnHeaders: string[] = [];\n\n /** Field code names for the extra columns, index-aligned with {@link FKColumnHeaders}. */\n FKColumnFields: string[] = [];\n\n /** Code name of the name column (used as its sort key). */\n FKNameField = '';\n\n /** Whether rows render a leading icon column (drives the header's empty icon cell). */\n FKHasIconColumn = false;\n\n /** Active sort column (field code name), or null for natural (unsorted) order. */\n FKSortField: string | null = null;\n\n /** Active sort direction; only meaningful when {@link FKSortField} is set. */\n FKSortDir: 'asc' | 'desc' = 'asc';\n\n /** Unsorted snapshot of the current suggestions, used to restore natural order. */\n private _fkSuggestionsNatural: FKSuggestion[] = [];\n\n /** Text the user is currently typing in the FK search input. null = use display name. */\n private _fkInputText: string | null = null;\n\n /**\n * The active search query that produced the current results — `''` on a focus/clear\n * browse (full list), the typed text when filtering. Distinct from {@link _fkInputText},\n * which holds the *displayed* text (the selected record's name when not typing). This is\n * the correct signal for \"browse mode\" and for the create-footer label.\n */\n private _fkQuery = '';\n\n /** Debounce timer for FK search */\n private _fkSearchTimeout: ReturnType<typeof setTimeout> | null = null;\n\n /** Last known FK input element for position recalculation */\n private _lastFKInputEl: HTMLElement | null = null;\n\n /** Monotonic token so a slow DB response from a stale query can't clobber a newer one. */\n private _fkSearchSeq = 0;\n\n /** Cached column plan for the current related entity (rebuilt on demand). */\n private _fkColumnPlan: FKColumnPlan | null = null;\n\n // ---- Scope / search-field picker (Option B) ----\n\n /** Related-entity field code name currently searched against (defaults to the name field). */\n FKSearchField = '';\n\n /** Friendly label of {@link FKSearchField}, shown on the scope pill. */\n FKSearchFieldLabel = '';\n\n /** Whether the scope-picker menu is open. */\n FKShowScopeMenu = false;\n\n /** Whether the FK input is focused — the scope pill only appears while focused. */\n FKFocused = false;\n\n /** Fields the user can scope the search to (name + shown columns + other fields). */\n FKSearchableFields: FKSearchableField[] = [];\n\n // ---- Per-user persisted prefs (scope / sort / column widths) ----\n\n /** User-resized column widths in px, keyed by related-entity field code name. */\n private _fkColWidths: Record<string, number> = {};\n\n /** The (host entity|field) pref key currently loaded; reload when it changes. */\n private _fkPrefKey: string | null = null;\n\n /** Active column-resize drag, or null when not resizing. */\n private _fkResize: { field: string; startX: number; startWidth: number } | null = null;\n private _fkResizeMove: ((e: MouseEvent) => void) | null = null;\n private _fkResizeUp: (() => void) | null = null;\n\n /** The display text shown in the FK search input */\n get FKSearchText(): string {\n if (this._fkInputText !== null) return this._fkInputText;\n return this.FKDisplayName || '';\n }\n\n /**\n * True when this FK currently points at a real record (has a value AND we can show\n * its name). Drives the \"linked\" affordance — the chain icon + accent — so the user\n * can tell at a glance this is a resolved link, not free text.\n */\n get FKHasLinkedValue(): boolean {\n return this.Value != null && this.Value !== '' && this.FKDisplayName != null;\n }\n\n /** Whether a dropdown row is the record currently linked by this FK (UUID-safe compare). */\n IsFKRowSelected(suggestion: FKSuggestion): boolean {\n const v = this.Value;\n const pk = suggestion.PrimaryKeyValue;\n if (v == null || pk == null) return false;\n return UUIDsEqual(String(v), String(pk));\n }\n\n /**\n * Resolves the related `EntityInfo` for this FK field via the instance provider\n * (multi-provider safe — never the global `Metadata`).\n */\n private getRelatedEntityInfo(): EntityInfo | undefined {\n const relatedName = this.FieldInfo?.RelatedEntity;\n if (!relatedName) return undefined;\n return this.ProviderToUse.EntityByName(relatedName);\n }\n\n /**\n * Returns the LIVE cached array of records for the related entity IF a loaded\n * engine holds the full (unfiltered) set; otherwise null. Records are read-only —\n * never mutate. Wraps {@link BaseEngineRegistry.TryGetCachedRecords}.\n */\n private getCachedRecordsForRelatedEntity(): BaseEntity[] | null {\n const relatedName = this.FieldInfo?.RelatedEntity;\n if (!relatedName) return null;\n const registry = BaseEngineRegistry.Instance;\n const records = registry.TryGetCachedRecords<BaseEntity>(relatedName, { unfilteredOnly: true });\n // Treat an empty (or absent) cache as \"no usable cache\" so callers fall through\n // to the DB path and still show options on focus — never a blank dropdown.\n return records && records.length > 0 ? records : null;\n }\n\n /**\n * Builds (and memoizes) the column plan for the related entity: the name field,\n * the PK field used as the FK value, and the extra `DefaultInView` columns\n * (excluding the name + PK). Returns null when the related entity can't be resolved\n * or has no usable name/PK.\n */\n private buildColumnPlan(): FKColumnPlan | null {\n if (this._fkColumnPlan) {\n this.ensureLinkedFieldPrefsLoaded(this._fkColumnPlan);\n return this._fkColumnPlan;\n }\n\n const relatedEntity = this.getRelatedEntityInfo();\n if (!relatedEntity) return null;\n\n const pkFields = relatedEntity.PrimaryKeys;\n // Field-level security applies to the RELATED entity here, not this record's. A name field\n // the user cannot read would throw from every downstream Get() — so drop to the primary key,\n // which is unrestrictable by construction. This plan is the single chokepoint for every\n // related-record read the FK control makes (dropdown rows, search, create-and-select), so\n // filtering here is what keeps those safe rather than four separate guards.\n const user = this.ProviderToUse?.CurrentUser;\n const nameField = relatedEntity.NameField && relatedEntity.IsFieldReadableByUser(relatedEntity.NameField.Name, user)\n ? relatedEntity.NameField\n : null;\n if (!nameField && (!pkFields || pkFields.length !== 1)) return null;\n\n const nameFieldName = nameField ? nameField.Name : pkFields[0].Name;\n const pkFieldName = this.FieldInfo?.RelatedEntityFieldName || (pkFields?.[0]?.Name ?? 'ID');\n\n // A field flagged ExtendedType='Icon' holds a per-row icon class — render it\n // as the row's leading glyph, not as a text column.\n const iconField = relatedEntity.Fields.find(f => f.ExtendedType === 'Icon' && relatedEntity.IsFieldReadableByUser(f.Name, user));\n const iconFieldName = iconField?.Name ?? null;\n\n const columnFields = this.computeOrderedColumns(relatedEntity, nameFieldName, pkFieldName, iconFieldName)\n .filter(c => relatedEntity.IsFieldReadableByUser(c, user));\n const extraFieldNames = columnFields.filter(c => c !== nameFieldName);\n\n this._fkColumnPlan = {\n NameFieldName: nameFieldName,\n PkFieldName: pkFieldName,\n ColumnFields: columnFields,\n ExtraFieldNames: extraFieldNames,\n ExtraHeaders: extraFieldNames.map(n => this.labelForRelatedField(n)),\n IconFieldName: iconFieldName,\n EntityIcon: relatedEntity.Icon || null\n };\n this.FKSearchableFields = this.buildSearchableFields(this._fkColumnPlan);\n this.ensureLinkedFieldPrefsLoaded(this._fkColumnPlan);\n return this._fkColumnPlan;\n }\n\n /**\n * Whether a `DefaultInView` field is worth showing as an extra dropdown column.\n * Excludes columns that read as opaque noise to a human picking a record:\n * • Primary keys (UUIDs/identities).\n * • Foreign-key columns — these hold the related record's raw ID (e.g. `ParentID`\n * → a GUID), not a human-readable label. The view's joined *name* field (if it's\n * itself `DefaultInView`) is the readable substitute and is kept.\n */\n private isUsefulExtraColumn(f: EntityFieldInfo): boolean {\n if (f.IsPrimaryKey) return false;\n if (f.RelatedEntityID && f.RelatedEntityID.length > 0) return false; // foreign key → raw ID\n return true;\n }\n\n /**\n * The ordered list of display columns INCLUDING the name field — the user-reorderable\n * column order. Honors a user `visibleFields` override (exact set + order, letting them\n * add fields like ID, drop defaults, or move the name field); otherwise falls back to\n * `[name, ...DefaultInView columns]`. The name field is always guaranteed present, and\n * the icon field is never a text column.\n */\n private computeOrderedColumns(\n relatedEntity: EntityInfo, nameFieldName: string, pkFieldName: string, iconFieldName: string | null\n ): string[] {\n const exists = (n: string) => n !== iconFieldName && !!relatedEntity.Fields.find(f => f.Name === n);\n\n const saved = this.fkHostEntityName && this.fkFieldCodeName\n ? LinkedFieldOptionsStore.Instance.Get(this.fkHostEntityName, this.fkFieldCodeName) : undefined;\n\n let cols: string[];\n if (saved?.visibleFields) {\n cols = saved.visibleFields.filter(exists);\n // Migrate older prefs (stored extras-only, without the name field) and guarantee\n // the name field is always present.\n if (!cols.includes(nameFieldName)) cols = [nameFieldName, ...cols];\n } else {\n const defaults = relatedEntity.Fields\n .filter(f => f.DefaultInView && f.Name !== nameFieldName && f.Name !== pkFieldName\n && f.Name !== iconFieldName && this.isUsefulExtraColumn(f))\n .map(f => f.Name);\n cols = [nameFieldName, ...defaults];\n }\n\n // De-dupe (preserve order) and ensure the name field is present.\n const seen = new Set<string>();\n const ordered = cols.filter(c => (seen.has(c) ? false : (seen.add(c), true)));\n if (!ordered.includes(nameFieldName)) ordered.unshift(nameFieldName);\n return ordered;\n }\n\n // ============================================\n // SCOPE PICKER + PER-USER PREFS\n // ============================================\n\n /** Host entity name (the entity whose form this field belongs to), or null. */\n private get fkHostEntityName(): string | null {\n return this.Record?.EntityInfo?.Name ?? null;\n }\n\n /** This FK field's code name on the host entity, or null. */\n private get fkFieldCodeName(): string | null {\n return this.FieldInfo?.Name ?? null;\n }\n\n /** Whether the active search column is the name field (drives where we highlight). */\n private isSearchingNameField(plan: FKColumnPlan): boolean {\n return !this.FKSearchField || this.FKSearchField === plan.NameFieldName;\n }\n\n /** A field is scope-searchable if it's a string column (LIKE-able) and not a system column. */\n private isScopeSearchableField(f: EntityFieldInfo): boolean {\n if (f.TSType !== EntityFieldTSType.String) return false;\n if (f.Name.startsWith('__mj_')) return false;\n return true;\n }\n\n /** Friendly label for a related-entity field code name. */\n private labelForRelatedField(name: string): string {\n return this.getRelatedEntityInfo()?.Fields.find(x => x.Name === name)?.DisplayNameOrName ?? name;\n }\n\n /** Whether a field code name exists on the related entity (guards stale saved prefs). */\n private isValidRelatedField(name: string): boolean {\n return !!this.getRelatedEntityInfo()?.Fields.find(x => x.Name === name);\n }\n\n /**\n * Build the scope-picker field list: the name + shown columns ('shown' group),\n * then any other searchable string fields like ID/Status ('other' group).\n */\n private buildSearchableFields(plan: FKColumnPlan): FKSearchableField[] {\n const re = this.getRelatedEntityInfo();\n if (!re) return [];\n const iconFor = (fieldName: string) => {\n if (fieldName === plan.NameFieldName) return 'fa-solid fa-font';\n return re.Fields.find(x => x.Name === fieldName)?.IsPrimaryKey ? 'fa-solid fa-hashtag' : 'fa-solid fa-tag';\n };\n // 'shown' group rendered in the actual column order so the menu matches the grid\n // (and so the up/down arrows hide correctly on the true first/last columns).\n const shown = new Set(plan.ColumnFields);\n const list: FKSearchableField[] = plan.ColumnFields.map(fieldName => ({\n FieldName: fieldName,\n Label: this.labelForRelatedField(fieldName),\n Icon: iconFor(fieldName),\n Group: 'shown' as const\n }));\n for (const f of re.Fields) {\n if (shown.has(f.Name) || f.Name === plan.IconFieldName) continue;\n if (!this.isScopeSearchableField(f)) continue;\n list.push({\n FieldName: f.Name,\n Label: f.DisplayNameOrName,\n Icon: f.IsPrimaryKey ? 'fa-solid fa-hashtag' : 'fa-solid fa-font',\n Group: 'other'\n });\n }\n return list;\n }\n\n /**\n * Load this (host entity, FK field)'s saved prefs — search scope, sort, column\n * widths — once per field. No-ops when the field hasn't changed. Falls back to\n * defaults (search the name field, natural sort, content-sized columns) and only\n * applies a saved value when it still resolves to a real field.\n */\n private ensureLinkedFieldPrefsLoaded(plan: FKColumnPlan): void {\n const key = this.fkHostEntityName && this.fkFieldCodeName\n ? `${this.fkHostEntityName}|${this.fkFieldCodeName}` : null;\n if (key === this._fkPrefKey) return;\n this._fkPrefKey = key;\n\n // Defaults\n this.FKSearchField = plan.NameFieldName;\n this._fkColWidths = {};\n\n const saved = this.fkHostEntityName && this.fkFieldCodeName\n ? LinkedFieldOptionsStore.Instance.Get(this.fkHostEntityName, this.fkFieldCodeName) : undefined;\n if (saved) {\n if (saved.searchField && this.isValidRelatedField(saved.searchField)) {\n this.FKSearchField = saved.searchField;\n }\n if (saved.sortField !== undefined && (saved.sortField === null || this.isValidRelatedField(saved.sortField))) {\n this.FKSortField = saved.sortField;\n this.FKSortDir = saved.sortDir ?? 'asc';\n }\n if (saved.colWidths) this._fkColWidths = { ...saved.colWidths };\n }\n this.FKSearchFieldLabel = this.labelForRelatedField(this.FKSearchField);\n }\n\n /** Format a raw cell value for display in the dropdown (delegates to the pure helper). */\n private formatCell(val: unknown): string {\n return FormatFKCell(val);\n }\n\n /**\n * Build the suggestion view-models from a set of plain rows (cached or DB),\n * applying the typed-query substring highlight to the name column.\n * `getField` abstracts cached BaseEntity rows (`.Get(name)`) vs simple objects.\n */\n private buildSuggestions(\n rows: ReadonlyArray<{ get: (field: string) => unknown }>,\n plan: FKColumnPlan,\n query: string\n ): FKSuggestion[] {\n const searchField = this.FKSearchField || plan.NameFieldName;\n // Only highlight the column actually being searched, and only when enabled.\n const nameQuery = (this.FKHighlightMatches && this.isSearchingNameField(plan)) ? query : '';\n return rows.map(row => {\n const name = this.formatCell(row.get(plan.NameFieldName));\n // Per-row icon from the entity's ExtendedType='Icon' field; else the\n // entity-level icon; else none.\n const rowIcon = plan.IconFieldName ? this.formatCell(row.get(plan.IconFieldName)).trim() : '';\n return {\n PrimaryKeyValue: row.get(plan.PkFieldName),\n DisplayName: name,\n // Empty query yields the (still HTML-escaped) plain name — no marks.\n HighlightedName: HighlightSearchMatches(name, nameQuery, 'mj-forms-search-highlight'),\n ExtraColumns: plan.ExtraFieldNames.map((fieldName, i) => {\n const value = this.formatCell(row.get(fieldName));\n const colQuery = (this.FKHighlightMatches && fieldName === searchField) ? query : '';\n return {\n FieldName: fieldName,\n Header: plan.ExtraHeaders[i],\n Value: value,\n HighlightedValue: HighlightSearchMatches(value, colQuery, 'mj-forms-search-highlight')\n };\n }),\n Icon: (rowIcon || plan.EntityIcon) || null\n };\n });\n }\n\n /** Apply a freshly-built suggestion list to the dropdown state + reposition + portal. */\n private applySuggestions(suggestions: FKSuggestion[], plan: FKColumnPlan): void {\n // Pinned \"currently selected\" row: in browse mode (empty query) with a valid linked\n // value, lift the selected record into a sticky section and remove it from the list so\n // the user can keep it or pick another without clearing first.\n this.FKSelectedSuggestion = null;\n const browseMode = this._fkQuery.trim().length === 0;\n if (browseMode && this.FKHasLinkedValue) {\n const idx = suggestions.findIndex(s => this.IsFKRowSelected(s));\n if (idx >= 0) {\n this.FKSelectedSuggestion = suggestions[idx];\n suggestions = suggestions.filter((_, i) => i !== idx);\n } else {\n // Selected record isn't in the (first-N) result — show a lightweight pinned row.\n this.FKSelectedSuggestion = this.buildSelectedFallbackSuggestion(plan);\n }\n }\n\n this._fkSuggestionsNatural = suggestions;\n this.FKNameField = plan.NameFieldName;\n // Full ordered column list (incl. the name field) + matching headers.\n this.FKColumnFields = plan.ColumnFields;\n this.FKColumnHeaders = plan.ColumnFields.map(c => c === plan.NameFieldName ? 'Name' : this.labelForRelatedField(c));\n this.FKHasIconColumn = (this.FKSelectedSuggestion?.Icon != null) || suggestions.some(s => s.Icon != null);\n this.FKSuggestions = this.sortSuggestions(suggestions);\n this.FKActiveIndex = this.FKSuggestions.length > 0 ? 0 : -1;\n this.FKNoMatches = suggestions.length === 0 && !this.FKSelectedSuggestion;\n\n // Show the dropdown for rows, a \"no matches\" state, or just the pinned selection.\n this.ShowFKDropdown = suggestions.length > 0 || this.FKNoMatches || !!this.FKSelectedSuggestion;\n if (this.ShowFKDropdown && this._lastFKInputEl) {\n this.updateDropdownPosition(this._lastFKInputEl);\n this.startScrollListener();\n this.portalDropdownToBody();\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Build a lightweight pinned row for the selected record when it isn't present in the\n * current result set (DB beyond first-N, or cached beyond the focus-show limit). We have\n * its display name from the FK name resolution; extra-column values are left blank.\n */\n private buildSelectedFallbackSuggestion(plan: FKColumnPlan): FKSuggestion | null {\n const name = this.FKDisplayName;\n if (this.Value == null || this.Value === '' || !name) return null;\n return {\n PrimaryKeyValue: this.Value,\n DisplayName: name,\n HighlightedName: HighlightSearchMatches(name, '', 'mj-forms-search-highlight'),\n ExtraColumns: plan.ExtraFieldNames.map((fn, i) => ({\n FieldName: fn, Header: plan.ExtraHeaders[i], Value: '', HighlightedValue: ''\n })),\n Icon: plan.EntityIcon ?? null\n };\n }\n\n /**\n * Returns a sorted copy of the suggestions per the active sort column/direction.\n * Null sort field → natural order (original array, untouched). Sorts on the name\n * column's `DisplayName` or the matching extra column's formatted `Value`,\n * case-insensitively.\n */\n private sortSuggestions(suggestions: FKSuggestion[]): FKSuggestion[] {\n const field = this.FKSortField;\n if (!field) return suggestions;\n const keyOf = (s: FKSuggestion): string => {\n if (field === this.FKNameField) return s.DisplayName ?? '';\n return s.ExtraColumns.find(c => c.FieldName === field)?.Value ?? '';\n };\n const dir = this.FKSortDir === 'desc' ? -1 : 1;\n return [...suggestions].sort((a, b) =>\n dir * keyOf(a).localeCompare(keyOf(b), undefined, { numeric: true, sensitivity: 'base' })\n );\n }\n\n /**\n * Toggle the sort on a column header: same column cycles asc → desc → none;\n * a new column starts at asc. Re-derives the visible list from the natural snapshot.\n */\n OnFKSortToggle(fieldName: string): void {\n if (this.FKSortField === fieldName) {\n if (this.FKSortDir === 'asc') this.FKSortDir = 'desc';\n else { this.FKSortField = null; this.FKSortDir = 'asc'; } // desc → cleared\n } else {\n this.FKSortField = fieldName;\n this.FKSortDir = 'asc';\n }\n this.FKSuggestions = this.sortSuggestions(this._fkSuggestionsNatural);\n this.FKActiveIndex = this.FKSuggestions.length > 0 ? 0 : -1;\n this.persistLinkedFieldSort();\n this.cdr.markForCheck();\n }\n\n /** Persist the active sort for this (host entity, FK field) pair. */\n private persistLinkedFieldSort(): void {\n if (this.fkHostEntityName && this.fkFieldCodeName) {\n LinkedFieldOptionsStore.Instance.SetSort(\n this.fkHostEntityName, this.fkFieldCodeName, this.FKSortField, this.FKSortDir\n );\n }\n }\n\n /** FontAwesome class for a column header's sort indicator (idle / asc / desc). */\n FKSortIcon(fieldName: string): string {\n if (this.FKSortField !== fieldName) return 'fa-solid fa-sort mj-fk-sort-icon mj-fk-sort-icon--idle';\n return this.FKSortDir === 'asc'\n ? 'fa-solid fa-sort-up mj-fk-sort-icon'\n : 'fa-solid fa-sort-down mj-fk-sort-icon';\n }\n\n // ---- Scope pill (search-field picker) ----\n\n /** Toggle the scope-picker menu. mousedown+preventDefault keeps the input focused. */\n OnFKScopeToggle(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.FKShowScopeMenu = !this.FKShowScopeMenu;\n this.cdr.markForCheck();\n }\n\n /** Whether a scope-menu row is the active search field. */\n IsFKScopeActive(field: FKSearchableField): boolean {\n return field.FieldName === (this.FKSearchField || this.FKNameField);\n }\n\n /** Whether there are non-visible searchable fields (drives the \"Other fields\" group). */\n get FKHasOtherSearchableFields(): boolean {\n return this.FKSearchableFields.some(f => f.Group === 'other');\n }\n\n /** User picked a field to search by — persist the override and re-run the search. */\n OnFKScopeSelect(event: MouseEvent, field: FKSearchableField): void {\n event.preventDefault();\n this.selectScope(field);\n }\n\n /** Set the active search field (used by click + the no-drag path of menu drag). */\n private selectScope(field: FKSearchableField): void {\n this.FKSearchField = field.FieldName;\n this.FKSearchFieldLabel = field.Label;\n this.FKShowScopeMenu = false;\n if (this.fkHostEntityName && this.fkFieldCodeName) {\n LinkedFieldOptionsStore.Instance.SetSearchField(this.fkHostEntityName, this.fkFieldCodeName, field.FieldName);\n }\n this.rerunCurrentFKSearch();\n this.cdr.markForCheck();\n }\n\n /** Re-run the active query against the (possibly newly-chosen) search field. */\n private rerunCurrentFKSearch(): void {\n const query = this._fkQuery;\n const cached = this.getCachedRecordsForRelatedEntity();\n if (cached) this.searchCachedEntity(cached, query);\n else void this.searchRelatedEntity(query);\n }\n\n // ---- Column visibility (show/hide a field as a column) ----\n\n /** Whether a field is currently rendered as a column (the Name column is always shown). */\n IsFKColumnVisible(field: FKSearchableField): boolean {\n return field.FieldName === this.FKNameField || this.FKColumnFields.includes(field.FieldName);\n }\n\n /** Whether this field's column visibility can be toggled (Name is always shown). */\n CanToggleFKColumn(field: FKSearchableField): boolean {\n return field.FieldName !== this.FKNameField;\n }\n\n /**\n * Toggle whether a field shows as a column. Persists the full visible set, then\n * rebuilds the column plan + re-runs the search so the grid reflects it live.\n * stopPropagation so the row's search-scope click doesn't also fire.\n */\n OnFKColumnToggle(event: MouseEvent, field: FKSearchableField): void {\n event.preventDefault();\n event.stopPropagation();\n if (!this.CanToggleFKColumn(field)) return;\n\n const next = [...this.FKColumnFields];\n const idx = next.indexOf(field.FieldName);\n if (idx >= 0) next.splice(idx, 1);\n else next.push(field.FieldName);\n this.applyVisibleColumns(next);\n }\n\n /** Persist a new visible-column set/order and rebuild the grid live. */\n private applyVisibleColumns(cols: string[]): void {\n if (this.fkHostEntityName && this.fkFieldCodeName) {\n LinkedFieldOptionsStore.Instance.SetVisibleFields(this.fkHostEntityName, this.fkFieldCodeName, cols);\n }\n this._fkColumnPlan = null; // force rebuild with the new column set/order\n this.rerunCurrentFKSearch();\n this.cdr.markForCheck();\n }\n\n // ---- Column reorder (up/down arrows in the field-selector menu) ----\n\n /** Whether the column can move up (it's a column and not already first). */\n CanMoveFKColumnUp(field: string): boolean {\n return this.FKColumnFields.indexOf(field) > 0;\n }\n\n /** Whether the column can move down (it's a column and not already last). */\n CanMoveFKColumnDown(field: string): boolean {\n const i = this.FKColumnFields.indexOf(field);\n return i >= 0 && i < this.FKColumnFields.length - 1;\n }\n\n /**\n * Move a column one slot up (delta -1) or down (delta +1) and persist. mousedown +\n * stopPropagation so the row's select-scope handler doesn't fire and the menu stays open.\n */\n MoveFKColumn(event: MouseEvent, field: string, delta: -1 | 1): void {\n event.preventDefault();\n event.stopPropagation();\n const cols = [...this.FKColumnFields];\n const i = cols.indexOf(field);\n const j = i + delta;\n if (i < 0 || j < 0 || j >= cols.length) return;\n [cols[i], cols[j]] = [cols[j], cols[i]];\n this.applyVisibleColumns(cols);\n }\n\n /**\n * CSS `grid-template-columns` for the dropdown grid: optional icon column, then one\n * track per ordered column. The LAST column grows to fill any remaining width (`1fr`)\n * so the grid never leaves dead space on the right; earlier columns size to content.\n * A user-resized column uses its saved pixel width as the floor.\n */\n get FKGridTemplateColumns(): string {\n const cols: string[] = [];\n if (this.FKHasIconColumn) cols.push('min-content');\n const lastIdx = this.FKColumnFields.length - 1;\n this.FKColumnFields.forEach((field, i) => cols.push(this.fkColumnTrack(field, i === lastIdx)));\n return cols.join(' ');\n }\n\n /**\n * Track sizing for one column. Resized → fixed px (the last column still grows past it\n * via `1fr` when there's room). Default → content-sized, except the last column which\n * fills remaining space.\n */\n private fkColumnTrack(field: string, isLast: boolean): string {\n const w = this._fkColWidths[field];\n const min = field === this.FKNameField ? 120 : 80;\n if (w) return isLast ? `minmax(${w}px, 1fr)` : `${w}px`;\n return isLast ? `minmax(${min}px, 1fr)` : `minmax(${min}px, max-content)`;\n }\n\n /** Whether a column's cells should stretch to fill their track (last column or resized). */\n FKColumnFillsTrack(field: string, isLast: boolean): boolean {\n return isLast || this._fkColWidths[field] != null;\n }\n\n /** The built cell (value + highlighted html) for a non-name column of a suggestion. */\n FKCellFor(suggestion: FKSuggestion, field: string): FKSuggestionColumn | undefined {\n return suggestion.ExtraColumns.find(c => c.FieldName === field);\n }\n\n /** Header sort handler (grid headers click-to-sort only; drag-reorder is menu-only). */\n OnFKHeaderSort(event: MouseEvent, field: string): void {\n event.preventDefault(); // keep input focus so the body-portaled dropdown stays open\n this.OnFKSortToggle(field);\n }\n\n // ---- Column resize (drag a header's right edge) ----\n\n /** Begin resizing a column. stopPropagation so the header's sort handler doesn't fire. */\n OnFKColResizeStart(event: MouseEvent, field: string): void {\n event.preventDefault();\n event.stopPropagation();\n const headerCell = (event.target as HTMLElement).closest('.mj-fk-hcell') as HTMLElement | null;\n const startWidth = headerCell ? headerCell.offsetWidth : 120;\n this._fkResize = { field, startX: event.clientX, startWidth };\n this._fkResizeMove = (e: MouseEvent) => this.onFKColResizeMove(e);\n this._fkResizeUp = () => this.onFKColResizeEnd();\n document.addEventListener('mousemove', this._fkResizeMove);\n document.addEventListener('mouseup', this._fkResizeUp);\n }\n\n private onFKColResizeMove(e: MouseEvent): void {\n if (!this._fkResize) return;\n const width = Math.max(60, Math.round(this._fkResize.startWidth + (e.clientX - this._fkResize.startX)));\n this._fkColWidths = { ...this._fkColWidths, [this._fkResize.field]: width };\n this.cdr.markForCheck();\n }\n\n private onFKColResizeEnd(): void {\n if (this._fkResize) {\n const width = this._fkColWidths[this._fkResize.field];\n if (width && this.fkHostEntityName && this.fkFieldCodeName) {\n LinkedFieldOptionsStore.Instance.SetColWidth(\n this.fkHostEntityName, this.fkFieldCodeName, this._fkResize.field, width\n );\n }\n }\n this.teardownFKResizeListeners();\n this.cdr.markForCheck();\n }\n\n private teardownFKResizeListeners(): void {\n if (this._fkResizeMove) document.removeEventListener('mousemove', this._fkResizeMove);\n if (this._fkResizeUp) document.removeEventListener('mouseup', this._fkResizeUp);\n this._fkResize = null;\n this._fkResizeMove = null;\n this._fkResizeUp = null;\n }\n\n /** Handle typing in the FK search input */\n OnFKInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this._fkInputText = input.value;\n this._lastFKInputEl = input;\n this.FKIsMatched = false;\n\n const query = this._fkInputText;\n\n // Cached fast path: filter the in-memory array immediately (no DB, no debounce).\n const cached = this.getCachedRecordsForRelatedEntity();\n if (cached) {\n if (this._fkSearchTimeout) { clearTimeout(this._fkSearchTimeout); this._fkSearchTimeout = null; }\n this.searchCachedEntity(cached, query);\n return;\n }\n\n // DB path: debounce a RunView search. Empty query (cleared field) → first N,\n // so clearing the field reveals the list rather than closing it.\n if (this._fkSearchTimeout) clearTimeout(this._fkSearchTimeout);\n this._fkSearchTimeout = setTimeout(() => {\n void this.searchRelatedEntity(this._fkInputText ?? '');\n }, 300);\n }\n\n /**\n * Show dropdown on focus. With a cached-unfiltered entity we immediately show the\n * first N rows (sorted by name) even on empty input — zero DB round-trips. Without\n * a cache we keep prior behavior: only re-open if we already have suggestions.\n */\n OnFKFocus(event: FocusEvent): void {\n const input = event.target as HTMLInputElement;\n this._lastFKInputEl = input;\n this.FKFocused = true; // reveal the scope pill while focused\n // Select any pre-filled (linked) text so the first keystroke replaces it instead\n // of appending — matches how a searchable dropdown behaves.\n if (input.value) input.select();\n this.showInitialFKSuggestions();\n }\n\n /**\n * Show the initial suggestion list (no/empty query): the full set from a cached\n * unfiltered engine, otherwise the first N rows via a DB query. Used on focus and\n * when the field is cleared, so the user always sees options without typing.\n */\n private showInitialFKSuggestions(): void {\n // Always show the FULL list (empty query) on focus/clear — even when a value is\n // already selected — so the user can browse and re-pick like a normal dropdown.\n // Filtering only kicks in once they actually type (OnFKInput).\n const cached = this.getCachedRecordsForRelatedEntity();\n if (cached) {\n if (this._fkSearchTimeout) { clearTimeout(this._fkSearchTimeout); this._fkSearchTimeout = null; }\n this.searchCachedEntity(cached, '');\n return;\n }\n void this.searchRelatedEntity('');\n }\n\n /**\n * In-memory search over a cached-unfiltered entity array. Case-insensitive substring\n * on the name field. Empty query → first N rows sorted by name (focus-show). Instant,\n * no spinner, no DB.\n */\n private searchCachedEntity(records: ReadonlyArray<BaseEntity>, query: string): void {\n const plan = this.buildColumnPlan();\n if (!plan) { this.closeFKDropdown(); this.cdr.markForCheck(); return; }\n\n this._fkQuery = query;\n const accessor = (r: BaseEntity) => ({ get: (field: string) => r.Get(field) });\n // plan.NameFieldName is already vetted for readability by buildColumnPlan; FKSearchField is\n // caller-supplied and is not, so it falls back rather than throwing on the first row.\n const relatedInfo = records[0]?.EntityInfo;\n const searchField =\n this.FKSearchField && relatedInfo?.IsFieldReadableByUser(this.FKSearchField, this.ProviderToUse?.CurrentUser) !== false\n ? this.FKSearchField\n : plan.NameFieldName;\n const matches = FilterCachedFKRows(\n records,\n query,\n MjFormFieldComponent.FK_FOCUS_SHOW_LIMIT,\n r => r.Get(searchField)\n );\n\n this.FKLoading = false;\n this.applySuggestions(this.buildSuggestions(matches.map(accessor), plan, query), plan);\n }\n\n /** Hide dropdown on blur, revert to matched name if user didn't select */\n OnFKBlur(): void {\n // Small delay so mousedown on dropdown items / scope menu fires first\n setTimeout(() => {\n this.closeFKDropdown();\n this.FKShowScopeMenu = false;\n this.FKFocused = false; // hide the scope pill\n // If user was typing but didn't select, revert to display name\n if (!this.FKIsMatched && this._fkInputText !== null) {\n this._fkInputText = null;\n }\n this.cdr.markForCheck();\n }, 200);\n }\n\n /**\n * Keyboard navigation in the FK input: ArrowDown/ArrowUp move the active row,\n * Enter selects it, Escape closes the dropdown.\n */\n OnFKKeydown(event: KeyboardEvent): void {\n if (!this.ShowFKDropdown || this.FKSuggestions.length === 0) {\n if (event.key === 'Escape') { this.closeFKDropdown(); this.cdr.markForCheck(); }\n return;\n }\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.FKActiveIndex = Math.min(this.FKActiveIndex + 1, this.FKSuggestions.length - 1);\n this.scrollActiveOptionIntoView();\n this.cdr.markForCheck();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.FKActiveIndex = Math.max(this.FKActiveIndex - 1, 0);\n this.scrollActiveOptionIntoView();\n this.cdr.markForCheck();\n break;\n case 'Enter': {\n const active = this.FKSuggestions[this.FKActiveIndex];\n if (active) {\n event.preventDefault();\n this.selectFKSuggestion(active);\n }\n break;\n }\n case 'Escape':\n event.preventDefault();\n this.closeFKDropdown();\n this.cdr.markForCheck();\n break;\n }\n }\n\n /** Scroll the keyboard-active option into view inside the (possibly portaled) dropdown. */\n private scrollActiveOptionIntoView(): void {\n Promise.resolve().then(() => {\n const dropdown = this._portaledDropdownEl\n ?? (this.hostRef?.nativeElement?.querySelector('.mj-fk-dropdown') as HTMLElement | null);\n const active = dropdown?.querySelectorAll('.mj-fk-option')[this.FKActiveIndex] as HTMLElement | undefined;\n active?.scrollIntoView({ block: 'nearest' });\n });\n }\n\n /** Select an item from the FK dropdown (mouse) */\n OnFKSelectItem(suggestion: FKSuggestion, event: MouseEvent): void {\n event.preventDefault();\n this.selectFKSuggestion(suggestion);\n }\n\n /** Shared selection logic for mouse-click and keyboard-Enter. */\n private selectFKSuggestion(suggestion: FKSuggestion): void {\n this._fkInputText = suggestion.DisplayName;\n this.Value = suggestion.PrimaryKeyValue;\n this.FKIsMatched = true;\n this.closeFKDropdown();\n\n // Update virtual name field for visual consistency after save\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n this.Record.Set(nameFieldMap, suggestion.DisplayName);\n }\n this.cdr.markForCheck();\n }\n\n // ---- Inline \"create new related record\" ----\n\n /**\n * Whether to show the inline-create affordance: the field opts in (`AllowFKCreate`),\n * the related entity resolves, and the current user can create records of it (entity\n * allows creation + role permits — `GetUserPermisions().CanCreate` folds in `AllowCreateAPI`).\n */\n get CanCreateFK(): boolean {\n if (!this.AllowFKCreate) return false;\n const re = this.getRelatedEntityInfo();\n const user = this.ProviderToUse?.CurrentUser;\n if (!re || !user) return false;\n return re.GetUserPermisions(user)?.CanCreate === true;\n }\n\n /** Footer label: prefilled with the typed text when present, else generic \"create new\". */\n get FKCreateLabel(): string {\n const entityLabel = this.getRelatedEntityInfo()?.DisplayName || this.FieldInfo?.RelatedEntity || 'record';\n const query = this._fkQuery.trim();\n return query ? `Create \"${query}\"` : `Create new ${entityLabel}`;\n }\n\n /**\n * Ask the host (app layer) to create a new related record, prefilled with the typed\n * text as the name. We only EMIT the request — opening the form is the app's job (the\n * generic forms layer must not depend on the app-level form presenter). The host calls\n * `Complete(record)` when saved and we select it.\n */\n OnFKCreateNew(event: MouseEvent): void {\n event.preventDefault(); // don't blur the input before we capture the query\n const plan = this.buildColumnPlan();\n const relatedEntity = this.FieldInfo?.RelatedEntity;\n if (!plan || !relatedEntity) return;\n\n const query = this._fkQuery.trim();\n this.FKShowScopeMenu = false;\n this.FKFocused = false;\n this.closeFKDropdown();\n this.cdr.markForCheck();\n\n const newRecordValues: Record<string, unknown> = {};\n if (query) newRecordValues[plan.NameFieldName] = query;\n\n this.Navigate.emit({\n Kind: 'create-related',\n EntityName: relatedEntity,\n NewRecordValues: Object.keys(newRecordValues).length ? newRecordValues : undefined,\n Presentation: this.FKCreatePresentation,\n Provider: this.Provider ?? undefined,\n Complete: (created: BaseEntity | null) => { if (created) this.selectCreatedFKRecord(created, plan); },\n });\n }\n\n /** Select a freshly-created related record as this field's value. */\n private selectCreatedFKRecord(created: BaseEntity, plan: FKColumnPlan): void {\n const pk = created.Get(plan.PkFieldName);\n if (pk == null) return;\n const name = this.formatCell(created.Get(plan.NameFieldName));\n this._fkInputText = name;\n this.Value = pk;\n this.FKIsMatched = true;\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) this.Record.Set(nameFieldMap, name);\n this.closeFKDropdown();\n this.cdr.markForCheck();\n }\n\n /** Clear FK value via the X button */\n OnFKClearClick(event: MouseEvent): void {\n // preventDefault keeps focus on the input (the button never steals it), so the\n // freshly-opened dropdown stays open for the user to pick a replacement.\n event.preventDefault();\n this.Value = null;\n this._fkInputText = null;\n this.FKIsMatched = false;\n this._resolvedFKName = undefined;\n this._resolvedFKValue = undefined;\n\n const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;\n if (nameFieldMap) {\n this.Record.Set(nameFieldMap, '');\n }\n\n // Re-open the full list — clearing almost always precedes picking something else.\n this.showInitialFKSuggestions();\n this.cdr.markForCheck();\n }\n\n /** Close the FK dropdown and reset its transient view state. */\n private closeFKDropdown(): void {\n this.ShowFKDropdown = false;\n this.FKLoading = false;\n this.FKNoMatches = false;\n this.FKActiveIndex = -1;\n this.FKSelectedSuggestion = null;\n this._portaledDropdownEl = null;\n this.stopScrollListener();\n }\n\n /**\n * Perform a RunView search on the related entity's name field (DB path — used only\n * when no loaded engine caches the related entity unfiltered).\n * Falls back to searching by primary key when no NameField exists (single-field PKs only).\n */\n private async searchRelatedEntity(query: string): Promise<void> {\n const plan = this.buildColumnPlan();\n const fieldInfo = this.FieldInfo;\n if (!plan || !fieldInfo?.RelatedEntity) return;\n\n this._fkQuery = query;\n const seq = ++this._fkSearchSeq;\n this.FKLoading = true;\n this.FKNoMatches = false;\n this.ShowFKDropdown = true;\n if (this._lastFKInputEl) {\n this.updateDropdownPosition(this._lastFKInputEl);\n this.startScrollListener();\n this.portalDropdownToBody();\n }\n this.cdr.markForCheck();\n\n // Build Fields: PK + name + extra DefaultInView columns + the searched field +\n // the per-row icon field (when present), deduped via Set.\n const searchField = this.FKSearchField || plan.NameFieldName;\n const fields = Array.from(new Set([\n plan.PkFieldName, plan.NameFieldName, ...plan.ExtraFieldNames, searchField,\n ...(plan.IconFieldName ? [plan.IconFieldName] : [])\n ]));\n const escapedQuery = query.replace(/'/g, \"''\").trim();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: fieldInfo.RelatedEntity,\n // Empty query (focus / cleared field) → no filter → first N rows.\n ExtraFilter: escapedQuery ? `[${searchField}] LIKE '%${escapedQuery}%'` : '',\n MaxRows: MjFormFieldComponent.FK_DB_SEARCH_LIMIT,\n ResultType: 'simple',\n Fields: fields\n });\n\n // Ignore stale responses (a newer keystroke already fired).\n if (seq !== this._fkSearchSeq) return;\n this.FKLoading = false;\n\n if (result.Success) {\n const accessor = (r: Record<string, unknown>) => ({ get: (field: string) => r[field] });\n this.applySuggestions(this.buildSuggestions(result.Results.map(accessor), plan, query), plan);\n } else {\n this.FKSuggestions = [];\n this.FKNoMatches = true;\n this.ShowFKDropdown = true;\n }\n this.cdr.markForCheck();\n }\n\n // ============================================\n // VALUE LIST AUTOCOMPLETE (for 'autocomplete' type)\n // ============================================\n\n /** Whether the value list dropdown is visible */\n ShowValueListDropdown = false;\n\n /** Current filter text for the value list */\n private _valueListFilter = '';\n\n /** Filtered possible values based on what the user typed */\n get FilteredPossibleValues(): string[] {\n if (!this._valueListFilter) return this.PossibleValues;\n const filter = this._valueListFilter.toLowerCase();\n return this.PossibleValues.filter(v => v.toLowerCase().includes(filter));\n }\n\n /** Handle typing in the value list autocomplete */\n OnValueListInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this._valueListFilter = input.value;\n this.Value = input.value;\n this.updateDropdownPosition(input);\n if (!this._scrollCleanup) this.startScrollListener();\n this.ShowValueListDropdown = true;\n this.cdr.markForCheck();\n }\n\n /** Show dropdown on focus */\n OnValueListFocus(event: FocusEvent): void {\n const input = event.target as HTMLElement;\n this.updateDropdownPosition(input);\n this.startScrollListener();\n this.ShowValueListDropdown = true;\n this.cdr.markForCheck();\n }\n\n /** Hide dropdown on blur */\n OnValueListBlur(): void {\n setTimeout(() => {\n this.ShowValueListDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }, 200);\n }\n\n /** Select an item from the value list dropdown */\n OnValueListSelect(value: string, event: MouseEvent): void {\n event.preventDefault();\n this.Value = value;\n this._valueListFilter = '';\n this.ShowValueListDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }\n\n // ============================================\n // CUSTOM SELECT DROPDOWN (replaces native <select>)\n // ============================================\n\n /** Whether the custom select dropdown is visible */\n ShowSelectDropdown = false;\n\n /** Toggle the custom select dropdown */\n OnSelectTriggerClick(event: Event): void {\n event.preventDefault();\n if (this.ShowSelectDropdown) {\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n } else {\n const el = event.currentTarget as HTMLElement;\n this.updateDropdownPosition(el);\n this.startScrollListener();\n this.ShowSelectDropdown = true;\n }\n this.cdr.markForCheck();\n }\n\n /** Close the select dropdown on blur */\n OnSelectTriggerBlur(): void {\n setTimeout(() => {\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }, 200);\n }\n\n /** Select an option from the custom select dropdown */\n OnSelectOptionClick(value: string, event: MouseEvent): void {\n event.preventDefault();\n this.Value = value;\n this.ShowSelectDropdown = false;\n this.stopScrollListener();\n this.cdr.markForCheck();\n }\n\n // ============================================\n // GENERAL PROPERTIES\n // ============================================\n\n /** Whether the field's varchar(max) - long text that gets the wide read-only style */\n get IsLongText(): boolean {\n return this.FieldInfo?.Length === -1;\n }\n\n /**\n * Whether this field is large enough to be a candidate for rich-text (markdown/html)\n * auto-detection. Generic & multi-platform: keys off the TS type and character length\n * rather than a specific SQL type, so nvarchar(max)/ntext (MaxLength === 0 means\n * unlimited) and longer fixed fields (nvarchar(400)/varchar(500)/...) all qualify,\n * while short strings, UUIDs, numbers, dates, etc. do not.\n */\n get IsRichTextEligible(): boolean {\n const fi = this.FieldInfo;\n if (!fi || fi.TSType !== EntityFieldTSType.String) return false;\n const maxLen = fi.MaxLength;\n return maxLen === 0 || maxLen >= 255;\n }\n\n /**\n * Resolved rendering mode for this field. Honors an explicit `ExtendedType` first\n * ('Markdown' | 'HTML' | 'Code'); when `ExtendedType` is null, falls back to lightweight\n * client-side content detection — but only for {@link IsRichTextEligible} long-text fields.\n */\n get RichTextMode(): FieldRichTextMode {\n const fi = this.FieldInfo;\n if (!fi) return 'plain';\n\n switch (fi.ExtendedType) {\n case 'Markdown': return 'markdown';\n case 'HTML': return 'html';\n case 'Code': return 'code';\n }\n\n // Any other explicit ExtendedType (Email, URL, Geo*, Tel, ...) is not rich text here.\n if (fi.ExtendedType != null) return 'plain';\n\n // ExtendedType is null → auto-detect, but only on eligible long-text fields.\n if (!this.IsRichTextEligible) return 'plain';\n\n return this.detectFormat();\n }\n\n /** Backing snapshot for {@link EditRichTextMode}; null until first computed for the session. */\n private _editRichTextMode: FieldRichTextMode | null = null;\n\n /**\n * Stable rendering mode for EDIT mode. Unlike {@link RichTextMode} (which re-detects on the\n * live value), this is snapshotted when edit mode is entered so that typing markdown/html into\n * a plain textarea doesn't swap the control out from under the user mid-keystroke. Explicit\n * ExtendedType always wins regardless; only the auto-detect branch is frozen for the session.\n */\n get EditRichTextMode(): FieldRichTextMode {\n if (this._editRichTextMode === null) {\n this._editRichTextMode = this.RichTextMode;\n }\n return this._editRichTextMode;\n }\n\n /** Cached detection result, keyed by the exact string value it was computed from. */\n private _detectCacheValue: string | null = null;\n private _detectCacheResult: RichTextFormat = 'plain';\n\n /** Memoized content detection so the getter stays cheap under OnPush change detection. */\n private detectFormat(): RichTextFormat {\n const raw = this.Value;\n const text = raw == null ? '' : String(raw);\n if (text !== this._detectCacheValue) {\n this._detectCacheValue = text;\n this._detectCacheResult = detectRichTextFormat(text);\n }\n return this._detectCacheResult;\n }\n\n /**\n * Editor language for the code editor. In edit mode it tracks the frozen\n * {@link EditRichTextMode}; in read mode it tracks the live {@link RichTextMode}.\n */\n get CodeEditorLanguage(): string {\n const mode = this.EditMode ? this.EditRichTextMode : this.RichTextMode;\n switch (mode) {\n case 'markdown': return 'markdown';\n case 'html': return 'html';\n case 'code': return this.codeTypeToLanguage(this.FieldInfo?.CodeType);\n default: return '';\n }\n }\n\n /** Map the field's CodeType metadata value to a CodeMirror language id. */\n private codeTypeToLanguage(codeType: string | null | undefined): string {\n switch (codeType) {\n case 'CSS': return 'css';\n case 'HTML': return 'html';\n case 'JavaScript': return 'javascript';\n case 'SQL': return 'sql';\n case 'TypeScript': return 'typescript';\n default: return ''; // 'Other' / null → plain code editing\n }\n }\n\n /**\n * Runtime display kind from EntityField.ExtendedType. Honored ahead of the\n * generated `LinkType` input so PhotoURL forms still tagged LinkType=URL\n * render as images once metadata says Image.\n */\n get ExtendedDisplay(): 'image' | 'color' | 'json' | null {\n switch (this.FieldInfo?.ExtendedType) {\n case 'Image': return 'image';\n case 'Color': return 'color';\n case 'JSON': return 'json';\n default: return null;\n }\n }\n\n get ImagePreviewSrc(): string | null {\n const raw = this.FormatValue();\n return CoerceImageSrc(raw);\n }\n\n get IsInlineImageValue(): boolean {\n const raw = this.FormatValue().trim();\n if (!raw) return false;\n return IsInlineImageDataUri(raw) || CoerceRawImageBase64ToDataUri(raw) != null;\n }\n\n get ImageValueSizeLabel(): string {\n const raw = this.FormatValue();\n if (!raw) return '';\n return FormatByteSize(raw.length);\n }\n\n get ImageMaxSizeLabel(): string {\n return FormatByteSize(MaxInlineImageBytes(this.FieldInfo?.MaxLength ?? 0));\n }\n\n /** URL box: empty for inline images so we never dump a data URI into a text input. */\n get ImageUrlInputValue(): string {\n if (this.IsInlineImageValue) return '';\n return this.FormatValue();\n }\n\n get ImageUrlDisplay(): string {\n const raw = this.FormatValue().trim();\n return raw.replace(/^https?:\\/\\//i, '').replace(/\\/$/, '');\n }\n\n get ColorPickerValue(): string {\n return ParseCssHexColor(this.FormatValue()) ?? '#000000';\n }\n\n get ColorSwatchValue(): string {\n return ParseCssHexColor(this.FormatValue()) ?? 'transparent';\n }\n\n get JsonDisplayValue(): string {\n // Pretty-print only in read mode. Edit mode shows the live value; OnJsonBlur pretty-prints.\n if (this.EditMode) return this.FormatValue();\n return PrettyPrintJson(this.FormatValue());\n }\n\n /** Handle value changes coming from the embedded code editor (emits a plain string). */\n OnCodeEditorChange(value: string): void {\n this.Value = value;\n }\n\n /** Format a value for display */\n /**\n * Whether this field holds a DATE with no time, as opposed to a timestamp.\n *\n * The distinction decides which timezone the value may be rendered in, and getting it wrong\n * moves the day. A `date` column has no time and no zone: it is a calendar day, and the only\n * correct way to show it is in the zone it was written in. A `datetime`/`datetimeoffset` names\n * an instant, and the correct way to show THAT is the reader's local zone.\n */\n private get IsDateOnlyField(): boolean {\n return (this.FieldInfo?.Type ?? '').trim().toLowerCase() === 'date';\n }\n\n FormatValue(): string {\n const val = this.Value;\n if (val === null || val === undefined) return '';\n if (val instanceof Date) {\n /**\n * A DATE-ONLY VALUE IS NOT AN INSTANT, AND toLocaleString() TREATS IT AS ONE.\n *\n * A `date` column arrives as UTC midnight. Passing that through a LOCAL-time formatter\n * subtracts the reader's offset and lands on the previous day for everyone west of\n * Greenwich: a stored 2026-11-20 rendered as `11/19/2026, 7:00:00 PM` in America/New_York,\n * and 2026-01-01 rendered as `12/31/2025` — the wrong YEAR.\n *\n * The edit path does not have this bug: `DateInputValue` uses `toISOString()`, which is UTC.\n * So the two modes DISAGREED — a rep opened a record and saw 19 November, clicked Edit and\n * saw the 20th, on the same field, with no invalid data anywhere. Read mode was simply wrong.\n *\n * Pinning the timezone rather than switching to `toISOString()` keeps the reader's locale\n * format (a US reader still sees 11/20/2026, a UK reader 20/11/2026) and changes only the\n * zone the day is computed in. A TIMESTAMP is left exactly as it was: it names an instant,\n * and local time is the right way to show one.\n */\n if (this.IsDateOnlyField) {\n return val.toLocaleDateString(undefined, { timeZone: 'UTC' });\n }\n return val.toLocaleString();\n }\n return String(val);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // Field security depends on both the record's entity and which field this is, so the\n // memoized answer has to be dropped whenever either changes.\n if (changes['Record'] || changes['FieldName']) {\n this._isReadableByUser = undefined;\n this._isWritableByUser = undefined;\n this._isWritableForSavedState = undefined;\n }\n if (changes['FormContext'] || changes['EditMode'] || changes['Record']) {\n // Reset FK state when record changes\n if (changes['Record']) {\n this._fkInputText = null;\n this.FKIsMatched = false;\n this._fkQuery = '';\n this.FKSuggestions = [];\n this.FKSelectedSuggestion = null;\n this.ShowFKDropdown = false;\n this.FKActiveIndex = -1;\n this.FKLoading = false;\n this.FKNoMatches = false;\n this.FKColumnHeaders = [];\n this.FKColumnFields = [];\n this.FKSortField = null;\n this.FKSortDir = 'asc';\n this._fkSuggestionsNatural = [];\n this.FKSearchableFields = [];\n this.FKShowScopeMenu = false;\n this.FKFocused = false;\n this._fkColWidths = {};\n this._fkPrefKey = null; // force prefs reload for the new field\n this._portaledDropdownEl = null;\n this._fkColumnPlan = null;\n this._resolvedFKName = undefined;\n this._resolvedFKValue = undefined;\n this._fkNameLoading = false;\n // Reset validation state for new record\n this._touched = false;\n this._fieldErrors = [];\n // Invalidate cached rich-text detection (recomputed lazily for the new value)\n this._detectCacheValue = null;\n this._detectCacheResult = 'plain';\n this._editRichTextMode = null;\n }\n // Reset validation state when exiting edit mode\n if (changes['EditMode'] && !this.EditMode) {\n this._touched = false;\n this._fieldErrors = [];\n }\n // Re-snapshot the edit-mode rendering decision whenever edit mode toggles\n if (changes['EditMode']) {\n this._editRichTextMode = null;\n }\n this.cdr.markForCheck();\n }\n }\n\n ngOnDestroy(): void {\n if (this._fkSearchTimeout) {\n clearTimeout(this._fkSearchTimeout);\n }\n this.teardownFKResizeListeners();\n this.stopScrollListener();\n // If we relocated the dropdown to <body> and Angular tears us down while it's\n // still open, remove the orphaned node ourselves (Angular removes by reference,\n // but guard against a race where the view is destroyed before the @if updates).\n if (this._portaledDropdownEl && this._portaledDropdownEl.parentElement === document.body) {\n this.renderer.removeChild(document.body, this._portaledDropdownEl);\n }\n this._portaledDropdownEl = null;\n }\n\n // ---- Navigation Handlers ----\n\n /**\n * Handle click on a record FK link in read-only mode.\n */\n OnRecordLinkClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n if (!this.FieldInfo || !this.Record) return;\n const relatedEntityName = this.FieldInfo.RelatedEntity;\n if (!relatedEntityName) return;\n\n const fkValue = this.Value;\n if (!fkValue) return;\n\n // Build a CompositeKey for the FK target record using the related entity's PK field\n const relatedFieldName = this.FieldInfo.RelatedEntityFieldName || 'ID';\n const targetKey = new CompositeKey([new KeyValuePair(relatedFieldName, fkValue)]);\n\n this.Navigate.emit({\n Kind: 'record',\n EntityName: relatedEntityName,\n PrimaryKey: targetKey,\n OpenInNewTab: event.ctrlKey || event.metaKey\n });\n }\n\n /**\n * Handle click on an email link in read-only mode.\n */\n OnEmailLinkClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const email = this.FormatValue();\n if (!email) return;\n this.Navigate.emit({\n Kind: 'email',\n EmailAddress: email\n });\n }\n\n /**\n * Handle click on a URL link in read-only mode.\n */\n OnUrlLinkClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n const url = this.FormatValue();\n if (!url) return;\n this.Navigate.emit({\n Kind: 'external-link',\n Url: url,\n OpenInNewTab: true\n });\n }\n\n /**\n * Handle value change from a native input.\n */\n OnInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.imageUploadError = null;\n this.Value = input.value;\n }\n\n OnImageUrlInput(event: Event): void {\n this.OnInputChange(event);\n }\n\n OnImageClear(): void {\n this.imageUploadError = null;\n this.Value = null;\n this.cdr.markForCheck();\n }\n\n async OnImageFileSelected(event: Event): Promise<void> {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n input.value = '';\n this.imageUploadError = null;\n if (!file) return;\n\n const allowed = new Set(['image/png', 'image/jpeg', 'image/jpg', 'image/gif', 'image/webp', 'image/svg+xml']);\n if (file.type && !allowed.has(file.type)) {\n this.imageUploadError = 'That file is not a supported image type (PNG, JPEG, GIF, WebP, or SVG).';\n this.markTouched();\n this.cdr.markForCheck();\n return;\n }\n\n const absoluteReadCap = 8 * 1024 * 1024;\n if (file.size > absoluteReadCap) {\n this.imageUploadError = `File is too large to read (max ${FormatByteSize(absoluteReadCap)}).`;\n this.markTouched();\n this.cdr.markForCheck();\n return;\n }\n\n try {\n const maxChars = MaxStoredImageChars(this.FieldInfo?.MaxLength ?? 0);\n const dataUri = await this.readFileAsDataUri(file);\n if (!IsInlineImageDataUri(dataUri)) {\n this.imageUploadError = 'That file is not a supported image type (PNG, JPEG, GIF, WebP, or SVG).';\n this.markTouched();\n this.cdr.markForCheck();\n return;\n }\n if (dataUri.length <= maxChars) {\n this.Value = dataUri;\n this.cdr.markForCheck();\n return;\n }\n const compressed = await this.compressImageDataUriToFit(dataUri, maxChars);\n if (compressed) {\n this.Value = compressed;\n this.cdr.markForCheck();\n return;\n }\n this.imageUploadError = `Image is too large for this field (max ${this.ImageMaxSizeLabel}). Try a smaller file or paste an image URL.`;\n this.markTouched();\n } catch {\n this.imageUploadError = 'Could not read that image.';\n this.markTouched();\n }\n this.cdr.markForCheck();\n }\n\n OnColorPickerInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.imageUploadError = null;\n this.Value = input.value;\n }\n\n OnJsonBlur(): void {\n const raw = this.FormatValue();\n const pretty = PrettyPrintJson(raw);\n if (pretty !== raw) {\n this.Value = pretty;\n }\n }\n\n private readFileAsDataUri(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result ?? ''));\n reader.onerror = () => reject(reader.error ?? new Error('read failed'));\n reader.readAsDataURL(file);\n });\n }\n\n private loadHtmlImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error('image decode failed'));\n img.src = src;\n });\n }\n\n /**\n * Re-encode a raster data URI as JPEG, shrinking dimensions/quality until it fits\n * `maxChars`. GIF/SVG are left alone (would lose animation / vectors).\n */\n private async compressImageDataUriToFit(dataUri: string, maxChars: number): Promise<string | null> {\n if (typeof document === 'undefined') return null;\n if (/^data:image\\/(gif|svg\\+xml)/i.test(dataUri)) return null;\n const img = await this.loadHtmlImage(dataUri);\n const naturalW = img.naturalWidth || img.width;\n const naturalH = img.naturalHeight || img.height;\n if (!naturalW || !naturalH) return null;\n\n let maxDim = Math.min(Math.max(naturalW, naturalH), 1024);\n let quality = 0.85;\n for (let i = 0; i < 8; i++) {\n const scale = maxDim / Math.max(naturalW, naturalH);\n const w = Math.max(1, Math.round(naturalW * scale));\n const h = Math.max(1, Math.round(naturalH * scale));\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n ctx.drawImage(img, 0, 0, w, h);\n const next = canvas.toDataURL('image/jpeg', quality);\n if (next.length <= maxChars) return next;\n maxDim = Math.max(32, Math.round(maxDim * 0.65));\n quality = Math.max(0.4, quality - 0.1);\n }\n return null;\n }\n\n /**\n * Handle value change from a number input.\n */\n OnNumberChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const num = input.valueAsNumber;\n this.Value = isNaN(num) ? null : num;\n }\n\n /**\n * Handle value change from a date input.\n */\n OnDateChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.Value = input.value ? new Date(input.value) : null;\n }\n\n /**\n * Handle value change from a checkbox.\n */\n OnCheckboxChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.Value = input.checked;\n }\n\n /**\n * Get date value formatted for HTML date input.\n */\n get DateInputValue(): string {\n const val = this.Value;\n if (!val) return '';\n const date = val instanceof Date ? val : new Date(String(val));\n if (isNaN(date.getTime())) return '';\n return date.toISOString().split('T')[0];\n }\n\n /**\n * The field holds SOMETHING, and the date editor cannot show it.\n *\n * WHY A SEPARATE SIGNAL IS THE ONLY OPTION. `DateInputValue` returns '' for a value it cannot\n * render, and an `<input type=\"date\">` renders '' as an empty box — the same empty box it shows\n * for a field that was never set. There is no string that makes the element display\n * `not-a-date`, so the control physically cannot surface the problem itself. The most the getter\n * can do is refuse to emit garbage; saying WHY has to happen beside it.\n *\n * The consequence of not saying it is not cosmetic. The field reads as \"no date\", and the next\n * save writes that emptiness over whatever was actually stored — so an unreadable value becomes a\n * destroyed one, silently, by a user who was never told anything was wrong.\n *\n * READ MODE ALREADY DOES THIS and needs nothing: `FormatValue()` shows `Invalid Date` for a bad\n * Date and the raw text for a bad string. It is only the EDITOR that hides the problem, which is\n * why this is scoped to EditMode rather than to the field.\n *\n * An ABSENT value is not unreadable. Empty means empty, and must never be decorated as a fault.\n */\n get StoredDateIsUnreadable(): boolean {\n if (!this.EditMode) return false;\n if (this.Type !== 'datepicker' && this.FieldInfo?.TSType !== EntityFieldTSType.Date) return false;\n const val = this.Value;\n if (val === null || val === undefined || val === '') return false;\n return this.DateInputValue === '';\n }\n}\n","<!--\n IsFieldReadableByUser is FIRST deliberately. BaseEntity.Get() throws for a field the user\n cannot read, so every expression below — Value, ShouldHideField, the FK resolution — is only\n safe once this has short-circuited. A denied field renders nothing at all.\n-->\n@if (IsFieldReadableByUser && Record && (Record.IsSaved || !IsFieldReadOnly)) {\n <!-- READ-ONLY MODE -->\n @if ((!EditMode || IsFieldReadOnly) && !ShouldHideField) {\n <div class=\"mj-forms-field\" [class.mj-forms-field--readonly]=\"EditMode && IsFieldReadOnly\" [class.mj-forms-field--dirty]=\"IsDirty\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- FK fields with a mapped name field: show the name as a hyperlink -->\n @if (IsFKWithNameField) {\n <span class=\"mj-forms-field-value\">\n @if (RecordLinksEnabled) {\n <a class=\"mj-forms-field-link mj-forms-field-link--fk\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FKDisplayName }}\n </a>\n } @else {\n {{ FKDisplayName }}\n }\n </span>\n }\n @else if (ExtendedDisplay === 'image') {\n <div class=\"mj-forms-image\">\n @if (ImagePreviewSrc) {\n <img class=\"mj-forms-image-preview\" [src]=\"ImagePreviewSrc\" alt=\"\" />\n }\n @if (IsInlineImageValue) {\n <span class=\"mj-forms-image-meta\">Inline image ({{ ImageValueSizeLabel }})</span>\n } @else if (ImagePreviewSrc) {\n <a class=\"mj-forms-field-link\" (click)=\"OnUrlLinkClick($event)\" title=\"Open image\">\n {{ ImageUrlDisplay }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n } @else {\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n }\n </div>\n }\n @else if (ExtendedDisplay === 'color') {\n <div class=\"mj-forms-color\">\n <span class=\"mj-forms-color-swatch\" [style.background-color]=\"ColorSwatchValue\"></span>\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n </div>\n }\n @else if (ExtendedDisplay === 'json') {\n <pre class=\"mj-forms-json\">{{ JsonDisplayValue }}</pre>\n }\n @else {\n @switch (LinkType) {\n @case ('Email') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnEmailLinkClick($event)\" title=\"Send email\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-envelope mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('URL') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnUrlLinkClick($event)\" title=\"Open link\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('Record') {\n <span class=\"mj-forms-field-value\">\n @if (RecordLinksEnabled) {\n <a class=\"mj-forms-field-link\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n } @else {\n {{ FormatValue() }}\n }\n </span>\n }\n @default {\n @if (Type === 'checkbox') {\n <span class=\"mj-forms-field-value\">\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\" [checked]=\"!!Value\" disabled>\n </div>\n </span>\n }\n @else if (RichTextMode === 'markdown') {\n <div class=\"mj-forms-field-value mj-forms-field-value--rich\">\n <mj-markdown [data]=\"FormatValue()\"></mj-markdown>\n </div>\n }\n @else if (RichTextMode === 'html') {\n <!-- XSS: the mjSafeRichHtml pipe sanitizes with DOMPurify (HTML + SVG profiles)\n and then bypasses Angular's redundant re-sanitize. DOMPurify strips <script>,\n on* handlers, javascript:/data: URLs and <foreignObject> while KEEPING safe\n inline SVG + styles — richer than Angular's built-in sanitizer, still safe for\n untrusted content. -->\n <div class=\"mj-forms-field-value mj-forms-field-value--rich\" [innerHTML]=\"FormatValue() | mjSafeRichHtml\"></div>\n }\n @else if (RichTextMode === 'code') {\n <div class=\"mj-forms-field-value mj-forms-field-value--code\">\n <mj-code-editor [value]=\"FormatValue()\" [language]=\"CodeEditorLanguage\" [readonly]=\"true\"></mj-code-editor>\n </div>\n }\n @else if (IsLongText) {\n <span class=\"mj-forms-field-value mj-forms-field-value--long\">{{ FormatValue() }}</span>\n }\n @else {\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n }\n }\n }\n }\n </div>\n </div>\n }\n\n <!-- EDIT MODE -->\n @if (EditMode && !IsFieldReadOnly) {\n <div class=\"mj-forms-field mj-forms-field--editing\" [class.mj-forms-field--dirty]=\"IsDirty\" [class.mj-forms-field--required-empty]=\"IsRequiredEmpty\" [class.mj-forms-field--has-error]=\"ShowErrors\" [class.mj-forms-field--has-warning]=\"ShowWarnings || StoredDateIsUnreadable\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- Foreign Key fields get custom search autocomplete -->\n @if (HasRelatedEntity) {\n <div class=\"mj-fk-search\"\n [class.mj-fk-search--matched]=\"FKHasLinkedValue\"\n [class.mj-fk-search--scoped]=\"FKFocused && FKSearchableFields.length > 1\">\n @if (FKHasLinkedValue && !(FKFocused && FKSearchableFields.length > 1)) {\n <i class=\"fa-solid fa-link mj-fk-link-icon\" title=\"Linked record\"></i>\n }\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [class.mj-forms-field-input--linked]=\"FKHasLinkedValue\"\n [value]=\"FKSearchText\"\n (input)=\"OnFKInput($event)\"\n (focus)=\"OnFKFocus($event)\"\n (blur)=\"OnFKBlur()\"\n (keydown)=\"OnFKKeydown($event)\"\n placeholder=\"Search...\">\n\n <!-- Scope pill: only while focused, only when there's more than one searchable field.\n The menu itself lives INSIDE the results dropdown (below) so it overlays the\n list and rides the same above/below flip. -->\n @if (FKFocused && FKSearchableFields.length > 1) {\n <button class=\"mj-fk-scope-pill\"\n [class.mj-fk-scope-pill--open]=\"FKShowScopeMenu\"\n (mousedown)=\"OnFKScopeToggle($event)\"\n [title]=\"'Searching ' + FKSearchFieldLabel + ' — click to change'\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-scope-pill-icon\"></i>\n <span class=\"mj-fk-scope-pill-label\">{{ FKSearchFieldLabel }}</span>\n <i class=\"fa-solid mj-fk-scope-pill-caret\" [class.fa-chevron-up]=\"FKShowScopeMenu\" [class.fa-chevron-down]=\"!FKShowScopeMenu\"></i>\n </button>\n }\n\n @if (FKSearchText) {\n <button class=\"mj-fk-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n } @else {\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n }\n @if (ShowFKDropdown) {\n <div class=\"mj-fk-dropdown mj-fk-dropdown--multi\"\n [ngStyle]=\"DropdownPositionStyle\"\n [class.mj-fk-dropdown--above]=\"OpenAbove\"\n [class.mj-fk-dropdown--scope-open]=\"FKShowScopeMenu\">\n\n <!-- Scope (search-field) picker + column toggles — overlays the list, anchored to the pill edge.\n Click a row to SEARCH that field; click the eye to SHOW/HIDE it as a column. -->\n @if (FKShowScopeMenu) {\n <div class=\"mj-fk-scope-menu\" [class.mj-fk-scope-menu--bottom]=\"OpenAbove\">\n <div class=\"mj-fk-scope-grp\">Columns shown</div>\n @for (f of FKSearchableFields; track f.FieldName) {\n @if (f.Group === 'shown') {\n <ng-container *ngTemplateOutlet=\"scopeRow; context: { $implicit: f }\"></ng-container>\n }\n }\n @if (FKHasOtherSearchableFields) {\n <div class=\"mj-fk-scope-divider\"></div>\n <div class=\"mj-fk-scope-grp\">Other fields</div>\n @for (f of FKSearchableFields; track f.FieldName) {\n @if (f.Group === 'other') {\n <ng-container *ngTemplateOutlet=\"scopeRow; context: { $implicit: f }\"></ng-container>\n }\n }\n }\n </div>\n }\n\n <!-- Shared scope-menu row, fixed-slot layout for clean alignment:\n [reorder ▲▼ — hover-reveal] [icon] [label] [eye].\n Click the row = search this field; the active search row is shown bold+accent. -->\n <ng-template #scopeRow let-f>\n <div class=\"mj-fk-scope-mi\"\n [class.mj-fk-scope-mi--on]=\"IsFKScopeActive(f)\"\n (mousedown)=\"OnFKScopeSelect($event, f)\">\n <span class=\"mj-fk-col-reorder\">\n @if (f.Group === 'shown') {\n <button type=\"button\" class=\"mj-fk-col-move mj-fk-col-move--up\" [disabled]=\"!CanMoveFKColumnUp(f.FieldName)\"\n (mousedown)=\"MoveFKColumn($event, f.FieldName, -1)\" title=\"Move column up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button type=\"button\" class=\"mj-fk-col-move mj-fk-col-move--down\" [disabled]=\"!CanMoveFKColumnDown(f.FieldName)\"\n (mousedown)=\"MoveFKColumn($event, f.FieldName, 1)\" title=\"Move column down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n }\n </span>\n <i [class]=\"f.Icon + ' mj-fk-scope-mi-icon'\"></i>\n <span class=\"mj-fk-scope-mi-label\">{{ f.Label }}</span>\n <span class=\"mj-fk-col-eye-slot\">\n @if (CanToggleFKColumn(f)) {\n <button type=\"button\" class=\"mj-fk-col-toggle\"\n [class.mj-fk-col-toggle--on]=\"IsFKColumnVisible(f)\"\n (mousedown)=\"OnFKColumnToggle($event, f)\"\n [title]=\"IsFKColumnVisible(f) ? 'Hide this column' : 'Show as a column'\">\n <i class=\"fa-solid\" [class.fa-eye]=\"IsFKColumnVisible(f)\" [class.fa-eye-slash]=\"!IsFKColumnVisible(f)\"></i>\n </button>\n }\n </span>\n </div>\n </ng-template>\n\n <!-- Pinned \"currently selected\" — sticky at the top while browsing, so you can\n keep it or pick another without clearing first. -->\n @if (FKSelectedSuggestion && !FKLoading) {\n <div class=\"mj-fk-current\">\n <div class=\"mj-fk-current-head\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Currently selected</span>\n </div>\n <div class=\"mj-fk-current-row\" (mousedown)=\"OnFKSelectItem(FKSelectedSuggestion, $event)\" title=\"Keep this selection\">\n @if (FKSelectedSuggestion.Icon) { <i class=\"mj-fk-current-icon\" [class]=\"FKSelectedSuggestion.Icon\"></i> }\n <span class=\"mj-fk-current-name\" [innerHTML]=\"FKSelectedSuggestion.HighlightedName\"></span>\n @if (FKSelectedSuggestion.ExtraColumns.length && FKSelectedSuggestion.ExtraColumns[0].Value) {\n <span class=\"mj-fk-current-detail\">{{ FKSelectedSuggestion.ExtraColumns[0].Value }}</span>\n }\n <button type=\"button\" class=\"mj-fk-current-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear selection\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n @if (FKLoading) {\n <div class=\"mj-fk-status\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span>Searching…</span>\n </div>\n }\n @if (!FKLoading && FKNoMatches) {\n <div class=\"mj-fk-status mj-fk-status--empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No matches</span>\n </div>\n }\n @if (!FKLoading && FKSuggestions.length > 0) {\n <div class=\"mj-fk-options\">\n <div class=\"mj-fk-grid\" [style.grid-template-columns]=\"FKGridTemplateColumns\">\n <!-- Header row: click to sort, drag the right edge to resize.\n (Column reorder lives in the field-selector menu, not here.) -->\n <div class=\"mj-fk-grid-row mj-fk-grid-row--header\">\n @if (FKHasIconColumn) {\n <div class=\"mj-fk-hcell mj-fk-hcell--icon\"></div>\n }\n @for (col of FKColumnFields; track col; let i = $index) {\n <div class=\"mj-fk-hcell\"\n (mousedown)=\"OnFKHeaderSort($event, col)\"\n [title]=\"'Click to sort by ' + FKColumnHeaders[i]\">\n <span class=\"mj-fk-hcell-label\">{{ FKColumnHeaders[i] }}</span>\n <i [class]=\"FKSortIcon(col)\"></i>\n <span class=\"mj-fk-resizer\" (mousedown)=\"OnFKColResizeStart($event, col)\" title=\"Drag to resize\"></span>\n </div>\n }\n </div>\n <!-- Data rows -->\n @for (suggestion of FKSuggestions; track suggestion.PrimaryKeyValue; let i = $index) {\n <div class=\"mj-fk-grid-row\"\n [class.mj-fk-grid-row--active]=\"i === FKActiveIndex\"\n [class.mj-fk-grid-row--selected]=\"IsFKRowSelected(suggestion)\"\n (mousedown)=\"OnFKSelectItem(suggestion, $event)\"\n (mouseenter)=\"FKActiveIndex = i\">\n @if (FKHasIconColumn) {\n <div class=\"mj-fk-cell mj-fk-cell--icon\">\n @if (suggestion.Icon) { <i [class]=\"suggestion.Icon\"></i> }\n </div>\n }\n @for (col of FKColumnFields; track col; let last = $last) {\n @if (col === FKNameField) {\n <div class=\"mj-fk-cell mj-fk-cell--name\" [class.mj-fk-cell--fill]=\"FKColumnFillsTrack(col, last)\">\n @if (IsFKRowSelected(suggestion)) {\n <i class=\"fa-solid fa-check mj-fk-selected-check\" title=\"Currently selected\"></i>\n }\n <span [innerHTML]=\"suggestion.HighlightedName\"></span>\n </div>\n } @else {\n <div class=\"mj-fk-cell\" [class.mj-fk-cell--fill]=\"FKColumnFillsTrack(col, last)\" [title]=\"FKCellFor(suggestion, col)?.Value || ''\">\n <span [innerHTML]=\"FKCellFor(suggestion, col)?.HighlightedValue || ''\"></span>\n </div>\n }\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Sticky \"create new\" footer — always visible at the bottom (no scrolling),\n prefilled with the typed text. Gated on create permission. -->\n @if (CanCreateFK) {\n <button type=\"button\" class=\"mj-fk-create-footer\" (mousedown)=\"OnFKCreateNew($event)\" [title]=\"FKCreateLabel\">\n <i class=\"fa-solid fa-plus mj-fk-create-icon\"></i>\n <span class=\"mj-fk-create-label\">{{ FKCreateLabel }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n @else if (ExtendedDisplay === 'image') {\n <div class=\"mj-forms-image mj-forms-image--edit\">\n @if (ImagePreviewSrc) {\n <img class=\"mj-forms-image-preview\" [src]=\"ImagePreviewSrc\" alt=\"\" />\n } @else {\n <div class=\"mj-forms-image-preview mj-forms-image-preview--empty\" aria-hidden=\"true\">\n <i class=\"fa-regular fa-image\"></i>\n </div>\n }\n <div class=\"mj-forms-image-meta\">\n @if (IsInlineImageValue) {\n <span>Inline image ({{ ImageValueSizeLabel }})</span>\n }\n <span class=\"mj-forms-image-hint\">Max {{ ImageMaxSizeLabel }}</span>\n </div>\n <div class=\"mj-forms-image-actions\">\n <input #imageFileInput type=\"file\" accept=\"image/png,image/jpeg,image/gif,image/webp,image/svg+xml\"\n class=\"mj-forms-image-file\" (change)=\"OnImageFileSelected($event)\">\n <button type=\"button\" class=\"mj-forms-image-btn\" (click)=\"imageFileInput.click()\">\n <i class=\"fa-solid fa-upload\"></i>\n {{ ImagePreviewSrc ? 'Replace' : 'Upload' }}\n </button>\n @if (ImagePreviewSrc) {\n <button type=\"button\" class=\"mj-forms-image-btn mj-forms-image-btn--ghost\" (click)=\"OnImageClear()\">Clear</button>\n }\n </div>\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"ImageUrlInputValue\"\n (input)=\"OnImageUrlInput($event)\"\n placeholder=\"https://… or paste a data URI\">\n </div>\n }\n @else if (ExtendedDisplay === 'color') {\n <div class=\"mj-forms-color mj-forms-color--edit\">\n <input type=\"color\"\n class=\"mj-forms-color-picker\"\n [value]=\"ColorPickerValue\"\n (input)=\"OnColorPickerInput($event)\"\n [attr.aria-label]=\"DisplayName + ' color'\">\n <input type=\"text\"\n class=\"mj-forms-field-input mj-forms-color-hex\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"\n placeholder=\"#RRGGBB\">\n </div>\n }\n @else if (ExtendedDisplay === 'json') {\n <textarea\n class=\"mj-forms-field-input mj-forms-field-input--textarea mj-forms-json\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"\n (blur)=\"OnJsonBlur()\"></textarea>\n }\n @else if (EditRichTextMode !== 'plain') {\n <!-- Markdown / HTML / Code long-text: edit raw with a syntax-highlighted code editor -->\n <mj-code-editor\n class=\"mj-forms-field-input--code\"\n [value]=\"FormatValue()\"\n [language]=\"CodeEditorLanguage\"\n (change)=\"OnCodeEditorChange($event)\"></mj-code-editor>\n }\n @else {\n @switch (Type) {\n @case ('textbox') {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\">\n }\n @case ('textarea') {\n <textarea\n class=\"mj-forms-field-input mj-forms-field-input--textarea\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"></textarea>\n }\n @case ('number') {\n <input type=\"number\"\n class=\"mj-forms-field-input mj-forms-field-input--number\"\n [value]=\"Value\"\n (change)=\"OnNumberChange($event)\">\n }\n @case ('datepicker') {\n <input type=\"date\"\n class=\"mj-forms-field-input mj-forms-field-input--date\"\n [value]=\"DateInputValue\"\n (change)=\"OnDateChange($event)\">\n }\n @case ('checkbox') {\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"!!Value\"\n (change)=\"OnCheckboxChange($event)\">\n </div>\n }\n @case ('select') {\n <div class=\"mj-custom-select-trigger\"\n tabindex=\"0\"\n (click)=\"OnSelectTriggerClick($event)\"\n (blur)=\"OnSelectTriggerBlur()\">\n <span class=\"mj-custom-select-value\" [class.mj-custom-select-value--placeholder]=\"!FormatValue()\">\n {{ FormatValue() || '-- Select --' }}\n </span>\n <i class=\"fa-solid fa-chevron-down mj-custom-select-chevron\" [class.mj-custom-select-chevron--open]=\"ShowSelectDropdown\"></i>\n </div>\n @if (ShowSelectDropdown && PossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of PossibleValues; track option) {\n <div class=\"mj-fk-option\" [class.mj-fk-option--selected]=\"FormatValue() === option\" (mousedown)=\"OnSelectOptionClick(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n }\n @case ('autocomplete') {\n <div class=\"mj-fk-search\">\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnValueListInput($event)\"\n (focus)=\"OnValueListFocus($event)\"\n (blur)=\"OnValueListBlur()\"\n placeholder=\"Type to search...\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n @if (ShowValueListDropdown && FilteredPossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of FilteredPossibleValues; track option) {\n <div class=\"mj-fk-option\" (mousedown)=\"OnValueListSelect(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n </div>\n }\n @default {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (change)=\"OnInputChange($event)\">\n }\n }\n }\n </div>\n <!-- Inline validation messages -->\n @if (DisplayErrors.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--error\">\n @for (error of DisplayErrors; track error.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ error.Message }}</span>\n </div>\n }\n </div>\n }\n @if (DisplayWarnings.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--warning\">\n @for (warning of DisplayWarnings; track warning.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ warning.Message }}</span>\n </div>\n }\n </div>\n }\n <!--\n An unreadable stored value renders as an EMPTY date box, identical to a field that\n was never set - and the next save writes that emptiness over whatever is stored. The\n element cannot display the bad value itself, so the warning sits with the other validation messages, beneath the control.\n -->\n @if (StoredDateIsUnreadable) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--warning\">\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>This field holds a value that is not a readable date, so the box above is\n empty. Saving now will replace it.</span>\n </div>\n </div>\n }\n </div>\n }\n}\n"]}